U
    Mâh‘2  ã                   @   sP  d dl mZ d dlZd dlm  mZ d dlmZ G dd„ deƒZG dd„ dejƒZ	e
dœd	d
„ZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd „ d ejƒZG d!d"„ d"ejƒZG d#d$„ d$ejƒZdS )%é    )ÚBaseSparsifierN)Únnc                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚImplementedSparsifierc                    s   t ƒ j|d d S )N)Údefaults)ÚsuperÚ__init__)ÚselfÚkwargs©Ú	__class__© úX/var/www/html/venv/lib/python3.8/site-packages/torch/testing/_internal/common_pruning.pyr      s    zImplementedSparsifier.__init__c                 K   s4   d|j jd jd< | jd }| dd¡d |d< d S )Nr   zlinear1.weightZ
step_counté   )ZparametrizationsÚweightÚmaskÚstateÚget)r   Úmoduler	   Zlinear_stater   r   r   Úupdate_mask   s    
z!ImplementedSparsifier.update_mask)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r
   r   r   
   s   r   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚMockSparseLinearzË
    This class is a MockSparseLinear class to check convert functionality.
    It is the same as a normal Linear layer, except with a different type, as
    well as an additional from_dense method.
    c                 C   s   | |j |jƒ}|S )z	
        )Zin_featuresZout_features)ÚclsÚmodÚlinearr   r   r   Ú
from_dense   s    ÿzMockSparseLinear.from_denseN)r   r   r   Ú__doc__Úclassmethodr   r   r   r   r   r      s   r   )Úreturnc                 C   sB   d}| D ]4}|t |ƒk r6t ||| ¡s<|d7 }qqq dS qdS )zW
    Checks to see if all rows in subset tensor are present in the superset tensor
    r   r   FT)ÚlenÚtorchÚequal)Zsubset_tensorZsuperset_tensorÚiÚrowr   r   r   Úrows_are_subset#   s    
r&   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚSimpleLinearzžModel with only Linear layers without biases, some wrapped in a Sequential,
    some following the Sequential. Used to test basic pruned Linear-Linear fusion.c              	      sf   t ƒ  ¡  t tjddddtjddddtjdddd¡| _tjdddd| _tjdddd| _d S )Né   é   F©Úbiasé   é   é
   )r   r   r   Ú
SequentialÚLinearÚseqÚlinear1Úlinear2©r   r
   r   r   r   7   s    
ýzSimpleLinear.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S ©N)r1   r2   r3   ©r   Úxr   r   r   ÚforwardA   s    


zSimpleLinear.forward©r   r   r   r   r   r8   r   r   r   r
   r   r'   3   s   
r'   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú
LinearBiaszŠModel with only Linear layers, alternating layers with biases,
    wrapped in a Sequential. Used to test pruned Linear-Bias-Linear fusion.c                    s^   t ƒ  ¡  t tjddddtjddddtjddddtjddddtjdddd¡| _d S )	Nr(   r)   Tr*   r,   Fé   r.   )r   r   r   r/   r0   r1   r4   r
   r   r   r   L   s    
ûzLinearBias.__init__c                 C   s   |   |¡}|S r5   )r1   r6   r   r   r   r8   V   s    
zLinearBias.forwardr9   r   r   r
   r   r:   H   s   
r:   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚLinearActivationzùModel with only Linear layers, some with bias, some in a Sequential and some following.
    Activation functions modules in between each Linear in the Sequential, and each outside layer.
    Used to test pruned Linear(Bias)-Activation-Linear fusion.c                    s†   t ƒ  ¡  t tjddddt ¡ tjddddt ¡ tjdddd¡| _tjdddd| _t ¡ | _	tjdd	dd| _
