
    uki2                     h   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZ dd
lZ eed      rH ej"                         j%                         D ]&  \  ZZeD ]  \  ZZZ ej0                  eeee        ( erWddlmZ  eed      rH ej"                         j%                         D ]&  \  ZZeD ]  \  ZZZ ej0                  eeee        ( dedefdZej8                  ej:                  ej<                  ej>                  gZ ejB                  gZ" ejF                  d      Z$d Z%d Z&e$jO                  e%        ejP                  e$        e
jR                  e$ ee&d      d        e
jR                  e$ ee&d      d        ejF                  d      Z*d Z+d Z,e*jO                  e+        ejP                  e*        e
jR                  e* ee,d      d        e
jR                  e* ee,d      d        ejF                  d      Z-d Z.d Z/e-jO                  e.        ejP                  e-        e
jR                  e- ee/d      d        e
jR                  e- ee/d      d        ejF                  d       Z0d! Z1d" Z2e0jO                  e1        ejP                  e0        e
jR                  e0 ee2d      d        e
jR                  e0 ee2d      d       er-d# Z3 e
jR                  e-e3d$        e
jR                  e0e3d$       d% Z4d& Z5d' Z6d( Z7y
))zPrimitives for calling out to cusparse.

In general, these primitives are not meant to be used directly, but rather
are used internally in GPU translation rules of higher-level primitives.
    )partial)Any)core)dispatch)ffi)mlir)
gpu_sparse)has_cpu_sparseNregistrations)platformapi_version)
cpu_sparsetarget_name_prefixreturnc                 r    | dk(  rt         j                  S | dk(  rt         j                  S t        d|        )Ncuhipz Unsupported target_name_prefix: )r	   	_cusparse
_hipsparse
ValueErrorr   s    ]/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/experimental/sparse/_lowerings.py_get_moduler   0   s?    4U"   
78J7KL
MM    coo_spmvc                   | j                   |j                   cxk(  r|j                   k(  sJ  J |j                  dk(  sJ |j                  dk(  sJ |j                  |j                  k(  sJ |j                  t        v sJ | j                  |j                  k(  sJ |j                  t        v sJ t        |      dk(  sJ |j                   d   |r|d   n|d   k(  sJ t        j                  |r|dd  n|d d |j                        S N      r   shapedtyper!   ndimr"   SUPPORTED_INDEX_DTYPESSUPPORTED_DATA_DTYPESlenr   ShapedArraydatarowcolx	transposer!   s         r   _coo_spmv_abstract_evalr/   A   s    	syy	-CII	--	--	-	Q	
1	cii			,	,,	,	qww			
)	))	)	Uq	
Ia58	<<	<			 %)eBQi
''
 r   c          
         |\  }}	| j                   \  }
}}}|
j                  \  }t        |      j                  |
j                  |j                  |
j                  |j                  ||	||      \  }}t        j                  |ft        j                        }| j                  | j                  d   |g      }t        j                  | d      } |||||||      d d S )Nr    r   	avals_outsparse_coo_matvec_ffiopaquer   )avals_inr!   r   build_coo_matvec_descriptorr"   r   r(   npint8replacer2   r   ffi_lowering)ctxr*   r+   r,   r-   r.   r!   r   rowscols	data_avalrow_aval_x_avalnnzbuffer_sizer5   buffer_avalsub_ctxrules                       r   _coo_spmv_gpu_loweringrH   T   s    *$#&<< )Xq&	$##$67SSoov||Y__hnn
D#y"+v   ~RWWE+KK3==#3["AKB'			/00EF	G$	gtS#q	8!	<<r   r   r   cuda)r   r   rocmcoo_spmmc                .   | j                   |j                   cxk(  r|j                   k(  sJ  J |j                  dk(  sJ |j                  dk(  sJ |j                  |j                  k(  sJ |j                  t        v sJ | j                  |j                  k(  sJ |j                  t        v sJ t        |      dk(  sJ |j                   d   |r|d   n|d   k(  sJ t        j                  |r|d   n|d   |j                   d   f|j                        S r   r#   r)   s         r   _coo_spmm_abstract_evalrM   s   s   	syy	-CII	--	--	-	Q	
1	cii			,	,,	,	qww			
)	))	)	Uq	
Ia58	<<	<			 58eAh

