
    *`i4                     .    d dl Z g dZd Zd Zd Zd ZdS )    N))sparse_semi_structured_from_dense_cutlass'sparse_semi_structured_to_dense_cutlassmask_creatorc                    t          j        d| |          d d d f                             d|          }t          j        d||                              | d          }d}|j        dk    rdnd}||z  |z  |dz  dz  z   |dz  d	z  z   ||z  d	z  dz  dz  z   ||z  dz  d	z  z   }|dz  dk    |dz  dk    z                      t           j                  }|dz  dk    |dz  dk    z                      t           j                  }	|||	z
  z  }|||	z
  z  }d}
||
z  }||
z  }|| z  |
z  ||
z  z   |z                       d
          S )Nr   device   @                   )torcharangerepeatitemsizetoint8view)m
meta_ncols
meta_dtyper   dst_rowsdst_colsgroup_xgroup_ytopright
bottomleft
interleavecols_majcols_mins                /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/compressed_tensors/utils/semi_structured_conversions.py*_calculate_meta_reordering_scatter_offsetsr%   -   s   |Aq000D9@@JOOH|Az&999@@AFFH G'1,,bb"G 	Gg%a<1
	a<A
	 w!#
)B
.	/ w1$
)		*  A"x!|q'89==ejIIHa<1$A):;??
KKJ:%%H:%%H
 J:%H*$HqL:%:(==HNNrRRR    c                 	   |                                  dk    r%t          d|                                   d          | j        \  }}| j        }t          j        }| j        t          j        k    rt          j        }nZ| j        t          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k    rt          d| d          n|dz  dk    rt          d| d          |d|z  z  dk    rt          d| dd|z             | j        t          j
        k    r;d}|                     d||z  |          }|dk                        d          \  }}	}
}n=d}|                     d||z  |          }|dk                        d          x\  }}
\  }	}|||z  z  }||	z  }| |	z  }| |	 z  }|}|}||z  |z  }||	 z  }||                    t          j                  dz  z  }||                    t          j                  dz  z  }| j        t          j
        k    r|                    d|                    d                    }|                    d|                    d                    }t	          j        ||fd                              ||dz            }nC|                    d|                    d          dz                                ||dz            }||dz  z  }|                    d||f                              |          }|dk    rI|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  }|                    ||z  f          }t+          ||||          }|                    d||                    d                     ||                    ||          fS )Nr   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	   dim                        )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$   r   r   N   s   yy{{aX		XXX
 
 	
 ;DAq\FJ{ej  [

	U^U[%+N	N	N[

Lu{LLLMMM'0149V++STTTU[  r6Q;;M!MMM   
 r6Q;;M!MMM   	A&&'1,,fff!NdJdff
 
 	
 {ek!!**Rgw77!Q,..r22BBB**Rgw77"a<//333BRw!778JH GEC"HEC2#IEDD5=2DB3;DDGGEK((A-.EDGGEK((A-.E{ek!!..##
 
 ..U__R%8%899gw/R888==aaHHEOOB$7$71$<==BBqAv
 
 eqj!F[["j*@ABBEEjQQF""111aaa7OaaaAg!#%aaaAg!#% aaaAg"$& 	 
 1	$	$111aaa7OaaaAg!#%aaaAg!#% aaaAg"$& aaaAg"$	&
 aaaAg"$& aaaAg"$& aaaAg"$& 	 ^^	
Z N >	:z6 L A|TYYr]];;;N'':6677r&   c                 	   |                                  dk    r%t          d|                                   d          | j        \  }}| j        }|                                 dk    r%t          d|                                  d          |j        |k    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	        k    rdnd}|j        \  }}	||k    rt          d| d|           |	|z  |z  d|z  k    rt          d| d|	|z  |z  dz   d          t          ||	||          }
t          j        |                    d          d|
                              ||	          }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<   |                    d          t          j        dd|z  |z  |z  |(          dz                      dd                              dd                              d          z   }t          j        |dz  |z  f| j        |          }| j        t
          j	        k    r+|                    d||                     d                     nd|                    t
          j                                      d||                     t
          j                                      d                     |                    |d|z            S ))Nr   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   )r6   r   r,   r	   r0   
   r.   r-      r2   r      	   r/         r1         r3         r   )r+   r4   r5   r   r6   r   r;   r7   r   r:   r%   r>   r   emptyr   r   zerosrB   reshaper8   )rX   r\   r   rD   r   r   rE   rF   
meta_nrowsr   r]   r[   meta_2dense_offsetsrC   s                  r$   r   r      s~   zz||qZZZZ
 
 	
 <DAq]Fq  `~7I7I7K7K```
 
 	
 &&jVjjNLajjj
 
 	
  %J%+u{333JzJJJKKK'0149<5;..aaAG+1J
QpZppmnpp
 
 	
 G44A==I! I IV]I]`vIvz{I{ I I I
 
 	
 >	:z6 L <++B//LAAFFq*UUD [	
J223  F
 ""+qqq!!!Qw19,qqq!!!Qw19,qqq!!!Qw19,qqq!!!Qw19,qqq!!!Qw2:-qqq!!!Qw2:-qqq!!!Qw2:-qqq!!!Qw	1	$	$+qqq!!!Qw19,qqq!!!Qw19,qqq!!!Qw19,qqq!!!Qw19,qqq!!!Qw2:-qqq!!!Qw2:-qqq!!!Qw2:-qqq!!!Qw2:-qqq!!!Qw2:-qqq!!!Qw BJ$.qqq!!!Rx BJ$.qqq!!!Rx BJ$.qqq!!!Rx BJ$.qqq!!!Rx BJ$.qqq!!!Rx BJ$.qqq!!!RxKKOOQA	W,V<<<q@
d2qkk&&A,,ttBxx(M KQFLHHHE|u{""q-););<<<<

5:''}fkk%*55::2>>	
 	
 	
 ::aQr&   c                 $   d}d}d}|                                  |z  dk    rt          d| j         d| d          |                                  |z  }|                                                                                     ||          }t          j        |d	          dddt          ||z
            f         }t          j	        |j        |j
        
          }|                    d|d                              | j                  }|S )aJ  
    Class for creating N:M sparsity masks.
    Masks will be created using the N:M ratio, where for every block of
    M weights, N will be pruned based on ranked weight value. Each mask
    will correspond to the given tensor.

    :param N: The number of weights in a group to keep
    :param M: The size of a weight group
    r   r   Nr   zTensor of size z can't be evenly divided into z groupsr	   r*   r   )r+   indexvalue)numel
ValueErrorr5   detachabsrk   r   argsortintonesr   rB   )tensorNMmask
num_groupstensor_temprp   w_bs           r$   r   r   9  s	    	
A	AD||~~QXflXXaXXX
 
 	
 1$J --//%%''//
A>>KM+1---aaa3q1u::o>E
*[&{/A
B
B
BC<<AU!<44<<V\JJDKr&   )r   __all__r%   r   r   r    r&   r$   <module>r      ss   ,   (S S SBC8 C8 C8T^  ^  ^ B    r&   