t ¡ | _d S )
Nr(   r)   Tr*   r,   Fr-   r;   r.   )r   r   r   r/   r0   ÚReLUÚTanhr1   r2   Úact1r3   Úact2r4   r
   r   r   r   `   s    
û
zLinearActivation.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r5   )r1   r2   r?   r3   r@   r6   r   r   r   r8   n   s    




zLinearActivation.forwardr9   r   r   r
   r   r<   [   s   r<   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚLinearActivationFunctionala,  Model with only Linear layers, some with bias, some in a Sequential and some following.
    Activation functions modules in between each Linear in the Sequential, and functional
    activationals are called in between each outside layer.
    Used to test pruned Linear(Bias)-Activation-Linear fusion.c                    sŽ   t ƒ  ¡  t tjddddt ¡ tjddddt ¡ tjdddd¡| _tjdddd| _tjdd	dd| _tjd	d
dd| _	t ¡ | _
d S )Nr(   r)   Tr*   r,   Fr-   r;   é   r.   )r   r   r   r/   r0   r=   r1   r2   r3   Úlinear3r?   r4   r
   r   r   r   }   s    
ûz#LinearActivationFunctional.__init__c                 C   sJ   |   |¡}|  |¡}t |¡}|  |¡}t |¡}|  |¡}t |¡}|S r5   )r1   r2   ÚFÚrelur3   rC   r6   r   r   r   r8   ‹   s    






z"LinearActivationFunctional.forwardr9   r   r   r
   r   rA   w   s   rA   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚSimpleConv2dz‡Model with only Conv2d layers, all without bias, some in a Sequential and some following.
    Used to test pruned Conv2d-Conv2d fusion.c              
      sh   t ƒ  ¡  t tjddddddtjdddddd¡| _tjdddddd| _tjdddddd| _d S )	Nr   é    r;   Fr*   é@   é0   é4   ©r   r   r   r/   ÚConv2dr1   Úconv2d1Úconv2d2r4   r
   r   r   r   š   s    
þzSimpleConv2d.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r5   ©r1   rM   rN   r6   r   r   r   r8   £   s    


zSimpleConv2d.forwardr9   r   r   r
   r   rF   –   s   	rF   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú
Conv2dBiaszˆModel with only Conv2d layers, some with bias, some in a Sequential and some outside.
    Used to test pruned Conv2d-Bias-Conv2d fusion.c                    sz   t ƒ  ¡  t tjddddddtjddddddtjdddddd¡| _tjdddddd| _tjdd	dddd| _d S ©
Nr   rG   r;   Tr*   rH   FrI   rJ   rK   r4   r
   r   r   r   ®   s    
ýzConv2dBias.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S r5   rO   r6   r   r   r   r8   ¸   s    


zConv2dBias.forwardr9   r   r   r
   r   rP   ª   s   
rP   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚConv2dActivationa  Model with only Conv2d layers, some with bias, some in a Sequential and some following.
    Activation function modules in between each Sequential layer, functional activations called
    in-between each outside layer.
    Used to test pruned Conv2d-Bias-Activation-Conv2d fusion.c                    sŒ   t ƒ  ¡  t tjddddddt ¡ tjddddddt ¡ tjddddddt ¡ ¡| _tjdddddd| _tjdd	dddd| _	d S rQ   )
r   r   r   r/   rL   r=   r>   r1   rM   rN   r4   r
   r   r   r   Å   s    
úzConv2dActivation.__init__c                 C   s6   |   |¡}|  |¡}t |¡}|  |¡}t |¡}|S r5   )r1   rM   rD   rE   rN   Zhardtanhr6   r   r   r   r8   Ò   s    




zConv2dActivation.forwardr9   r   r   r
   r   rR   ¿   s   rR   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚConv2dPadBiasaQ  Model with only Conv2d layers, all with bias and some with padding > 0,
    some in a Sequential and some following. Activation function modules in between each layer.
    Used to test that bias is propagated correctly in the special case of
    pruned Conv2d-Bias-(Activation)Conv2d fusion, when the second Conv2d layer has padding > 0.c                    sÚ   t ƒ  ¡  t tjdddddddt ¡ tjddddddt ¡ tjdddddddt ¡ tjdddddddt ¡ tjddddddt ¡ ¡
| _tjdd	ddddd| _t ¡ | _	tjd	d
ddddd| _
t ¡ | _d S )Nr   rG   r;   T)Úpaddingr+   Fr*   rH   rI   rJ   )r   r   r   r/   rL   r=   r>   r1   rM   r?   rN   r@   r4   r
   r   r   r   á   s"    
ö
zConv2dPadBias.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r5   )r1   rM   r?   rN   r@   r6   r   r   r   r8   ô   s    




zConv2dPadBias.forwardr9   r   r   r
   r   rS   Û   s   rS   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú
Conv2dPoolzèModel with only Conv2d layers, all with bias, some in a Sequential and some following.
    Activation function modules in between each layer, Pool2d modules in between each layer.
    Used to test pruned Conv2d-Pool2d-Conv2d fusion.c                    sÂ   t ƒ  ¡  t tjddddddtjddddt ¡ tjddddddt ¡ tjdddd¡| _	tjdd	dddd| _
tjdddd| _t ¡ | _tjd	d
dddd| _tjd
d
dddd| _d S )Nr   rG   r;   T©Úkernel_sizerT   r+   é   ©rW   ZstriderT   rH   rI   rJ   )r   r   r   r/   rL   Ú	MaxPool2dr=   r>   Ú	AvgPool2dr1   rM   ÚmaxpoolÚaf1rN   Úconv2d3r4   r
   r   r   r     s    
ú
zConv2dPool.__init__c                 C   s\   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}tj|dddd}t |¡}|  |¡}|S ©NrX   r   rY   )	r1   rM   r\   r]   rN   rD   Z
avg_pool2drE   r^   r6   r   r   r   r8     s    






zConv2dPool.forwardr9   r   r   r
   r   rU   ý   s   rU   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚConv2dPoolFlattenFunctionala  Model with Conv2d layers, all with bias, some in a Sequential and some following, and then a Pool2d
    and a functional Flatten followed by a Linear layer.
    Activation functions and Pool2ds in between each layer also.
    Used to test pruned Conv2d-Pool2d-Flatten-Linear fusion.c                    s¸   t ƒ  ¡  t tjddddddtjddddt ¡ tjddddddt ¡ tjdddd¡| _	tjdddddd| _
t ¡ | _tjdd	dddd| _t d
¡| _tjd	ddd| _d S )Nr   r;   TrV   rX   rY   r)   r(   é   )r   r   é   r*   )r   r   r   r/   rL   rZ   r=   r>   r[   r1   rM   r]   rN   ÚAdaptiveAvgPool2dÚavg_poolr0   Úfcr4   r
   r   r   r   $  s    
ú
z$Conv2dPoolFlattenFunctional.__init__c                 C   s^   |   |¡}|  |¡}tj|dddd}|  |¡}|  |¡}|  |¡}t |d¡}|  	|¡}|S r_   )
r1   rM   rD   Ú
max_pool2dr]   rN   rd   r"   Úflattenre   r6   r   r   r   r8   4  s    





z#Conv2dPoolFlattenFunctional.forwardr9   r   r   r
   r   r`     s   r`   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚConv2dPoolFlattena  Model with Conv2d layers, all with bias, some in a Sequential and some following, and then a Pool2d
    and a Flatten module followed by a Linear layer.
    Activation functions and Pool2ds in between each layer also.
    Used to test pruned Conv2d-Pool2d-Flatten-Linear fusion.c                    sÂ   t ƒ  ¡  t tjddddddtjddddt ¡ tjddddddt ¡ tjdddd¡| _	tjdddddd| _
t ¡ | _tjdd	dddd| _t d
¡| _t ¡ | _tjdddd| _d S )Nr   r;   TrV   rX   rY   r)   r(   ra   )rX   rX   é,   rb   r*   )r   r   r   r/   rL   rZ   r=   r>   r[   r1   rM   r]   rN   rc   rd   ZFlattenrg   r0   re   r4   r
   r   r   r   F  s    
ú

zConv2dPoolFlatten.__init__c                 C   s\   |   |¡}|  |¡}tj|dddd}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r_   )	r1   rM   rD   rf   r]   rN   rd   rg   re   r6   r   r   r   r8   W  s    






zConv2dPoolFlatten.forwardr9   r   r   r
   r   rh   @  s   rh   c                       s4   e Zd ZdZeeeedœ‡ fdd„Zdd„ Z‡  ZS )ÚLSTMLinearModelzCContainer module with an encoder, a recurrent module, and a linear.©Ú	input_dimÚ
hidden_dimÚ
output_dimÚ
num_layersc                    s,   t ƒ  ¡  t |||¡| _t ||¡| _d S r5   )r   r   r   ÚLSTMÚlstmr0   r   ©r   rl   rm   rn   ro   r
   r   r   r   f  s    
zLSTMLinearModel.__init__c                 C   s    |   |¡\}}|  |¡}||fS r5   )rq   r   )r   ÚinputÚoutputZhiddenÚdecodedr   r   r   r8   m  s    
zLSTMLinearModel.forward©r   r   r   r   Úintr   r8   r   r   r   r
   r   rj   c  s      ÿrj   c                       s4   e Zd ZdZeeeedœ‡ fdd„Zdd„ Z‡  ZS )ÚLSTMLayerNormLinearModelz9Container module with an LSTM, a LayerNorm, and a linear.rk   c                    s8   t ƒ  ¡  t |||¡| _t |¡| _t ||¡| _d S r5   )	r   r   r   rp   rq   Z	LayerNormÚnormr0   r   rr   r
   r   r   r   v  s    
z!LSTMLayerNormLinearModel.__init__c                 C   s*   |   |¡\}}|  |¡}|  |¡}||fS r5   )rq   ry   r   )r   r7   r   r   r   r   r8   ~  s    

z LSTMLayerNormLinearModel.forwardrv   r   r   r
   r   rx   s  s      ÿrx   )Ztorch.ao.pruningr   r"   Ztorch.nn.functionalr   Z
functionalrD   r   r0   r   Úboolr&   ÚModuler'   r:   r<   rA   rF   rP   rR   rS   rU   r`   rh   rj   rx   r   r   r   r   Ú<module>   s&   
"!"#