
    Vpfh                        d dl mZ d dlmZmZ d dlZd dlmZ d dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d ZddZ	 	 dd dZ	 	 dd!dZ	 	 dd"dZ	 	 dd"dZeZdS )#    )annotations)CallableSequenceN)Any)core)	tree_util)_ensure_index_ensure_index_tuple)safe_zip)
split_listwraps)api_boundary)	JAXSparsec                ,    t          | t                    S N)
isinstancer   xs    Z/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/experimental/sparse/ad.py<lambda>r      s    jI..     argnumsint | tuple[int, ...]argstuple[Any, ...]c                b   
 t          |          t          fdD                       sJ t          j        t                    \  t          t          j                  d                                 D                       ^ }}|rJ t          t          j                            fdt          |          D                                 
t          j                  \  }t          t          j                  d                                 D                       ^ }}|rJ d t          |          D             }t          t          j                            
fdt          |          D                                 } fd}fd	
fd
}	||||	fS )Nc              3  R   K   | ]!}d |cxk    ot                    k     nc V  "dS )r   N)len).0argnumr   s     r   	<genexpr>z,flatten_fun_for_sparse_ad.<locals>.<genexpr>$   sE      ??Q&$$$$3t99$$$$??????r   )is_leafc                    g | ]	}|j         
S  
num_leavesr   childs     r   
<listcomp>z-flatten_fun_for_sparse_ad.<locals>.<listcomp>*       #S#S#SE$4#S#S#Sr   c              3  *   K   | ]\  }}|v 	|V  d S r   r$   )r   inumsargnums_tups      r   r!   z,flatten_fun_for_sparse_ad.<locals>.<genexpr>,   s>       5H 5Hq$a;6F6Fd6F6F6F6F5H 5Hr   c                    g | ]	}|j         
S r$   r%   r'   s     r   r)   z-flatten_fun_for_sparse_ad.<locals>.<listcomp>2   r*   r   c                J    g | ] \  }}t          |          r
|d d         n|!S N   )	is_sparse)r   argr-   s      r   r)   z-flatten_fun_for_sparse_ad.<locals>.<listcomp>5   sI     I I I sD  )~~74884 I I Ir   c              3  *   K   | ]\  }}|v 	|V  d S r   r$   )r   r,   r-   argnums_flat1s      r   r!   z,flatten_fun_for_sparse_ad.<locals>.<genexpr>7   s>       5J 5Jq$a=6H6Hd6H6H6H6H5J 5Jr   c                 d    t          j        t          j        |                     } |i |S r   r   tree_unflatten)	args_flatkwargsr   funtree1tree2s      r   fun_flatz+flatten_fun_for_sparse_ad.<locals>.fun_flat:   s7    #E9+CE9+U+UVVD3r   c                    t          j        |                    \  fd}t          |j        d         j        z
            D ]}t	          j        |          } ||          S )Nc                D    t          j        | gdd                    S r1   r8   )gbufstrees    r   r   z@flatten_fun_for_sparse_ad.<locals>.reconstruct.<locals>.<lambda>@   s"    1$T!""XGG r   r   )r   tree_flattenrangendimjaxvmap)r,   grad_outf_recons_rC   rD   
args_flat1s       @@r   reconstructz.flatten_fun_for_sparse_ad.<locals>.reconstruct>   ss    '
166JD$GGGGGH8=47</00 $ $(##hh8Hr   c                   d gj         z  }t          |           D ]\  }} ||          ||<   t          j        |          }t	          t          d |                    }t          |          dk    r|d         n|S )Nc                @    t           j                            |           S r   )rH   rD   leavesr   s    r   r   zJflatten_fun_for_sparse_ad.<locals>.postprocess_gradients.<locals>.<lambda>J   s    sxq'9'9 r   r2   r   )r&   r   r   r9   tuplefilterr   )	grads_out
leaf_gradsr,   grad	grad_treer6   rN   r=   s        r   postprocess_gradientsz8flatten_fun_for_sparse_ad.<locals>.postprocess_gradientsE   s    %**JM955 + +4!k!T**jmm(
;;If999EEFFIy>>Q..9Q<<I=r   )r
   allr   rE   r3   r   rF   r&   childrenlist	itertoolschainfrom_iterable	enumerater   rR   )r<   r   r   leaf_argnums1endr:   leaf_argnums2argnums_flatr?   rX   r6   r.   rM   rN   r=   r>   s   ` `       @@@@@@r   flatten_fun_for_sparse_adrd   "   sW   #G,,+	????;???	?	????  ,T9EEE*e"5)9#:#:#S#S%..BRBR#S#S#SU U=#...y44 5H 5H 5H 5H#M225H 5H 5H H H I I- +J77)U"5)9#:#:#S#S%..BRBR#S#S#SU U=#...I I$,Z$G$GI I I-y44 5J 5J 5J 5J#M225J 5J 5J J J K K,                 > > > > > > > 
