
    h{                     h   S SK Jr  S SKrS SKJr  S SKJr   S	S jr\R                  R                  R                  \\R                  R                  R                  \\R                  R                  R                  \\R                  R                  R                  \" \SS9\R                  R                  R                  \\R                  R                  R                  \" \SS9\R                  R                  R                   \" \SS9\R                  R                  R"                  \" \SS90rg)
    )partialN)SparseSemiStructuredTensor)semi_structured_sparsify_likec                 $  ^ ^^
 Sm
U H  n[        U[        5      (       d  M  Um
M     T
c   eU U
U4S jn[        U5       VVs/ s H  u  puU" Xu5      PM     nnnT
R                  T
R                  T " U V	s/ s H&  n	[        U	[        5      (       a  U	R
                  OU	PM(     sn	6 T
R                  T " U V	s/ s H&  n	[        U	[        5      (       a  U	R                  OU	PM(     sn	6 T
R                  T
R                  5      $ s  snnf s  sn	f s  sn	f )am  
adds pointwise op support for semi-structured tensors.

Assumes that at least one of the arguments in arg is a SparseSemiStructuredTensor.
The last instance of a SparseSemiStructuredTensor is used as the reference mask to sparsify the others tensors passed in args.
sparsify_like_args_list is used to specify which arguments to sparsify like the reference tensor.
Nc                   > [        U[        R                  5      (       Ga9  [        U[        5      (       d`  U T;   a  [	        UT5      nU$ [        STR                   STR                   S[        T5       S[        T5       SU  S[        U5       35      eUR                  by  TR                  bl  UR                  R                  5       TR                  R                  5       :w  d6  UR                  R                  5       TR                  R                  5       :w  a>  [        STR                   STR                   S[        T5       S[        T5       S3	5      eU$ )Nz
Operation .z on z requires all operands to be z, but operand z is a z with the same sparsity pattern)
isinstancetorchTensorr   r   
ValueError
__module____name__typecompressed_swizzled_bitmaskdata_ptrstride)itensorfuncreference_sparse_tensorsparsify_like_args_lists     a/home/james-whalen/.local/lib/python3.13/site-packages/torchao/sparsity/training/pointwise_ops.py
handle_arg-_semi_sparse_pointwise_op.<locals>.handle_arg   se   fell++ f&@AA//: 7F2 + %$T__$5Qt}}oT$OfJgIh i"#:;<N1#VTXY_T`Sac  66>.JJR99BBD.JJSSUV99@@B.JJQQST %$T__$5Qt}}oT$OfJgIh  iF 7899XZ      )
r	   r   	enumerate	__class__shapepackedmetapacked_tmeta_tr   )r   typesargskwargsr   r   r   r   args_updatedxr   s   `   `     @r   _semi_sparse_pointwise_opr(      s     #f899&,#  #...B <ET?K?iaJq)?LK",,%% &%A 'q*DEE1L%	
 	 $$ &%A ),FGG

QN%	
 	 &&;;!  L
s   D6-D7-D)r      )r   )r   ) Nr*   )	functoolsr   r
   torch.sparser   "torchao.sparsity.training.autogradr   r(   opsatenrelugelusilumuladdgelu_backwardsilu_backwardthreshold_backward#CUTLASS_POINTWISE_OP_DISPATCH_TABLEr*   r   r   <module>r9      s      3 L @BDR 
IINN2	IINN2	IINN2	IINN! &
 
IINN1 
IINN  '!4# 
IINN  '!6# 
IINN%%w! $(%' #r   