;
''
 r   c                t   | j                   \  }}	}
}|j                  \  }|j                  \  }
}d}t        |      dk(  r|\  }}n(t        |      dk(  r|\  }}}||z  }nt        d|       |}|r|n|}||z  }t	        |      j                  |j                  |j                  |j                  |	j                  ||||||||      \  }}t        j                  |ft        j                        }| j                  | j                  d   |g      }t        j                  | d      } |||||||	      d d S )
Nr   r      zUnsupported shape: r    r   r1   sparse_coo_matmat_ffir4   )r6   r!   r'   NotImplementedErrorr   build_coo_matmat_descriptorr"   r   r(   r8   r9   r:   r2   r   r;   )r<   r*   r+   r,   r-   r.   r!   r   r?   r@   rA   rB   rC   Ccolsbatch_countr=   r>   lhs_batch_strideB_rowsrhs_batch_striderD   r5   rE   rF   rG   s                            r   _coo_spmm_gpu_loweringrX      sI   #&<< )Xq&	$#\\(!U+Z1_JD$
5zQ#Kt

C
 3E7;
<< 4$&un#$67SSoov||Y__hnn
D%i6F+v
   ~RWWE+KK3==#3["AKB'			/00EF	G$	gtS#q	8!	<<r   csr_spmvc                d   | j                   |j                   cxk(  r|j                   cxk(  rdk(  sJ  J | j                  |j                  k(  sJ |j                  d   |d   dz   k(  sJ |j                   dk(  sJ |j                  |j                  k(  sJ |j                  t        v sJ | j                  |j                  k(  sJ |j                  t        v sJ t        |      dk(  sJ |j                  d   |r|d   n|d   k(  sJ t        j                  |r|dd  n|d d |j                        S Nr   r   r   r    r$   r!   r"   r%   r&   r'   r   r(   r*   indicesindptrr-   r.   r!   s         r   _csr_spmv_abstract_evalr`      s!   	gll	6fkk	6Q	66	66	6	w}}	$$	$	aE!HqL	((	(	
1	&,,	&&	&	0	00	0	qww			
)	))	)	Uq	
Ia58	<<	<			 %)eBQi
''
 r   c          
         |\  }}	| j                   \  }
}}}|
j                  \  }t        |      j                  |
j                  |j                  |
j                  |j                  ||	||      \  }}t        j                  |ft        j                        }| j                  | j                  d   |g      }t        j                  | d      } |||||||      d d S )Nr    r   r1   sparse_csr_matvec_ffir4   r   )r6   r!   r   build_csr_matvec_descriptorr"   r   r(   r8   r9   r:   r2   r   r;   )r<   r*   r^   r_   r-   r.   r!   r   r=   r>   r?   indices_avalrA   rB   rC   rD   r5   rE   rF   rG   s                       r   _csr_spmv_gpu_loweringre      s    *$'*||$)\1f	$##$67SSoov||Y__l6H6H
D#y"+v   ~RWWE+KK3==#3["AKB'			/00EF	G$	gtWfa	?	CCr   csr_spmmc                   | j                   |j                   cxk(  r|j                   cxk(  rdk(  sJ  J | j                  |j                  k(  sJ |j                  d   |d   dz   k(  sJ |j                   dk(  sJ |j                  |j                  k(  sJ |j                  t        v sJ | j                  |j                  k(  sJ |j                  t        v sJ t        |      dk(  sJ |j                  d   |r|d   n|d   k(  sJ t        j                  |r|d   n|d   |j                  d   f|j                        S r[   r\   r]   s         r   _csr_spmm_abstract_evalrh      s*   	gll	6fkk	6Q	66	66	6	w}}	$$	$	aE!HqL	((	(	
1	&,,	&&	&	0	00	0	qww			
)	))	)	Uq	
Ia58	<<	<			 58eAh

