o
    i|                     @   s~   d dl Z d dlmZ d dlmZ d dlmZ ee g dZG dd de j	j
ZG dd	 d	e j	j
ZdddZdddZdS )    N)!SparseSemiStructuredTensorCUTLASS)semi_structured_sparsify)#CUTLASS_POINTWISE_OP_DISPATCH_TABLE)SemiSparseLinearSemiSparseActivationLinear#swap_linear_with_semi_sparse_linear#swap_semi_sparse_linear_with_linearc                   @   0   e Zd ZdZdd Zedd Zedd ZdS )	r   zE
    Replacement nn.Linear that supports runtime weight sparsity
    c                 C   s"   t | jdd}tjj||| jS N
cusparselt)backend)r   weighttorchnn
functionallinearbias)selfxsparse_weight r   V/home/ubuntu/.local/lib/python3.10/site-packages/torchao/sparsity/training/__init__.pyforward   s   zSemiSparseLinear.forwardc                 C   "   | |j |j}|j|_|j|_|S Nin_featuresout_featuresr   r   clsr   modr   r   r   
from_dense"      zSemiSparseLinear.from_densec                 C   &   t j|j|j}|j|_|j|_|S r   r   r   Linearr   r   r   r   r   semi_sparse_linearr    r   r   r   to_dense)      zSemiSparseLinear.to_denseN__name__
__module____qualname____doc__r   classmethodr!   r(   r   r   r   r   r          
r   c                   @   r	   )	r   zI
    Replacement nn.Linear that supports runtime activation sparsity
    c                 C   s"   t |dd}tjj|| j| jS r
   )r   r   r   r   r   r   r   )r   r   sparse_xr   r   r   r   8   s   z"SemiSparseActivationLinear.forwardc                 C   r   r   r   r   r   r   r   r!   <   r"   z%SemiSparseActivationLinear.from_densec                 C   r#   r   r$   r&   r   r   r   r(   C   r)   z#SemiSparseActivationLinear.to_denseNr*   r   r   r   r   r   3   r0   r    c                 C   sv   t |  }| D ].\}}|r| d| n|}t|tjjr1||v r0t| ||| | ~q
t	|||d q
dS )zB
    Public API for replacing nn.Linear with SemiSparseLinear
    .currentN)
dictnamed_childrenitems
isinstancer   r   r%   setattrr!   r   )modelconfigr5   name_to_childnamechildfqnr   r   r   r   M   s   r   c                 C   sh   t |  }| D ]'\}}|r| d| n|}t|ttfr+t| ||| ~q
t||d q
dS )zj
    Public API for replacing instances of SemiSparseLinear/SemiSparseActivaitonLinear with nn.Linear
    r3   r4   N)	r6   r7   r8   r9   r   r   r:   r(   r   )r;   r5   r=   r>   r?   r@   r   r   r   r   \   s   r   )r2   )r   torch.sparser   "torchao.sparsity.training.autogradr   'torchao.sparsity.training.pointwise_opsr   _load_dispatch_table__all__r   r%   r   r   r   r   r   r   r   r   <module>   s   
