
    RЦi
                     Z    S r SSKJr  SSKJrJr  SSKrSSKJr  SSKJ	r	   " S S\5      r
g)	zLookahead 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                       \ rS rSrS
S jr\R                  " 5       S 5       rS r\R                  " 5       SS j5       r	S r
S rS	rg)	Lookahead   c                    [        5       U l        [        5       U l        SUs=::  a  S::  d  O  [        SU 35      eSU::  d  [        SU 35      e[	        X#SS9nXl        UR                  U l        UR                  U l        U R                  R                  U5        [        [        5      U l
        UR                  5        H3  u  pVU R
                  R                   H  nUR                  XV5        M     M5     g )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           S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/optim/lookahead.py__init__Lookahead.__init__   s    >Im&?J}'e"s"9%ABBAv8<==QO-*77&//X& &
%^^-MD--::  / ; .    c                 (   US    H  nUR                   c  M  U R                  R                  U   nSU;  a-  [        R                  " U5      US'   US   R                  U5        US   nUR                  X$-
  US   S9  UR                  U5        M     g )Nparamslookahead_slow_buffr   )r   )gradr   r   torch
empty_likecopy_add_)r   r!   fast_pparam_stateslows        r"   update_slowLookahead.update_slow#   s    HoF{{"..44V<K$K75:5E5Ef5M121288@45DIIfm51B+CIDLL &r%   c                 `    U R                   R                   H  nU R                  U5        M     g N)r   r   r1   )r   r!   s     r"   sync_lookaheadLookahead.sync_lookahead0   s&    ))66EU# 7r%   Nc                     U R                   R                  U5      nU R                   R                   H2  nUS==   S-  ss'   US   US   -  S:X  d  M!  U R                  U5        M4     U$ )Nr   r   r   r   )r   stepr   r1   )r   closurelossr!   s       r"   r8   Lookahead.step4   sl    ##((1))66E"#q(#%&})==B  ' 7 r%   c                 6    U R                   R                  5       $ r4   )r   
state_dict)r   s    r"   r=   Lookahead.state_dict=   s    ##..00r%   c                 p    U R                   R                  U5        U R                   R                  U l        g r4   )r   load_state_dictr   )r   r=   s     r"   r@   Lookahead.load_state_dict@   s*    ,,Z8 00==r%   )r   r   r   r   r   r   )g      ?   r4   )__name__
__module____qualname____firstlineno__r#   r*   no_gradr1   r5   r8   r=   r@   __static_attributes__ r%   r"   r	   r	      sJ    0& ]]_
 
$ ]]_ 1>r%   r	   )__doc__collectionsr   typingr   r   r*   torch.optim.optimizerr   r   r	   rI   r%   r"   <module>rN      s'    $ !  + #3>	 3>r%   