
    Vpf;                       U d Z ddlmZ ddlmZ ddlmZ ddlZddlZddl	m
Z
 ddl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mZmZ ddlmZ ddlmZmZmZmZ ddl m!Z! ddl"m#Z#m$Z$ ddl%m&Z& ddl'Z(dZ)d%dZ*ej+        ej,        ej-        ej.        iZ/de0d<   ej+        ej1        ej-        ej2        iZ3de0d<    e$d           G d d                      Z4ddd&d$Z5dS )'z#Tools to create numpy-style ufuncs.    )annotations)Callable)partialN)Any)Array	ArrayLike	DTypeLike)lax)
reductions)#_eliminate_deprecated_list_indexingappendtake)	_moveaxis)
implementscheck_arraylike_broadcast_to_where)	vectorize)canonicalize_axis
set_module)pjitzBecause JAX arrays are immutable, jnp.ufunc.at() cannot operate inplace like
np.ufunc.at(). Instead, you can pass inplace=False and capture the result; e.g.
>>> arr = jnp.add.at(arr, ind, val, inplace=False)
funCallable[..., Any]argsr   returnjax.core.Primitive | Nonec                   	  t          j        |           | }n#  Y dS xY wt          |j                  dk    r|j        d         }|j        |j        f|j        j        |j        j        fk    rdS |j        t          j	        k    rMt          d g |j        d         |j        d         R D                       r|j        d         j        d         }n|j        d         j        S t          |j                  dk    dS )z
  If fun(*args) lowers to a single primitive with inputs and outputs matching
  function inputs and outputs, return that primitive. Otherwise return None.
  N   r   c              3  >   K   | ]}t          j        |          V  d S N)r   is_unspecified).0shardings     X/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/numpy/ufunc_api.py	<genexpr>z*get_if_single_primitive.<locals>.<genexpr>;   sE       K Kd!(++ K K K K K K    in_shardingsout_shardingsjaxpr)jax
make_jaxprleneqnsinvarsoutvarsr)   	primitiver   pjit_pallparams)r   r   r)   eqns       r$   get_if_single_primitiver5   -   s   
CN3&EE44EJ1
*Q-C
CK U[%79L$MMMT
-4;
&
&
 K KI
>*ISZ-HIIK K K K K ' jm"7+eeZ]$$ 	EJ1 
s    z,dict[jax.core.Primitive, Callable[..., Any]]_primitive_reducers_primitive_accumulatorsz	jax.numpyc                  |   e Zd ZdZddddddGdZ ed           Z ed           Z ed           Z ed           Z	 ed           Z
 ed           ZdHdZdIdZdJdZddddKd%Z eej        j        d&'           eej        g d()          	 	 	 dLdMd3                        Z	 	 	 dNdOd5Z eej        j        d&'           eej        g d6)          	 	 dPdQd7                        Z	 	 dRdSd8Z eej        j        d&'           eej        d*gd9g:          dTd;d<dUd?                        ZdVd@Z eej        j        d&'           eej        g d6)          	 	 dPdWdA                        Z	 	 dRdXdBZ eej        j        d&'           eej        d*gC          dYdF                        ZdS )ZufunczFunctions that operate element-by-element on whole arrays.

  This is a class for LAX-backed implementations of numpy ufuncs.
  NF)namenargsidentity
