
    Vpf:^                    r   d Z ddlmZ ddlmZ ddlmZ ddlZddlm	Z	m
Z
 ddlZddlZddl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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$ ddl%m&Z&m'Z'm(Z( ddl)mZ* e	Z+e,e-df         Z. G d de
          Z/ej0         G d de                      Z1 ej2        d          Z3dUdZ4dVd"Z5d# Z6e3j7        d$             Z8 ej9        e6d%&          Z:d' Z;d( Z<d) Z= ej>        e3e<dd           e=ej?        e3<    ej@        e3e:            ejA        e3           e"jB        r" ej@        e3 ee;e"jC                  d*+           e"jD        r" ej@        e3 ee;e"jE                  d,+            ej2        d-          ZFd.eF_G        de*jH        d/dWd4ZIe*jH        d5dXd8ZJd9 ZKeFj7        d:             ZL ej9        eKd.&          ZMd; ZNd< ZOd= ZPeOejQ        eF<   ePej?        eF<    ej@        eFeM            ejA        eF           e"jB        r" ej@        eF eeNe"jR                  d*+           e"jD        r" ej@        eF eeNe"jS                  d,+            ej2        d>          ZTdYdZdBZUd%dCd[dDZVdE ZWeTj7        dF             ZX ej9        eWd%&          ZYdG ZZdH Z[dI Z\dJ Z] ej>        eTe[dde\           e]ej?        eT<    ej@        eTeY            ejA        eT           e"jB        r" ej@        eT eeZe"j^                  d*+           e"jD        r" ej@        eT eeZe"j_                  d,+            ej2        dK          Z`d%dCd\dMZad%dCd]dNZbdO Zce`j7        dP             Zd ej9        ecd%&          ZedQ ZfdR ZgdS ZhdT Zi ej>        e`egddeh           eiej?        e`<    ej@        e`ee            ejA        e`           e"jB        r" ej@        e` eefe"jj                  d*+           e"jD        r$ ej@        e` eefe"jk                  d,+           dS dS )^z@COO (coordinate format) matrix object and associated primitives.    )annotations)Sequence)partialN)Any
NamedTuple)lax)mlir)	JAXSparse)_coo_extractCuSparseEfficiencyWarning)	tree_util)core)dispatch)ad)_const)hlo)
gpu_sparse)promote_dtypes)Array	ArrayLike	DTypeLike.c                  6    e Zd ZU ded<   dZded<   dZded<   dS )COOInfoShapeshapeFboolrows_sortedcols_sortedN)__name__
__module____qualname____annotations__r   r        [/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/experimental/sparse/coo.pyr   r   .   s=         ,,,++r$   r   c                  t    e Zd ZU dZded<   ded<   ded<   ded<    ed           Z ed	           Z ed
           Z ed           Z	ded<   ded<   dddd7 fdZ
edej        dd8d             Zd9d!Zedd"d#d:d'            Zedd"d#d;d,            Zd<d-Zd=d>d0Zd?d2Zed3             Zd@d6Z xZS )ACOOa  Experimental COO matrix implemented in JAX.

  Note: this class has minimal compatibility with JAX transforms such as
  grad and autodiff, and offers very little functionality. In general you
  should prefer :class:`jax.experimental.sparse.BCOO`.

  Additionally, there are known failures in the case that `nse` is larger
  than the true number of nonzeros in the represented matrix. This situation
  is better handled in BCOO.
  z	jax.Arraydatarowcolztuple[int, int]r   c                    | j         j        S N)r(   sizeselfs    r%   <lambda>zCOO.<lambda>D   s
    din r$   c                    | j         j        S r,   )r(   dtyper.   s    r%   r0   zCOO.<lambda>E   s
    	 r$   c                D    t          | j        | j        | j                  S )Nr   r   r   )r   r   _rows_sorted_cols_sortedr.   s    r%   r0   zCOO.<lambda>F   s%    JD$5#!% !% !% r$   c                *    | j         | j        | j        fS r,   )r(   r)   r*   r.   s    r%   r0   zCOO.<lambda>I   s    DHdh ? r$   r   r5   r6   F)r   r   argstuple[Array, Array, Array]r   r   r   c                   t          t          j        |          \  | _        | _        | _        || _        || _        t                      	                    ||           d S )Nr   )
