
    uki              
          d Z ddlZddlm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 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  G d de      Z G d de      Z G d de      Zeedf   Z G d de      ZddddZ d*dZ!ejD                  dededeeef   fd       Z#dedededefdZ$ded ededefd!Z%d*ded"ed#edefd$Z&d*ded"ed#edefd%Z'd&eedf   d'eedf   d(edeedf   fd)Z(y)+zSparse utilities.    N)
NamedTuple)lax)	tree_util)vmap)core)flatten_axes)safe_zip)_dot_general_shape_ruleDotDimensionNumbers)Arrayc                       e Zd Zy)SparseEfficiencyErrorN__name__
__module____qualname__     W/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/experimental/sparse/util.pyr   r           r   r   c                       e Zd Zy)SparseEfficiencyWarningNr   r   r   r   r   r   #   r   r   r   c                       e Zd Zy)CuSparseEfficiencyWarningNr   r   r   r   r   r   &   r   r   r   .c                   4    e Zd ZU eed<   dZeed<   dZeed<   y)
SparseInfoshapeFindices_sortedunique_indicesN)r   r   r   Shape__annotations__r   boolr   r   r   r   r   r   +   s    	,.$.$r   r   T)broadcastedin_axesc                V    |rt         nt        }t        |      D ]  } || |      }  | S )z9Convenience function to apply (broadcasted) vmap N times.)r$   )broadcasting_vmapr   range)funNr#   r$   _vmap_s         r   
nfold_vmapr,   5   s0    *
%8 &a
W
%C&	*r   c                 J     t        j                          fd       }|S )Nc                     t        j                  |       \  }}t        d|d      }t        d t	        ||      D              dkD  rEt        fdt	        ||      D              rt        d      t        d t        ||      D         \  }}t        j                  ||      }t        j                  ||      } t        |		      | S )
Nzvmap in_axesF)kwsc              3   F   K   | ]  \  }}|	|j                   |     y w)Nr   .0argis      r   	<genexpr>z9broadcasting_vmap.<locals>.batched_fun.<locals>.<genexpr>A   s      ]Qq}syy|]s   
!!   c              3   V   K   | ]   \  }}|d uxr |j                   |   dfv " y wNr7   r1   )r3   r4   r5   sizes      r   r6   z9broadcasting_vmap.<locals>.batched_fun.<locals>.<genexpr>C   s:      >a d]<syy|At9<< >s   &)z*broadcasting_vmap: mismatched input shapesc              3      K   | ]<  \  }}||d fn.|j                   |   dk(  rt        j                  ||f      d fn||f > y wr9   )r   r   squeezer2   s      r   r6   z9broadcasting_vmap.<locals>.batched_fun.<locals>.<genexpr>F   sU      &c1 3+#))TU,Z[J[S1$)?(Fbeghai
i&s   AA)r$   out_axes)
r   tree_flattenr   maxr	   any
ValueErrorziptree_unflattenr   )
args	args_flatin_treein_axes_flatnew_argsnew_in_axesr:   r(   r$   r=   s
         @r   batched_funz&broadcasting_vmap.<locals>.batched_fun=   s    #006IweLL](9l*K]]Dax	 >#I|<> 
>EFF # &I|4& !	i '';H**7LAK<4[8<hGGr   )	functoolswraps)r(   r$   r=   rJ   s   ``` r   r&   r&   <   s(    ??3H H 
r   indicesindptrreturnc                     t        j                  t        j                  |       j                  |   j	                  d            dz
  | fS )z1Given CSR (indices, indptr) return COO (row, col)r7   )jnpcumsum
zeros_likeatadd)rM   rN   s     r   _csr_to_coorV   O   s<     
CNN7+..v6::1=	>	BG	KKr   matc                 :    t        | |      \  }}t        |||      S )z8Extract values of dense matrix mat at given CSR indices.)rV   _coo_extract)rM   rN   rW   rowcols        r   _csr_extractr\   T   s!    &)(#s	c3	$$r   rZ   r[   c                     || |f   S )z8Extract values of dense matrix mat at given COO indices.r   )rZ   r[   rW   s      r   rY   rY   Y   s    	S#Xr   n_batchn_densec                     t        j                  |       } | dk7  }|dkD  r*|j                  t        d t	        |      D                    }|j                  t        t	        ||j                                    }|S )zCReturn per-batch number of stored elements (nse) of a dense matrix.r   c              3   (   K   | ]
  }|d z      yw)r7   Nr   )r3   r5   s     r   r6   z3_count_stored_elements_per_batch.<locals>.<genexpr>b   s     ;qAE(;s   )rQ   asarrayr@   tupler'   sumndim)rW   r^   r_   masks       r    _count_stored_elements_per_batchrg   ]   s`    C#
($q[88E;E'N;;<D	%gtyy12	3$	+r   c                 <    t        | ||      j                  d      S )zEReturn the number of stored elements (nse) of the given dense matrix.r   )initial)rg   r?   )rW   r^   r_   s      r   _count_stored_elementsrj   f   s    	)#w	@	D	DQ	D	OOr   	lhs_shape	rhs_shapedimension_numbersc                     t        j                  | t        j                        }t        j                  |t        j                        }t	        |||ddd      S )z0Validate the inputs and return the output shape.N)rm   	precisionpreferred_element_typeout_sharding)r   ShapedArraynpfloat32r
   )rk   rl   rm   lhsrhss        r   _dot_general_validated_shaperw   j   sN     	BJJ/#BJJ/#	  14d
D Dr   )r   r   ))__doc__rK   typingr   numpyrs   jaxr   r   r   jax._srcr   jax._src.api_utilr   	jax.numpyrQ   jax._src.utilr	   jax._src.lax.laxr
   r   jax._src.typingr   rA   r   UserWarningr   r   rc   intr    r   r,   r&   jitrV   r\   rY   rg   rj   rw   r   r   r   <module>r      s       
     *  " I !J k  7  	c3h  '+A & L L L%u2E L 	L%% % %U %u %
e % e  % # C X] P P P# Pe PDS#XD+0c?D*D/4S#XDr   