
    Vpf^_                       d Z ddlmZ ddlmZ ddlZddl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mZmZmZ dd	lmZ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,e-df         Z.ej/         G d de                      Z0ej/         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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#rTe#jB        r" ej@        e` eefe#jj                  d*+           e#jD        r& ej@        e` eefe#jk                  d,+           dS dS dS )]zDCSR (compressed sparse row) matrix object and associated primitives.    )annotations)partialN)Optional)mlir)	JAXSparse)_coo_matmat_coo_matvec_coo_todenseCOOInfo)_csr_to_coo_csr_extractCuSparseEfficiencyWarning)lax)	tree_util)core)dispatch)ad)_const)
gpu_sparse)promote_dtypes)Array	ArrayLike	DTypeLike.c                  (    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 fdZ	e
dej        dd            Ze
dddd            Ze
dddd            Zd ZddZd Zd Ze
d             Z xZS )CSRa  Experimental CSR 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.
  	jax.Arraydataindicesindptrtuple[int, int]shapec                    | j         j        S Nr   sizeselfs    [/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/experimental/sparse/csr.py<lambda>zCSR.<lambda>=   
    din     c                    | j         j        S r#   r   dtyper&   s    r(   r)   zCSR.<lambda>>   
    	 r+   c                *    | j         | j        | j        fS r#   )r   r   r   r&   s    r(   r)   zCSR.<lambda>?   s    DL$+ F r+   c                   t          t          j        |          \  | _        | _        | _        t                                          ||           d S Nr!   mapjnpasarrayr   r   r   super__init__r'   argsr!   	__class__s      r(   r9   zCSR.__init__A   D    +.s{D+A+A(DIt|T[	GGT'''''r+   Nnseindex_dtypec               Z    ||dk                                     }t          |||          S Nr   r>   )sumcsr_fromdenseclsmatr?   r@   s       r(   	fromdensezCSR.fromdenseE   s/    
{AXNNc#;????r+   int32r.   r@   c                  t          |          }t          |          dk    rt          d|          t          j        d|          }t          j        d|          }t          j        |d         dz   |          } | |||f|          S )z>Create an empty CSR instance. Public method is sparse.empty().   z CSR must have ndim=2; got shape=r      r3   tuplelen
ValueErrorr6   emptyzerosrF   r!   r.   r@   r   r   r   s          r(   _emptyz
CSR._emptyK        %LLE
5zzQ<E<<===9QDi;''GYuQx!|[11F3gv&e4444r+   c          	     6   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                    }t          j        |dz   |          j        dd                              t          j        t          j        ||	          	                    |                              } | ||
|f||f
          S )Nr   rJ   r.   c                      S r#    zeros   r(   r)   zCSR._eye.<locals>.<lambda>e        r+   c                      S r#   rZ   ks   r(   r)   zCSR._eye.<locals>.<lambda>e       a r+   c                      S r#   rZ   r[   s   r(   r)   zCSR._eye.<locals>.<lambda>h   r]   r+   c                      S r#   rZ   r_   s   r(   r)   zCSR._eye.<locals>.<lambda>h   ra   r+   rM   lengthr3   )minrU   r6   onesaranger   r   addcondastypesubrS   atsetcumsumbincount)rF   NMr`   r.   r@   	diag_sizer   idxcolr   rowr   r\   s      `         @r(   _eyezCSR._eyeV   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jj%%G
'#sxQiiii@@
A
ACYq1uK0003ABB7;;
3<A...55kBBCCE EF3gv&q!f5555r+   c                     t          |           S r#   )csr_todenser&   s    r(   todensezCSR.todensem   s    tr+   c                l    |J t          | j        | j        | j        f| j        d d d                   S Nr3   )CSCr   r   r   r!   r'   axess     r(   	transposezCSR.transposep   8    <<<	4<5TZ"=MNNNNr+   c                   t          |t                    rt          d          t          j        |          }t          | j        |          \  }}|j        dk    r#t          || j	        | j
        || j                  S |j        dk    r#t          || j	        | j
        || j                  S t          d|j                   )N"matmul between two sparse objects.rM   r3   rL   matmul with object of shape 
