a
    d                     @   sN   d Z ddlZddlZddlZddlZddlmZ ee	Z
G dd deZdS )zv TanH Scheduler

TanH schedule with warmup, cycle/restarts, noise.

Hacked together by / Copyright 2021 Ross Wightman
    N   )	Schedulerc                       sN   e Zd ZdZdejjeeeeeeed
d	 fddZ	dd Z
dddZ  ZS )TanhLRSchedulerzu
    Hyberbolic-Tangent decay with restarts.
    This is described in the paper https://arxiv.org/abs/1806.01593
                @              ?r   r   FTNq=
ףp?*   )		optimizer	t_initiallbublr_min	cycle_mulcycle_decaycycle_limitreturnc              
      s   t  j|d||||||d |dks(J |dks4J ||k s@J |dksLJ |	dksXJ dksdJ | _| _| _| _| _| _| _|	 _	 _
| _ j	r jr jn
  j	} fdd|D  _t   j
 ndd  jD  _d S )Nlr)Zparam_group_fieldt_in_epochsnoise_range_t	noise_pct	noise_std
noise_seed
initializer   c                    s   g | ]}|  j  qS  )warmup_t.0vselfwarmup_lr_initr   _/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/scheduler/tanh_lr.py
<listcomp>I       z,TanhLRScheduler.__init__.<locals>.<listcomp>c                 S   s   g | ]}d qS )r   r   r   _r   r   r#   r$   L   r%   )super__init__r   r   r   r   r   r   r   r   r"   warmup_prefixbase_values_get_lrwarmup_stepsZupdate_groups)r!   r   r   r   r   r   r   r   r   r   r"   r*   r   r   r   r   r   r   Zt_v	__class__r    r#   r)      s>    zTanhLRScheduler.__init__c                    s  j k r"fddjD }njr2j  jdkrttdj dj   j}j| j }dj|  dj  j  }nj }j}j|  }|jk rj	|   fddj
D }|| fdd|D }nfddj
D }|S )Nc                    s   g | ]} j |  qS r   )r"   )r   s)r!   tr   r#   r$   P   r%   z+TanhLRScheduler._get_lr.<locals>.<listcomp>r   c                    s   g | ]}|  qS r   r   r   )gammar   r#   r$   `   r%   c              
      sB   g | ]:} j d | j   dt jd   j     qS )g      ?r   r   )r   mathtanhr   r   )r   Zlr_max)r!   trr   r#   r$   c   s   c                    s   g | ]
} j qS r   )r   r&   )r!   r   r#   r$   h   r%   )r   r-   r*   r   r3   floorlogr   r   r   r+   )r!   r1   ZlrsiZt_iZt_currZlr_max_valuesr   )r2   r!   r1   r5   r#   r,   N   s(    


($


zTanhLRScheduler._get_lrc                 C   sR   t d|p| j}| jdkr$| j| S tt| j | j| d  d| j  S d S )Nr   r   )maxr   r   r   intr3   r6   )r!   Zcyclesr   r   r#   get_cycle_lengthk   s    

z TanhLRScheduler.get_cycle_length)r   r   r   r   r   r   r   r   FTNr	   r   r
   T)r   )__name__
__module____qualname____doc__torchZoptimZ	Optimizerr:   floatr)   r,   r;   __classcell__r   r   r.   r#   r      s:   	               
6r   )r?   loggingr3   numpynpr@   Z	schedulerr   	getLoggerr<   Z_loggerr   r   r   r   r#   <module>   s   
