o
    iW                     @   s   d Z ddlZddlmZ ddlmZ G dd dZG dd dZi Zd	d
 Z	dd Z
e	G dd deZe	G dd deZe	G dd deZdS )zSchedulers.    N)dynamic_import)fill_missing_argsc                   @   s   e Zd Zdd Zdd ZdS )_PrefixParserc                 C   s   || _ || _d S Nparserprefix)selfr   r    r
   N/home/ubuntu/.local/lib/python3.10/site-packages/espnet/scheduler/scheduler.py__init__
   s   
z_PrefixParser.__init__c                 K   s4   | dsJ | jj| j|dd   fi | d S )N--   )
startswithr   add_argumentr   )r	   namekwargsr
   r
   r   r      s   &z_PrefixParser.add_argumentN)__name__
__module____qualname__r   r   r
   r
   r
   r   r   	   s    r   c                   @   s~   e Zd ZdZdZdedejfddZdd Z	e
ded	ejfd
dZed	efddZe
defddZdedefddZdS )SchedulerInterfacezScheduler interface. keyargsc                 C   sT   || _ |d | j d }t| D ]\}}||r't| |t|d | qdS )Initialize class._N)r   aliasvarsitemsr   setattrlen)r	   r   r   r   kvr
   r
   r   r      s   
zSchedulerInterface.__init__c                 C   s    t | j| j d| j d| S )zGet argument without prefix.r   )getattrr   r   r   )r	   r   r
   r
   r   get_arg    s    zSchedulerInterface.get_argr   c              	   C   s8   | | j d}| t|d| d| j dd |S )zAdd arguments for CLI.z
 schedulerr   -r   )add_argument_groupr   _add_argumentsr   )clsr   r   groupr
   r
   r   add_arguments$   s   "z SchedulerInterface.add_argumentsc                 C   s   d S r   r
   r   r
   r
   r   r'   +      z!SchedulerInterface._add_argumentsc                    sJ    fdd} fdd|  D }tjdi |}t||} |S )zInitialize this class with python-level args.

        Args:
            key (str): key of hyper parameter

        Returns:
            LMinterface: A new instance of LMInterface.

        c                    s     | S r   )r*   r+   r(   r   r
   r   add;   s   z%SchedulerInterface.build.<locals>.addc                    s(   i | ]\}} d  j  d | |qS )r   )r   ).0r!   r"   r-   r
   r   
<dictcomp>>   s   ( z,SchedulerInterface.build.<locals>.<dictcomp>Nr
   )r   argparse	Namespacer   )r(   r   r   r.   r   r
   r-   r   build/   s
   

zSchedulerInterface.buildn_iterreturnc                 C   s   t  )zScale at `n_iter`.

        Args:
            n_iter (int): number of current iterations.

        Returns:
            float: current scale of learning rate.

        )NotImplementedErrorr	   r4   r
   r
   r   scaleC   s   
zSchedulerInterface.scaleN)r   r   r   __doc__r   strr1   r2   r   r$   classmethodArgumentParserr*   staticmethodr   r'   r3   intfloatr8   r
   r
   r
   r   r      s    r   c                 C   s   | j d | j t| j< | S )zRegister scheduler.:)r   r   SCHEDULER_DICTr   )r(   r
   r
   r   register_schedulerS   s   rB   c                 C   s&   t | t}t|tsJ |  d|S )zImport Scheduler class dynamically.

    Args:
        module (str): module_name:class_name or alias in `SCHEDULER_DICT`

    Returns:
        type: Scheduler class

    z& does not implement SchedulerInterface)r   rA   
issubclassr   )modulemodel_classr
   r
   r   dynamic_import_schedulerY   s   

rF   c                   @   s   e Zd ZdZdZdd ZdS )NoSchedulerzScheduler which does nothing.nonec                 C   s   dS )Scale of lr.g      ?r
   r7   r
   r
   r   r8   p   r,   zNoScheduler.scaleN)r   r   r   r9   r   r8   r
   r
   r
   r   rG   j   s    rG   c                       s>   e Zd ZdZdZedefddZ fddZdd	 Z	  Z
S )
NoamSchedulerznWarmup + InverseSqrt decay scheduler.

    Args:
        noam_warmup (int): number of warmup iterations.

    noamr   c                 C   s   | j dtddd dS )Add scheduler args.--warmup  Number of warmup iterations.typedefaulthelpNr   r>   r+   r
   r
   r   r'      s   
zNoamScheduler._add_argumentsc                    s(   t  || d| j| jd   | _dS )r            N)superr   warmup	normalize)r	   r   r   	__class__r
   r   r      s   zNoamScheduler.__init__c                 C   s&   |d7 }| j t|d || jd   S )rI   rU   g      rV   )rY   minrX   )r	   stepr
   r
   r   r8      s   zNoamScheduler.scale)r   r   r   r9   r   r=   r   r'   r   r8   __classcell__r
   r
   rZ   r   rJ   u   s    rJ   c                   @   s.   e Zd ZdZdZedefddZdd ZdS )	CyclicCosineSchedulerav  Cyclic cosine annealing.

    Args:
        cosine_warmup (int): number of warmup iterations.
        cosine_total (int): number of total annealing iterations.

    Notes:
        Proposed in https://openreview.net/pdf?id=BJYwwY9ll
        (and https://arxiv.org/pdf/1608.03983.pdf).
        Used in the GPT2 config of Megatron-LM https://github.com/NVIDIA/Megatron-LM

    cosiner   c                 C   s(   | j dtddd | j dtddd dS )	rL   rM   rN   rO   rP   z--totali z%Number of total annealing iterations.NrT   r+   r
   r
   r   r'      s   
z$CyclicCosineScheduler._add_argumentsc                 C   s,   ddl }d||j|| j  | j d  S )rI   r   Ng      ?rU   )mathcospirX   total)r	   r4   ra   r
   r
   r   r8      s   $zCyclicCosineScheduler.scaleN)	r   r   r   r9   r   r=   r   r'   r8   r
   r
   r
   r   r_      s    r_   )r9   r1   espnet.utils.dynamic_importr   espnet.utils.fill_missing_argsr   r   r   rA   rB   rF   rG   rJ   r_   r
   r
   r
   r   <module>   s    
=
