
    ^j_                     R    d Z ddlZddlmZmZmZmZmZ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)AnyDictListOptionalTupleUnion   )	Schedulerc            !       \    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddej
                  j                  dededededed	ed
ede	de
ee   eeef   edf   de	dededee   deddf  fdZdee	ef   fdZdee	ef   ddfdZd dedee   ddf fdZd dedee   fdZdeddf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.N	optimizer
decay_rate
patience_t	threshold
cooldown_twarmup_twarmup_lr_initlr_minmodenoise_range_t
noise_type	noise_pct	noise_std
noise_seed
initializereturnc           
         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)r   r   r   r   r   r   )patiencefactorr   cooldownr   min_lrr	   )super__init__torchoptimlr_schedulerReduceLROnPlateaur   r   r   base_valueswarmup_stepsupdate_groups
restore_lr)selfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   v_	__class__s                     d/var/www/ramen.bs-engineer-server.com/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'   r3   r4   )r-   s    r1   
state_dictzPlateauLRScheduler.state_dict@   s*    %%**++66
 	
    r6   c                 ^    |d   | j                   _        d|v r|d   | j                   _        y y )Nr3   r4   r5   )r-   r6   s     r1   load_state_dictz"PlateauLRScheduler.load_state_dictF   s5    !+F!3:%+5l+CD( &r7   epochmetricc                    || 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-   r:   r;   slrsiparam_groupr0   s          r1   r@   zPlateauLRScheduler.stepL   s    DMM!<@<M<MNq4&&2NCNG!#&*&/0K0K&L ;NA{(,(:K%;"& !!!&&v.##E*!!%( + Os   Cnum_updatesc                      y N )r-   rG   r;   s      r1   step_updatezPlateauLRScheduler.step_update^   s    r7   c                     | j                  |      }g }t        | j                  j                        D ]1  \  }}t	        |d         }|j                  |       |||z  z   }||d<   3 || _        y r=   )_calculate_noiser>   r   r?   floatappendr,   )r-   r:   noiser,   rE   rF   old_lrnew_lrs           r1   rB   zPlateauLRScheduler._apply_noisea   sy    %%e, 
'(C(CD 	'NA{;t,-Ff%fun,F &K		'
 %r7   tc                     J d       )Nz*should not be called as step is overriddenrJ   )r-   rS   s     r1   _get_lrzPlateauLRScheduler._get_lrn   s    BBBur7   )g?
   g-C6?r   r           rW   maxNnormalgq=
ףp?g      ?NTrI   )__name__
__module____qualname____doc__r%   r&   	OptimizerrN   intstrr   r   r   r   boolr$   r   r   r6   r9   r@   rK   rB   rU   __classcell__)r0   s   @r1   r   r      s   K
 !$ #$&JN&#"(,#!.{{,,. . 	.
 . . . ". . . !cE#s(OS$!FG. . . . !.  !." 
#.`
DcN 
D$sCx. DT D)# )x )$ )$s HUO %# %$ %C Ce Cr7   r   )r]   r%   typingr   r   r   r   r   r   	schedulerr
   r   rJ   r7   r1   <module>re      s(     : :  bC bCr7   