
    WhL_                    ~   d Z ddlmZ ddlmZ ddl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& ddl'mZ( e)e*df         Z+ej,         G d de                      Z-ej,         G d de                      Z. ej/        d          Z0dTdZ1dUd!Z2d" Z3e0j4        d#             Z5 ej6        e3d$%          Z7d& Z8d' Z9d( Z: ej;        e0e9dd           e:ej<        e0<    ej=        e0e7            ej>        e0           e!j?        r" ej=        e0 ee8e!j@                  d)*           e!jA        r" ej=        e0 ee8e!jB                  d+*            ej/        d,          ZCd-eC_D        dejE        d.dVd3ZFejE        d4dWd7ZGd8 ZHeCj4        d9             ZI ej6        eHd-%          ZJd: ZKd; ZLd< ZMeLejN        eC<   eMej<        eC<    ej=        eCeJ            ej>        eC           e!j?        r" ej=        eC eeKe!jO                  d)*           e!jA        r" ej=        eC eeKe!jP                  d+*            ej/        d=          ZQdXdYdAZRd$dBdCZSdD ZTeQj4        dE             ZU ej6        eTd$%          ZVdF ZWdG ZXdH ZYdI ZZ ej;        eQeXddeY           eZej<        eQ<    ej=        eQeV            ej>        eQ           e!j?        r" ej=        eQ eeWe!j[                  d)*           e!jA        r" ej=        eQ eeWe!j\                  d+*            ej/        dJ          Z]d$dBdZdLZ^d$dBd[dMZ_dN Z`e]j4        dO             Za ej6        e`d$%          ZbdP ZcdQ ZddR ZedS Zf ej;        e]edddee           efej<        e]<    ej=        e]eb            ej>        e]           e!rTe!j?        r" ej=        e] eece!jg                  d)*           e!jA        r& ej=        e] eece!jh                  d+*           dS dS dS )\zDCSR (compressed sparse row) matrix object and associated primitives.    )annotations)partialN)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	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    a/var/www/html/movieo_spanner_bot/venv/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&   r7   zCSR.__init__@   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.fromdenseD   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      r1   tuplelen
ValueErrorr4   emptyzerosrD   r   r,   r>   r   r   r   s          r&   _emptyz
CSR._emptyJ        %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   rH   r,   c                      S r!    zeros   r&   r'   zCSR._eye.<locals>.<lambda>d        r)   c                      S r!   rX   ks   r&   r'   zCSR._eye.<locals>.<lambda>d       a r)   c                      S r!   rX   rY   s   r&   r'   zCSR._eye.<locals>.<lambda>g   r[   r)   c                      S r!   rX   r]   s   r&   r'   zCSR._eye.<locals>.<lambda>g   r_   r)   rK   lengthr1   )minrS   r4   onesaranger   r   addcondastypesubrQ   atsetcumsumbincount)rD   NMr^   r,   r>   	diag_sizer   idxcolr   rowr   rZ   s      `         @r&   _eyezCSR._eyeU   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.todensel   s    tr)   c                l    |J t          | j        | j        | j        f| j        d d d                   S Nr1   )CSCr   r   r   r   r%   axess     r&   	transposezCSR.transposeo   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.rK   r1   rJ   matmul with object of shape 
isinstancer   NotImplementedErrorr4   r5   r   r   ndim_csr_matvecr   r   r   _csr_matmatr%   otherr   s      r&   
__matmul__zCSR.__matmul__s   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=rX   	object__new__r   r   r   keysrO   __dict__updaterD   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,   _bufsr7   classmethodnprG   rF   rS   ru   rx   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 r0   r2   r8   s      r&   r7   zCSC.__init__   r;   r)   Nr<   c               n    ||dk                                     }t          |j        ||          j        S r@   )rA   rB   TrC   s       r&   rF   zCSC.fromdense   s4    
{AXNNcC[AAACCr)   rG   rH   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().rJ   z CSC must have ndim=2; got shape=r   rK   r1   rL   rR   s          r&   rS   z
CSC._empty   rT   r)   c               L    t                               ||| ||          j        S )NrH   )r   ru   r   )rD   ro   rp   r^   r,   r>   s         r&   ru   zCSC._eye   s#    88Aq1"E{8CCEEr)   c                4    t          | j                  j        S r!   )rw   r   r$   s    r&   rx   zCSC.todense   s    tv  r)   c                l    |J t          | j        | j        | j        f| j        d d d                   S rz   )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   rK   r{   Tr   r   rJ   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=rX   r   r   s       r&   r   zCSC.tree_unflatten   r   r)   r!   )r   r   r   r   r   r   r=   r,   r7   r   r   rG   rF   rS   ru   rx   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|   rw   rE   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``
  r1   )_csr_todenser   r   r   r   )rE   s    r&   rw   rw      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``
  r1   )csr_todense_pbindr   s       r&   r   r      s!     
		D'6		?	??r)   c               Z    t          | gt          ||          R dt          |          iS )Nspinfor1   )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 )NrK   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.r1   )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 r0   )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_primalrO   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rocmrB   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<   r1   )	intrA   r   concrete_or_erroroperatorindexr   _csr_fromdenser   )rE   r=   r>   nse_ints       r&   rB   rB   .  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<   )
r4   r5   r   r   r   r   csr_fromdense_pr   r   r,   )rE   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 )NrJ   r   )r#   rK   rV   rb   )r4   r5   r   r   nonzerorf   rA   whereri   rQ   rk   rl   rm   rn   )
rE   r=   r>   mrt   rs   r   true_nonzerosr   r   s
             r&   _csr_fromdense_implr   P  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   rK   )r   r   r,   r   )rE   r=   r>   r   r   r   s         r&   _csr_fromdense_abstract_evalr   `  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   rE   r=   r>   r,   r   r   r   s	            r&   _csr_fromdense_gpu_loweringr   j  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_primal_valuer   )primalstangentsr=   r>   rp   Mdotprimals_outr   r   r   r   tangents_outs               r&   _csr_fromdense_jvpr  v  s    "!
