
    Pi              
          d dl mZ d dlZd dlmZmZmZ ej                            e           ej                            e            edg d          Z	 G d dej
        j                  Z G d d	ej
        j                  Zej        j        	 	 ddej        dededefd            Zej        j        e	j        fdej        dede	defd            ZdS )    )EnumN)SparseSemiStructuredTensor$SparseSemiStructuredTensorCUSPARSELT!SparseSemiStructuredTensorCUTLASSGRADIENT_TYPE)DENSESPARSESTEc                   b    e Zd Zedej        dedefd            Zedej        fd            Z	dS )_SparsifyFuncxalgobackendc           
          |dk    }t          |t                    sFt          j        |||          \  }}}}}	|rt          nt
          }
 |
|j        |||||	dd          }n|                                }|S )Ncutlass)	algorithmuse_cutlassFT)packedmetapacked_tmeta_tcompressed_swizzled_bitmaskrequires_gradfuse_transpose_cusparselt)
isinstancer   torch_sparse_semi_structured_tiler   r   shapedetach)ctxr   r   r   r   r   r   r   r   bitmaskclsouts               v/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torchao/sparsity/training/autograd.pyforwardz_SparsifyFunc.forward   s    *!788 	2;   6VT8VW :119 
 #!,3#*.	 	 	CC ((**C
    grad_outc                     |d d fS )N )r    r'   s     r$   backwardz_SparsifyFunc.backward4   s     t##r&   N)
__name__
__module____qualname__staticmethodr   Tensorstrr   r%   r*   r)   r&   r$   r   r      sr         C -    \8 $ $ $ $ \$ $ $r&   r   c                   l    e Zd Zeej        fdej        defd            Z	edej        fd            Z
dS )_SparsifyLikeFuncr   patternc           	         t          |t                    sJ t          |t                    st          d          |j                                        st          d          t          j        ||j                  \  }}|j        | _        |j	        | _	        |j        | _
        || _        |                    |j        ||j        ||j	        |j        |j                  S )NzC`sparsify_like(x, pattern)` is only implemented for CUTLASS backendzK`sparsify_like(x, pattern)` is not implemented when `bitmask` is transposedr   )r   r   r   NotImplementedErrorr   is_contiguousr   _sparse_semi_structured_applyr   r   r!   gradient	__class__r   r   )r    r   r3   r9   r   r   s         r$   r%   z_SparsifyLikeFunc.forward;   s     '#=>>>>>'#DEE 	%U   2@@BB 	%]   !>w2
 

 <^
9  GLN// ! 
 
 	
r&   r'   c           	      &   | j         t          j        k    st          |t                    r|d d d fS t          |t                    rJ |j        | j        k    sJ | j         t          j        k    r9| j                                        sJ t          j
        || j                  d d d fS | j         t          j        k    sJ t          j        || j        d          \  }}}}t          |j        || j        || j        | j        |j                  d d d fS )Nr   )r   r5   )r9   r   r
   r   r   dtyper   threads_masksr7   r   #_sparse_semi_structured_apply_denser!   r	   r   r   r   r   r   r   )r    r'   r   _r   s        r$   r*   z_SparsifyLikeFunc.backwarda   s>   <=,,,
01
 1
, T4--h(BCCCCC~****<=...$22444449(CKPP	  |}33333!&!Cck9"
 "
 "
8Q .
&4   
 	
r&   N)r+   r,   r-   r.   r   r	   r   r/   r   r%   r*   r)   r&   r$   r2   r2   :   s}        
 %	#
 #
<#
 ,#
 #
 #
 \#
J # # # # \# # #r&   r2    r   r   r   r   returnc                 :    t                               | ||          S )zl
    Sparsifies a dense tensor into a semi-structured tensor, according to the algo and backend passed.
    )r   apply)r   r   r   s      r$   semi_structured_sparsifyrD      s     q$000r&   r3   r9   c                 :    t                               | ||          S )zj
    Sparsifies a dense tensor into a semi-structured tensor, using the mask of the provided pattern.
    )r2   rC   )r   r3   r9   s      r$   semi_structured_sparsify_likerF      s     ""1gx888r&   )r@   r   )enumr   r   torch.sparser   r   r   _dynamoallow_in_graphr   autogradFunctionr   r2   r/   r0   rD   r	   rF   r)   r&   r$   <module>rM      s                     A B B B   > ? ? ? _&@&@&@AA!$ !$ !$ !$ !$EN+ !$ !$ !$HK K K K K/ K K K\  1 1|1
1 1  	1 1 1 1  ,29 9|9'9 9  	9 9 9 9 9 9r&   