o
    ॵi	                     @   s    d dl mZ G dd deZdS )    )_LRSchedulerc                       sZ   e Zd ZdZ		d fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	e
dd Z  ZS )
BaseWarmupzBase warmup scheduler

    Args:
        base_scheduler (torch.optim._LRScheduler): an instance of torch.optim._LRScheduler type
        warmup_iters (int | list): Warmup iterations
        last_epoch (int): The index of last epoch.
    Fc                    s4   || _ || _| j j}d| _tt| j|||d d S )NT)
last_epochverbose)base_schedulerwarmup_iters	optimizer_is_init_stepsuperr   __init__)selfr   r   r   r   r	   	__class__ _/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/lrscheduler/warmup/base.pyr      s   

zBaseWarmup.__init__c                 C   
   | j  S N)r   get_lrr   r   r   r   r         
zBaseWarmup.get_lrc                 C   r   r   )r   
state_dictr   r   r   r   r      r   zBaseWarmup.state_dictc                 C   s   | j |S r   )r   load_state_dict)r   r   r   r   r   r   !   s   zBaseWarmup.load_state_dictc                    s   |  | jjd  t ttfr  fddtt| jj	D  n#t t
tfs+J dt t| jj	ksCJ dt t| jj	t| jj	D ]\}}|d   | 9  < qIdS )z"Scale the learning rates.
           c                    s   g | ]} qS r   r   ).0_scale_valuer   r   
<listcomp>*   s    z$BaseWarmup.scale.<locals>.<listcomp>z Only support list or tuple type!zSize mismatch {} != {}lrN)get_warmup_scaler   _step_count
isinstanceintfloatrangelenr	   param_groupslisttupleformat	enumerate)r   igroupr   r   r   scale$   s,   

zBaseWarmup.scalec                 O   sn   | j j| jkr| j j|i |S t| jj| jD ]\}}||d< q| jr(d| _n	| j j|i | | 	  dS )zs
        When ``self.base_scheduler._step_count`` is less than ``self.warmup_iters``, multiply lr by scale
        r   FN)
r   r!   r   stepzipr	   r'   base_lrsr
   r.   )r   argskwargsr-   r   r   r   r   r/   7   s   
zBaseWarmup.stepc                 C   s   d S r   r   )r   cur_iterr   r   r   r    I   s   zBaseWarmup.get_warmup_scale)r   F)__name__
__module____qualname____doc__r   r   r   r   r.   r/   classmethodr    __classcell__r   r   r   r   r      s    r   N)torch.optim.lr_schedulerr   r   r   r   r   r   <module>   s   