%$qc{CCC+%$	$ZZ27w((..HHGVT22HBG55g>>@Y@YZ`@a@ab,	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   r1   )
rN   r,   r   r   r   rO   r   r   r   r   )r   rp   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   )rE   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 Nr1   )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 NrJ   rK   r   rN   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   r4   r5   r   )	r   r   r   r   r	  r   r   rt   rs   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   )rE   r/  r   r   r   r   s         r&   r.  r.    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   r/  r   r   s         r&   r   r   !  s%    $ 
		4&!5I		V	VVr)   c               `    t          | gt          ||          |R t          |          |dS r  )r   r   r
   r3  s         r&   _csr_matmat_implr5  5  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   r/  r   r   r  s          r&   _csr_matmat_abstract_evalr7  8  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   r/  r   r   r   r   r   B_avalr,   s                r&   _csr_matmat_gpu_loweringr=  G  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   r/  r   r   s          r&   _csr_matmat_jvp_leftr@  V  r'  r)   c               ,    t          |||| ||          S r$  r?  )B_dotr   r   r   r/  r   r   s          r&   _csr_matmat_jvp_rightrC  Y  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   rK   )r   r   r   r4   r5   r   rA   )	r   r   r   r   r/  r   r   rt   rs   s	            r&   _csr_matmat_transposerE  \  s    #G,,,,	,#F++++	+A 9&+dGVRudm`m"n"n"nnnAA7F++HCsGaf!!!$$gvq88r)   )rE   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )rE   r   r=   r   r>   r   r   r   )rE   r   r=   r   r>   r   r   r   )F)rE   r   r	  r   r   r
  r   r   )rE   r   r/  r   r   r
  r   r   )r   r   r   r   r   r   r/  r   r   r   r   r
  r   r   )ir   
__future__r   	functoolsr   r   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   	jax.numpyr4   rM   r   r   register_pytree_node_classr   r|   	Primitiver   rw   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   rG   rB   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_matvecr2  r.  r   r5  r7  r:  r=  r@  rC  rE  cuda_csr_matmatrocm_csr_matmatrX   r)   r&   <module>rh     s	   K J " " " " " "             



 ! ! ! ! ! ! 3 3 3 3 3 3 W W W W W W W W W W W W ] ] ] ] ] ] ] ] ] ]                         $ $ $ $ $ $ # # # # # # # # # # # # . . . . . . , , , , , , , ,       	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)   