update_docninintnoutfuncr   r:   
str | Noner;   
int | Noner<   r   c                  |r|j         | _         |p|j        | _        |t          |          t          j        |          t          j        |          t          j        |p|          |d| _        d S )N)rA   callr>   r@   r;   r<   )__doc____name__r   operatorindex_ufunc__static_props)selfrA   r>   r@   r:   r;   r<   r=   s           r$   __init__zufunc.__init__U   sr      "\dl)DMDMoo^C  nT""~els++ Dr&   c                    | j         d         S )NrA   rJ   rK   s    r$   <lambda>zufunc.<lambda>j        3F ; r&   c                    | j         d         S )NrE   rN   rO   s    r$   rP   zufunc.<lambda>k   rQ   r&   c                    | j         d         S )Nr>   rN   rO   s    r$   rP   zufunc.<lambda>l   s    d1%8 r&   c                    | j         d         S )Nr@   rN   rO   s    r$   rP   zufunc.<lambda>m   s    t26: r&   c                    | j         d         S )Nr;   rN   rO   s    r$   rP   zufunc.<lambda>n   s     3G < r&   c                    | j         d         S )Nr<   rN   rO   s    r$   rP   zufunc.<lambda>o   s    4#6z#B r&   r   c                h    t          | j        | j        | j        | j        | j        | j        f          S r    )hash_funcrG   r<   r>   r@   r;   rO   s    r$   __hash__zufunc.__hash__q   s2    T]DM49dj2 3 3 3r&   otherboolc                    t          |t                    oM| j        | j        | j        | j        | j        | j        f|j        |j        |j        |j        |j        |j        fk    S r    )
isinstancer9   rY   rG   r<   r>   r@   r;   )rK   r[   s     r$   __eq__zufunc.__eq__v   sY    eU## Yz4=$-49djQ{ENENEIuz5;WXYr&   strc                    d| j          dS )Nz<jnp.ufunc 'z'>)rG   rO   s    r$   __repr__zufunc.__repr__|   s    +$-++++r&   )outwherer   r   rc   Nonerd   kwargsc               l    |t          d|            |t          d|             | j        |i |S )Nout argument of zwhere argument of )NotImplementedError_call)rK   rc   rd   r   rf   s        r$   __call__zufunc.__call__   sT      94 9 9::: ;T ; ;<<<4:t&v&&&r&   znumpy.ufunc)module)rK   axisdtyperc   keepdims)static_argnamesr   arm   rn   DTypeLike | Nonero   initialArrayLike | Noner   c                   t          | j         d|           | j        dk    rt          d          | j        dk    rt          d          |t          d| j         d          |t          | j         d|           |zt          | j         d|           | j        |t          d| j        d	          t          j        |          t          k    r$t          d
t          j        |                     t          | j        g| j        t          j        |          gz  R  }|| j        }	n t                              || j                  }	 |	||||||          S )Nz.reduce   z'reduce only supported for binary ufuncsr   z<reduce only supported for functions returning a single valuerh   z	.reduce()zreduction operation zP does not have an identity, so to use a where mask one has to specify 'initial'.z/where argument must have dtype=bool; got dtype=)rm   rn   ro   rs   rd   )r   rG   r>   
ValueErrorr@   ri   r<   lax_internal_dtyper\   r5   rj   _one_reduce_via_scanr6   get)
rK   rq   rm   rn   rc   ro   rs   rd   r0   reducers
             r$   reducezufunc.reduce   s   
 t}---q111x1}}@AAAyA~~UVVV
 K4= K K KLLL///999///777		7? P P P P Q Q 	Q		U	#	#t	+	+g<K^_dKeKegghhh'
Ydh,BSTUBVBVAW6WYYYI%gg#''	43HIIg714uxX]^^^^r&   arrc                     j         dk    r j        dk    sJ t          j                  | j        }Dt          j         j        t          j                  t          j                            j	        t          j                  t          |t                    r*t          fd|D                       }t          d          |<|rdj        z  }nd}                                                                d}nbt#          |j                  }|r'g j        d |         dj        |dz   d          R }n$g j        d |         j        |dz   d          R }|dk    r$t%          |d          t%          |d          | j        d         dk    rt'          d           fd	}|d}	d         }
nd}	|}
t          t          j        |
                                        j        dd                    }
t
          j                            |	j        d         ||
          }|r|                    |          }|S )
Nrv   r   c              3  B   K   | ]}t          |j                  V  d S r    )r   ndim)r"   rq   r   s     r$   r%   z)ufunc._reduce_via_scan.<locals>.<genexpr>   s0      @@a$Q11@@@@@@r&   ztuple of axes)r    r   zLzero-size array to reduction operation {self.__name__} which has no ideneityc           	         /                     ||                                                  S t          |                               ||                                                  |          S r    )rj   astyper   )ivalr   rn   rK   rd   s     r$   body_funz(ufunc._reduce_via_scan.<locals>.body_fun   s`    	zz#s1v}}U33444eAh