<,A	AAr   Fr<   r   int | Sequence[int]returnCallable[..., tuple[Any, Any]]c                     t          j         fd|}t          j        t                    t           |j                  t           fd                        }|S )a"  Sparse-aware version of :func:`jax.value_and_grad`

  Arguments and return values are the same as :func:`jax.value_and_grad`, but when
  taking the gradient with respect to a :class:`jax.experimental.sparse` array, the
  gradient is computed in the subspace defined by the array's sparsity pattern.

  Examples:

    >>> from jax.experimental import sparse
    >>> X = sparse.BCOO.fromdense(jnp.arange(6.))
    >>> y = jnp.ones(6)
    >>> sparse.value_and_grad(lambda X, y: X @ y)(X, y)
    (Array(15., dtype=float32), BCOO(float32[6], nse=5))
  r   has_auxdocstrr   c                     t          	|           \  }}}} t          j        |f|
d|| \  }}| ||          fS )Nri   )rd   rH   value_and_grad)r   r;   r?   rc   r:   rX   val_outrJ   r   r<   rj   s           r   value_and_grad_funz*value_and_grad.<locals>.value_and_grad_func   sj     @YY\^egk?l?l<HlI'<e*8e\SZee^deegpqGX))(3333r   )rH   rn   r   concrete_or_errorr	   r   __doc__r   )r<   r   rj   r;   raw_value_and_grad_funrp   s   ```   r   rn   rn   P   s      -c^7G^^W]^^"='::'+3WEEE4 4 4 4 4 4 < FE4 
r   c                     t          j         fdi|}t          j        t                    t           |j                  t           fd                        }|S )a  Sparse-aware version of :func:`jax.grad`

  Arguments and return values are the same as :func:`jax.grad`, but when taking
  the gradient with respect to a :class:`jax.experimental.sparse` array, the
  gradient is computed in the subspace defined by the array's sparsity pattern.

  Examples:

    >>> from jax.experimental import sparse
    >>> X = sparse.BCOO.fromdense(jnp.arange(6.))
    >>> y = jnp.ones(6)
    >>> sparse.grad(lambda X, y: X @ y)(X, y)
    BCOO(float32[6], nse=5)
  r   rk   c                     t          |           \  }}}} t          j        |f|	d|| }	r ||d                   |d         fS  ||          S Nri   r   r2   )rd   rH   rV   
r   r;   r?   rc   r:   rX   outr   r<   rj   s
          r   grad_funzgrad.<locals>.grad_fun   s     @YY\^egk?l?l<HlI'<
M#(8
M\7
M
Mf
M
My
YC 3""3q6**CF22  %%%r   )rH   rV   r   rq   r	   r   rr   r   )r<   r   rj   r;   raw_grad_funry   s   ```   r   rV   rV   l   s      #99w9&99,"='::'\)7;;;& & & & & & < <;& 
/r   rj   boolc                     t          j         fdi|}t          j        t                    t           |j                  t           fd                        }|S )aU  Sparse-aware version of :func:`jax.jacfwd`

  Arguments and return values are the same as :func:`jax.jacfwd`, but when taking
  the gradient with respect to a :class:`jax.experimental.sparse` array, the
  gradient is computed in the subspace defined by the array's sparsity pattern.
  Currently this is only implemented for dense outputs.
  r   rk   c                     t          |           \  }}}} t          j        |f|	d|| }	r ||d                   |d         fS  ||          S rv   )rd   rH   jacfwdrw   s
          r   
jacfwd_funzjacfwd.<locals>.jacfwd_fun        @YY\^egk?l?l<HlI'<
O#*X
O|W
O
O
O
OQZ
[C 3""3q6**CF22  %%%r   )rH   r~   r   rq   r	   r   rr   r   )r<   r   rj   r;   raw_jacfwd_funr   s   ```   r   r~   r~           :c==7=f==."='::'^+W===& & & & & & < >=& 
r   c                     t          j         fdi|}t          j        t                    t           |j                  t           fd                        }|S )aU  Sparse-aware version of :func:`jax.jacrev`

  Arguments and return values are the same as :func:`jax.jacrev`, but when taking
  the gradient with respect to a :class:`jax.experimental.sparse` array, the
  gradient is computed in the subspace defined by the array's sparsity pattern.
  Currently this is only implemented for dense outputs.
  r   rk   c                     t          |           \  }}}} t          j        |f|	d|| }	r ||d                   |d         fS  ||          S rv   )rd   rH   jacrevrw   s
          r   
jacrev_funzjacrev.<locals>.jacrev_fun   r   r   )rH   r   r   rq   r	   r   rr   r   )r<   r   rj   r;   raw_jacrev_funr   s   ```   r   r   r      r   r   )r   r   r   r   )r   F)r<   r   r   re   rf   rg   )r<   r   r   re   rf   r   )r<   r   r   re   rj   r{   rf   r   )
__future__r   collections.abcr   r   r\   typingr   rH   jax._srcr   r   jax._src.api_utilr	   r
   jax.utilr   jax._src.utilr   r   jax._src.traceback_utilr   jax.experimental.sparse._baser   r3   rd   rn   rV   r~   r   jacobianr$   r   r   <module>r      s   # " " " " " . . . . . . . .           



             @ @ @ @ @ @ @ @       + + + + + + + + 0 0 0 0 0 0 3 3 3 3 3 3 /.	+B +B +B +B\ BC     8 89    < :;     . :;     . r   