U
    ¯Ê¹jY  ã                   @   sF   d 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 )zu Polynomial Scheduler

Polynomial LR schedule with warmup, noise.

Hacked together by / Copyright 2021 Ross Wightman
é    Né   )Ú	Schedulerc                       sL   e Zd ZdZdejjeeeeeed	dœ‡ fdd„Z	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   FTNçq=
×£på?é*   )Ú	optimizerÚ	t_initialÚpowerÚlr_minÚ	cycle_mulÚcycle_decayÚcycle_limitÚreturnc              
      sÖ   t ƒ j|d||||||d� |dks(t‚|dks4t‚|dkrV|dkrV|dkrVt d¡ |ˆ _|ˆ _|ˆ _|ˆ _|ˆ _	|ˆ _
|ˆ _ˆˆ _|
ˆ _|ˆ _ˆ jrÀ‡ ‡fdd„ˆ j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   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   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/scheduler/poly_lr.pyÚ
<listcomp>G   s     z,PolyLRScheduler.__init__.<locals>.<listcomp>c                 S   s   g | ]}d ‘qS ©r   r   ©r   Ú_r   r   r!   r"   J   s     )ÚsuperÚ__init__ÚAssertionErrorÚ_loggerÚwarningr   r   r   r   r   r   r   r    Úwarmup_prefixÚk_decayÚbase_valuesÚwarmup_stepsZ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__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| ‰ ‡ fdd„ˆj	D ƒ}ˆj
‰|ˆjk rþ‡‡‡‡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"   N   s     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   Zlr_max)Úkr   Út_currÚt_ir   r!   r"   a   s   ÿc                    s   g | ]
}ˆ j ‘qS r   )r   r$   )r   r   r!   r"   f   s     )r   r.   r+   r   ÚmathÚfloorÚlogr   r   r-   r,   r   )r   r2   ZlrsÚiZlr_max_valuesr   )r3   r4   r   r2   r5   r6   r!   Ú_get_lrL   s(    


($


þzPolyLRScheduler._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   Úintr7   r8   )r   Zcyclesr   r   r!   Úget_cycle_lengthj   s    

z PolyLRScheduler.get_cycle_length)r   r   r   r   r   r   r   FTNr   r   r	   r   T)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtorchZoptimZ	Optimizerr=   Úfloatr'   r;   r>   Ú__classcell__r   r   r/   r!   r      s8   	               îí4r   )
rB   r7   ÚloggingrC   Z	schedulerr   Ú	getLoggerr?   r)   r   r   r   r   r!   Ú<module>   s   