;
''
 r   c                   |\  }}	| j                   \  }
}}}|
j                  \  }|j                  \  }}t        |      j                  |
j                  |j                  |
j                  |j                  ||	|||	      \  }}t        j                  |ft        j                        }| j                  | j                  d   |g      }t        j                  | d      } |||||||      d d S )Nr    r   r1   sparse_csr_matmat_ffir4   r   )r6   r!   r   build_csr_matmat_descriptorr"   r   r(   r8   r9   r:   r2   r   r;   )r<   r*   r^   r_   r-   r.   r!   r   r=   r>   r?   rd   rA   rB   rC   rS   rD   r5   rE   rF   rG   s                        r   _csr_spmm_gpu_loweringrl      s    *$'*||$)\1f	$#\\(!U#$67SSoov||Y__l6H6H
D%i)+v   ~RWWE+KK3==#3["AKB'			/00EF	G$	gtWfa	?	CCr   c                 D    t        j                  d      } || ||||      S )Ncpu_csr_sparse_dense_ffi)r   r;   )r<   r*   outer_indicesinner_indicesrhsrG   s         r   _csr_spmm_cpu_loweringrr     s&    67DT=-==r   cpuc                   | j                   \  }}}|j                  \  }	|\  }
}t        |      j                  |j                  |j                  |
||	      \  }}t        j                  |ft        j                        }| j                  | j                  d   |g      }t        j                  | d      } ||||||      d   S )Nr    r   r1   sparse_coo_todense_ffir4   )r6   r!   r   build_coo_todense_descriptorr"   r   r(   r8   r9   r:   r2   r   r;   )r<   r*   r+   r,   r!   r   r?   r@   rA   rC   r=   r>   rD   r5   rE   rF   rG   s                    r   coo_todense_gpu_loweringrw   *  s    <<)Xq	$#*$#$67TToox~~tT38+v  ~RWWE+KK3==#3["AKB'			/00FG	H$	gtS#f	5a	88r   c                   | j                   \  }|j                  \  }}t        |      j                  |j                  t        j                  |      |||      \  }}	t        j                  |ft
        j                        }
| j                  g | j                  |
      }t        j                  | d      } ||||	      d d S )Nr    r1   sparse_coo_fromdense_ffir4   rO   )r6   r!   r   build_coo_fromdense_descriptorr"   r8   r   r(   r9   r:   r2   r   r;   r<   matrC   index_dtyper   mat_avalr=   r>   rD   r5   rE   rF   rG   s                r   coo_fromdense_gpu_loweringr   5      ll)(~~*$#$67VVnnbhh{+T4>+v  ~RWWE+KK"?CMM"?;"?K@'			/00HI	J$	gs6	*2A	..r   c                   | j                   \  }}}|j                  \  }	|\  }
}t        |      j                  |j                  |j                  |
||	      \  }}t        j                  |ft        j                        }| j                  | j                  d   |g      }t        j                  | d      } ||||||      d   S )Nr    r   r1   sparse_csr_todense_ffir4   )r6   r!   r   build_csr_todense_descriptorr"   r   r(   r8   r9   r:   r2   r   r;   )r<   r*   r^   r_   r!   r   r?   rd   rA   rC   r=   r>   rD   r5   rE   rF   rG   s                    r   csr_todense_gpu_loweringr   ?  s     #)\1	$#*$#$67TToo|))4s<+v  ~RWWE+KK3==#3["AKB'			/00FG	H$	gtWfV	<Q	??r   c                   | j                   \  }|j                  \  }}t        |      j                  |j                  t        j                  |      |||      \  }}	t        j                  |ft
        j                        }
| j                  g | j                  |
      }t        j                  | d      } ||||	      d d S )Nr    r1   sparse_csr_fromdense_ffir4   rO   )r6   r!   r   build_csr_fromdense_descriptorr"   r8   r   r(   r9   r:   r2   r   r;   r{   s                r   csr_fromdense_gpu_loweringr   J  r   r   )8__doc__	functoolsr   typingr   jax._srcr   r   r   jax._src.interpretersr   jax._src.libr	   r
   numpyr8   hasattrr   itemsr   targetsnamevaluer   register_ffi_targetr   strr   float32float64	complex64
complex128r&   int32r%   	Primitive
coo_spmv_pr/   rH   def_abstract_evalsimple_implregister_lowering
coo_spmm_prM   rX   
csr_spmv_pr`   re   
csr_spmm_prh   rl   rr   rw   r   r   r    r   r   <module>r      s        & # ' 
:'3:335;;= h$+  e[c
k %Z)5Z557==? 
'&- 

"${%(	


NC NC N RZZr}}M ((  T^^J'
&=   4 5   Z     	
 T:   	
 U; T^^J'
&=D   4 5   Z     	
 T:   	
 U; T^^J'
&D   4 5   Z     	
 T:   	
 U; T^^J'
&D   4 5   Z     	
 T:   	
 U; > $
 $	9/	@/r   