
    RЦi_                     R    S r SSKrSSKJrJrJrJrJrJr  SSK	J
r
   " S S\
5      rg)zPlateau 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            !       |  ^  \ rS rSrSr              S!S\R                  R                  S\S\	S\S\	S	\	S
\S\S\
S\\\	   \\	\	4   \	S4   S\
S\S\S\\	   S\SS4 U 4S jjjrS\\
\4   4S jrS\\
\4   SS4S jrS"S\	S\\   SS4U 4S jjjrS"S\	S\\   4S jjrS\	SS4S jrS\	S\\   4S jrS rU =r$ )#PlateauLRScheduler   zADecay 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U ]  USU
UUUUUS9  [        R                  R                  R                  U R                  UUUUU	US9U l        X`l        Xpl        U R                  (       aL  U R                   Vs/ s H  nUU-
  U R                  -  PM     snU l
        [         TU ]-  U R                  5        O"U R                   Vs/ s H  nSPM     snU l
        S U l        g s  snf s  snf )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                     X/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/scheduler/plateau_lr.pyr%   PlateauLRScheduler.__init__   s    $ 	'!!! 	 		
 "KK44FFNN G 
 !,==OSO_O_ `O_!!n"4!EO_ `DG!$"5"56,0,<,< =,<q,< =D	 !a !>s   =C%	C*c                 \    U R                   R                  U R                   R                  S.$ )N)best
last_epochr(   r5   r6   )r.   s    r2   
state_dictPlateauLRScheduler.state_dict@   s*    %%**++66
 	
    r8   c                 b    US   U R                   l        SU;   a  US   U R                   l        g g )Nr5   r6   r7   )r.   r8   s     r2   load_state_dict"PlateauLRScheduler.load_state_dictF   s5    !+F!3:%+5l+CD( &r:   epochmetricc                   > XR                   ::  a:  U R                   Vs/ s H  o0R                  X-  -   PM     nn[        TU ]  U5        g U R
                  bA  [        U R                  R                  5       H  u  pVU R
                  U   US'   M     S U l        Ub  U R                  R                  U5        U R                  U5      (       a  U R                  U5        g g s  snf Nr   )r   r+   r   r$   r,   r-   	enumerater   param_groupsr(   step_is_apply_noise_apply_noise)r.   r>   r?   slrsiparam_groupr1   s          r2   rD   PlateauLRScheduler.stepL   s    MM!<@<M<MN<Mq&&2<MCNG!#&*&/0K0K&LNA(,(:K% 'M"& !!!&&v.##E**!!%( + Os   C num_updatesc                     g N )r.   rL   r?   s      r2   step_updatePlateauLRScheduler.step_update^   s    r:   c                     U R                  U5      n/ n[        U R                  R                  5       H/  u  pE[	        US   5      nUR                  U5        XfU-  -   nXuS'   M1     X0l        g rA   )_calculate_noiserB   r   rC   floatappendr-   )r.   r>   noiser-   rI   rJ   old_lrnew_lrs           r2   rF   PlateauLRScheduler._apply_noisea   sm    %%e, 
'(C(CDNA;t,-Ff%un,F &	 E
 %r:   tc                      S5       e)Nz*should not be called as step is overriddenrO   )r.   rZ   s     r2   _get_lrPlateauLRScheduler._get_lrn   s    BBBur:   )r(   r-   r   r+   r   )g?
   g-C6?r   r           r_   maxNnormalgq=
ףp?g      ?NTrN   )__name__
__module____qualname____firstlineno____doc__r&   r'   	OptimizerrT   intstrr   r   r   r   boolr%   r   r   r8   r<   rD   rP   rF   r\   __static_attributes____classcell__)r1   s   @r2   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 Cr:   r   )rf   r&   typingr   r   r   r   r   r   	schedulerr
   r   rO   r:   r2   <module>ro      s(     : :  bC bCr:   