
    uki}]                    R   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 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%m&Z& ddl'mZ( e)e*df   Z+ejX                   G d de             Z-ejX                   G d de             Z. ej^                  d      Z0dEdZ1dFdZ2d Z3e0jh                  d        Z5 ejl                  e3d      Z7d Z8d Z9d  Z: ejv                  e0e9dd       e:ejx                  e0<    ejz                  e0e7        ej|                  e0        ejz                  e0 ee8d!"      d#$        ejz                  e0 ee8d%"      d&$        ej^                  d'      Z?d(e?_@        dej                  d)dGd*ZBej                  d+dHd,ZCd- ZDe?jh                  d.        ZE ejl                  eDd(      ZFd/ ZGd0 ZHd1 ZIeHej                  e?<   eIejx                  e?<    ejz                  e?eF        ej|                  e?        ejz                  e? eeGd!"      d#$        ejz                  e? eeGd%"      d&$        ej^                  d2      ZKdIdJd3ZLdd4d5ZMd6 ZNeKjh                  d7        ZO ejl                  eNd      ZPd8 ZQd9 ZRd: ZSd; ZT ejv                  eKeRddeS       eTejx                  eK<    ejz                  eKeP        ej|                  eK        ejz                  eK eeQd!"      d#$        ejz                  eK eeQd%"      d&$        ej^                  d<      ZUdd4dKd=ZVdd4	 	 	 	 	 dLd>ZWd? ZXeUjh                  d@        ZY ejl                  eXd      ZZdA Z[dB Z\dC Z]dD Z^ ejv                  eUe\dde]       e^ejx                  eU<    ejz                  eUeZ        ej|                  eU        ejz                  eU ee[d!"      d#$        ejz                  eU ee[d%"      d&$       y)MzDCSR (compressed sparse row) matrix object and associated primitives.    )annotations)partialN)mlir)
_lowerings)	JAXSparse)_coo_matmat_coo_matvec_coo_todenseCOOInfo)_csr_to_coo_csr_extractCuSparseEfficiencyWarning)lax)	tree_util)core)dispatch)ad)_const)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    V/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/experimental/sparse/csr.py<lambda>zCSR.<lambda><       diinn     c                .    | j                   j                  S r!   r   dtyper$   s    r&   r'   zCSR.<lambda>=       		 r)   c                H    | j                   | j                  | j                  fS r!   )r   r   r   r$   s    r&   r'   zCSR.<lambda>>   s    DLL$++ F r)   c                   t        t        j                  |      \  | _        | _        | _        t        |   ||       y Nr   mapjnpasarrayr   r   r   super__init__r%   argsr   	__class__s      r&   r7   zCSR.__init__@   2    +.s{{D+A(DIt|T[	GT'r)   Nnseindex_dtypec               H    ||dk7  j                         }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k7  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   w     %LE
5zQ:E8<==99QDii;'GYYuQx!|[1Fgv&e44r)   c          	        dkD  rt        ||z
        }nt        |z   |      }|dk  r| j                  ||f||      S t        j                  ||      }t        j                  ||      }t        |d      t        |      t        j                  |t        j                  dk  fdfd            }	|	j                  |      }
t        j                  |t        j                  dk\  fdfd            }t        j                  |dz   |      j                  dd  j                  t        j                  t        j                  ||	      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   s5   1uaQ-ia!eQ-iA~ZZAeZEE88IU+D
**Yk
2C#q>DsAA
''#sxxQi@
ACjj%G
''#sxxQi@
ACYYq1uK033AB7;;

3<<A.55kBCEFgv&q!f55r)   c                    t        |       S r!   )csr_todenser$   s    r&   todensezCSR.todensel   s    tr)   c                    |J t        | j                  | j                  | j                  f| j                  d d d         S Nr1   )CSCr   r   r   r   r%   axess     r&   	transposezCSR.transposeo   9    <<		4<<5TZZ"=M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    %# DEEKKE E2KD%zzQt||T[[%tzzRR	qt||T[[%tzzRR">u{{m LMMr)   c                d    | j                   | j                  | j                  fd| j                  ifS Nr   r   r   r   r   r$   s    r&   tree_flattenzCSR.tree_flatten   )    IIt||T[[1GTZZ3HHHr)   c                    t         j                  |       }|\  |_        |_        |_        |j                         dhk7  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   a    
..
C(0%CHck3:}}7)#?h[ABBCLL#(#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%
F
G%( !%288 @ @
 "&G 5 5 "&G 6 6,O
N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        |   ||       y r0   r2   r8   s      r&   r7   zCSC.__init__   r;   r)   Nr<   c               p    ||dk7  j                         }t        |j                  ||      j                  S r@   )rA   rB   TrC   s       r&   rF   zCSC.fromdense   s0    
{AXNNcC[ACCCr)   rG   rH   c                   t        |      }t        |      dk7  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                  ||| ||      j                  S )NrH   )r   ru   r   )rD   ro   rp   r^   r,   r>   s         r&   ru   zCSC._eye   s#    88Aq1"E{8CEEEr)   c                @    t        | j                        j                  S r!   )rw   r   r$   s    r&   rx   zCSC.todense   s    tvv   r)   c                    |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(  r5t        || j                  | j                  || j                  d d d   d      S |j                  dk(  r5t        || 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    %# DEEKKE E2KD%zzQt||T[[%#zz$B$/4A A	qt||T[[%#zz$B$/4A A  ">u{{m LMMr)   c                d    | j                   | j                  | j                  fd| j                  ifS r   r   r$   s    r&   r   zCSC.tree_flatten   r   r)   c                    t         j                  |       }|\  |_        |_        |_        |j                         dhk7  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/
	,-#