3Ae0D0D E EsKKKr&   )r>   r@   rx   asarrayr<   r*   
eval_shaperY   rz   rn   r   shaper^   tupleri   r   ravelr   r   rw   r   r
   	fori_loopreshape)rK   r   rm   rn   ro   rs   rd   final_shaper   start_indexstart_valueresults   `` `  `     r$   r{   zufunc._reduce_via_scan   s    8q==TY!^^^^

s
#
#Cg}nTZ):3)?)?ARSVAWAWXX^eE39--e$ A@@@@4@@@@@d000		 SXoIIKKc		ddtSX..d	 AC	%4%(C!Cciq		.BCC@	%4%(@39TAXYY+?@@ qyyc4##c		%q))39Q<1,,efffL L L L L L L L kFkkkk 4[ A A H H O OQTQZ[\[][]Q^__KW{CIaL(KPPF +~~k**fMr&   )rK   rm   rn   c                h   | j         dk    rt          d          | j        dk    rt          d          |t          d| j         d          t          | j        g| j         t          j        |          gz  R  }|| j	        }n t                              || j	                  } ||||          S )Nrv   z+accumulate only supported for binary ufuncsr   z@accumulate only supported for functions returning a single valuerh   z.accumulate()rm   rn   )r>   rw   r@   ri   rG   r5   rj   rx   rz   _accumulate_via_scanr7   r|   )rK   rq   rm   rn   rc   r0   accumulators          r$   
accumulatezufunc.accumulate   s     x1}}DEEEyA~~YZZZ
 O4= O O OPPP'
Ydh,BSTUBVBVAW6WYYYI-kk+//	4;TUUk;qt51111r&   c                     j         dk    r j        dk    sJ t           j         d           t	          j                  Dt          j         j        t	          j	                  t	          j	                            j
        |t          |t                    rt          d          t          |t          j                            }t#          |d           fd}t          j                            |dd                                       fd j        d                   \  }}t#          |d|          S )Nrv   r   z.accumulatez'accumulate does not allow multiple axesr   c           
         | \  }}t          |dk    d                                                           |                              |                                                           }|dz   |f|fS )Nr   r   )r   r   rj   )carry_r   xyr   rn   rK   s        r$   scan_funz,ufunc._accumulate_via_scan.<locals>.scan_fun   sl    da
aQu--tzz!((5//3q6==Y^K_K_/`/`
a
aa!eQZ]r&   )length)r>   r@   r   rG   rx   r   r*   r   rY   rz   rn   r^   r   rw   r   npr   r   r
   scanr   r   )rK   r   rm   rn   r   r   r   s   `` `   r$   r   zufunc._accumulate_via_scan   s9   8q==TY!^^^^t}1113777

s
#
#C}nTZ):3)?)?ARSVAWAWXX^e|z$..|@AAAT273<<00D
Cq
!
!C       X3q6==+?+?'@$syYZ|\\IAvVQ%%%r&   inplace)static_argnumsrp   T)r   indicesbc                  |rt          t                    ||                     ||          S |                     |||          S r    )ri   _AT_INPLACE_WARNING_at_via_scan)rK   rq   r   r   r   s        r$   atzufunc.at  sN      5 3444yq'***q'1---r&   c           	        	
 t                    dv sJ t           j         d|gR   t          j         j        t          j        |          gd D             R  j        	t          j	        |          
                    	          }t          	fdD                       t                    s|S d D             }|ot          j        j        | 

sI|j                                       j        |j                                                 gR            S r|t'          d         g 
d         j        t          
          d          R           } |j        t-          j        
          gd         j        t          
          d          R  f
fdD              fd}t          j                            |d|fd t          d                             \  }}|d	         S )
N>   r   r   z.atc              3  >   K   | ]}t          j        |          V  d S r    )rx   rz   )r"   args     r$   r%   z%ufunc._at_via_scan.<locals>.<genexpr>  s/      >f>fZ]|?PQT?U?U>f>f>f>f>f>fr&   c              3  f   K   | ]+}t          j        |                                        V  ,d S r    )rx   r   r   )r"   r   rn   s     r$   r%   z%ufunc._at_via_scan.<locals>.<genexpr>  s<      IIS%c**11%88IIIIIIr&   c                `    g | ]+}t          |t                    t          j        |          ,S r   )r^   slicer   r   )r"   r   s     r$   
<listcomp>z&ufunc._at_via_scan.<locals>.<listcomp>  s/    GGGa*Q2F2FGbhqkkGGGr&   r   c                    g | ];}t          |t                    r|n!t          |                                          <S r   )r^   r   r   r   )r"   idxr   s     r$   r   z&ufunc._at_via_scan.<locals>.<listcomp>#  sC    gggX[je,,Sss-U2K2K2Q2Q2S2Sgggr&   c                   | \  }t          fdD                       }|j        |                              j        |j        |                                         gfdD             R            }dz   |f|fS )Nc              3  V   K   | ]#}t          |t                    r|n|         V  $d S r    )r^   r   )r"   indr   s     r$   r%   z7ufunc._at_via_scan.<locals>.scan_fun.<locals>.<genexpr>'  s:      OOC//;##SVOOOOOOr&   c              3  (   K   | ]}|         V  d S r    r   )r"   r   r   s     r$   r%   z7ufunc._at_via_scan.<locals>.scan_fun.<locals>.<genexpr>(  s'      5M5Mc!f5M5M5M5M5M5Mr&   r   )r   r   setrj   r|   )r   r   rq   r   r   r   r   rK   s       @r$   r   z$ufunc._at_via_scan.<locals>.scan_fun%  s    daOOOOwOOOOOc
$s)--

