
    Ng
                     b    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
dS )	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
dS )	Lookahead      ?   c                 
   t                      | _        t                      | _        d|cxk    rdk    sn t          d|           d|k    st          d|           t	          ||d          }|| _        |j        | _        |j        | _        | j                            |           t          t                    | _
        |                                D ]*\  }}| j        j        D ]}|                    ||           +d S )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/html/ai-engine/env/lib/python3.11/site-packages/timm/optim/lookahead.py__init__zLookahead.__init__   s    >Imm&?J}}'e""""s""""A%AABBBAvv<<<===1QOOO-*7&/X&&& &&
%^^-- 	0 	0MD'-: 0 0  w////0	0 	0    c                 6   |d         D ]}|j         
| j        j        |         }d|vr2t          j        |          |d<   |d                             |           |d         }|                    ||z
  |d                    |                    |           d S )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{".4V<K$K775:5Ef5M5M121288@@@45DIIftm51B+CIDDDLL		 		r%   c                 N    | j         j        D ]}|                     |           d S N)r   r   r1   )r   r"   s     r#   sync_lookaheadzLookahead.sync_lookahead0   s8    )6 	$ 	$EU####	$ 	$r%   Nc                     | j                             |          }| j         j        D ]<}|dxx         dz  cc<   |d         |d         z  dk    r|                     |           =|S )Nr   r   r   r   )r   stepr   r1   )r   closurelossr"   s       r#   r6   zLookahead.step4   s    #((11)6 	( 	(E"###q(###%&})==BB  '''r%   c                 4    | j                                         S r3   )r   
state_dict)r   s    r#   r:   zLookahead.state_dict=   s    #..000r%   c                 \    | j                             |           | j         j        | _        d S r3   )r   load_state_dictr   )r   r:   s     r#   r<   zLookahead.load_state_dict@   s-    ,,Z888 0=r%   )r
   r   r3   )__name__
__module____qualname__r$   r*   no_gradr1   r4   r6   r:   r<    r%   r#   r	   r	      s        0 0 0 0& U]__
 
 _
$ $ $ U]__   _1 1 1> > > > >r%   r	   )__doc__collectionsr   typingr   r   r*   torch.optim.optimizerr   r   r	   rA   r%   r#   <module>rF      s     $ # # # # # ! ! ! ! ! ! ! !  + + + + + + # # # # # #3> 3> 3> 3> 3>	 3> 3> 3> 3> 3>r%   