/
0%( !%288 D D
 "&G 5 5 "&G F F!ONI  r)   r|   rw   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%     
chhSZZsyy	IIr)   c               4    t         j                  | |||      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               H    t        | gt        ||      dt        |      iS )Nspinfor1   )r
   r   r   r   s       r&   _csr_todense_implr      s$    	d	W[&9	W'PUBV	WWr)   c               J   | j                   |j                   cxk(  r|j                   cxk(  rdk(  sJ  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    	gll	6fkk	6Q	66	66	6	&,,	&&	&	w}}	$$	$	aE!HqL	((	(			%	,,r)   F)multiple_resultsc               ^   | j                   \  }}}|j                  }	t        j                  |	t        j                        sRt        j                  |	t        j
                        s.t        j                  d|	dt               t        | ||||      S t        j                  | |||||      gS )Nz@csr_todense cusparse/hipsparse lowering not available for dtype=). Falling back to default implementation.r1   )r   target_name_prefix)avals_inr,   r   
issubdtypefloatingcomplexfloatingwarningswarnr   _csr_todense_loweringr   csr_todense_gpu_lowering)
ctxr   r   r   r   r   	data_avalindices_aval_r,   s
             r&   _csr_todense_gpu_loweringr      s    "||)\1
//%
--r{{
+r}}UBDVDV/WMMUuh W< <=VX dGV5II

-
-	4&+- 
. .r)   c                    t        | |||      S r0   )r   )data_dotr   r   r   r   s        r&   _csr_todense_jvpr     s    	hu	==r)   c                  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$(>(>v(F
F
GG	U					v{{00	00	0	TYY__	$$	$	gvr	*GV	;;r)   cu)r   cuda)platformhiprocmrB   Tr<   c                   |t        | dk7  j                               }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.
  r   zcoo_fromdense nse argumentr<   r1   )	intrA   r   concrete_or_erroroperatorindexr   _csr_fromdenser   )rE   r=   r>   nse_ints       r&   rB   rB   +  sQ     	[
saxnn
C""8>>38TU'	^CW+Fcii	XXr)   )r>   c                   t        j                  |       } t        j                  t        j
                  |d      }t        j                  | |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   <  sL     	C#x~~s4UV#			cs8M		NNr)   c               b   t        j                  |       } | j                  dk(  sJ | j                  d   }t        j                  | |      \  }}| ||f   }t        j
                  |      | dk7  j                         k  }t        j                  ||d      }t        j                  |||      }|j                  |      }t        j                  |dz   |      j                  dd  j                  t        j                  t        j                  ||      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   M  s    C#	Q	iil![[3'(#s	S#X$**S/SAXNN$44-	=$	*$		-a(#JJ{#'99QU+.11!"599	jjc!,33K@A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   ]  s]    			3&#))	,$cV[1'SYYq\A-/=&	w	r)   c               R   | j                   d   j                  }t        j                  |t        j                        sQt        j                  |t        j
                        s-t        j                  d|dt               t        | |||      S t        j                  | ||||      S )Nr   zBcsr_fromdense cusparse/hipsparse lowering not available for dtype=r   r<   )nnzr>   r   )r   r,   r   r   r   r   r   r   r   _csr_fromdense_loweringr   csr_fromdense_gpu_lowering)r   rE   r=   r>   r   r,   s         r&   _csr_fromdense_gpu_loweringr   g  s    
,,q/

