o
    0ñhW5  ã                   @   sh  d dl mZ 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d	ejd
ejdef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 )(é    )ÚAny)ÚBaseSparsifierN)Únnc                       sR   e Zd Zdeeef ddf‡ fdd„Zdejdedeeef ddfdd	„Z	‡  Z
S )
ÚImplementedSparsifierÚkwargsÚreturnNc                    s   t ƒ j|d d S )N)Údefaults)ÚsuperÚ__init__)Úselfr   ©Ú	__class__© úZ/var/www/vscode/kcb/lib/python3.10/site-packages/torch/testing/_internal/common_pruning.pyr
   
   s   zImplementedSparsifier.__init__ÚmoduleÚtensor_namec                 K   s4   d|j jd jd< | jd }| dd¡d |d< d S )Nr   zlinear1.weightÚ
step_counté   )ÚparametrizationsÚweightÚmaskÚstateÚget)r   r   r   r   Úlinear_stater   r   r   Úupdate_mask   s   
z!ImplementedSparsifier.update_mask)Ú__name__Ú
__module__Ú__qualname__ÚdictÚstrr   r
   r   ÚModuler   Ú__classcell__r   r   r   r   r   	   s    ,r   c                   @   s(   e Zd ZdZedejdd f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.
    Úmodr   c                 C   s   | |j |jƒ}|S )z	
        )Úin_featuresÚout_features)Úclsr#   Úlinearr   r   r   Ú
from_dense   s   ÿzMockSparseLinear.from_denseN)r   r   r   Ú__doc__Úclassmethodr   ÚLinearr(   r   r   r   r   r"      s    r"   Úsubset_tensorÚsuperset_tensorr   c                 C   sL   d}| D ]}|t |ƒk r t ||| ¡s|d7 }nn	|t |ƒk s 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)r,   r-   ÚiÚrowr   r   r   Úrows_are_subset"   s   
üþr3   c                       ó8   e Zd ZdZd	‡ fdd„Zdejdejf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.r   Nc              	      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   Ú
Sequentialr+   ÚseqÚlinear1Úlinear2©r   r   r   r   r
   6   s   
ýzSimpleLinear.__init__Úxc                 C   ó"   |   |¡}|  |¡}|  |¡}|S ©N)r>   r?   r@   ©r   rB   r   r   r   Úforward@   ó   


zSimpleLinear.forward©r   N©	r   r   r   r)   r
   r/   ÚTensorrF   r!   r   r   r   r   r5   2   ó    
r5   c                       r4   )
Ú
LinearBiaszŠModel with only Linear layers, alternating layers with biases,
    wrapped in a Sequential. Used to test pruned Linear-Bias-Linear fusion.r   Nc                    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 )	Nr6   r7   Tr8   r:   Fé   r<   )r	   r
   r   r=   r+   r>   rA   r   r   r   r
   K   s   

ûzLinearBias.__init__rB   c                 C   s   |   |¡}|S rD   )r>   rE   r   r   r   rF   U   s   
zLinearBias.forwardrH   rI   r   r   r   r   rL   G   rK   rL   c                       r4   )
Ú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.r   Nc                    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 )
Nr6   r7   Tr8   r:   Fr;   rM   r<   )r	   r
   r   r=   r+   ÚReLUÚTanhr>   r?   Úact1r@   Úact2rA   r   r   r   r
   _   s   
û
zLinearActivation.__init__rB   c                 C   ó6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rD   )r>   r?   rQ   r@   rR   rE   r   r   r   rF   m   ó   




zLinearActivation.forwardrH   rI   r   r   r   r   rN   Z   s    rN   c                       r4   )
Ú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.r   Nc                    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 )Nr6   r7   Tr8   r:   Fr;   rM   é   r<   )r	   r
   r   r=   r+   rO   r>   r?   r@   Úlinear3rQ   rA   r   r   r   r
   |   s   
ûz#LinearActivationFunctional.__init__rB   c                 C   sJ   |   |¡}|  |¡}t |¡}|  |¡}t |¡}|  |¡}t |¡}|S rD   )r>   r?   ÚFÚrelur@   rW   rE   r   r   r   rF   Š   s   






z"LinearActivationFunctional.forwardrH   rI   r   r   r   r   rU   v   s    rU   c                       r4   )
ÚSimpleConv2dz‡Model with only Conv2d layers, all without bias, some in a Sequential and some following.
    Used to test pruned Conv2d-Conv2d fusion.r   Nc              
      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   é    rM   Fr8   é@   é0   é4   ©r	   r
   r   r=   ÚConv2dr>   Úconv2d1Úconv2d2rA   r   r   r   r
   ™   s   
þzSimpleConv2d.__init__rB   c                 C   rC   rD   ©r>   ra   rb   rE   r   r   r   rF   ¢   rG   zSimpleConv2d.forwardrH   rI   r   r   r   r   rZ   •   s    	rZ   c                       r4   )
Ú
Conv2dBiaszˆModel with only Conv2d layers, some with bias, some in a Sequential and some outside.
    Used to test pruned Conv2d-Bias-Conv2d fusion.r   Nc                    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   r[   rM   Tr8   r\   Fr]   r^   r_   rA   r   r   r   r
   ­   s   
