
    sh                     :    S SK r SSKJr  S/rS r " S S\5      rg)    N   )BaseSchedulerCubicSLc                 ,    [        U[        X 5      5      $ N)maxmin)xlohis      ~/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/ao/pruning/scheduler/cubic_scheduler.py_clampr   
   s    r3r:    c                   X   ^  \ rS rSrSr       SU 4S jjr\SS j5       rS rSr	U =r
$ )	r      a  Sets the sparsity level of each parameter group to the final sl
plus a given exponential function.

.. math::

    s_i = s_f + (s_0 - s_f) \cdot \left( 1 - \frac{t - t_0}{n\Delta t} \right)^3

where :math:`s_i` is the sparsity at epoch :math:`t`, :math;`s_f` is the final
sparsity level, :math:`f(i)` is the function to be applied to the current epoch
:math:`t`, initial epoch :math:`t_0`, and final epoch :math:`t_f`.
:math:`\Delta t` is used to control how often the update of the sparsity level
happens. By default,

Args:
    sparsifier (BaseSparsifier): Wrapped sparsifier.
    init_sl (int, list): Initial level of sparsity
    init_t (int, list): Initial step, when pruning starts
    delta_t (int, list): Pruning frequency
    total_t (int, list): Total number of pruning steps
    initially_zero (bool, list): If True, sets the level of sparsity to 0
        before init_t (:math:`t_0`). Otherwise, the sparsity level before
        init_t (:math:`t_0`) is set to init_sl(:math:`s_0`)
    last_epoch (int): The index of last epoch. Default: -1.
    verbose (bool): If ``True``, prints a message to stdout for
        each update. Default: ``False``.
c	                   > Xl         U R                  U5      U l        U R                  U5      U l        U R                  U5      U l        U R                  U5      U l        U R                  U5      U l        [        T	U ]!  XU5        g r   )	
sparsifier_make_sure_a_listinit_slinit_tdelta_ttotal_tinitially_zerosuper__init__)
selfr   r   r   r   r   r   
last_epochverbose	__class__s
            r   r   CubicSL.__init__*   st     %--g6,,V4--g6--g6"44^D9r   c                 f    U(       a  X#:  a  gXU-
  SX#-
  XE-  -  -
  S-  -  -   n[        XpU5      nU$ )a  "Computes the current level of sparsity.

Based on https://arxiv.org/pdf/1710.01878.pdf

Args:
    s_0: Initial level of sparsity, :math:`s_i`
    s_f: Target level of sparsity, :math:`s_f`
    t: Current step, :math:`t`
    t_0: Initial step, :math:`t_0`
    dt: Pruning frequency, :math:`\Delta T`
    n: Pruning steps, :math:`n`
    initially_zero: Sets the level of sparsity to 0 before t_0.
        If False, sets to s_0

Returns:
    The sparsity level :math:`s_t` at the current step :math:`t`
r   g      ?   )r   )s_0s_ftt_0dtnr   s_ts           r   sparsity_compute_fnCubicSL.sparsity_compute_fn@   sC    & ag3Y3!'bf)=#=!"CCCSs#
r   c                 t   U R                   (       d  [        R                  " S5        [        U R                  U R
                  U R                  U R                  U R                  U R                  5       VVVVVVs/ s H&  u  pp4pVU R                  UUU R                  UUUUS9PM(     snnnnnn$ s  snnnnnnf )NzUTo get the last sparsity level computed by the scheduler, please use `get_last_sl()`.)r#   r$   r%   r&   r'   r(   r   )_get_sl_called_within_stepwarningswarnzipr   base_slr   r   r   r   r*   r   )r   initial_sparsityfinal_sparsityinitial_epochdelta_epochinterval_epochsr   s          r   get_slCubicSL.get_slY   s    ..MM. ru##r
 
rm -o $$$"//!!- % r
 	
 
s   ;-B0)r   r   r   r   r   r   )g        r   
   d   FF)F)__name__
__module____qualname____firstlineno____doc__r   staticmethodr*   r7   __static_attributes____classcell__)r   s   @r   r   r      sB    < :,  0
 
r   )r.   base_schedulerr   __all__r   r    r   r   <module>rG      s'     ) +c
m c
r   