mapjnpasarrayr(   r)   r*   r5   r6   super__init__)r/   r8   r   r   r   	__class__s        r%   r@   zCOO.__init__M   sT    $'T$:$:!DItx#D#D	GGT'''''r$   Nnseindex_dtypematr   rC   
int | NonerD   r   returnc               &    t          |||          S NrB   )coo_fromdense)clsrE   rC   rD   s       r%   	fromdensezCOO.fromdenseT   s    #;????r$   c                    | j         r| S t          j        | j        | j        | j        fd          \  }}}|                     |||f| j        d          S )zReturn a copy of the COO matrix with sorted indices.

    The matrix is sorted by row indices and column indices per row.
    If self._rows_sorted is True, this returns ``self`` without a copy.
       )num_keysTr   r   )r5   r   sortr)   r*   r(   rA   r   )r/   r)   r*   r(   s       r%   _sort_indiceszCOO._sort_indicesX   sf      kXtx49=JJJNCd>>4c*$*&*  , , ,r$   int32r2   rD   Sequence[int]r2   DTypeLike | Nonec                   t          |          }t          |          dk    rt          d|          t          j        d|          }t          j        d|          x}} | |||f|dd          S )z>Create an empty COO instance. Public method is sparse.empty().rN   z COO must have ndim=2; got shape=r   Tr4   )tuplelen
ValueErrorr=   empty)rK   r   r2   rD   r(   r)   r*   s          r%   _emptyz
COO._emptye   s     %LLE
5zzQ<E<<===9QD	![)))C#3c3u$! ! ! !r$   NintMkc          	     ,   dk    rt          ||z
            }nt          |z   |          }|dk    r|                     ||f||          S t          j        ||          }t          j        ||          }t          |d          t          |          t          j        |t          j        dk    fdfd                    }	t          j	        |t          j        dk    fdfd                    }
 | ||	|
f||fdd	          S )
Nr   rT   )r2   c                      S r,   r#   zeros   r%   r0   zCOO._eye.<locals>.<lambda>        r$   c                      S r,   r#   r`   s   r%   r0   zCOO._eye.<locals>.<lambda>       a r$   c                      S r,   r#   rc   s   r%   r0   zCOO._eye.<locals>.<lambda>   re   r$   c                      S r,   r#   rg   s   r%   r0   zCOO._eye.<locals>.<lambda>   rh   r$   Tr4   )
minr\   r=   onesaranger   r   subcondadd)rK   r]   r_   r`   r2   rD   	diag_sizer(   idxr)   r*   rd   s      `       @r%   _eyezCOO._eyeq   s    	1uuaQ--iia!eQ--iA~~ZZAeZEEE8IU+++D
*Yk
2
2
2C#q>>DsAA
'#sxQiiii@@
A
AC
'#sxQiiii@@
A
AC3c31v4TRRRRr$   c                     t          |           S r,   )coo_todenser.   s    r%   todensezCOO.todense   s    tr$   axestuple[int, ...] | Nonec                    |t          d          t          | j        | j        | j        f| j        d d d         | j        | j                  S )Nzaxes argument to transpose()r4   )NotImplementedErrorr'   r(   r*   r)   r   r6   r5   )r/   rw   s     r%   	transposezCOO.transpose   s[     >???	48TX.dj26F,$:KM M M Mr$   1tuple[tuple[Array, Array, Array], dict[str, Any]]c                \    | j         | j        | j        f| j                                        fS r,   )r(   r)   r*   _info_asdictr.   s    r%   tree_flattenzCOO.tree_flatten   s(    Itx*DJ,>,>,@,@@@r$   c                
   t                               |           }|\  |_        |_        |_        |                                h dk    rt          d|          |d         |_        |d         |_        |d         |_	        |S )N>   r   r   r   z%COO.tree_unflatten: invalid aux_data=r   r   r   )
object__new__r(   r)   r*   keysrZ   r   r5   r6   )rK   aux_datachildrenobjs       r%   tree_unflattenzCOO.tree_unflatten   s    
..

C!)CHcgsw}}AAAAAAhAABBB!CI.C.CJr$   otherr   c                   t          |t                    rt          d          t          j        |          }t          | j        |          \  }}t          || j        | j	        ffi | j
                                        }|j        dk    rt          ||          S |j        dk    rt          ||          S t          d|j                   )Nz"matmul between two sparse objects.   rN   zmatmul with object of shape )
isinstancer
   r{   r=   r>   r   r(   r'   r)   r*   r   r   ndim
coo_matvec
coo_matmatr   )r/   r   r(   self_promoteds       r%   
__matmul__zCOO.__matmul__   s    %## F DEEEKE E22KD%tx2KKdj6H6H6J6JKKMzQu---	qu--- Lu{ L LMMMr$   )r8   r9   r   r   r   r   r   r   rE   r   rC   rF   rD   r   rG   r'   )rG   r'   )r   rU   r2   rV   rD   r   rG   r'   )r]   r^   r_   r^   r`   r^   r2   rV   rD   r   rG   r'   )rG   r   r,   )rw   rx   rG   r'   )rG   r}   )r   r   rG   r   )r   r    r!   __doc__r"   propertyrC   r2   r   _bufsr@   classmethodnprS   rL   rR   r\   rs   rv   r|   r   r   r   __classcell__)rA   s   @r%   r'   r'   4   s%        	 	 ///......,,--#
(//
0
0%
( % % & &% (??
@
@% $)e( ( ( ( ( ( ( ( 6:UWU] @ @ @ @ @ ;@, , , , EI&-	! 	! 	! 	! 	! ;	! EI$+S S S S S ;S&   M M M M MA A A A   ;N N N N N N N Nr$   r'   ru   rE   rG   r   c                P    t          | j        | j        | j        | j                  S )zConvert a COO-format sparse matrix to a dense matrix.

  Args:
    mat : COO matrix
  Returns:
    mat_dense: dense version of ``mat``
  spinfo)_coo_todenser(   r)   r*   r   )rE   s    r%   ru   ru      s#     
ch	C	C	CCr$   r(   r)   r*   r   c               >    t                               | |||          S )aI  Convert CSR-format sparse matrix to a dense matrix.

  Args:
    data : array of shape ``(nse,)``.
    row : array of shape ``(nse,)``
    col : array of shape ``(nse,)`` and dtype ``row.dtype``
    spinfo : COOInfo object containing matrix metadata

  Returns:
    mat : array with specified shape and dtype matching ``data``
  r   )coo_todense_pbindr(   r)   r*   r   s       r%   r   r      s!     
		D#s6		:	::r$   c                   t          j        |j        | j                  j        ||f                             |           S r,   )r=   zerosr   r2   atrp   r   s       r%   _coo_todense_implr      s2    	6<	,	,	/S	9	=	=d	C	CCr$   c               @    t          j        |j        | j                  S r,   )r   ShapedArrayr   r2   r   s       r%   _coo_todense_abstract_evalr      s    		&,
	3	33r$   F)multiple_resultsc               J   |j         \  }}}|j        }	t          j        |	t          j                  sQt          j        |	t          j                  s2t          j        d|	dt                     t          |||||          S |j
        r
|j        }
d}nL|j        r||}}d}|j        d d d         }
n.t          j        dt                     t          |||||          S  | ||||
|	|j                  }|r*t          j        |t          j        d	d
g                    gn|gS )Nz@coo_todense cusparse/hipsparse lowering not available for dtype=). Falling back to default implementation.r   FTrz   zcoo_todense GPU lowering requires matrices with sorted rows or sorted cols. To sort the rows in your matrix, use e.g. mat = mat._sort_indices(). Falling back to the default implementation.)r   
data_dtyperD   r   r   )avals_inr2   r   
issubdtypefloatingcomplexfloatingwarningswarnr   _coo_todense_loweringr   r   r   r   r|   r	   dense_int_array)coo_todense_hloctxr(   r)   r*   r   	data_avalrow_aval_r2   r   r|   results                r%   _coo_todense_gpu_loweringr      so   <)Xq
/%
-r{
+
+ Er}UBDV/W/W EM <u < < <=VX X X dCVDDDD ELEII ECCIL2EEM 89RT T T !dCVDDDD?
CEeQ Q Q& 
!s}VT11a&99::;;"r$   c               (    t          | |||          S )Nr   )r   )data_dotr(   r)   r*   r   s        r%   _coo_todense_jvpr      s    	hS	8	8	88r$   c               N   t          j        |          sJ t          j        |          st          j        |          rt          d          | j        |j        k    sJ |j        j        |j        j        k    sJ | j        |j        j        k    sJ t          |||           ||fS )N/Cannot transpose with respect to sparse indices)r   is_undefined_primalrZ   r   avalr2   r   )ctr(   r)   r*   r   s        r%   _coo_todense_transposer      s     
		%	%%%%C   HB$:3$?$? H
F
G
GG	V\	!	!	!	!	38>	)	)	)	)	TY_	$	$	$	$	c3	#	#S#	--r$   cuda)platformrocmrJ   TrB   rC   rF   rD   r   c                   |%t          | dk                                              }t          j        t          j        |d          }t          t          | ||          | j        d          S )aE  Create a COO-format sparse matrix from a dense matrix.

  Args:
    mat : array to be converted to COO.
    nse : number of specified entries in ``mat``. If not specified,
      it will be computed from the input matrix.
    index_dtype : dtype of sparse indices

  Returns:
    mat_coo : COO representation of the matrix.
  Nr   zcoo_fromdense nse argumentrB   TrP   )	r^   sumr   concrete_or_erroroperatorindexr'   _coo_fromdenser   )rE   rC   rD   nse_ints       r%   rJ   rJ     sj     	[
saxnn

C"8>38TUU'	^CW+FFF9$
0 
0 
0 0r$   )rD   r^   r9   c                   t          j        |           } t          j        t          j        |d          }t                              | ||          S )a  Create COO-format sparse matrix from a dense matrix.

  Args:
    mat : array to be converted to COO.
    nse : number of specified entries in ``mat``
    index_dtype : dtype of sparse indices

  Returns:
    data : array of shape ``(nse,)`` and dtype ``mat.dtype``
    row : array of shape ``(nse,)`` and dtype ``index_dtype``
    col : array of shape ``(nse,)`` and dtype ``index_dtype``
  znse argument of coo_fromdense()rB   )r=   r>   r   r   r   r   coo_fromdense_pr   )rE   rC   rD   s      r%   r   r   "  sE     	C#x~s4UVV#			cs		D	DDr$   c               h   t          j        |           } | j        dk    sJ t          j        | |          \  }}| ||f         }t          j        |          | dk                                    k     }t          j        ||d          }||                    |          |                    |          fS )NrN   )r-   r   )r=   r>   r   nonzerorm   r   whereastype)rE   rC   rD   r)   r*   r(   true_nonzeross          r%   _coo_fromdense_implr   3  s    C#	Q[3'''(#s	S#X$*S//SAXNN$4$44-	=$	*	*$	szz+&&

;(?(?	??r$   c               r    t          j        |f| j                  }t          j        |f|          x}}|||fS r,   )r   r   r2   )rE   rC   rD   r(   r)   r*   s         r%   _coo_fromdense_abstract_evalr   ?  s=    		3&#)	,	,$v{333#	sCr$   c                  |j         d         j        }t          j        |t          j                  sPt          j        |t          j                  s1t          j        d|dt                     t          ||||          S  | |||t          j        |          t          j        t          j        |                              \  }}}|||gS )Nr   zBcoo_fromdense cusparse/hipsparse lowering not available for dtype=r   rB   )nnzr   rD   
index_type)r   r2   r   r   r   r   r   r   r   _coo_fromdense_loweringr	   dtype_to_ir_type)	coo_fromdense_hlor   rE   rC   rD   r2   r(   r)   r*   s	            r%   _coo_fromdense_gpu_loweringr   H  s    
,q/
%
-r{
+
+ Or}UBDV/W/W OM <QV < < <=VX X X"3+NNNN$$	s(;''&rx'<'<==	? ? ?.$S
 S	r$   c               `   | \  }|\  }t          |||          }|\  }}}	t          |          t          j        u r t          j                            |          }
nt          ||	|          }
|
t          j                            |          t          j                            |	          f}||fS rI   )r   typer   Zero
from_valuer   )primalstangentsrC   rD   r_   Mdotprimals_outr(   r)   r*   r   tangents_outs               r%   _coo_fromdense_jvpr   W  s    "!
%$qc{CCC+.$S	$ZZ27w!!$''HHCd++HBG..s33RW5G5G5L5LM,	l	""r$   c               v   | \  }}}t          |          |k    sJ |j        |j        cxk    r|k    sn J t          |t          j                  st          |t          j                  rt          d          t          j        |          sJ t          |||t          |j	        j
                            S )Nr   r;   r   )rY   r2   r   r   r   rZ   r   r   r   r   r   )r   r_   rC   rD   r(   r)   r*   s          r%   _coo_fromdense_transposer   g  s    .$S	Tc					ci	.	.	.	.;	.	.	.	.	.	.RW HC!9!9 H
F
G
GG			"	""""	dCW16<-H-H-H	I	I	IIr$   r   vr|   r   c                L    | j         \  }}}t          ||||| j        |          S )a  Product of COO sparse matrix and a dense vector.

  Args:
    mat : COO matrix
    v : one-dimensional array of size ``(shape[0] if transpose else shape[1],)`` and
      dtype ``mat.dtype``
    transpose : boolean specifying whether to transpose the sparse matrix
      before computing.

  Returns:
    y : array of shape ``(mat.shape[1] if transpose else mat.shape[0],)`` representing
      the matrix vector product.
  r   r|   )r   _coo_matvecr   )rE   r   r|   r(   r)   r*   s         r%   r   r     .     9.$S	T3QsyI	N	N	NNr$   )r|   c               B    t                               | |||||          S )a:  Product of COO sparse matrix and a dense vector.

  Args:
    data : array of shape ``(nse,)``.
    row : array of shape ``(nse,)``
    col : array of shape ``(nse,)`` and dtype ``row.dtype``
    v : array of shape ``(shape[0] if transpose else shape[1],)`` and
      dtype ``data.dtype``
    shape : length-2 tuple representing the matrix shape
    transpose : boolean specifying whether to transpose the sparse matrix
      before computing.

  Returns:
    y : array of shape ``(shape[1] if transpose else shape[0],)`` representing
      the matrix vector product.
  r   )coo_matvec_pr   )r(   r)   r*   r   r   r|   s         r%   r   r     %    " 
		4c1Vy		Q	QQr$   c                   t          j        |          }|r||}}|r|j        d         n|j        d         }| ||         z  }t          j        ||j                  j        |                             |          S Nr   r   r=   r>   r   r   r2   r   rp   )r(   r)   r*   r   r   r|   	out_shapedvs           r%   _coo_matvec_implr     sq    	k!nn! CC!*?fl1ooQ)af}"	9bh	'	'	*3	/	3	3B	7	77r$   c                  | j         |j         cxk    r|j         k    sn J | j        |j        k    sJ |j        |j        k    sJ t          |j                   dk    sJ |j        dk    sJ |j         d         |r|j         d         n|j         d         k    sJ |r|j         d         n|j         d         }t	          j        |f| j                  S )NrN   r   r   )r   r2   rY   r   r   r   )r(   r)   r*   r   r   r|   r   s          r%   _coo_matvec_abstract_evalr     s    	sy	-	-	-	-CI	-	-	-	-	-	-	qw					ci					V\		a					
1	
9IQ&,q/	J	J	J	J!*?fl1ooQ)		9,
	3	33r$   c                  |j         \  }}	}
}|j        }|t          j        t          j        t          j        t          j        fvr4t          j        d|dt                     t          |||||||          S |j        r|j        }nO|j        r||}}| }|j        d d d         }n0t          j        dt                     t          |||||||          S  | |||||||	j        ||j        	  	        gS )Nz?coo_matvec cusparse/hipsparse lowering not available for dtype=r   r   rz   zcoo_matvec GPU lowering requires matrices with sorted rows or sorted cols. To sort the rows in your matrix, use e.g. mat = mat._sort_indices(). Falling back to the default implementation.)r   r|   rD   r   x_dtype)r   r2   r   float32float64	complex64
complex128r   r   r   _coo_matvec_loweringr   r   r   )coo_matvec_hlor   r(   r)   r*   r   r   r|   r   r   r   x_avalr2   r   s                 r%   _coo_matvec_gpu_loweringr    sJ   #&< )Xq&
/%
2:rz2<GGGM <e < < <=VX X XT3QvQZ[[[[ 5LEE 	5CCIL2EEM 89RT T T  T3Qv*35 5 5 5 .
Cau	.UFLJ J J 
K Kr$   c               ,    t          | |||||          S Nr   r   )r   r(   r)   r*   r   r   r|   s          r%   _coo_matvec_jvp_matr	        	XsC6Y	O	O	OOr$   c               ,    t          |||| ||          S r  r  )v_dotr(   r)   r*   r   r   r|   s          r%   _coo_matvec_jvp_vecr        	T3U6Y	O	O	OOr$   c                  t          j        |          rJ t          j        |          rJ t          j        |          r|||t          |||| ||           fS t          j        |          }| |         ||         z  |||fS r  )r   r   r   r=   r>   )r   r(   r)   r*   r   r   r|   s          r%   _coo_matvec_transposer    s    #C(((((#C(((((A )c;tS#r&XaTabbbbbAA c7QsVS#q((r$   r   Bc               L    | j         \  }}}t          ||||| j        |          S )a  Product of COO sparse matrix and a dense matrix.

  Args:
    mat : COO matrix
    B : array of shape ``(mat.shape[0] if transpose else mat.shape[1], cols)`` and
      dtype ``mat.dtype``
    transpose : boolean specifying whether to transpose the sparse matrix
      before computing.

  Returns:
    C : array of shape ``(mat.shape[1] if transpose else mat.shape[0], cols)``
      representing the matrix vector product.
  r   )r   _coo_matmatr   )rE   r  r|   r(   r)   r*   s         r%   r   r     r   r$   c               B    t                               | |||||          S )aD  Product of COO sparse matrix and a dense matrix.

  Args:
    data : array of shape ``(nse,)``.
    row : array of shape ``(nse,)``
    col : array of shape ``(nse,)`` and dtype ``row.dtype``
    B : array of shape ``(shape[0] if transpose else shape[1], cols)`` and
      dtype ``data.dtype``
    shape : length-2 tuple representing the matrix shape
    transpose : boolean specifying whether to transpose the sparse matrix
      before computing.

  Returns:
    C : array of shape ``(shape[1] if transpose else shape[0], cols)``
      representing the matrix vector product.
  r   )coo_matmat_pr   )r(   r)   r*   r  r   r|   s         r%   r  r    r   r$   c               "   t          j        |          }|r||}}|r|j        d         n|j        d         }| d d d f         ||         z  }t          j        ||j        d         f|j                  j        |                             |          S r   r   )r(   r)   r*   r  r   r|   r   dBs           r%   _coo_matmat_implr  &  s    	k!nn! CC!*?fl1ooQ)AAAtG}qv"	Iqwqz*BH	5	5	8	=	A	A"	E	EEr$   c                  | j         |j         cxk    r|j         k    sn J | j        |j        k    sJ |j        dk    sJ t          |j                   dk    sJ |j         d         |r|j         d         n|j         d         k    sJ |r|j         d         n|j         d         }t	          j        ||j         d         f| j                  S )NrN   r   r   )r   r2   r   rY   r   r   )r(   r)   r*   r  r   r|   r   s          r%   _coo_matmat_abstract_evalr  .  s    	sy	-	-	-	-CI	-	-	-	-	-	-	qw					
1	V\		a					
9IQ&,q/	J	J	J	J!*?fl1ooQ)		9agaj14:	>	>>r$   c                  |j         \  }}	}
}|j        }|t          j        t          j        t          j        t          j        fvr4t          j        d|dt                     t          |||||||          S |j        r|j        }nO|j        r||}}| }|j        d d d         }n0t          j        dt                     t          |||||||          S  | |||||||j        |j        |	j        	  	        gS )Nz>coo_matmat cusparse/hipsprse lowering not available for dtype=r   r   rz   zcoo_matmat GPU lowering requires matrices with sorted rows or sorted cols. To sort the rows in your matrix, use e.g. mat = mat._sort_indices(). Falling back to the default implementation.)r   r|   r   r   rD   )r   r2   r   r   r   r   r  r   r   r   _coo_matmat_loweringr   r   r   )coo_matmat_hlor   r(   r)   r*   r  r   r|   r   r   r   B_avalr2   r   s                 r%   _coo_matmat_gpu_loweringr  :  sM   #&< )Xq&
/%
2:rz2<GGGM <U < < <=VX X XT3QvQZ[[[[ 5LEE 	5CCIL2EEM 89RT T T  T3Qv*35 5 5 5 .sC%096<1:2:.B B B 
C Cr$   c               ,    t          | |||||          S r  r  )r   r(   r)   r*   r  r   r|   s          r%   _coo_matmat_jvp_leftr"  V  r
  r$   c               ,    t          |||| ||          S r  r!  )B_dotr(   r)   r*   r  r   r|   s          r%   _coo_matmat_jvp_rightr%  Y  r  r$   c               .   t          j        |          rJ t          j        |          rJ t          j        |          r|||t          |||| ||           fS t          j        |          }| |         ||         z                      d          |||fS )Nr   r   )r   r   r  r=   r>   r   )r   r(   r)   r*   r  r   r|   s          r%   _coo_matmat_transposer'  \  s    #C(((((#C(((((A 2c;tS#r&XaTabbbbbAAsGaf!!!$$c311r$   )rE   r'   rG   r   )
r(   r   r)   r   r*   r   r   r   rG   r   r   )rE   r   rC   r^   rD   r   rG   r9   )F)rE   r'   r   r   r|   r   rG   r   )r(   r   r)   r   r*   r   r   r   r   r   r|   r   rG   r   )rE   r'   r  r   r|   r   rG   r   )r(   r   r)   r   r*   r   r  r   r   r   r|   r   rG   r   )lr   
__future__r   collections.abcr   	functoolsr   r   typingr   r   r   numpyr   jaxr   jax.interpretersr	   jax.experimental.sparse._baser
   jax.experimental.sparse.utilr   r   r   jax._srcr   r   jax._src.interpretersr   jax._src.lax.laxr   jax._src.lib.mlir.dialectsr   jax._src.libr   jax._src.numpy.utilr   jax._src.typingr   r   r   	jax.numpyr=   DtyperX   r^   r   r   register_pytree_node_classr'   	Primitiver   ru   r   r   def_abstract_evalr   	lower_funr   r   r   r   defjvpprimitive_transposesregister_loweringsimple_implcuda_is_supportedcuda_coo_todenserocm_is_supportedrocm_coo_todenser   r   rS   rJ   r   r   r   r   r   r   r   primitive_jvpscuda_coo_fromdenserocm_coo_fromdenser   r   r   r   r   r  r  r	  r  r  cuda_coo_matvecrocm_coo_matvecr  r   r  r  r  r  r  r"  r%  r'  cuda_coo_matmatrocm_coo_matmatr#   r$   r%   <module>rM     s	   G F " " " " " " $ $ $ $ $ $        " " " " " " " "      



       ! ! ! ! ! ! 3 3 3 3 3 3 P P P P P P P P                   $ $ $ $ $ $ # # # # # # * * * * * * # # # # # # . . . . . . 7 7 7 7 7 7 7 7 7 7       	c3h    j    %rN rN rN rN rN) rN rN &%rNn }--D D D D; ; ; ;D D D  4 4 ! 4 '/ / / " " "89 9 9	. 	. 	. 
	-)4 6 6 6)?  &  }&; < < <  ] # # # $g')DEE     $g')DEE    !$.11#'  37RUR[ 0 0 0 0 0 0$ FIY E E E E E E"
@ 
@ 
@ "  #"
 )$.$0 0 0   # # # J J J &8 / "+C  (  (? @ @ @  _ % % % $g):+HII     $g):+HII    t~l++O O O O O" fk R R R R R R&8 8 8 4 4  4 &t~u. . . K K K6P P PP P P
) 
) 
) 
	,+T49L M M M(=  %  |%9 : : :  \ " " " $g&
(BCC     $g&
(BCC    t~l++8= O O O O O O" fk R R R R R R&F F F ? ?  ? &t~&6OOO C C C8P P PP P P2 2 2 
	,,dD:O P P P(=  %  |%9 : : :  \ " " " $g&
(BCC     $g&
(BCC      r$   