ýzConv2dBias.__init__rB   c                 C   rC   rD   rc   rE   r   r   r   rF   ·   rG   zConv2dBias.forwardrH   rI   r   r   r   r   rd   ©   rK   rd   c                       r4   )
Ú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.r   Nc                    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 re   )
r	   r
   r   r=   r`   rO   rP   r>   ra   rb   rA   r   r   r   r
   Ä   s   
úzConv2dActivation.__init__rB   c                 C   s6   |   |¡}|  |¡}t |¡}|  |¡}t |¡}|S rD   )r>   ra   rX   rY   rb   ÚhardtanhrE   r   r   r   rF   Ñ   rT   zConv2dActivation.forwardrH   rI   r   r   r   r   rf   ¾   s    rf   c                       r4   )
Ú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.r   Nc                    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   r[   rM   T)Úpaddingr9   Fr8   r\   r]   r^   )r	   r
   r   r=   r`   rO   rP   r>   ra   rQ   rb   rR   rA   r   r   r   r
   à   s"   
ö
zConv2dPadBias.__init__rB   c                 C   rS   rD   )r>   ra   rQ   rb   rR   rE   r   r   r   rF   ó   rT   zConv2dPadBias.forwardrH   rI   r   r   r   r   rh   Ú   s    rh   c                       r4   )
Ú
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.r   Nc                    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   r[   rM   T©Úkernel_sizeri   r9   é   ©rl   Ústrideri   r\   r]   r^   )r	   r
   r   r=   r`   Ú	MaxPool2drO   rP   Ú	AvgPool2dr>   ra   ÚmaxpoolÚaf1rb   Úconv2d3rA   r   r   r   r
     s   
ú
zConv2dPool.__init__rB   c                 C   s\   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}tj|dddd}t |¡}|  |¡}|S ©Nrm   r   rn   )	r>   ra   rr   rs   rb   rX   Ú
avg_pool2drY   rt   rE   r   r   r   rF     s   






zConv2dPool.forwardrH   rI   r   r   r   r   rj   ü   s    rj   c                       r4   )
Ú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.r   Nc                    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   rM   Trk   rm   rn   r7   r6   é   )r   r   é   r8   )r	   r
   r   r=   r`   rp   rO   rP   rq   r>   ra   rs   rb   ÚAdaptiveAvgPool2dÚavg_poolr+   ÚfcrA   r   r   r   r
   #  s   
ú
z$Conv2dPoolFlattenFunctional.__init__rB   c                 C   s^   |   |¡}|  |¡}tj|dddd}|  |¡}|  |¡}|  |¡}t |d¡}|  	|¡}|S ru   )
r>   ra   rX   Ú
max_pool2drs   rb   r{   r/   Úflattenr|   rE   r   r   r   rF   3  s   





z#Conv2dPoolFlattenFunctional.forwardrH   rI   r   r   r   r   rw     s    rw   c                       r4   )
Ú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.r   Nc                    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   rM   Trk   rm   rn   r7   r6   rx   )rm   rm   é,   ry   r8   )r	   r
   r   r=   r`   rp   rO   rP   rq   r>   ra   rs   rb   rz   r{   ÚFlattenr~   r+   r|   rA   r   r   r   r
   E  s   
ú

zConv2dPoolFlatten.__init__rB   c                 C   s\   |   |¡}|  |¡}tj|dddd}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S ru   )	r>   ra   rX   r}   rs   rb   r{   r~   r|   rE   r   r   r   rF   V  s   






zConv2dPoolFlatten.forwardrH   rI   r   r   r   r   r   ?  s    r   c                
       óV   e Zd ZdZdededededdf
‡ fdd	„Zd
ejdeejejf fdd„Z	‡  Z
S )ÚLSTMLinearModelzCContainer module with an encoder, a recurrent module, and a linear.Ú	input_dimÚ
hidden_dimÚ
output_dimÚ
num_layersr   Nc                    s,   t ƒ  ¡  t |||¡| _t ||¡| _d S rD   )r	   r
   r   ÚLSTMÚlstmr+   r'   ©r   r„   r…   r†   r‡   r   r   r   r
   e  s   
zLSTMLinearModel.__init__Úinputc                 C   s    |   |¡\}}|  |¡}||fS rD   )r‰   r'   )r   r‹   ÚoutputÚ_hiddenÚdecodedr   r   r   rF   l  s   
zLSTMLinearModel.forward©r   r   r   r)   Úintr
   r/   rJ   ÚtuplerF   r!   r   r   r   r   rƒ   b  s    ÿÿÿÿþ(rƒ   c                
       r‚   )ÚLSTMLayerNormLinearModelz9Container module with an LSTM, a LayerNorm, and a linear.r„   r…   r†   r‡   r   Nc                    s8   t ƒ  ¡  t |||¡| _t |¡| _t ||¡| _d S rD   )	r	   r
   r   rˆ   r‰   Ú	LayerNormÚnormr+   r'   rŠ   r   r   r   r
   u  s   
z!LSTMLayerNormLinearModel.__init__rB   c                 C   s*   |   |¡\}}|  |¡}|  |¡}||fS rD   )r‰   r”   r'   )r   rB   r   r   r   r   rF   }  s   

z LSTMLayerNormLinearModel.forwardr   r   r   r   r   r’   r  s    ÿÿÿÿþ(r’   )Útypingr   Útorch.ao.pruningr   r/   Útorch.nn.functionalr   Ú
functionalrX   r   r+   r"   rJ   Úboolr3   r    r5   rL   rN   rU   rZ   rd   rf   rh   rj   rw   r   rƒ   r’   r   r   r   r   Ú<module>   s*   
"!"#