o
    پi
                     @   sT   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 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                   @   sP   e Zd ZdddZe dd Zdd Ze dd
dZdd Z	dd Z
d	S )	Lookahead      ?   c                 C   s   t  | _t  | _d|  krdksn td| d|ks%td| t||dd}|| _|j| _|j| _| j| t	t| _
| D ]\}}| jjD ]}||| qNqFd 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group r    H/home/ubuntu/.local/lib/python3.10/site-packages/timm/optim/lookahead.py__init__   s"   
zLookahead.__init__c                 C   sv   |d D ]4}|j d u rq| jj| }d|vr$t||d< |d | |d }|j|| |d d || qd S )Nparamslookahead_slow_buffr   )r   )gradr   r   torch
empty_likecopy_add_)r   r   fast_pparam_stateslowr    r    r!   update_slow#   s   
zLookahead.update_slowc                 C   s   | j jD ]}| | qd S N)r   r   r-   )r   r   r    r    r!   sync_lookahead0   s   zLookahead.sync_lookaheadNc                 C   sL   | j |}| j jD ]}|d  d7  < |d |d  dkr#| | q
|S )Nr   r
   r   r   )r   stepr   r-   )r   closurelossr   r    r    r!   r0   4   s   
zLookahead.stepc                 C   s
   | j  S r.   )r   
state_dict)r   r    r    r!   r3   =   s   
zLookahead.state_dictc                 C   s   | j | | j j| _d S r.   )r   load_state_dictr   )r   r3   r    r    r!   r4   @   s   zLookahead.load_state_dict)r   r	   r.   )__name__
__module____qualname__r"   r&   no_gradr-   r/   r0   r3   r4   r    r    r    r!   r      s    

r   )__doc__collectionsr   typingr   r   r&   torch.optim.optimizerr   r   r   r    r    r    r!   <module>   s    