149==??N5M5M5M5M5M5M5MNNN
O
Oa!eQZ]r&   r   )r,   r   rG   r*   r   rY   rx   rz   rn   r   r   r   r   r
   broadcast_shapesr   r   rj   r|   r   r   r   mathprodr   )rK   rq   r   r   shapesr   r   r   r   rn   r   s   ` ``     @@r$   r   zufunc._at_via_scan  s1   t99t})))14t4444N4:|'8';';g>f>fae>f>f>fgggmEQ&&u--AIIIIDIIIIID1'::G hGG7GGGF8sw/8E GT']ztz!$w-*;*;*=*=EEEEFFF K$q'#HU#HT!W]3u::;;-G#H#HIIcck$)E**HT!W]3u::;;-GHHHJdgggg_fgggG      
 w||Hq!fdC
OODDHE18Or&   c                    | j         dk    rt          d          | j        dk    rt          d          |t          d| j         d          |                     ||||          S )Nrv   z)reduceat only supported for binary ufuncsr   z>reduceat only supported for functions returning a single valuerh   z.reduceat()r   )r>   rw   r@   ri   rG   _reduceat_via_scan)rK   rq   r   rm   rn   rc   s         r$   reduceatzufunc.reduceat-  sv     x1}}BCCCyA~~WXXX
 M4= M M MNNN""1gD"FFFr&   c           
     
   	
 t           j         d|           t          j                  t	          |          }t          |          dk    sJ |d         }j        dk    rt          dj                  |j        dk    rt          d|j                  |j	        }t          t          t          f          rt          d          t          j                  t          |          }t          j                            t%          |j                           t          t'          j        t'          j        |j                                                }t          j                            |d|j                 dz
            
t          j                            |d|j                           		
 fd}t          j                            dj                 ||          S )	Nz	.reduceatr   r   z7reduceat: a must have 1 or more dimension, got a.shape=z=reduceat: indices must be one-dimensional, got indices.shape=z(reduceat requires a single integer axis.rm   c                    t          | k    | k     z                      |t          t          j                            | d                              |          S )N)r   r   )r   rj   r   r*   r
   expand_dims)r   rc   rq   rm   ind_end	ind_startrK   s     r$   	loop_bodyz+ufunc._reduceat_via_scan.<locals>.loop_bodyN  sY    Q]q7{3JJsDCG,?,?4,H,Ht$T$T$TUU  r&   )r   rG   rx   r   r   r,   r   rw   r   rn   r^   r   listr   r   r*   r
   r   r   r   deletearangeslice_in_dimr   )rK   rq   r   rm   rn   	idx_tuplerc   r   r   r   r   s   `` `     @@r$   r   zufunc._reduceat_via_scan9  s   t}///G<<<QA3G<<Iy>>QlGv{{SSSTTT|qYYYZZZ}ge|z$66|ABBBT16**D
q'
%
%
%C
'

