U
    ¯Ê¹j  ã                   @   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   FTNçq=
×£på?é*   )	Ú	optimizerÚ	t_initialÚlbÚubÚlr_minÚ	cycle_mulÚcycle_decayÚcycle_limitÚreturnc              
      sú   t ƒ j|d||||||d� |dks(t‚|dks4t‚||k s@t‚|dksLt‚|	dksXt‚ˆdksdt‚|ˆ _|ˆ _|ˆ _|ˆ _|ˆ _|ˆ _|ˆ _	|	ˆ _
ˆˆ _|ˆ _ˆ 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   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/scheduler/tanh_lr.pyÚ
<listcomp>I   s     z,TanhLRScheduler.__init__.<locals>.<listcomp>c                 S   s   g | ]}d ‘qS )r   r   ©r   Ú_r   r   r#   r$   L   s     )ÚsuperÚ__init__ÚAssertionErrorr   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r˜t 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   s     z+TanhLRScheduler._get_lr.<locals>.<listcomp>r   c                    s   g | ]}|ˆ  ‘qS r   r   r   )Úgammar   r#   r$   `   s     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   s     )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   
