
    Vpfs!                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ ddlmZ dd	lmZ dd	lZ ej        d
          Zej        ej        ej        ej        fZej        ej        fZd e             e            ffdej        fdededededededefdZd Z d Z!d(dZ"d Z#d Z$d Z%ej&        d             Z' ej(        ee$            ej)        e           ej*        r ej(        ee%d           ej+        r ej(        ee%d            ej        d           Z,d(d!edefd"Z-d# Z.e,j/        d$             Z0e,j&        d%             Z1 ej2        e0d&'          Z3 ej(        e,e3            ej)        e,           d	S ))z#N:M-sparsity associated primitives.    )core)dispatch)DotDimensionNumbers)
gpu_sparse)mhlo)Array	DTypeLike)mlirNsparse_dense_matmul))   )r   lhsrhsmetadatadimension_numberssparse_operand_idxoutput_dtypereturnc                 B    t                               | |||||          S )a  Dot operation where one of the operands has N:M sparsity.

  Args:
    lhs: An ndarray (first dot operand).
    rhs: An ndarray (second dot operand).
    metadata: An ndarray with structured sparsity metadata for the contracting
      dimension. For 2:4 sparsity it should contain (N=2) two-bit index values
      for each (M=4) element group.
    dimension_numbers: a tuple of tuples of the form `((lhs_contracting_dims,
      rhs_contracting_dims), (lhs_batch_dims, rhs_batch_dims))`.
    sparse_operand_idx: index of the sparse operand (0 or 1).
    output_dtype: result type.

  Returns:
    An ndarray dense array containing the result.
  )r   r   r   )	nm_spmm_pbind)r   r   r   r   r   r   s         Z/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/experimental/sparse/nm.pynm_spmmr   $   s1    0 
		)+ 
 
 
     c                 @    | |                                 dz
  z  }d|z  S )Nr      )
bit_length)nm
group_bitss      r   _calc_groups_per_elementr    F   s$    ALLNNQ&'*	z	r   c           	      "   t          t          t          t          |                     t          ||z             z
                      }t          ||z   |z             t	          t          |                     k    rt          d|           |S )Nz Incorrect dimension numbers for )tuplesortedsetrangelist	TypeError)rankcontractbatchnamenon_contracts        r   _validate_dnumsr-   K   s    vc%++..X5E1F1FFGGHH,L8#e+,,U4[[0A0AAA
=t==
>
>>	r         c                 .   |dv sJ |t          ||          z  }| |g|         }|d         |         }	|j        t          j        k    rt	          d|j                   |	d         |j        dz
  k    rt	          d          |j        d d         |j        d d         k    rt	          d          |j        d         |z  |j        d         k    r8t	          d| d	| d
| d|j        d         |z   d|j        d          d          |j        d         |z  dk    rt          d          | |gd|z
           }
|d         d|z
           }|j        |	d                  |
j        |d                  }}||z  ||z  k    rt	          d| d
| d| d
|           d S )Nr   r   r   zMetadata must be uint16, got r   z+Contracting dimension must be the minor onezRMetadata shape must match the operand shape (except for the contracting dimension)zMetadata must be exactly z/ times less than the contracting dimension for :z structured sparsity (expected , got )z&Metadata with padding is not supportedz(Contracting dimension sizes should have z ratio, got )r    dtypenpuint16r'   ndimshapeNotImplementedError)r   r   r   r   indexr   r   size_factorsparsesparse_contractdensedense_contractabs                 r   _validate_metadatarD   R   s   	&,Q222+:e&%a(//^ry  
DHNDD
E
EEQ6;?**
A
B
BB^CRCFL"---
	"   ^B+%b)999
	IK 	I 	I&'	I 	I*+	I 	IL+	I 	I3;>"3E	I 	I 	I  
 \"#q((
F
G
GG*QY
%$Q'E	2.	oa(	)5;~a7H+IQ!Ua!e^^
M1MMqMMaMM!MM   ^r   c                     |\  \  }}\  }}t          |          dk    st          |          dk    rt          d          t           j        ||d          }t          j        ||d          }t          |          dk    st          |          dk    rt          d           fd|D             }	|	fd|D             k    rt          d          t	          |	 j        |d	                  j        |d	                  gz             S )
Nr   z.Only single contracting dimension is supportedr   r   z2Only single non-contracting dimension is supportedc                 *    g | ]}j         |         S  r:   ).0ir   s     r   
<listcomp>z'_infer_result_shape.<locals>.<listcomp>{   s    
+
+
+A39Q<
+
+
+r   c                 *    g | ]}j         |         S rG   rH   )rI   rJ   r   s     r   rK   z'_infer_result_shape.<locals>.<listcomp>|   s    ///sy|///r   z"Batch dimension sizes do not matchr   )lenr'   r-   r9   r"   r:   )
r   r   r   lhs_contractrhs_contract	lhs_batch	rhs_batchlhs_dimsrhs_dimsr*   s
   ``        r   _infer_result_shaperT   s   s   ;L8L,!7)Y!s<00A55