fWagdm<<"29RYsx-@-@$#G#GHHJ JC$$S!SYt_q-@t$LLIg""339T?"FFG         7Qy#>>>r&   )r   ABc          
        | j         dk    rt          d          | j        dk    rt          d          t          | j         d||           d } t          j        t          j        t          | j        fi |d          d           ||           ||                    } |j	        g t          j        |          t          j        |          R  S )	Nrv   z&outer only supported for binary ufuncsr   z;outer only supported for functions returning a single valuez.outerc                h    t           j                            | t          j        |           f          S r    )r*   r
   r   r   size)r   s    r$   rP   zufunc.outer.<locals>.<lambda>\  s     swq271::-88 r&   )Nr   r   N)r>   rw   r@   r   rG   r*   vmapr   rj   r   r   r   )rK   r   r   rf   _ravelr   s         r$   outerzufunc.outerT  s     x1}}?@@@yA~~TUUUt},,,a33388FTSXchwtz<<V<<iHH)TTU[U[\]U^U^`f`fgh`i`ijjF6>528A;;5!5555r&   )r>   r?   r@   r?   rA   r   r:   rB   r;   rC   r<   r   )r   r?   )r[   r   r   r\   )r   r`   )
r   r   rc   re   rd   re   rf   r   r   r   )r   NNFNN)rq   r   rm   r?   rn   rr   rc   re   ro   r\   rs   rt   rd   rt   r   r   )r   NFNN)r   r   rm   r?   rn   rr   ro   r\   rs   rt   rd   rt   r   r   )r   NN)
rq   r   rm   r?   rn   rr   rc   re   r   r   r   )r   r   rm   r?   rn   rr   r   r   r    )
rq   r   r   r   r   rt   r   r\   r   r   )rq   r   r   r   r   r   r   r   )rq   r   r   r   rm   r?   rn   rr   rc   re   r   r   )
rq   r   r   r   rm   r?   rn   rr   r   r   )r   r   r   r   r   r   )rG   
__module____qualname__rF   rL   propertyrY   rj   r>   r@   r;   r<   rZ   r_   rb   rk   r   r   r9   r~   r   r*   jitr{   r   r   r   r   r   r   r   r   r&   r$   r9   r9   O   s         #'#'#	     * (;;
<
<%
(;;
<
<%8899#	::	;	;$
(<<
=
=%XBBCC(3 3 3 3
Y Y Y Y, , , ,  t' ' ' ' ' ' :bhom444
737$P$P$PQQQJNSW'+_ _ _ _ RQ 54_4 W[KO15: : : : :x :bh!-888
737$=$=$=>>>NR!2 2 2 2 ?> 982 >?59& & & & &* :bhk-000
737A3DDD.. . . . . ED 10.   8 :bh666
737$=$=$=>>>=>;?G G G G ?> 76G HI37? ? ? ? ?6 :bhn]333
737A3'''6 6 6 (' 436 6 6r&   r9   )r<   r>   r?   r@   rA   r<   c              *    t          | |||d          S )a  Create a JAX ufunc from an arbitrary JAX-compatible scalar function.

  Args:
    func : a callable that takes `nin` scalar arguments and returns `nout` outputs.
    nin: integer specifying the number of scalar inputs
    nout: integer specifying the number of scalar outputs
    identity: (optional) a scalar specifying the identity of the operation, if any.

  Returns:
    wrapped : jax.numpy.ufunc wrapper of func.
  T)r<   r=   )r9   )rA   r>   r@   r<   s       r$   
frompyfuncr   a  s     
tS$d	C	C	CCr&   )r   r   r   r   r   r   )
r>   r?   r@   r?   rA   r   r<   r   r   r9   )6rF   
__future__r   collections.abcr   	functoolsr   r   rH   typingr   r*   jax._src.typingr   r   r	   jax._src.laxr
   rx   jax._src.numpyr   jax._src.numpy.lax_numpyr   r   r   jax._src.numpy.reductionsr   jax._src.numpy.utilr   r   r   r   jax._src.numpy.vectorizer   jax._src.utilr   r   jax._srcr   numpyr   r   r5   add_psummul_pr   r6   __annotations__cumsumcumprodr7   r9   r   r   r&   r$   <module>r      sR   * ) ) " " " " " " $ $ $ $ $ $               



 7 7 7 7 7 7 7 7 7 7 , , , , , , % % % % % % V V V V V V V V V V / / / / / / R R R R R R R R R R R R . . . . . . 7 7 7 7 7 7 7 7              . jnjoE      j'j(I      KN6 N6 N6 N6 N6 N6 N6 N6d #'D D D D D D D Dr&   