o
    پi                     @   sR   d Z ddlZddlZddlmZ ddlZddlmZ ee	Z
G dd deZdS )zu Polynomial Scheduler

Polynomial LR schedule with warmup, 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d	f fddZ	dede
e fddZdddZ  ZS )PolyLRSchedulerz Polynomial LR Scheduler w/ warmup, noise, and k-decay

    k-decay option based on `k-decay: A New Method For Learning Rate Schedule` - https://arxiv.org/abs/2004.05909
          ?              ?r   r   FTNq=
ףp?*   	optimizer	t_initialpowerlr_min	cycle_mulcycle_decaycycle_limitreturnc              
      s   t  j|d||||||d |dksJ |dksJ |dkr+|dkr+|dkr+td | _| _| _| _| _| _	| _
 _|
 _| _ j
ra fdd j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   r   zjCosine annealing scheduler will have no effect on the learning rate since t_initial = t_mul = eta_mul = 1.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/poly_lr.py
<listcomp>H       z,PolyLRScheduler.__init__.<locals>.<listcomp>c                 S   s   g | ]}d qS r   r   r   _r   r   r#   r$   K   s    )super__init___loggerwarningr   r   r   r   r   r   r   r"   warmup_prefixk_decaybase_valueswarmup_stepsupdate_groups)r!   r   r   r   r   r   r   r   r   r"   r-   r   r   r   r   r   r.   r   	__class__r    r#   r*      s8   
zPolyLRScheduler.__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|   fddj	D }j
|jk r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$   O   r%   z+PolyLRScheduler._get_lr.<locals>.<listcomp>r   c                    s   g | ]}|  qS r   r   r   )gammar   r#   r$   ^   s    c                    s6   g | ]}j |j  d       j   qS r&   )r   r   )r   lr_max)kr!   t_currt_ir   r#   r$   b   s    (c                    s   g | ]} j qS r   )r   r'   )r!   r   r#   r$   g   s    )r   r0   r-   r   mathfloorlogr   r   r/   r.   r   )r!   r4   lrsilr_max_valuesr   )r6   r8   r!   r4   r9   r:   r#   _get_lrM   s,   


($


zPolyLRScheduler._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   intr;   r<   r-   r   )r!   cyclesr4   r   r   r#   get_cycle_lengthk   s
   
*z PolyLRScheduler.get_cycle_length)r   r   r   r   r   r   r   FTNr	   r   r
   r   T)r   )__name__
__module____qualname____doc__torchoptim	OptimizerrC   floatr*   r   rA   rE   __classcell__r   r   r2   r#   r      sH    	4r   )rI   r;   loggingtypingr   rJ   	schedulerr   	getLoggerrF   r+   r   r   r   r   r#   <module>   s    
