
    sg~                     F    d dl Z d dlZd dlmZ d dlmZ dgZ G d d      Zy)    N)wraps)BaseSparsifierBaseSchedulerc                   H    e Zd ZddZd Zd Zd Zd ZddZd Z	dd	Z
d
 Zy)r   c                    t        |t              s!t        t        |      j                   d      || _        |j                  D cg c]  }|d   	 c}| _        || _        d } || j
                  j                        | j
                  _	        d| j
                  _
        d| _
        || _        d| _        | j                          y c c}w )Nz6 is not an instance of torch.ao.pruning.BaseSparsifiersparsity_levelc                     t        | dd      r| S t        j                  | j                        | j                          j
                  ~ t              fd       }d|_        |S )N_with_counterFc                  p            }|xj                   dz  c_         j                  |      } || i |S )N   )_step_count__get__)argskwargsinstancewrappedclsfuncinstance_refs       \/var/www/html/venv/lib/python3.12/site-packages/torch/ao/pruning/scheduler/base_scheduler.pywrapperz=BaseScheduler.__init__.<locals>.with_counter.<locals>.wrapper+   s;    '>$$)$,,x5///    T)getattrweakrefref__self____func__	__class__r   r
   )methodr   r   r   r   s     @@@r   with_counterz,BaseScheduler.__init__.<locals>.with_counter   sf    v6 #;;v7L??D.**C4[0 0 %)G!Nr   r   F)
isinstancer   	TypeErrortype__name__
sparsifiergroupsbase_sl
last_epochstepr   verbose_get_sl_called_within_step)selfr%   r(   r*   groupr    s         r   __init__zBaseScheduler.__init__   s    *n5
#,,--cd  % >H=N=NOE./O$
	2  ,DOO,@,@A&'# ! 16'		O Ps   Cc                 v    | j                   j                         D ci c]  \  }}|dk7  s|| c}}S c c}}w )zReturns the state of the scheduler as a :class:`dict`.

        It contains an entry for every variable in self.__dict__ which
        is not the sparsifier.
        r%   )__dict__items)r,   keyvalues      r   
state_dictzBaseScheduler.state_dictA   s=     *.)<)<)>
%3#BUCJ
 	
 
s   55c                 :    | j                   j                  |       y)zLoads the schedulers state.

        Args:
            state_dict (dict): scheduler state. Should be an object returned
                from a call to :meth:`state_dict`.
        N)r0   update)r,   r4   s     r   load_state_dictzBaseScheduler.load_state_dictK   s     	Z(r   c                     | j                   S )z9Return last computed sparsity level by current scheduler.)_last_slr,   s    r   get_last_slzBaseScheduler.get_last_slT   s    }}r   c                 P    | j                   st        j                  d       t        )NzUTo get the last sparsity level computed by the scheduler, please use `get_last_sl()`.)r+   warningswarnNotImplementedErrorr:   s    r   get_slzBaseScheduler.get_slX   s&     ..MM. "!r   Nc           	      d    |r.|t        d| d|dd       yt        d|dd| d|dd       yy)	z#Display the current sparsity level.Nz"Adjusting sparsity level of group z to z.4e.zEpoch 5dz$: adjusting sparsity level of group )print)r,   
is_verboser-   slepochs        r   print_slzBaseScheduler.print_slc   sS    }:5'bXQOPU2J&J5'QUVXY\U]]^_	 r   c                     | j                   j                  dz   }|dz  }|d| j                   dz  }|d| j                   dz  }|dz  }|S )Nz (
zSparsifier z    base_sl: ))r   r$   r%   r'   )r,   format_strings     r   __repr__zBaseScheduler.__repr__m   s_    //$6;t&7r::=b99r   c                    | j                   dk(  rnt        | j                  j                  d      st	        j
                  dt               n3| j                  j                   dk  rt	        j
                  dt               | xj                   dz  c_          G d d      } ||       5  | xj                  dz  c_        | j                         }d d d        t        t        | j                  j                              D ]-  \  }}|\  }}||d<   | j                  | j                  |||       / | j                  j                  D cg c]  }|d   	 c}| _        d| j                  _        y # 1 sw Y   xY wc c}w )	Nr   r
   zSeems like `sparsifier.step()` has been overridden after sparsity scheduler initialization. Please, make sure to call `sparsifier.step()` before `scheduler.step()`.zDetected call of `scheduler.step()` before `sparsifier.step()`. You have to make sure you run the sparsifier.step() BEFORE any calls to the scheduler.step().c                       e Zd Zd Zd Zd Zy)/BaseScheduler.step.<locals>._enable_get_sl_callc                     || _         y N)o)r,   rS   s     r   r.   z8BaseScheduler.step.<locals>._enable_get_sl_call.__init__   s	    r   c                 (    d| j                   _        | S )NTrS   r+   r:   s    r   	__enter__z9BaseScheduler.step.<locals>._enable_get_sl_call.__enter__   s    481r   c                 &    d| j                   _        y )NFrU   )r,   r#   r3   	tracebacks       r   __exit__z8BaseScheduler.step.<locals>._enable_get_sl_call.__exit__   s    491r   N)r$   
__module____qualname__r.   rV   rY    r   r   _enable_get_sl_callrP      s    :r   r]   r   T)r   hasattrr%   r)   r=   r>   UserWarningr(   r@   	enumeratezipr&   rH   r*   r9   enable_mask_update)	r,   rG   r]   valuesidataparam_grouprF   r-   s	            r   r)   zBaseScheduler.stepu   sF    q 4??//A*  	 ,,q05  	 	A		: 		: !& 	#OOq O[[]F	# !T__%;%;V!DE 	6GAt"OK,.K()MM$,,2u5	6
 ?Coo>T>TUU/0U-1*	# 	# Vs   %&E*E6*E3c                     t        | j                  j                        }t        |t        t
        f      s|g|z  S t        |      |k7  rt        d| dt        |             t	        |      S )zPUtility that extends it to the same length as the .groups, ensuring it is a listzExpected variable of length z
, but got )lenr%   r&   r!   listtuple
ValueError)r,   varns      r   _make_sure_a_listzBaseScheduler._make_sure_a_list   sc    &&'#e}-5193x1} #?s*SQTXJ!WXX9r   )FrR   )r$   rZ   r[   r.   r4   r7   r;   r@   rH   rM   r)   rn   r\   r   r   r   r      s1    1f
)	"+2Zr   )r=   r   	functoolsr   +torch.ao.pruning.sparsifier.base_sparsifierr   __all__r   r\   r   r   <module>rs      s)       F 
] ]r   