U
    ¯Ê¹j
  ã                   @   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s4n td|› �ƒ‚d|ksJtd|› �ƒ‚t||dd�}|| _|j| _|j| _| j |¡ t	tƒ| _
| ¡ D ]"\}}| jjD ]}| ||¡ qœqŒd S )Ng        g      ð?zInvalid slow update rate: é   zInvalid lookahead steps: r   )Úlookahead_alphaÚlookahead_kÚlookahead_step)r   Z_optimizer_step_pre_hooksZ_optimizer_step_post_hooksÚ
ValueErrorÚdictÚ_base_optimizerÚparam_groupsÚdefaultsÚupdater   ÚstateÚitemsÚ
setdefault)ÚselfZbase_optimizerÚalphaÚkr   ÚnameÚdefaultÚgroup© r   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/optim/lookahead.pyÚ__init__   s    
zLookahead.__init__c                 C   sv   |d D ]h}|j d krq| jj| }d|krHt |¡|d< |d  |¡ |d }|j|| |d d� | |¡ qd S )NÚparamsZlookahead_slow_buffr   )r   )Zgradr   r   ÚtorchZ
empty_likeZcopy_Zadd_)r   r   Zfast_pZparam_stateZ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 ]2}|d  d7  < |d |d  dkr|  |¡ q|S )Nr   r
   r   r   )r   Ústepr   r"   )r   ÚclosureZlossr   r   r   r   r%   4   s    zLookahead.stepc                 C   s
   | j  ¡ S r#   )r   Ú
state_dict)r   r   r   r   r'   =   s    zLookahead.state_dictc                 C   s   | j  |¡ | j j| _d S r#   )r   Úload_state_dictr   )r   r'   r   r   r   r(   @   s    zLookahead.load_state_dict)r   r	   )N)Ú__name__Ú
__module__Ú__qualname__r   r!   Zno_gradr"   r$   r%   r'   r(   r   r   r   r   r      s   

r   )Ú__doc__Úcollectionsr   Útypingr   r   r!   Ztorch.optim.optimizerr   r   r   r   r   r   r   Ú<module>   s   