
    kh
                     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           P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/optim/lookahead.py__init__zLookahead.__init__   s    >Im&?J}'e"s"9%ABBAv8<==1QO-*77&//X& &
%^^- 	0MD'--:: 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    Ho 		F{{"..44V<K$K75:5E5Ef5M121288@45DIIftm51B+CIDLL		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#   