U
    Kºc  ã                   @   s.   d dl Z ddlmZ dgZG dd„ deƒZdS )é    Né   )ÚBaseSchedulerÚLambdaSLc                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )	r   aè  Sets the sparsity level of each parameter group to the final sl
    times a given function. When last_epoch=-1, sets initial sl as zero.
    Args:
        sparsifier (BaseSparsifier): Wrapped sparsifier.
        sl_lambda (function or list): A function which computes a multiplicative
            factor given an integer parameter epoch, or a list of such
            functions, one for each group in sparsifier.param_groups.
        last_epoch (int): The index of last epoch. Default: -1.
        verbose (bool): If ``True``, prints a message to stdout for
            each update. Default: ``False``.
    Example:
        >>> # Assuming sparsifier has two groups.
        >>> lambda1 = lambda epoch: epoch // 30
        >>> lambda2 = lambda epoch: 0.95 ** epoch
        >>> # xdoctest: +SKIP
        >>> scheduler = LambdaSL(sparsifier, sl_lambda=[lambda1, lambda2])
        >>> for epoch in range(100):
        >>>     train(...)
        >>>     validate(...)
        >>>     scheduler.step()
    éÿÿÿÿFc                    s|   || _ t|tƒs.t|tƒs.|gt|jƒ | _n6t|ƒt|jƒkrZtd t|jƒt|ƒ¡ƒ‚t|ƒ| _t	t
| ƒ |||¡ d S )Nz"Expected {} lr_lambdas, but got {})Ú
sparsifierÚ
isinstanceÚlistÚtupleÚlenÚgroupsÚ
sl_lambdasÚ
ValueErrorÚformatÚsuperr   Ú__init__)Úselfr   Z	sl_lambdaÚ
last_epochÚverbose©Ú	__class__© úP/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/sparsity/scheduler/lambda_scheduler.pyr      s     ÿ
zLambdaSL.__init__c                    s,   ˆ j st d¡ ‡ fdd„tˆ jˆ jƒD ƒS )NzUTo get the last sparsity level computed by the scheduler, please use `get_last_sl()`.c                    s   g | ]\}}||ˆ j ƒ ‘qS r   )r   )Ú.0ZlmbdaÚbase_sl©r   r   r   Ú
<listcomp>/   s   ÿz#LambdaSL.get_sl.<locals>.<listcomp>)Z_get_sl_called_within_stepÚwarningsÚwarnÚzipr   r   r   r   r   r   Úget_sl*   s    ÿ
ÿzLambdaSL.get_sl)r   F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__r   r   r   r   r      s   )r   Zbase_schedulerr   Ú__all__r   r   r   r   r   Ú<module>   s   