o
    ¡¿¯i‹
  ã                   @   sR   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 G dd„ dee	ƒZ
dS )	z3Step (with Warm up) learning rate scheduler module.é    )ÚUnionN)Ú_LRScheduler)Úcheck_argument_types)ÚAbsBatchStepSchedulerc                       sb   e Zd ZdZ					ddejjdeee	f d	ed
ede	def‡ fdd„Z
dd„ Zdd„ Z‡  ZS )ÚWarmupStepLRa  The WarmupStepLR scheduler.

    This scheduler is the combination of WarmupLR and StepLR:

    WarmupLR:
        lr = optimizer.lr * warmup_step ** 0.5
             * min(step ** -0.5, step * warmup_step ** -1.5)
    WarmupStepLR:
        if step <= warmup_step:
            lr = optimizer.lr * warmup_step ** 0.5
                 * min(step ** -0.5, step * warmup_step ** -1.5)
        else:
            lr = optimizer.lr * (gamma ** (epoch//step_size))

    Note that the maximum lr equals to optimizer.lr in this scheduler.

    é¨a  é'  é   çš™™™™™¹?éÿÿÿÿÚ	optimizerÚwarmup_stepsÚsteps_per_epochÚ	step_sizeÚgammaÚ
last_epochc                    sT   t ƒ sJ ‚|| _d| _d| _|| _|| | _|d | _|| _|| _t	ƒ  
||¡ d S )Nr   r   )r   r   Ústep_numÚ	epoch_numr   Úwarmup_epochÚlr_scaler   r   ÚsuperÚ__init__)Úselfr   r   r   r   r   r   ©Ú	__class__© úU/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/schedulers/warmup_step_lr.pyr      s   


zWarmupStepLR.__init__c              
   C   s.   | j j› d| j› d| j› d| j› d| j› d
S )Nz(warmup_steps=z, steps_per_epoch=z, step_size=z, gamma=ú))r   Ú__name__r   r   r   r   ©r   r   r   r   Ú__repr__?   s   ÿþþÿzWarmupStepLR.__repr__c                    s`   ˆ  j d7  _ ˆ j ˆ j dkrˆ  jd7  _ˆ j ˆ jkr&‡ fdd„ˆ jD ƒS ‡ fdd„ˆ jD ƒS )Nr	   r   c                    s   g | ]
}|ˆ j  ˆ j ‘qS r   )r   r   ©Ú.0Úlrr   r   r   Ú
<listcomp>L   s    z'WarmupStepLR.get_lr.<locals>.<listcomp>c                    s(   g | ]}|ˆ j ˆ jˆ j ˆ j   ‘qS r   )r   r   r   r   r!   r   r   r   r$   N   s    þÿÿ)r   r   r   r   Úbase_lrsr   r   r   r   Úget_lrF   s   
ýzWarmupStepLR.get_lr)r   r   r	   r
   r   )r   Ú
__module__Ú__qualname__Ú__doc__ÚtorchÚoptimÚ	Optimizerr   ÚintÚfloatr   r    r&   Ú__classcell__r   r   r   r   r      s,    ÷þ
üúùø	÷!r   )r)   Útypingr   r*   Útorch.optim.lr_schedulerr   Ú	typeguardr   Ú espnet2.schedulers.abs_schedulerr   r   r   r   r   r   Ú<module>   s    