Ë
    éÓ^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õ   ø€ ô$ 	‰ÑØØØ'Ø!ØØØ!Ø!ð 	ô 		
ô "ŸK™K×4Ñ4×FÑFØ�N‰NØØØØØØð Gó 
ˆÔð !ˆŒØ,ˆÔØ�=Š=ØOS×O_Ñ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ˆ×ÑÔØ˜:Ñ%Ø+5°lÑ+CˆD×ÑÕ(ð &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Í   ø€ Ø�D—M‘MÒ!Ø<@×<MÑ<MÖN°q�4×&Ñ&¨°©Ó2ÐNˆCÐNÜ‰GÑ! #Õ&à�‰Ð*ä&/°·±×0KÑ0KÓ&Lò ;‘N�A�{Ø(,¯©¸Ñ(:�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ò 	'‰NˆAˆ{Ü˜; tÑ,Ó-ˆFØ×Ñ˜fÔ%Ø˜f u™nÑ,ˆ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ÓBˆur7   )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°(©O¸SÀ$Ð!FÑGð.ð ð.ð ð.ð ð.ð ! ™ð.ð  ð!.ð" 
õ#.ð`
˜D  c ™Nó 
ðD¨$¨s°C¨x©.ð D¸Tó Dñ)˜#ð ) x°¡ð )À$õ )ñ$ sð °H¸U±Oó ð% #ð %¨$ó %ð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   