
    kh                     >    d Z ddlZddlmZ ddlmZ  G d de      Zy)z Plateau Scheduler

Adapts PyTorch plateau scheduler and allows application of noise, warmup.

Hacked together by / Copyright 2020 Ross Wightman
    N)List   )	Schedulerc                        e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Zd Zd Zd fd	Zddede	fdZ
d	 Zd
edee	   fdZ xZS )PlateauLRSchedulerzADecay the LR by a factor every time the validation loss plateaus.c           
         t         |   |d||||||       t        j                  j                  j                  | j                  ||||||
|	      | _        || _        || _        | j                  rP| j                  D cg c]  }||z
  | j                  z   c}| _
        t         | -  | j                         d | _        y | j                  D cg c]  }d c}| _
        d | _        y c c}w c c}w )Nlr)noise_range_t
noise_type	noise_pct	noise_std
noise_seed
initialize)patiencefactorverbose	thresholdcooldownmodemin_lrr   )super__init__torchoptimlr_schedulerReduceLROnPlateau	optimizerwarmup_twarmup_lr_initbase_valueswarmup_stepsupdate_groups
restore_lr)selfr   
decay_rate
patience_tr   r   
cooldown_tr   r   lr_minr   r
   r   r   r   r   r   v_	__class__s                      U/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/scheduler/plateau_lr.pyr   zPlateauLRScheduler.__init__   s    & 	'!!! 	 		
 "KK44FFNN G 	
 !,==OSO_O_ `!!n"4!E `DG!$"5"56  -1,<,< =q =D	 !a !>s   C*	C/c                 \    | j                   j                  | j                   j                  dS )N)best
last_epochr   r.   r/   )r$   s    r,   
state_dictzPlateauLRScheduler.state_dictB   s*    %%**++66
 	
    c                 ^    |d   | j                   _        d|v r|d   | j                   _        y y )Nr.   r/   r0   )r$   r1   s     r,   load_state_dictz"PlateauLRScheduler.load_state_dictH   s5    !+F!3:%+5l+CD( &r2   c                    || j                   k  r9| j                  D cg c]  }| j                  ||z  z    }}t        |   |       y | j
                  @t        | j                  j                        D ]  \  }}| j
                  |   |d<    d | _        | j                  j                  ||       | j                  |      r| j                  |       y y c c}w Nr	   )r   r!   r   r   r"   r#   	enumerater   param_groupsr   step_is_apply_noise_apply_noise)r$   epochmetricslrsiparam_groupr+   s          r,   r9   zPlateauLRScheduler.stepN   s    DMM!<@<M<MNq4&&2NCNG!#&*&/0K0K&L ;NA{(,(:K%;"&""651##E*!!%( + Os   Cnum_updatesr=   c                      y N )r$   rB   r=   s      r,   step_updatezPlateauLRScheduler.step_update^   s    r2   c                     | j                  |      }g }t        | j                  j                        D ]1  \  }}t	        |d         }|j                  |       |||z  z   }||d<   3 || _        y r6   )_calculate_noiser7   r   r8   floatappendr#   )r$   r<   noiser#   r@   rA   old_lrnew_lrs           r,   r;   zPlateauLRScheduler._apply_noisea   sy    %%e, 
'(C(CD 	'NA{;t,-Ff%fun,F &K		'
 %r2   treturnc                     J d       )Nz*should not be called as step is overriddenrE   )r$   rN   s     r,   _get_lrzPlateauLRScheduler._get_lrn   s    BBBur2   )g?
   Tg-C6?r   r   r   r   maxNnormalgq=
ףp?g      ?NTrD   )__name__
__module____qualname____doc__r   r1   r4   r9   intrI   rF   r;   r   rQ   __classcell__)r+   s   @r,   r   r      s}    K
 #0d
D) s E %C Ce Cr2   r   )rX   r   typingr   	schedulerr   r   rE   r2   r,   <module>r]      s%       bC bCr2   