Ë
    [^(hÀ6  ã                   ó*   — d dl Z d„ Zd„ Zd„ Zd„ Zd„ Zy)é    Nc                 ó`  — t        j                  d| |¬«      dd…df   j                  d|«      }t        j                  d||¬«      j                  | d«      }|j                  dk(  rdnd}|j                  dk(  rdnd}||z  |z  |d	z  |z  z   ||z  d	z  z   }|dz  dk(  |dz  dk(  z  j	                  t         j
                  «      }|dz  dk(  |dz  dk(  z  j	                  t         j
                  «      }	|||	z
  z  }|||	z
  z  }d}
||
z  }||
z  }|| z  |
z  ||
z  z   |z   j                  d
«      S )aS  
    This is PyTorch implementation of main part of reorder_meta()
    function, from tools/util/include/cutlass/util/host_reorder.h file
    of CUTLASS source tree.  Furthermore, CUTLASS template for sparse
    GEMM decides upon layout of this matrix, and at the moment for the
    sparse GEMM executed on tensor cores, this is layout described by
    ColumnMajorInterleaved<2> data structure, in
    include/cutlass/layout/matrix.h of CUTLASS source tree.  The
    reordering of meta matrix into meta_reordered matrix calculated
    according to these segments of CUTLASS code is re-implemented here.
    Note that this calculation produces offsets for scattering metadata
    matrix elements into reordered metadata matrix elements (or,
    equivalently, for gathering reordered metadata matrix element back
    into metadata matrix elements).
    r   ©ÚdeviceNé   é   é    é   é   é   éÿÿÿÿ)ÚtorchÚarangeÚrepeatÚitemsizeÚtoÚint8Úview)ÚmÚ
meta_ncolsÚ
meta_dtyper   Údst_rowsÚdst_colsÚgroupÚ
interweaveÚtoprightÚ
bottomleftÚ
interleaveÚcols_majÚcols_mins                úg/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/sparse/_semi_structured_conversions.pyÚ*_calculate_meta_reordering_scatter_offsetsr!      sd  € ô  �|‰|˜A˜q¨Ô0²°D°Ñ9×@Ñ@ÀÀJÓO€HÜ�|‰|˜A˜z°&Ô9×@Ñ@ÀÀAÓF€Hð ×%Ñ%¨Ò*‰B°€EØ ×)Ñ)¨QÒ.‘°A€Jà�EÑ˜EÑ!Ø�a‰<˜:Ñ
%ñ	&à�eÑ Ñ
!ñ	"ð ð ˜A‘ Ñ" x°!¡|°qÑ'8Ñ9×=Ñ=¼e¿j¹jÓI€HØ˜a‘< 1Ñ$¨°A©¸Ñ):Ñ;×?Ñ?ÄÇ
Á
ÓK€JØ�˜:Ñ%Ñ%€HØ�˜:Ñ%Ñ%€Hð
 €JØ˜:Ñ%€HØ˜*Ñ$€HØ�q‰L˜:Ñ%¨°:Ñ(=Ñ=ÀÑH×NÑNÈrÓRÐRó    c                 óæ  — | j                  «       dk7  rt        d| j                  «       › d�«      ‚| j                  \  }}| j                  }t        j
                  }| j                  t        j
                  k(  rt        j                  }ne| j                  t        j                  t        j                  t        j                  fv rt        j                  }nt        d| j                  › d�«      ‚|j                  dz  dz  }|dvrt        d	«      ‚|t        j                  k(  r|d
z  dk7  r&t        d|› d�«      ‚|dz  dk7  rt        d|› d�«      ‚|d|z  z  dk7  rt        d|› dd|z  › �«      ‚| j                  t        j                  k7  r2d}| j                  d||z  |«      }|dk7  j                  d«      \  }}	}
}n4d}| j                  d||z  |«      }|dk7  j                  d«      x\  }}
\  }	}|||z  z  }||	z  }| |	z  }| |	 z  }|}|}||z  |z  }||	 z  }||j                  t        j                   «      dz  z  }||j                  t        j                   «      dz  z  }| j                  t        j                  k7  roj#                  d|j%                  d«      «      }|j#                  d|j%                  d«      «      }t	        j&                  ||fd¬«      j                  ||dz  «      }n7j#                  d|j%                  d«      dz  «      j                  ||dz  «      }||dz  z  }|j                  d||f«      j                  |«      }|dk(  r=|dd…dd…df   |dd…dd…df   dz  z  |dd…dd…df   dz  z  |dd…dd…df   dz  z  }n�|dk(  r||dd…dd…df   |dd…dd…df   dz  z  |dd…dd…df   dz  z  |dd…dd…df   dz  z  |dd…dd…df   d
z  z  |dd…dd…df   dz  z  |dd…dd…df   dz  z  |dd…dd…df   dz  z  }j)                  ||z  f«      }t+        ||||«      }|j-                  d||j                  d«      «       ||j                  ||«      fS )zÊ
    This function converts dense matrix into sparse semi-structured
    representation, producing "compressed" matrix, in the layout used by
    CUTLASS backend, and corresponding metadata matrix.
    r   z)Expected 2-dimensional dense tensor, got ú-dimensional tensorúInvalid datatype z of dense matrixr   r
   )r
   r   z6Invalid number of elements per meta element calculatedr	   r   zNumber of rows of dense matrix z must be divisible by 16r   z must be divisible by 32z"Number of columns of dense matrix z must be divisible by r   r   )ÚdimNé   é   é   é   é   é   é   é   )r&   ÚRuntimeErrorÚshaper   r   r   ÚdtypeÚint32ÚhalfÚbfloat16ÚfloatÚint16r   r   Úunbindr   Úint64ÚgatherÚ	unsqueezeÚstackÚ	new_emptyr!   Úscatter_)Údenser   Úkr   r   Úquadbits_per_meta_elemÚksparseÚdense_4Úm0Úm1Ú_m2Úm3Údense_2r   Úexpr0Úexpr1Úexpr2Úbit0Úbit1Úbit2Úbit3Úidxs0Úidxs1Úsparse0Úsparse1ÚsparseÚmeta_4Úmeta_nÚmetaÚmeta_reorderedÚmeta_offsetss                                  r    Ú)sparse_semi_structured_from_dense_cutlassrY   /   sÊ  € ð ‡y�yƒ{�aÒÜØ7¸¿	¹	»°}ÐDWÐXó
ð 	
ð �;‰;�D€A€qØ�\‰\€Fä—‘€JØ‡{�{”e—j‘jÒ Ü—[‘[‰
Ø	�‰œŸ™¤U§^¡^´U·[±[ÐAÑ	AÜ—[‘[‰
äÐ.¨u¯{©{¨mÐ;KÐLÓMÐMØ'×0Ñ0°1Ñ4¸Ñ9ÐØ VÑ+ÜÐSÓTÐTà”U—[‘[Ò Øˆr‰6�QŠ;ÜØ1°!°Ð4LÐMóð ð ˆr‰6�QŠ;ÜØ1°!°Ð4LÐMóð ð 	ˆAÐ&Ñ&Ñ'¨1Ò,ÜØ0°°Ð3IÈ!ÐNdÑJdÐIeÐfó
ð 	
ð ‡{�{”e—k‘kÒ!ØˆØ—*‘*˜R  g¡¨wÓ7ˆØ" a™<×/Ñ/°Ó3‰ˆˆB�‘RàˆØ—*‘*˜R  g¡¨wÓ7ˆØ# q™L×0Ñ0°Ó4Ð4‰ˆˆC‘&�"�bØ�wÐ!7Ñ7Ñ8€JðH �‰G€EØˆC�"‰H€EØˆC�2�#‰I€EØ€DØ€DØ�5‰=˜2Ñ€DØ�B�3‰;€DØ�D—G‘GœEŸK™KÓ(¨AÑ-Ñ.€EØ�D—G‘GœEŸK™KÓ(¨AÑ-Ñ.€Eà‡{�{”e—k‘kÒ!Ø—.‘.  U§_¡_°RÓ%8Ó9ˆØ—.‘.  U§_¡_°RÓ%8Ó9ˆÜ—‘˜g wÐ/°RÔ8×=Ñ=¸aÀÀaÁÓH‰à—‘  E§O¡O°BÓ$7¸1Ñ$<Ó=×BÑBÀ1ÀaÈ1ÁfÓMˆà�e˜q‘jÑ!€FØ�[‰[˜"˜jÐ*@ÐAÓB×EÑEÀjÓQ€Fà Ò"à’1’a˜�7‰OØ’aš˜A�g‰ !Ñ#ñ%à’aš˜A�g‰ !Ñ#ñ%ð ’aš˜A�g‰ "Ñ$ñ&ñ 	ð 
  1Ò	$à’1’a˜�7‰OØ’aš˜A�g‰ !Ñ#ñ%à’aš˜A�g‰ !Ñ#ñ%ð ’aš˜A�g‰ "Ñ$ñ&ð ’aš˜A�g‰ "Ñ$ñ	&ð
 ’aš˜A�g‰ "Ñ$ñ&ð ’aš˜A�g‰ "Ñ$ñ&ð ’aš˜A�g‰ "Ñ$ñ&ð 	ð —^‘^ Q¨¡^Ð$5Ó6€NÜ=Ø	ˆ:�z 6ó€Lð ×Ñ˜A˜|¨T¯Y©Y°r«]Ô;à�N×'Ñ'¨¨:Ó6Ð7Ð7r"   c                 ó|	  — | j                  «       dk7  rt        d| j                  «       › d�«      ‚| j                  \  }}| j                  }|j                  «       dk7  rt        d|j                  «       › d�«      ‚|j                  |k7  rt        d|› d|j                  › d�«      ‚|j                  }|t
        j                  t
        j                  fvrt        d|› d	�«      ‚|j                  d
z  dz  }| j                  t
        j                  k7  rd}nd}|j                  \  }}	||k7  rt        d|› d|› �«      ‚|	|z  |z  d|z  k7  rt        d|› d|	|z  |z  dz  › d�«      ‚t        ||	||«      }
t        j                  |j                  d«      d|
«      j                  ||	«      }t        j                  ||	d|z  f||¬«      }|dk(  r�|dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |d
z	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   �n#|d
k(  �r|dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |d
z	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…df<   |dz	  dz  |dd…dd…d
f<   |dz	  dz  |dd…dd…df<   |d z	  dz  |dd…dd…df<   |d!z	  dz  |dd…dd…d"f<   |d#z	  dz  |dd…dd…df<   |d$z	  dz  |dd…dd…d%f<   |d&z	  dz  |dd…dd…df<   |d'z	  dz  |dd…dd…d(f<   |j                  d«      t        j                  dd|z  |z  |z  |¬)«      dz  j                  dd«      j                  dd«      j                  d«      z   }t        j                   |dz  |z  f| j                  |¬«      }| j                  t
        j                  k7  r#|j#                  d|| j                  d«      «       n\|j                  t
        j$                  «      j#                  d|| j                  t
        j$                  «      j                  d«      «       |j                  |d|z  «      S )*zÜ
    This function performs reverse of the function above - it
    reconstructs dense matrix from a pair of "compressed" matrix, given
    in the layout used by CUTLASS backend, and accompanying metadata
    matrix.
    r   z*Expected 2-dimensional sparse tensor, got r$   z(Expected 2-dimensional meta tensor, got zExpected meta matrix to be on z device, got matrix on z devicer%   z of meta matrixr   r
   zNumber of rows of meta matrix z4 must be equal to number of columns of spase matrix z#Number of columns of sparse matrix z different from the z<, expected according to the number of columns of meta matrixr   r   ©r1   r   r'   Nr   r+   é
   r)   r(   é   r-   r	   é   é	   r*   é   é   r,   é   é   r.   é   é   r   )r&   r/   r0   r   r1   r   r6   r2   r   r5   r!   r9   r   Úemptyr   r   Úzerosr=   r3   )rS   rW   r   r?   r   r   r@   rA   Ú
meta_nrowsr   rX   rV   Úmeta_2Údense_offsetsr>   s                  r    Ú'sparse_semi_structured_to_dense_cutlassrk   ´   sJ  € ð ‡z�zƒ|�qÒÜØ8¸¿¹»¸ÐFYÐZó
ð 	
ð �<‰<�D€A€qØ�]‰]€Fà×ÑÓ˜qÒ ÜØ6°~×7IÑ7IÓ7KÐ6LÐL_Ð`ó
ð 	
ð ×Ñ Ò&ÜØ,¨V¨HÐ4KÈN×LaÑLaÐKbÐbiÐjó
ð 	
ð  ×%Ñ%€JØœ%Ÿ+™+¤u§{¡{Ð3Ñ3ÜÐ.¨z¨l¸/ÐJÓKÐKØ'×0Ñ0°1Ñ4¸Ñ9Ðà‡|�|”u—{‘{Ò"Ø‰àˆà+×1Ñ1Ñ€J�
Ø�Q‚ÜØ,¨Z¨LÐ8lÐmnÐloÐpó
ð 	
ð �GÑÐ4Ñ4¸¸A¹Ò=ÜØ1°!°Ð4HÈÐV]ÑI]Ð`vÑIvÐz{ÑI{ÐH|ð }Ið Ió
ð 	
ô >Ø	ˆ:�z 6ó€Lô �<‰<˜×+Ñ+¨BÓ/°°LÓA×FÑFÀqÈ*ÓU€Dô �[‰[Ø	
ˆJ˜Ð2Ñ2Ð3ØØô€Fð
  Ò"Ø ™+ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‹Ø	 1Ó	$Ø ™+ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 1™9¨Ñ,ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø 2™:¨Ñ-ˆŠq’!�Qˆw‰Ø  B™J¨$Ñ.ˆŠq’!�RˆxÑØ  B™J¨$Ñ.ˆŠq’!�RˆxÑØ  B™J¨$Ñ.ˆŠq’!�RˆxÑØ  B™J¨$Ñ.ˆŠq’!�RˆxÑØ  B™J¨$Ñ.ˆŠq’!�RˆxÑØ  B™J¨$Ñ.ˆŠq’!�RˆxÑà—K‘K “OÜ�‰�Q˜˜A™ ™	 WÑ,°VÔ<¸qÑ@ß
�dˆ2ˆqƒk—&‘&˜˜A“,Ÿt™t B›xñ(€Mô �K‰K˜˜Q™ ™˜¨F¯L©LÀÔH€EØ‡|�|”u—{‘{Ò"Ø�‰�q˜-¨¯©°R«Õ9à�
‰
”5—:‘:Ó×'Ñ'Øˆ}˜fŸk™k¬%¯*©*Ó5×:Ñ:¸2Ó>ô	
ð �:‰:�a˜˜Q™ÓÐr"   c                 ó|   — d„ }| j                  ddd«      j                  ddd«      D ]  }|D ]
  } ||«       Œ Œ | S )a   
    This function computes a 2:4 sparse tile by greedily taking the largest values.

    Since we take the largest values greedily, how the sorting algorithm handles duplicates affects
    the ultimate sparsity pattern.

    Note that this function does not have the same sorting semantics as our CUDA backend,
    which is exposed via `torch._sparse_semi_structured_tile` and thus returns a different pattern.
    c                 óì   — g d¢}g d¢}| j                  «       j                  dd¬«      j                  D ]>  }|dz  |dz  }}||   dk  r#||   dk  r||xx   dz  cc<   ||xx   dz  cc<   Œ8d| ||f<   Œ@ y )N)r   r   r   r   T)Ú
descendingÚstabler
   r   r   r   )ÚflattenÚsortÚindices)ÚtileÚnum_kept_rowÚnum_kept_colÚxÚrÚcs         r    Úgreedy_prune_tilez7_sparse_semi_structured_tile.<locals>.greedy_prune_tile(  sˆ   € Ú#ˆÚ#ˆà—‘“×$Ñ$°¸TÐ$ÓB×JÑJò 	ˆAØ˜‘6˜1˜q™5ˆqˆAØ˜A‰ Ò" |°A¡¸Ò':Ø˜Q“ 1Ñ$“Ø˜Q“ 1Ñ$”à��Q˜�T’
ñ	r"   r   r
   r   )Úunfold)r>   ry   Úbatchrs   s       r    Ú_sparse_semi_structured_tiler|     sR   € ò
ð —‘˜a  AÓ&×-Ñ-¨a°°AÓ6ò $ˆØò 	$ˆDÙ˜dÕ#ñ	$ð$ð €Lr"   c                 ó
  — | j                  «       j                  t        j                  «      }|j	                  ddd«      j	                  ddd«      }|j	                  ddd«      j	                  ddd«      } |j
                  g |j                  dd ¢d‘d‘d‘­Ž }dt        j                  dt        j                  d¬	«      z  }|j                  t        j                  «      |z  j                  t        j                  «      }|S )
zH
    Calculates the compressed swizzled bitmask from a dense tensor
    r   r   r   r   r
   r'   NÚcudar[   )	Úboolr   r   Úuint8rz   Úreshaper0   r   r5   )r>   Úint_bitmaskÚbitmask_8x8_chunksÚbitmask_4x4_chunksÚbitmask_binary_representationÚpowers_of_twoÚcompressed_swizzled_bitmasks          r    Ú$_compute_compressed_swizzled_bitmaskrˆ   ;  sû   € ð —*‘*“,—/‘/¤%§+¡+Ó.€Kð %×+Ñ+¨A¨q°!Ó4×;Ñ;¸A¸qÀ!ÓDÐð ,×2Ñ2°1°a¸Ó;×BÑBÀ1ÀaÈÓKÐð %?Ð$6×$>Ñ$>ð %Ø	×	!Ñ	! " 1Ð	%ð%Ø'(ð%Ø*+ð%Ø-.ò%Ð!ð
 œŸ™ a¬u¯{©{À6ÔJÑJ€Mð 	&×(Ñ(¬¯©Ó5¸ÑEß�bŒ�‰ƒoð  ð 'Ð&r"   )r   r!   rY   rk   r|   rˆ   © r"   r    ú<module>rŠ      s'   ðã ò'SòTB8òJf òRó<)'r"   