U
    KcQ
                     @   st   d dl Z d dl mZ d dlmZmZ ddddgZG dd dejZG d	d dejZG d
d dZ	G dd dZ
dS )    N)nn)AnyListPruningParametrizationZeroesParametrizationActivationReconstructionBiasHookc                       s$   e Zd Z fddZdd Z  ZS )r   c                    s(   t    tt| | _t | _d S Nsuper__init__setrangeitemoriginal_outputspruned_outputsselfr   	__class__ Z/tmp/pip-unpacked-wheel-gikjz4vx/torch/ao/sparsity/_experimental/pruner/parametrization.pyr      s    
zPruningParametrization.__init__c                 C   s   | j | j }|t| S r	   )r   r   list)r   xZvalid_outputsr   r   r   forward   s    zPruningParametrization.forward)__name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s   c                       s(   e Zd ZdZ fddZdd Z  ZS )r   z}Zero out pruned channels instead of removing.
    E.g. used for Batch Norm pruning, which should match previous Conv2d layer.c                    s(   t    tt| | _t | _d S r	   r
   r   r   r   r   r      s    
zZeroesParametrization.__init__c                 C   s   d|j t| j< |S )Nr   )datar   r   )r   r   r   r   r   r      s    zZeroesParametrization.forward)r   r   r   __doc__r   r   r   r   r   r   r   r      s   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r	   )param)r   parametrizationr   r   r   r       s    z!ActivationReconstruction.__init__c                 C   s   | j j}| j j}t|| }t|j}t||d< g }|jD ]}	|td|	d q<||d< tj	||j
|j|jd}
||
|< |
S )N   r   )dtypedevicelayout)r!   r   r   r   shapelenappendslicetorchzerosr$   r%   r&   )r   moduleinputoutputZmax_outputsr   Zvalid_columnsZsizesindicessizeZreconstructed_tensorr   r   r   __call__#   s     

z!ActivationReconstruction.__call__Nr   r   r   r   r2   r   r   r   r   r      s   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _d S r	   )r!   
prune_bias)r   r"   r4   r   r   r   r   ;   s    zBiasHook.__init__c                 C   s`   | j j}t|dd d k	r\|jj}| jr2d|t|< dgt|j }d|d< |	|}||7 }|S )N_biasr   r#   )
r!   r   getattrr5   r   r4   r   r(   r'   Zreshape)r   r-   r.   r/   r   Zbiasidxr   r   r   r2   ?   s    
zBiasHook.__call__Nr3   r   r   r   r   r   :   s   )r+   r   typingr   r   __all__Moduler   r   r   r   r   r   r   r   <module>   s   