Ë
    éÓ^j
  ã                   óZ   — d Z ddlmZ ddlmZmZ ddlZddlmZ ddlm	Z	  G d„ de«      Z
y)	zú Lookahead Optimizer Wrapper.
Implementation modified from: https://github.com/alphadl/lookahead.pytorch
Paper: `Lookahead Optimizer: k steps forward, 1 step back` - https://arxiv.org/abs/1907.08610

Hacked together by / Copyright 2020 Ross Wightman
é    )ÚOrderedDict)ÚCallableÚDictN)Ú	Optimizer)Údefaultdictc                   ó„   — e Zd Zdd„Z ej
                  «       d„ «       Zd„ Z ej
                  «       d	d„«       Zd„ Z	d„ Z
y)
Ú	Lookaheadc                 óò  — t        «       | _        t        «       | _        d|cxk  rdk  sn t        d|› �«      ‚d|k  st        d|› �«      ‚t	        ||d¬«      }|| _        |j                  | _        |j                  | _        | j                  j                  |«       t        t        «      | _
        |j                  «       D ]2  \  }}| j
                  j                  D ]  }|j                  ||«       Œ Œ4 y )Ng        g      ð?zInvalid slow update rate: é   zInvalid lookahead steps: r   )Úlookahead_alphaÚlookahead_kÚlookahead_step)r   Ú_optimizer_step_pre_hooksÚ_optimizer_step_post_hooksÚ
ValueErrorÚdictÚ_base_optimizerÚparam_groupsÚdefaultsÚupdater   ÚstateÚitemsÚ
setdefault)ÚselfÚbase_optimizerÚalphaÚkr   ÚnameÚdefaultÚgroups           ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/lookahead.pyÚ__init__zLookahead.__init__   sä   € ä>I»mˆÔ&Ü?J»}ˆÔ'Ø�eÔ"˜sÔ"ÜÐ9¸%¸ÐAÓBÐBØ�AŠvÜÐ8¸¸Ð<Ó=Ð=Ü¨¸1ÈQÔOˆØ-ˆÔØ*×7Ñ7ˆÔØ&×/Ñ/ˆŒØ�‰×Ñ˜XÔ&Ü ¤Ó&ˆŒ
à%Ÿ^™^Ó-ò 	0‰MˆD�'Ø×-Ñ-×:Ñ:ò 0�Ø× Ñ   wÕ/ñ0ñ	0ó    c                 ó"  — |d   D ]‡  }|j                   €Œ| j                  j                  |   }d|vr,t        j                  |«      |d<   |d   j                  |«       |d   }|j                  ||z
  |d   ¬«       |j                  |«       Œ‰ y )NÚparamsÚlookahead_slow_buffr   )r   )Úgradr   r   ÚtorchÚ
empty_likeÚcopy_Úadd_)r   r    Úfast_pÚparam_stateÚslows        r!   Úupdate_slowzLookahead.update_slow#   s›   € à˜H‘oò 		ˆFØ�{‰{Ð"ØØ×.Ñ.×4Ñ4°VÑ<ˆKØ$¨KÑ7Ü5:×5EÑ5EÀfÓ5M�Ð1Ñ2ØÐ1Ñ2×8Ñ8¸Ô@ØÐ4Ñ5ˆDØ�I‰I�f˜t‘m¨5Ð1BÑ+CˆIÔDØ�L‰L˜Õñ		r#   c                 ó\   — | j                   j                  D ]  }| j                  |«       Œ y ©N)r   r   r/   )r   r    s     r!   Úsync_lookaheadzLookahead.sync_lookahead0   s+   € Ø×)Ñ)×6Ñ6ò 	$ˆEØ×Ñ˜UÕ#ñ	$r#   Nc                 óÌ   — | j                   j                  |«      }| j                   j                  D ]/  }|dxx   dz  cc<   |d   |d   z  dk(  sŒ| j                  |«       Œ1 |S )Nr   r   r   r   )r   Ústepr   r/   )r   ÚclosureÚlossr    s       r!   r4   zLookahead.step4   sq   € à×#Ñ#×(Ñ(¨Ó1ˆØ×)Ñ)×6Ñ6ò 	(ˆEØÐ"Ó# qÑ(Ó#ØÐ%Ñ&¨¨}Ñ)=Ñ=ÀÓBØ× Ñ  Õ'ð	(ð ˆr#   c                 ó6   — | j                   j                  «       S r1   )r   Ú
state_dict)r   s    r!   r8   zLookahead.state_dict=   s   € Ø×#Ñ#×.Ñ.Ó0Ð0r#   c                 óp   — | j                   j                  |«       | j                   j                  | _        y r1   )r   Úload_state_dictr   )r   r8   s     r!   r:   zLookahead.load_state_dict@   s*   € Ø×Ñ×,Ñ,¨ZÔ8Ø ×0Ñ0×=Ñ=ˆÕr#   )g      à?é   r1   )Ú__name__Ú
__module__Ú__qualname__r"   r(   Úno_gradr/   r2   r4   r8   r:   © r#   r!   r	   r	      sN   „ ó0ð& €U‡]�]ƒ_ñ
ó ð
ò$ð €U‡]�]ƒ_òó ðò1ó>r#   r	   )Ú__doc__Úcollectionsr   Útypingr   r   r(   Útorch.optim.optimizerr   r   r	   r@   r#   r!   ú<module>rE      s'   ðñõ $ß !ã Ý +Ý #ô3>�	õ 3>r#   