a
    d	                     @   s8   d 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
    N)	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   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 ]}|	|| qq|d S )Ng        g      ?zInvalid slow update rate:    zInvalid lookahead steps: r   )lookahead_alphalookahead_klookahead_step)

ValueErrordict_base_optimizerparam_groupsdefaultsupdater   stateitems
setdefault)selfZbase_optimizeralphakr   namedefaultgroup r   ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/optim/lookahead.py__init__   s    
zLookahead.__init__c                 C   sv   |d D ]h}|j d u rq| jj| }d|v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_lookahead+   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"   /   s    zLookahead.stepc                 C   s
   | j  S r    )r   
state_dict)r   r   r   r   r$   8   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__r   Ztorch.optim.optimizerr   collectionsr   r   r   r   r   r   <module>   s   