isinstancer   NotImplementedErrorr6   r7   r   r   ndim_csr_matvecr   r   r!   _csr_matmatr'   otherr   s      r(   
__matmul__zCSR.__matmul__t   s    %## F DEEEKE E22KD%zQt|T[%tzRRRR	qt|T[%tzRRRR Lu{ L LMMMr+   c                <    | j         | j        | j        fd| j        ifS Nr!   r   r   r   r!   r&   s    r(   tree_flattenzCSR.tree_flatten   !    It|T[1GTZ3HHHr+   c                    t                               |           }|\  |_        |_        |_        |                                dhk    rt          d|           |j        j        di | |S )Nr!   z%CSR.tree_unflatten: invalid aux_data=rZ   	object__new__r   r   r   keysrQ   __dict__updaterF   aux_datachildrenobjs       r(   tree_unflattenzCSR.tree_unflatten   q    
..

C(0%CHck3:}}7)##AhAABBBCL##(###Jr+   r#   )__name__
__module____qualname____doc____annotations__propertyr?   r.   _bufsr9   classmethodnprI   rH   rU   rw   rz   r   r   r   r   __classcell__r<   s   @r(   r   r   -   s        	 	 ///,,--#
(//
0
0%
(FF
G
G%( ( ( ( ( !%28 @ @ @ @ ;@
 "&G 5 5 5 5 ;5 "&G 6 6 6 6 ;6,  O O O O
N 
N 
NI I I   ;    r+   r   c                      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 fd
Ze	de
j        dd            Ze	dddd            Ze	dddd            Zd ZddZd Zd Ze	d             Z xZS )r~   zBExperimental CSC matrix implemented in JAX; API subject to change.r   r   r   r   r    r!   c                    | j         j        S r#   r$   r&   s    r(   r)   zCSC.<lambda>   r*   r+   c                    | j         j        S r#   r-   r&   s    r(   r)   zCSC.<lambda>   r/   r+   c                   t          t          j        |          \  | _        | _        | _        t                                          ||           d S r2   r4   r:   s      r(   r9   zCSC.__init__   r=   r+   Nr>   c               n    ||dk                                     }t          |j        ||          j        S rB   )rC   rD   TrE   s       r(   rH   zCSC.fromdense   s4    
{AXNNcC[AAACCr+   rI   rJ   c                  t          |          }t          |          dk    rt          d|          t          j        d|          }t          j        d|          }t          j        |d         dz   |          } | |||f|          S )z>Create an empty CSC instance. Public method is sparse.empty().rL   z CSC must have ndim=2; got shape=r   rM   r3   rN   rT   s          r(   rU   z
CSC._empty   rV   r+   c               L    t                               ||| ||          j        S )NrJ   )r   rw   r   )rF   rq   rr   r`   r.   r@   s         r(   rw   zCSC._eye   s#    88Aq1"E{8CCEEr+   c                4    t          | j                  j        S r#   )ry   r   r&   s    r(   rz   zCSC.todense   s    tv  r+   c                l    |J t          | j        | j        | j        f| j        d d d                   S r|   )r   r   r   r   r!   r   s     r(   r   zCSC.transpose   r   r+   c           
        t          |t                    rt          d          t          j        |          }t          | j        |          \  }}|j        dk    r-t          || j	        | j
        || j        d d d         d          S |j        dk    r-t          || j	        | j
        || j        d d d         d          S t          d|j                   )Nr   rM   r}   Tr!   r   rL   r   r   r   s      r(   r   zCSC.__matmul__   s    %## F DEEEKE E22KD%zQt|T[%#z$$B$/4A A A A	qt|T[%#z$$B$/4A A A A   Lu{ L LMMMr+   c                <    | j         | j        | j        fd| j        ifS r   r   r&   s    r(   r   zCSC.tree_flatten   r   r+   c                    t                               |           }|\  |_        |_        |_        |                                dhk    rt          d|           |j        j        di | |S )Nr!   z%CSC.tree_unflatten: invalid aux_data=rZ   r   r   s       r(   r   zCSC.tree_unflatten   r   r+   r#   )r   r   r   r   r   r   r?   r.   r9   r   r   rI   rH   rU   rw   rz   r   r   r   r   r   r   s   @r(   r~   r~      s        JJ///,,--#
(//
0
0%( ( ( ( ( !%28 D D D D ;D
 "&G 5 5 5 5 ;5 "&G F F F F ;F! ! !O O O ON N NI I I   ;    r+   r~   ry   rG   returnr   c                P    t          | j        | j        | j        | j                  S )zConvert a CSR-format sparse matrix to a dense matrix.

  Args:
    mat : CSR matrix
  Returns:
    mat_dense: dense version of ``mat``
  r3   )_csr_todenser   r   r   r!   )rG   s    r(   ry   ry      s#     
chSZsy	I	I	IIr+   r   r   r   r!   Shapec               >    t                               | |||          S )a_  Convert CSR-format sparse matrix to a dense matrix.

  Args:
    data : array of shape ``(nse,)``.
    indices : array of shape ``(nse,)``
    indptr : array of shape ``(shape[0] + 1,)`` and dtype ``indices.dtype``
    shape : length-2 tuple representing the matrix shape

  Returns:
    mat : array with specified shape and dtype matching ``data``
  r3   )csr_todense_pbindr   s       r(   r   r      s!     
		D'6		?	??r+   c               Z    t          | gt          ||          R dt          |          iS )Nspinfor3   )r
   r   r   r   s       r(   _csr_todense_implr      s6    	d	W[&99	W	W	W'PUBVBVBV	W	WWr+   c                  | j         |j         cxk    r|j         cxk    rdk    sn J |j        |j        k    sJ | j        |j        k    sJ |j        d         |d         dz   k    sJ t          j        || j                  S )NrM   r   )r   r.   r!   r   ShapedArrayr   s       r(   _csr_todense_abstract_evalr      s    	gl	6	6	6	6fk	6	6	6	6Q	6	6	6	6	6	6	&,	&	&	&	&	w}	$	$	$	$	aE!HqL	(	(	(	(		%	,	,,r+   F)multiple_resultsc               4   |j         \  }}}|j        }	t          j        |	t          j                  sQt          j        |	t          j                  s2t          j        d|	dt                     t          |||||          S  | |||||	|j                  gS )Nz@csr_todense cusparse/hipsparse lowering not available for dtype=). Falling back to default implementation.r3   )r!   
data_dtyper@   )
avals_inr.   r   
issubdtypefloatingcomplexfloatingwarningswarnr   _csr_todense_lowering)
csr_todense_hloctxr   r   r   r!   	data_avalindices_aval_r.   s
             r(   _csr_todense_gpu_loweringr      s    "|)\1
/%
-r{
+
+ Jr}UBDV/W/W JM <u < < <=VX X X dGV5IIII
/
GV5U$& & & 
' 'r+   c               (    t          | |||          S r2   )r   )data_dotr   r   r   r!   s        r(   _csr_todense_jvpr   
  s    	hu	=	=	==r+   c               D   t          j        |          sJ t          j        |          st          j        |          rt          d          | 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_primalrQ   r!   avalr.   r   )ctr   r   r   r!   s        r(   _csr_todense_transposer     s     
		%	%%%%G$$ H(>v(F(F H
F
G
GG	U						v{0	0	0	0	0	TY_	$	$	$	$	gvr	*	*GV	;;r+   cuda)platformrocmrD   Tr>   r?   
int | Noner@   r   c                   |%t          | dk                                              }t          j        t          j        |d          }t          t          | ||          | j                  S )aE  Create a CSR-format sparse matrix from a dense matrix.

  Args:
    mat : array to be converted to CSR.
    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 : CSR representation of the matrix.
  Nr   zcoo_fromdense nse argumentr>   r3   )	intrC   r   concrete_or_erroroperatorindexr   _csr_fromdenser!   )rG   r?   r@   nse_ints       r(   rD   rD   /  s_     	[
saxnn

C"8>38TUU'	^CW+FFFci	X	X	XXr+   )r@   r   tuple[Array, Array, Array]c                   t          j        |           } t          j        t          j        |d          }t                              | |t          j	        |                    S )a  Create CSR-format sparse matrix from a dense matrix.

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

  Returns:
    data : array of shape ``(nse,)`` and dtype ``mat.dtype``.
    indices : array of shape ``(nse,)`` and dtype ``index_dtype``
    indptr : array of shape ``(mat.shape[0] + 1,)`` and dtype ``index_dtype``
  znse argument of csr_fromdense()r>   )
r6   r7   r   r   r   r   csr_fromdense_pr   r   r.   )rG   r?   r@   s      r(   r   r   @  sO     	C#x~s4UVV#			cs8M8M		N	NNr+   c               p   t          j        |           } | j        dk    sJ | j        d         }t          j        | |          \  }}| ||f         }t          j        |          | dk                                    k     }t          j        ||d          }t          j        |||          }|                    |          }t          j	        |dz   |          j
        dd                              t          j        t          j        ||                              |                              }	|||	fS )NrL   r   )r%   rM   rX   rd   )r6   r7   r   r!   nonzerorh   rC   whererk   rS   rm   rn   ro   rp   )
rG   r?   r@   mrv   ru   r   true_nonzerosr   r   s
             r(   _csr_fromdense_implr   Q  s   C#	Q	il![3'''(#s	S#X$*S//SAXNN$4$44-	=$	*	*$	-a((#JJ{##'9QU+...1!""599	jc!,,,33K@@AAC C&	w	r+   c                   t          j        |f| j                  }t          j        |f|          }t          j        | j        d         dz   f|          }|||fS )Nr   rM   )r   r   r.   r!   )rG   r?   r@   r   r   r   s         r(   _csr_fromdense_abstract_evalr   a  sY    		3&#)	,	,$cV[11'SYq\A-/==&	w	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   zBcsr_fromdense cusparse/hipsparse lowering not available for dtype=r   r>   )nnzr@   r   
index_type)r   r.   r   r   r   r   r   r   r   _csr_fromdense_loweringr   dtype_to_ir_type)	csr_fromdense_hlor   rG   r?   r@   r.   r   r   r   s	            r(   _csr_fromdense_gpu_loweringr   k  s    
,q/
%
-r{
+
+ Or}UBDV/W/W OM <QV < < <=VX X X"3+NNNN++	s 5 54#8+9N9N#O#OQ Q Q$ 	  r+   c               `   | \  }|\  }t          |||          }|\  }}}	t          |          t          j        u r t          j                            |          }
nt          ||	|          }
|
t          j                            |          t          j                            |	          f}||fS )Nr>   )r   typer   Zero
from_valuer   )primalstangentsr?   r@   rr   Mdotprimals_outr   r   r   r   tangents_outs               r(   _csr_fromdense_jvpr  w  s    "!
%$qc{CCC+%$	$ZZ27w!!$''HHGVT22HBG..w779K9KF9S9ST,	l	""r+   c               Z   | \  }}}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          ||||j        j	                  S )Nr   r3   )
rP   r.   r   r   r   rQ   r   r   r   r!   )r   rr   r?   r@   r   r   r   s          r(   _csr_fromdense_transposer	    s    $	Tc					&,	5	5	5	5+	5	5	5	5	5	5!! HZ%@%@ H
F
G
GG			"	""""	dGV16<	@	@	@@r+   
csr_matvecvr   boolc                L    | j         \  }}}t          ||||| j        |          S )a  Product of CSR sparse matrix and a dense vector.

  Args:
    mat : CSR 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   r!   )rG   r  r   r   r   r   s         r(   r
  r
    /     )$	T7FASY)	T	T	TTr+   )r   c               B    t                               | |||||          S )aN  Product of CSR sparse matrix and a dense vector.

  Args:
    data : array of shape ``(nse,)``.
    indices : array of shape ``(nse,)``
    indptr : array of shape ``(shape[0] + 1,)`` and dtype ``indices.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   )csr_matvec_pr   r   r   r   r  r!   r   s         r(   r   r     s%    " 
		4&!5I		V	VVr+   c               `    t          | gt          ||          |R t          |          |dS Nr3   )r   r   )r	   r   r   r  s         r(   _csr_matvec_implr    >    	T	nK88	n!	n	nGRWDXDXDXdm	n	n	nnr+   c                  t          |          dk    sJ |j        | j        cxk    r|j        cxk    r|j        cxk    rdk    sn J | j        |j        k    sJ | j        |j        k    sJ |j        |j        k    sJ |j        d         |d         dz   k    sJ |r|d         n|d         }|j        d         |r|d         n|d         k    sJ t	          j        |f| j                  S NrL   rM   r   rP   r   r!   r.   r   r   )r   r   r   r  r!   r   	out_shapes          r(   _csr_matvec_abstract_evalr    s   	Uq	
49	@	@	@	@	@	@	@	@	@	@	@	@q	@	@	@	@	@	@	w}	$	$	$	$	qw					&,	&	&	&	&	aE!HqL	(	(	(	(#1eAhhq)	
I;a58	<	<	<	<		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        |j        	  	        gS )Nz?csr_matvec cusparse/hipsparse lowering not available for dtype=r   r   )r!   r   r   r@   x_dtype)r   r.   r   float32float64	complex64
complex128r   r   r   _csr_matvec_lowering)csr_matvec_hlor   r   r   r   r  r!   r   r   r   r   v_avalr.   s                r(   _csr_matvec_gpu_loweringr$    s    '*|$)\1f
/%
2:rz2<GGGM <e < < <=VX X XT7FAU*35 5 5 5
.
GVQeyL$6N N N 
O Or+   c               ,    t          | |||||          S Nr   r   )r   r   r   r   r  r!   r   s          r(   _csr_matvec_jvp_matr(        	Xw)	T	T	TTr+   c               ,    t          |||| ||          S r&  r'  )v_dotr   r   r   r  r!   r   s          r(   _csr_matvec_jvp_vecr,        	T7FE)	T	T	TTr+   c               .   t          j        |          rJ t          j        |          rJ t          j        |          r|||t          |||| ||           fS t          j        |          }t          ||          \  }}| |         ||         z  |||fS r&  )r   r   r   r6   r7   r   )	r   r   r   r   r  r!   r   rv   ru   s	            r(   _csr_matvec_transposer/    s    #G,,,,,#F+++++A 0&+dGVRudm`m"n"n"nnnAA 7F++HCc7QsVWfa//r+   
csr_matmatBc               L    | j         \  }}}t          ||||| j        |          S )a  Product of CSR sparse matrix and a dense matrix.

  Args:
    mat : CSR 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   r   r!   )rG   r1  r   r   r   r   s         r(   r0  r0    r  r+   c               B    t                               | |||||          S )aX  Product of CSR sparse matrix and a dense matrix.

  Args:
    data : array of shape ``(nse,)``.
    indices : array of shape ``(nse,)``
    indptr : array of shape ``(shape[0] + 1,)`` and dtype ``indices.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-matrix product.
  r   )csr_matmat_pr   r   r   r   r1  r!   r   s         r(   r   r   "  s%    $ 
		4&!5I		V	VVr+   c               `    t          | gt          ||          |R t          |          |dS r  )r   r   r   r5  s         r(   _csr_matmat_implr7  6  r  r+   c                  t          |          dk    sJ | j        |j        cxk    r|j        cxk    rdk    sn J |j        dk    sJ | j        |j        k    sJ | j        |j        k    sJ |j        |j        k    sJ |j        d         |d         dz   k    sJ |r|d         n|d         }|j        d         |r|d         n|d         k    sJ t	          j        ||j        d         f| j                  S r  r  )r   r   r   r1  r!   r   r  s          r(   _csr_matmat_abstract_evalr9  9  s   	Uq	gl	6	6	6	6fk	6	6	6	6Q	6	6	6	6	6	6	
1	w}	$	$	$	$	qw					&,	&	&	&	&	aE!HqL	(	(	(	(#1eAhhq)	
I;a58	<	<	<	<		9agaj14:	>	>>r+   c               8   |j         \  }}	}
}|j        }|t          j        t          j        t          j        t          j        fvr4t          j        d|dt                     t          |||||||          S  | |||||||	j        |j        |j        	  	        gS )Nz?csr_matmat cusparse/hipsparse lowering not available for dtype=r   r   )r!   r   r@   r   B_dtype)r   r.   r   r  r  r  r   r   r   r   _csr_matmat_lowering)csr_matmat_hlor   r   r   r   r1  r!   r   r   r   r   B_avalr.   s                r(   _csr_matmat_gpu_loweringr?  H  s    '*|$)\1f
/%
2:rz2<GGGM <e < < <=VX X XT7FAU*35 5 5 5
.
GVQey$l   
 r+   c               ,    t          | |||||          S r&  r   )r   r   r   r   r1  r!   r   s          r(   _csr_matmat_jvp_leftrB  W  r)  r+   c               ,    t          |||| ||          S r&  rA  )B_dotr   r   r   r1  r!   r   s          r(   _csr_matmat_jvp_rightrE  Z  r-  r+   c               T   t          j        |          rJ t          j        |          rJ t          j        |          r|||t          |||| ||           fS t          j        |          }t          ||          \  }}| |         ||         z                      d          |||fS )Nr   rM   )r   r   r   r6   r7   r   rC   )	r   r   r   r   r1  r!   r   rv   ru   s	            r(   _csr_matmat_transposerG  ]  s    #G,,,,,#F+++++A 9&+dGVRudm`m"n"n"nnnAA7F++HCsGaf!!!$$gvq88r+   )rG   r   r   r   )
r   r   r   r   r   r   r!   r   r   r   )rG   r   r?   r   r@   r   r   r   )rG   r   r?   r   r@   r   r   r   )F)rG   r   r  r   r   r  r   r   )rG   r   r1  r   r   r  r   r   )r   r   r   r   r   r   r1  r   r!   r   r   r  r   r   )lr   
__future__r   	functoolsr   r   typingr   r   numpyr   jaxjax.interpretersr   jax.experimental.sparse._baser   jax.experimental.sparse.coor   r	   r
   r   jax.experimental.sparse.utilr   r   r   r   r   jax._srcr   r   jax._src.interpretersr   jax._src.lax.laxr   jax._src.libr   jax._src.numpy.utilr   jax._src.typingr   r   r   	jax.numpyr6   rO   r   r   register_pytree_node_classr   r~   	Primitiver   ry   r   r   def_abstract_evalr   	lower_funr   r   r   r   defjvpprimitive_transposesregister_loweringsimple_implcuda_is_supportedcuda_csr_todenserocm_is_supportedrocm_csr_todenser   r   rI   rD   r   r   r   r   r   r  r	  primitive_jvpscuda_csr_fromdenserocm_csr_fromdenser  r
  r   r  r  r!  r$  r(  r,  r/  cuda_csr_matvecrocm_csr_matvecr4  r0  r   r7  r9  r<  r?  rB  rE  rG  cuda_csr_matmatrocm_csr_matmatrZ   r+   r(   <module>rk     s	   K J " " " " " "                   



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