o
    پi{                     @   sZ   d Z ddlZddlZddlZddlZddlm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)List   )	Schedulerc                       s   e Zd ZdZ												
					ddejjdedededededededd
f fddZ	dede
e f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sJ ||k s J |dks&J |	dks,J dks2J | _| _| _| _| _| _| _|	 _	 _
| _ j	rs jrY jn  j	} fdd|D  _t   j
 d S dd  jD  _d S )Nlr)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   J/home/ubuntu/.local/lib/python3.10/site-packages/timm/scheduler/tanh_lr.py
<listcomp>J       z,TanhLRScheduler.__init__.<locals>.<listcomp>c                 S   s   g | ]}d qS )r   r   r    _r   r   r%   r&   M   s    )super__init__r   r   r   r   r   r   r   r   r$   warmup_prefixbase_values_get_lrwarmup_stepsupdate_groups)r#   r   r   r   r   r   r   r   r   r   r$   r,   r   r   r   r   r   r   t_v	__class__r"   r%   r+      s>   zTanhLRScheduler.__init__tc                    s  j k rfddjD }|S jrj  jdkrMt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 }|S fddj
D }|S )Nc                    s   g | ]	} j |  qS r   )r$   )r    s)r#   r4   r   r%   r&   Q   r'   z+TanhLRScheduler._get_lr.<locals>.<listcomp>r   c                    s   g | ]}|  qS r   r   r   )gammar   r%   r&   a   s    c              
      sB   g | ]} j d | j   dt jd   j     qS )g      ?r   r	   )r   mathtanhr   r   )r    lr_max)r#   trr   r%   r&   d   s    4c                    s   g | ]} j qS r   )r   r(   )r#   r   r%   r&   i   s    )r   r/   r,   r   r7   floorlogr   r   r   r-   )r#   r4   lrsit_it_currlr_max_valuesr   )r6   r#   r4   r:   r%   r.   O   s,   


($


zTanhLRScheduler._get_lrc                 C   sd   t d|p| j}| jdkr| j| }ntt| j | j| d  d| j  }| jr0|| j S |S )Nr   r	   )	maxr   r   r   intr7   r;   r,   r   )r#   cyclesr4   r   r   r%   get_cycle_lengthl   s
   
*z TanhLRScheduler.get_cycle_length)r   r   r   r	   r	   r   r   r   FTNr
   r	   r   T)r   )__name__
__module____qualname____doc__torchoptim	OptimizerrC   floatr+   r   r.   rE   __classcell__r   r   r2   r%   r      sL    		6r   )rI   loggingr7   numpynprJ   typingr   	schedulerr   	getLoggerrF   _loggerr   r   r   r   r%   <module>   s    