%
--r{{
+r}}UBDVDV/WMMWQVPX Y< <=VX"3+NN		.	.	3C[+
- -r)   c               P   | \  }|\  }t        |||      }|\  }}}	t        |      t        j                  u r t        j                  j	                  |      }
nt        ||	|      }
|
t        j                  j	                  |      t        j                  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  s  s    "!
%$qc{C+%$	$Z277ww((.HGVT2HBGG55g>@Y@YZ`@ab,	l	""r)   c               h   | \  }}}t        |      |k(  sJ |j                  |j                  cxk(  r|k(  sJ  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!Z%@
F
GG				""	"	dGV166<<	@@r)   
csr_matvecc                X    | 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   vr   r   r   r   s         r&   r  r    -     ))$	T7FASYY)	TTr)   )r   c               8    t         j                  | |||||      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Vr)   c               N    t        | gt        ||      |t        |      |dS Nr1   )r   r   )r	   r   r   r
  s         r&   _csr_matvec_implr    ,    	T	nK8	n!	nGRWDXdm	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J  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	
499	@	@	@q	@@	@@	@	w}}	$$	$	qww			&,,	&&	&	aE!HqL	((	(#eAhq)	
Ia58	<<	<			9,

	33r)   c          
     V   | j                   \  }}	}
}|j                  }|t        j                  t        j                  t        j
                  t        j                  fvr0t        j                  d|dt               t        | ||||||      S t        j                  | |||||||      S )Nz?csr_matvec cusparse/hipsparse lowering not available for dtype=r   r   r   r   r   )r   r,   r   float32float64	complex64
complex128r   r   r   _csr_matvec_loweringr   _csr_spmv_gpu_lowering)r   r   r   r   r  r   r   r   r   r   r   v_avalr,   s                r&   _csr_matvec_gpu_loweringr        '*||$)\1f
//%
2::rzz2<<GGMMTeX V< <=VXT7FAU*35 5		*	*	4&!5I+
- -r)   c               $    t        | |||||      S Nr   r   )r   r   r   r   r  r   r   s          r&   _csr_matvec_jvp_matr"        	Xw)	TTr)   c               $    t        |||| ||      S r   r!  )v_dotr   r   r   r  r   r   s          r&   _csr_matvec_jvp_vecr&        	T7FE)	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&+dGVRudm`m"nnnAA 7F+HCc7QsVWfa//r)   
csr_matmatc               X    | 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   Br   r   r   r   s         r&   r*  r*    r  r)   c               8    t         j                  | |||||      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Vr)   c               N    t        | gt        ||      |t        |      |dS r  )r   r   r   r/  s         r&   _csr_matmat_implr1  -  r  r)   c               4   t        |      dk(  sJ | j                  |j                  cxk(  r|j                  cxk(  rdk(  sJ  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_evalr3  0  s   	Uq	gll	6fkk	6Q	66	66	6	
1	w}}	$$	$	qww			&,,	&&	&	aE!HqL	((	(#eAhq)	
Ia58	<<	<			9aggaj14::	>>r)   c          
     V   | j                   \  }}	}
}|j                  }|t        j                  t        j                  t        j
                  t        j                  fvr0t        j                  d|dt               t        | ||||||      S t        j                  | |||||||      S )Nz?csr_matmat cusparse/hipsparse lowering not available for dtype=r   r   r  )r   r,   r   r  r  r  r  r   r   r   _csr_matmat_loweringr   _csr_spmm_gpu_lowering)r   r   r   r   r,  r   r   r   r   r   r   B_avalr,   s                r&   _csr_matmat_gpu_loweringr8  ?  r  r)   c               $    t        | |||||      S r   r   )r   r   r   r   r,  r   r   s          r&   _csr_matmat_jvp_leftr;  L  r#  r)   c               $    t        |||| ||      S r   r:  )B_dotr   r   r   r,  r   r   s          r&   _csr_matmat_jvp_rightr>  O  r'  r)   c               8   t        j                  |      rJ t        j                  |      rJ t        j                  |      r|||t        |||| ||       fS t        j                  |      }t        ||      \  }}| |   ||   z  j                  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_transposer@  R  s    ##G,,	,##F++	+A&+dGVRudm`m"nnnAA7F+HCsGaf!!!$gvq88r)   )rE   r   returnr   )
r   r   r   r   r   r   r   ShaperA  r   )rE   r   r=   z
int | Noner>   r   rA  r   )rE   r   r=   r   r>   r   rA  ztuple[Array, Array, Array])F)rE   r   r  r   r   boolrA  r   )rE   r   r,  r   r   rC  rA  r   )r   r   r   r   r   r   r,  r   r   rB  r   rC  rA  r   )_r   
__future__r   	functoolsr   r   r   numpyr   jaxjax.interpretersr   jax.experimental.sparser   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.numpy.utilr   jax._src.typingr   r   	jax.numpyr4   rM   r   rB  register_pytree_node_classr   r|   	Primitiver   rw   r   r   def_abstract_evalr   	lower_funr   r   r   r   defjvpprimitive_transposesregister_loweringsimple_implr   r   rG   rB   r   r   r   r   r   r  r  primitive_jvpsr	  r  r   r  r  r  r  r"  r&  r)  r.  r*  r   r1  r3  r5  r8  r;  r>  r@  rX   r)   r&   <module>r\     s   K "     
 ! . 3 W W ] ]     $ # . ,  	c3h %%\) \ &\~ %%A) A &AN }-J@X   - !- '/ 	.>	< 
		-)4 6)?   &   }&; <   ] #   %$?   %%@ !$..1#'  37RTRZRZ Y" FHXX O"  "" # )$..)<:>@ 	-# A &8  / "+C   (   (? @   _ %   'DA   'EB t~~l+U" ?D W&o 	4  	4 &t~~&6O -UU0 
		,+T49L M(=   %   |%9 :   \ "   $>   $? t~~l+8= U$ 49WW,0W=BW(o 
?  
? &t~~&6O -UU	9 
		,,dD:O P(=   %   |%9 :   \ "   $>   $?r)   