D
E
EESX|YFF(SX|YFF(]]a3x==A--
H
I
II
+
+
+
+
+
+
+%
////Y/////
8
9
99	u	(1+.	(1+0FGG	H	HHr   c                       t          d          )Nz,Sparse N:M matmul is only implemented on GPU)r;   )_args_kwargss     r   _nm_spmm_default_loweringrX      s    JKKKr   c                   |dv sJ t           j                            |d         |         d         dd          }t           j                            |d         |         |d         d|z
           |d         |         |d         d|z
                     }| j        d         }	dd	g|         }
|
|i}t          j        t          j        |	          |||g|fi |}|j        S )
Nr1   r   r.   r/   )	dimensionr   r   r   )lhs_batching_dimensionsrhs_batching_dimensionslhs_contracting_dimensionsrhs_contracting_dimensionslhs_sparsityrhs_sparsity)	r   SparsityDescriptorgetr   	avals_outSparseDotOpr
   aval_to_ir_typeresults)ctxr   r   r   r   r   r   sparsity_descriptor	dot_dnumsdot_typekeykwargsops                r   _nm_spmm_gpu_loweringrn      s    
v	%	%	%	%/33!!$%78;qA 4   &**/23EF/217I3IJ!21!56H!I!21!5a:L6L!M	 +  ) ]1(	();<#$%&
8$$c3
I IO " 
r   c                >   | j         t          vrt          d| j                    |j         t          vrt          d|j                    |t          vrt          d|           t	          | ||          }t          | ||||           t          j        ||          S )NzUnsupported lhs input type: zUnsupported rhs input type: zUnsupported output type: )r6   _supported_input_typesr'   _supported_output_typesrT   rD   r   ShapedArray)r   r   r   r   r   r   	res_shapes          r   _nm_spmm_abstract_evalrt      s     	Y,,,
>39>>
?
??Y,,,
>39>>
?
??000
>>>
?
??!#s,=>>)S#x):<NOOO		)\	2	22r   cuda)platformrocmsparse_pack_nmmaskc                 <    t                               | ||          S )a  Generate metadata tensor for an N:M mask.

  Args:
    mask: Predicates for the input tensor, where the elements are grouped in the
      minor dimension. In each group of size M there should be exactly N true
      values, which mark the data elements to keep.
    n: Number of non-zero elements in a group.
    m: Group size.

  Returns:
    An ndarray containing only the masked input elements.
  )r   r   )	nm_pack_pr   )ry   r   r   s      r   nm_packr|      s     
Q	'	''r   c           	         g }||z  z  }t          dt          |           |          D ]v}t          t          j        | |||z            |          d         z            }t          fdt          |          D                       }|                    |           wt          j        |t          j
                  S )Nr   )sizec              3   D   K   | ]\  }}|t          |          z  V  d S N)pow)rI   rJ   jr   s      r   	<genexpr>z_compress.<locals>.<genexpr>   s3      ;;$!QC1II;;;;;;r   )r6   )r%   rM   r"   jnpnonzerosum	enumerateappendarrayr7   r8   )	datar   r   kresultexpectedrJ   r<   values	     `      r   	_compressr      s    &!q&\(CIIq!!  a#+d1q1u9oH===a@1DEEE;;;;)E*:*:;;;;;E
MM%	6	+	+	++r   c                d    t                    z  t          j        fdd|           S )Nc                 (    t          |           S r   )r   )x
batch_sizer   r   s    r   <lambda>z_nm_pack_impl.<locals>.<lambda>   s    	!Q:.. r   r2   )r    r   apply_along_axis)ry   r   r   r   s    ``@r   _nm_pack_implr      sE    +Aq111*		......D
 
 r   c                X   |t          ||          z  }| j        t          k    rt          d| j                   | j        d         |z  dk    rt          d| d| j                   t          | j                  }|dxx         |z  cc<   t          j        |t          j	                  S )NzMask should be bool, got r2   r   z,Inner dimension size should be divisible by r4   )
r    r6   boolr'   r:   r&   r   rr   r7   r8   )ry   r   r   r=   rs   s        r   _nm_pack_abstract_evalr      s    ,Q222+	Z4
<
<<
=
==	Z^k!Q&&
	{ 	 	J	 	   4:)B---K---		)RY	/	//r   F)multiple_results)r.   r/   )4__doc__jaxr   jax._srcr   jax._src.lax.laxr   jax._src.libr   jax._src.lib.mlir.dialectsr   jax._src.typingr   r	   jax.interpretersr
   	jax.numpynumpyr   r7   	Primitiver   int8int16float16bfloat16rp   float32rq   r"   intr   r    r-   rD   rT   rX   rn   def_abstract_evalrt   register_loweringsimple_implcuda_is_supportedrocm_is_supportedr{   r|   r   def_implr   r   	lower_fun_nm_pack_loweringrG   r   r   <module>r      s6   * )             0 0 0 0 0 0 # # # # # # + + + + + + , , , , , , , , ! ! ! ! ! !          
 DN011	(CIs{CLI <5  /;UUWWeegg<N-O!l 		  +	
      D  
     BI I IL L L  : 3 3 3  y"; < < <  Y    L$$9FKKKK L$$9FKKKK
 DN+,,	( (% (e ( ( ( ( , , ,    0 0 0 #DN=5III   y"3 4 4 4  Y     r   