
    Ng                     F    d Z ddlZddlmZ ddlmZ  G d de          ZdS )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.皙?
   T-C6?r   maxNnormalq=
ףp?      ?c           
          t                                          |d||||||           t          j        j                             j        ||||||
|	           _        | _         _         j        r@ fd j	        D              _
        t                                           j                   nd  j	        D              _
        d  _        d S )Nlr)noise_range_t
noise_type	noise_pct	noise_std
noise_seed
initialize)patiencefactorverbose	thresholdcooldownmodemin_lrc                 *    g | ]}|z
  j         z  S  )warmup_t).0vselfwarmup_lr_inits     U/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/scheduler/plateau_lr.py
<listcomp>z/PlateauLRScheduler.__init__.<locals>.<listcomp><   s%     ` ` `!!n"4!E ` ` `    c                     g | ]}d S )r   r   )r!   _s     r%   r&   z/PlateauLRScheduler.__init__.<locals>.<listcomp>?   s     = = =q = = =r'   )super__init__torchoptimlr_schedulerReduceLROnPlateau	optimizerr    r$   base_valueswarmup_stepsupdate_groups
restore_lr)r#   r0   
decay_rate
patience_tr   r   
cooldown_tr    r$   lr_minr   r   r   r   r   r   r   	__class__s   `       `        r%   r+   zPlateauLRScheduler.__init__   s    & 	'!!! 	 		
 		
 		
 "K4FFN G 	
 	
 !,= 	> ` ` ` ` `tO_ ` ` `DGG!!$"56666 = =D,< = = =Dr'   c                 4    | j         j        | j         j        dS )N)best
last_epochr.   r;   r<   )r#   s    r%   
state_dictzPlateauLRScheduler.state_dictB   s#    %*+6
 
 	
r'   c                 Z    |d         | j         _        d|v r|d         | j         _        d S d S )Nr;   r<   r=   )r#   r>   s     r%   load_state_dictz"PlateauLRScheduler.load_state_dictH   s;    !+F!3:%%+5l+CD((( &%r'   c                      j         k    r7 fd j        D             }t                                          |           d S  j        6t           j        j                  D ]\  }} j        |         |d<   d  _         j        	                    |            
                              r                                d S d S )Nc                 *    g | ]}j         |z  z   S r   )r$   )r!   sepochr#   s     r%   r&   z+PlateauLRScheduler.step.<locals>.<listcomp>P   s%    NNNq4&2NNNr'   r   )r    r2   r*   r3   r4   	enumerater0   param_groupsr.   step_is_apply_noise_apply_noise)r#   rD   metriclrsiparam_groupr9   s   ``    r%   rG   zPlateauLRScheduler.stepN   s    DM!!NNNNND<MNNNCGG!!#&&&&&*&/0K&L&L ; ;NA{(,(:K%%"&""65111##E** )!!%((((() )r'   num_updatesrJ   c                     d S Nr   )r#   rN   rJ   s      r%   step_updatezPlateauLRScheduler.step_update^   s    tr'   c                     |                      |          }g }t          | j        j                  D ]<\  }}t	          |d                   }|                    |           |||z  z   }||d<   =|| _        d S )Nr   )_calculate_noiserE   r0   rF   floatappendr4   )r#   rD   noiser4   rL   rM   old_lrnew_lrs           r%   rI   zPlateauLRScheduler._apply_noisea   s    %%e,, 
'(CDD 	' 	'NA{;t,--Ff%%%fun,F &K$r'   treturnc                     J d            )NFz*should not be called as step is overriddenr   )r#   rY   s     r%   _get_lrzPlateauLRScheduler._get_lrn   s    BBBBBr'   )r   r	   Tr
   r   r   r   r   r   Nr   r   r   NTrP   )__name__
__module____qualname____doc__r+   r>   r@   rG   intrT   rQ   rI   r   r\   __classcell__)r9   s   @r%   r   r      s       KK
 #0 0 0 0 0 0d
 
 
D D D) ) ) ) ) )  s E    % % %C Ce C C C C C C C Cr'   r   )r`   r,   typingr   	schedulerr   r   r   r'   r%   <module>re      s                       bC bC bC bC bC bC bC bC bC bCr'   