
    Vpf                    j   U d dl mZ d dlmZmZ d dlZd dlZd dlZd dl	m
Z
mZm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 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&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l0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9  ej:        e;            ej:        e;           e5e<cZ<Z=e6e>cZ>Z?ee@e1f         ZAeeBe1f         ZCeDd         ZEeFeejG        e1f                  ZHe!jI        ZI e
d          ZJd ZKd  ZL G d! deM          ZNejO         ejP        d"d"#           G d$ d%ejQ                                          ZRejS        T                    eR           ejU        T                    eR            G d& d'eN          ZV G d( d)eN          ZW G d* d+eN          ZX G d, d-eN          ZYejP         G d. d/eN                      ZZe!j[         ejP        d"0           G d1 d2                                  Z\ e\i i i i           Z] ej^        d3          j_        Z`dd9Zad: Zbejc        d;             ZdddCZedD ZfddHZgddPZhdQ Ziejc        dR             ZjddSZk ejl        dT          Zmd"em_n        ddVZoeoejp        em<    G dW dXeq          Zremjs        dY             Ztemju        dZ             Zv eqd[          Zwd\ Zxd] Zyd^ Zz e)j{        emeyd_`            e)j{        emexda`            e)j{        emexdb`           dc Z|e|e(j}        em<   dd Z~e~e'j        em<   eZi Zdeedf<   dg Zdh Zdi Zg ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ej        ZeD ]Z ej        ee          ee<   dj Zeeej        <   dk Zeeej        <   dl Zeeej        <   dm Zeeej        <   dn Zdo Zdp Z ej        eej                  eej        <    ej        eej                  eej        <    ej        eej                  eej        <    ej        eej                  eej        <    ej        eej                  eej        <   e8ddr            ZddsZeeej        <   dt Zeeej        <   ddyZe8dd{            Zd| Zeeej        <   d} Zeeej        <   d~ Zeeej        <   d Zd Zeeej        <   d Zeeem<    eeYh          Z eeWh          Z eeXh          Z eeVh          Zeez  Zeez  Zeez  ZefddZddZd ZdddZddZddZddZdS )    )annotations)CallableSequenceN)TypeVarAnyUnion)dtypes)lax)api)linear_util)config)core)custom_derivatives)effects)pjit)sharding_impls)source_info_util)traceback_util)	tree_util)SymbolicZero)flatten_fun)ad)batching)mlir)partial_evaltree_flatten)tree_map)tree_unflatten)Array)as_hashable_function
split_listsafe_mapsafe_zipunzip3weakref_lru_cacheHashableWrapperJaxExceptionOutc                F    t          | |          }t          | |           |S N)getattrdelattr)objattrnamevals      Q/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/checkify.pypopattrr2   C   s&    X#	#x	*    c                n    t                      }t          | ||          |u sJ t          | ||           d S r+   )objectr,   setattr)r.   namer0   sentinels       r1   
setnewattrr9   H   s@    XX(	dH	%	%	1	1	1	1	#tSr3   c                  B    e Zd ZdZd Zd Zd Zed             Zd
dZ	d	S )r(   zKPython exception which can contain an error message with JAX run-time info.c                    || _         d S r+   traceback_info)selfr=   s     r1   __init__zJaxException.__init__R   s    (Dr3   c                .    t          j        |            d S r+   )jturegister_pytree_node_class)clss    r1   __init_subclass__zJaxException.__init_subclass__W   s    "3'''''r3   c                    g | j         fS r+   r<   r>   s    r1   r   zJaxException.tree_flattenZ   s    #$$r3   c                    ~ | |          S r+    rC   metadatapayloads      r1   r   zJaxException.tree_unflatten]   s    3x==r3   returnErrorEffectc                    t           r+   )NotImplementedErrorrF   s    r1   get_effect_typezJaxException.get_effect_typeb   s    
r3   N)rL   rM   )
__name__
__module____qualname____doc__r?   rD   r   classmethodr   rP   rH   r3   r1   r(   r(   O   sv        SS) ) )
( ( (% % %   ;     r3   T)eqfrozenc                  ,    e Zd ZU ded<   ded<   ddZdS )	rM   ztype[JaxException]
error_typez tuple[api.ShapeDtypeStruct, ...]shape_dtypesotherc                D    d fd} ||            ||          k     S )Nc                >    t          d | j        D                       S )Nc              3  L   K   | ]}|j         t          |j                  fV   d S r+   )shapestrdtype).0sds     r1   	<genexpr>z7ErrorEffect.__lt__.<locals>.<lambda>.<locals>.<genexpr>m   sE       #= #=') %'Hc"(mm#< #= #= #= #= #= #=r3   )tuplerZ   xs    r1   <lambda>z$ErrorEffect.__lt__.<locals>.<lambda>m   s.    U #= #=-.^#= #= #= = = r3   c                B    t          | j                   |           fS r+   )r`   rY   )rg   rZ   s    r1   rh   z$ErrorEffect.__lt__.<locals>.<lambda>o   s    AL))<<??; r3   rH   )r>   r[   unpackrZ   s      @r1   __lt__zErrorEffect.__lt__l   s8    = =L;;;;FF4LL66%==()r3   N)r[   rM   )rQ   rR   rS   __annotations__rk   rH   r3   r1   rM   rM   f   sD          !   0000* * * * * *r3   rM   c                      e Zd Zd Zd ZdS )DivisionByZeroErrorc                    dS )Nzdivision by zerorH   rF   s    r1   __str__zDivisionByZeroError.__str__w   s    r3   c                ,    t          t          d          S NrH   )rM   rn   rF   s    r1   rP   z#DivisionByZeroError.get_effect_typez   s    *B///r3   N)rQ   rR   rS   rp   rP   rH   r3   r1   rn   rn   u   s2          0 0 0 0 0r3   rn   c                  F     e Zd Z fdZd Zed             Zd Zd Z xZ	S )NaNErrorc                X    t                                          |           || _        d S r+   )superr?   prim)r>   r=   primitive_name	__class__s      r1   r?   zNaNError.__init__   s&    	GG^$$$DIIIr3   c                "    g | j         | j        ffS r+   )r=   rw   rF   s    r1   r   zNaNError.tree_flatten   s    $di011r3   c                     | | S r+   rH   )rC   rJ   _s      r1   r   zNaNError.tree_unflatten   s    3>r3   c                ,    t          t          d          S rr   )rM   rt   rF   s    r1   rP   zNaNError.get_effect_type   s    x$$$r3   c                    d| j          dS )Nznan generated by primitive: .)rw   rF   s    r1   rp   zNaNError.__str__   s    6$)6666r3   )
rQ   rR   rS   r?   r   rU   r   rP   rp   __classcell__ry   s   @r1   rt   rt   }   s            2 2 2   ;% % %7 7 7 7 7 7 7r3   rt   c                  F     e Zd Z fdZd Zed             Zd Zd Z xZ	S )OOBErrorc                t    t                                          |           || _        || _        || _        d S r+   )rv   r?   rw   operand_shape_payload)r>   r=   rx   r   rK   ry   s        r1   r?   zOOBError.__init__   s5    	GG^$$$DI&DDMMMr3   c                :    | j         g| j        | j        | j        ffS r+   )r   r=   rw   r   rF   s    r1   r   zOOBError.tree_flatten   s     ]Od149d>PQRRr3   c                "     | g ||d         R  S Nr   rH   rI   s      r1   r   zOOBError.tree_unflatten   s!    3%%'!*%%%%r3   c           	     l    d| j          d| j        d          d| j        d          d| j        d          d	S )	Nz*out-of-bounds indexing for array of shape z: index r   z is out of bounds for axis    z with size    z. )r   r   rF   s    r1   rp   zOOBError.__str__   sl    A'A A]1%A A }QA A -1M!,<A A A Br3   c                h    t          t          t          j        dt          j                  f          S )N)   )rM   r   r   ShapeDtypeStructjnpint32rF   s    r1   rP   zOOBError.get_effect_type   s$    x#"6tSY"G"G!IJJJr3   
rQ   rR   rS   r?   r   rU   r   rp   rP   r   r   s   @r1   r   r      s            S S S & & ;&B B BK K K K K K Kr3   r   c                  F     e Zd Z fdZd Zed             Zd Zd Z xZ	S )FailedCheckErrorc                t    t                                          |           || _        || _        || _        d S r+   )rv   r?   
fmt_stringargskwargs)r>   r=   r   akry   s        r1   r?   zFailedCheckError.__init__   s4    	GG^$$$ DODIDKKKr3   c                :    | j         | j        f| j        | j        ffS r+   )r   r   r=   r   rF   s    r1   r   zFailedCheckError.tree_flatten   s%    Y$ $/24 4r3   c                &    |\  }} | g ||R i |S r+   rH   )rC   rJ   rK   r   r   s        r1   r   zFailedCheckError.tree_unflatten   s.    LD&3**4***6***r3   c                @     | j         j        | j        i | j        dz   S )Nz (`check` failed))r   formatr   r   rF   s    r1   rp   zFailedCheckError.__str__   s*    "DO"DI===!" #r3   c                    t          j        | j        | j        f          }t	          t
          t          d |D                                 S )Nc              3  T   K   | ]#}t          j        |j        |j                  V  $d S r+   )r   r   r_   ra   )rb   rg   s     r1   rd   z3FailedCheckError.get_effect_type.<locals>.<genexpr>   s3      CCc"17AG44CCCCCCr3   )rA   tree_leavesr   r   rM   r   re   )r>   valss     r1   rP   z FailedCheckError.get_effect_type   sL    ?DIt{344DCCdCCCCCE E Er3   r   r   s   @r1   r   r      s            4 4 4 + + ;+# # #E E E E E E Er3   r   c                  0     e Zd ZU ded<    fdZd Z xZS )BatchedErrorz#dict[tuple[int, ...], JaxException]error_mappingc                    t          | j                                                  d         j        }t	                                          |           d S r   )listr   valuesr=   rv   r?   )r>   r=   ry   s     r1   __post_init__zBatchedError.__post_init__   sE    $,335566q9HN	GG^$$$$$r3   c                n    d                     d | j                                        D                       S )N
c              3  x   K   | ]5\  }}d d                     t          t          |                     d| V  6dS )zat mapped index z, z: N)joinmapr`   )rb   idxes      r1   rd   z'BatchedError.__str__.<locals>.<genexpr>   s_       ? ?a H		#c3--(@(@GGAGG ? ? ? ? ? ?r3   )r   r   itemsrF   s    r1   rp   zBatchedError.__str__   sC    99 ? ?#'#5#;#;#=#=? ? ? ? ? ?r3   )rQ   rR   rS   rl   r   rp   r   r   s   @r1   r   r      sU         4444% % % % %
? ? ? ? ? ? ?r3   r   )rW   c                      e Zd ZU ded<   ded<   ded<   ded<   ddZddZd Zd ZddZddZ	d dZ
d Zd Zed             ZdS )!Errorzdict[ErrorEffect, Bool]_predzdict[ErrorEffect, Int]_codezdict[Int, PyTreeDef]	_metadatazdict[ErrorEffect, Payload]r   rL   
str | Nonec                P    |                                  }|t          |          S dS )zCReturns error message if error happened, None if no error happened.N)get_exceptionr`   )r>   exps     r1   getz	Error.get   s(    




C
XXo4r3   JaxException | Nonec                   t          t          t          j        | j                                                            r|                                 S d}d}| j                                        D ]\  }}| j        |         r|||k     r|}|}|3t          | j
        t          |                   | j        |                   S dS )zFReturns Python exception if error happened, None if no error happened.N)anyr   npr_   r   r   _get_batched_exceptionr   r   r   r   intr   )r>   min_code
cur_effecterror_effectcodes        r1   r   zError.get_exception   s    
3rx**,,--.. 9((***hj $
 0 0 2 2 & &
,:l# 	&H%J		dnS]];"mJ79 9 	94r3   c                $    t          |            d S r+   )_check_errorrF   s    r1   throwzError.throw   s    r3   c                2    d|                                   dS )NzError())r   rF   s    r1   rp   zError.__str__   s    !DHHJJ!!!!r3   BatchedError | Nonec                    t          j        t          | j                                                  d                   }i }t          j        | D ]}d }d }| j                                        D ]0\  }}| j        |         |         r|||         |k     r
||         }|}1|Kt          |fd| j	        |                   }t          | j        t          |                   |          }	|	||<   |rt          |          S d S )Nr   c                    | |         S r+   rH   )rg   is     r1   rh   z.Error._get_batched_exception.<locals>.<lambda>	  s
    AaD r3   )r   r_   r   r   r   ndindexr   r   r   r   r   r   r   r   )
r>   r_   r   r   r   r   r   r   rK   	jax_errors
             r1   r   zError._get_batched_exception   s   HT$*++--..q122EMz5! ' 'hj $
 0 0 2 2 & &
,:l#C( 	&cX!5!5CyH%J		s000$-
2KLL"4>#h--#@'JJ	&c -(((Tr3   effect_typerM   c                    i | j         ||i}i | j        ||i}i | j        ||i}i | j        |}	t	          |||	|          S r+   )r   r   r   r   r   )
r>   r   predr   rJ   rK   new_errs	new_codesnew_payloadnew_metadatas
             r1   _updatezError._update  si    4$*4d 34H54:5+t!45I=T]={G&<=K1dn11L9lK@@@r3   r   set[ErrorEffect]c                f   | j                                         }| j                                        }| j                                        }|D ]M}|| j                                         vr0d||<   t          t          d |j                            ||<   d||<   Nt          ||| j	        |          S )zCFill out Error with `effects` and np.ones arrays of their payloads.Fc                @    t          j        | j        | j                  S r+   )r   onesr_   ra   )r   s    r1   rh   z0Error._add_placeholder_effects.<locals>.<lambda>!  s    sx99 r3   )
r   copyr   r   keysr   r   rZ   r   r   )r>   r   new_errnew_coder   effects         r1   _add_placeholder_effectszError._add_placeholder_effects  s    jooGz  H-$$&&K  	tz((	(	("996;NOOQ QF (DNK@@@r3   c                ,    t          j        | g|R i |S r+   )dataclassesreplace)r>   r   r   s      r1   _replacezError._replace'  s#    t5d555f555r3   c                8    | j         | j        | j        f| j        fS r+   )r   r   r   r   rF   s    r1   r   zError.tree_flatten,  s    ZT]3dnFFr3   c                *    |\  }}} | ||||          S r+   rH   )rC   rJ   datar   r   rK   s         r1   r   zError.tree_unflatten/  s$    D$3tT8W---r3   N)rL   r   )rL   r   )rL   r   )r   rM   )r   r   )rQ   rR   rS   rl   r   r   r   rp   r   r   r   r   r   rU   r   rH   r3   r1   r   r      s         !   !!!!&&&&      $  " " "
   *A A A AA A A A6 6 6
G G G . . ;. . .r3   r   r   errorr   Bool	new_errorrL   c                    t                      }|                                }t          |          \  }}t          | ||||i||          S r+   )	next_coderP   r   update_error)r   r   r   r   r   r   r   s          r1   assert_funcr   7  sK    	$))+++*955+|	eT4$)={K	X	XXr3   c                n   | j                             |d          }||z  }t          j        || j                            |d          |          }| j                            |d           }	|	/t          t          j        t          j        |          |	|          }
n|}
| 	                    |||||
          S )NFr   )
r   r   r
   selectr   r   r   	functoolspartialr   )r   r   r   rJ   rK   r   err_of_typeout_errout_codecur_payloadout_payloads              r1   r   r   =  s    U33+$'ZU[__["%E%EtLL("";55+9,SZEE{T[\\KKK	{GXx	M	MMr3   c               '     K   | i fV \  }}t          j        ||f          \  }}||t          |j                                                  ffV  d S r+   )rA   r   setr   r   )invalsr   outout_valsout_trees        r1   %_flatten_and_get_error_metadata_thunkr  K  sd      RZ*%'55(H8S!1!1!3!3445555555r3   	primitivecore.Primitiver   
core.Valueparamsr   "tuple[Error, Sequence[core.Value]]c                   d|vr| | j         |i |fS t          j        |          \  }}t          |          }d|v r t	          |g dg|z  |d         R           }|                    d          }t          |t          j                  r|j	        |j
        }
}	n|d}
}	t          d |
D                       }t          j        t          j        t                    |	|||          }t!          |          \  }t          | t          j                  rQ|                    d          t%                    fd	            }t	          |g d
|z  |d         R |          } | j         |g||R i |}             \  }}t'          ||          \  }}t          | t          j                  rt)          |          }||fS )z6Default rule for primitives in `checkify` interpreter.
call_jaxprdonated_invarsF)r	  rH   c              3  4   K   | ]}t          |          V  d S r+   )r'   rb   cs     r1   rd   z(default_checkify_rule.<locals>.<genexpr>g  s*      55/!$$555555r3   out_axes)closurec                 b                 d         j         t                    z
  } g d| z  R S )Nr   r   )
num_leaveslen)out_err_numrJ   out_val_axess    r1   out_axes_thunkz-default_checkify_rule.<locals>.out_axes_thunkr  s:    HJJqM,s</@/@@k/tK/,///r3   r+   in_axes)r  r  )bindrA   r   r  dictpop
isinstancer   ClosedJaxprjaxprconstsre   luhashable_partial	wrap_initcheckify_jaxpr_flat_hashabler  MapPrimitiver!   r   _reduce_any_error)r  r   enabled_errorsr   r  err_valserr_treenum_error_valsr  r  r  consts_partial_checkifyr  all_valsr   r|   r   rJ   r  s                     @@r1   default_checkify_ruler+  Q  sJ    .).&3F3333 '..(Hx==.& *EE7>+A *E+12B+C*E *E F F FF zz,''*
D,-- #$j&76EE6E55f55555'("*$ *$%*G^XO OD   H 	4,-- 1::j))L,///0 0 0 0 0 0/0 &GGN2GVI5FGG!/1 1 1F Y^,KxK&KKKFKK(

+(A"8X66/%	4,-- %e$$E	r3   c                N    t          j        t          j        |                     S r+   )r   raise_to_shapedget_aval)r0   s    r1   get_shaped_avalr/    s    		dmC00	1	11r3   r  core.ClosedJaxprtuple[Error, list[core.Value]]c                h    t          j        |          \  }}t          | j        | j        ||g||R  S r+   )rA   r   checkify_jaxpr_flatr  r  )r  r$  r   r   r%  r&  s         r1   checkify_jaxprr4    sQ    '..(H	U[%,+X
I8@
ICG
I 
I 
I Ir3   
core.Jaxprr  Sequence[core.Value]r&  	PyTreeDefr   tuple[Error, list[Any]]c                `   i t          ||j        g          \  }}t          j        ||          }t	          j        |           }d
fd}	dfd}
t          |
| j        |           t          |
| j        |           | j	        D ]}t          |	|j                  }t                              |j        t          j        t          |j                            }t!          j                    |j        j        z   }t!          j        |j        j        |          5   |||g|R i |j        \  }}d d d            n# 1 swxY w Y   |j        j        rt          |
|j        |           n |
|j        d	         |           t	          j        ||           |t          |	| j                  fS )Nvar	core.Atomc                V    t          | t          j                  r| j        S |          S r+   )r  r   Literalr0   )r:  envs    r1   read_envz%checkify_jaxpr_flat.<locals>.read_env  s'    #t|$$ Wns8Or3   core.Varr0   r   c                    || <   d S r+   rH   )r:  r0   r>  s     r1   	write_envz&checkify_jaxpr_flat.<locals>.write_env  s    CHHHr3   )
name_stackr   )r:  r;  )r:  r@  r0   r   )r"   r  rA   r   r   	last_usedr   	constvarsinvarseqnserror_checksr   r  r   r   r+  r   current_name_stacksource_inforC  user_context	tracebackr  multiple_resultsoutvarsclean_up_dead_vars)r  r  r$  r&  r   r%  in_argsr   rD  r?  rB  eqnr   checkify_rulerC  outvalsr>  s                   @r1   r3  r3    s.     # (;'<==(G

Xx
0
0%nU##)     
      i&)))iw''' Z 1 1c3:&&F $$y()>NNP PM!4669SSJ		&s'@2<
> 
> 
> < <$}UN <&,< < <03
< <neW< < < < < < < < < < < < < < < }% )	)S['****iA(((Ci0000	Hem,,	,,s   D<<E 	E 	c                T    t          d |D                       }t          | |||g|R  S )Nc              3  $   K   | ]}|j         V  d S r+   rf   r  s     r1   rd   z/checkify_jaxpr_flat_hashable.<locals>.<genexpr>  s$      ........r3   )re   r3  )r  hashable_constsr$  r&  r   r  s         r1   r!  r!    s:    ..o.....&	UFNH	Lt	L	L	LLr3   c               '  8   K   | i fV }t          |          V  d S r+   r   )r   anss     r1   flatten_fun_outputrY    s-      Bh#Sr3   c                j   t           }| j                                        D ]v}| j        |         | j        |         | j        |         }}}t          j        |          d         }t          |fd|||f          \  }}}	|                    |||i |	          }w|	                    | j
                  }|S )Nr   c                    | |         S r+   rH   )rg   r   s     r1   rh   z#_reduce_any_error.<locals>.<lambda>  s
    af r3   r   )
init_errorr   r   r   r   r   argsortr   r   r   r   )
r   	out_errorr   errscodespayloadsreduced_idxr   r   rK   s
             r1   r#  r#    s    )k&&(( I Il"[6"[6"^L9 %D +d##B'K"#D#D#D$(%#:< <D$!!,dBHHII  5? ;;)	r3   checkcore.pp.Docc                L   |j         rt          j        | j                   nd }|j        rd| j         j         dnd }t	          d | j                                        D                       }t          j        	                    | j
        j        |          t          j        |||          t          j        	                    d          t          j        | j        |          z   g}t          j                            t          j        	                    d|          g|          S )N[]c              3  0   K   | ]\  }}|d k    ||fV  dS )r&  NrH   )rb   r   vs      r1   rd   z_pp_check.<locals>.<genexpr>  s;       . .Va*__ a&,___. .r3   )
annotation  )rJ  r   	summarizerC  sortedr  r   r   pptextr  r7   pp_kv_pairspp_varsrF  concat)rQ  contextsettingsrk  name_stack_annotationtrimmed_paramsrhss          r1   	_pp_checkrz    s   '2 *3?;;;-1  '1<<s9<<<<7;  . .sz/?/?/A/A . . . . ..	cm(5J	K	K		.'8	<	<	c		T\#*g>>	>	@# 
b*55<<	=	==r3   c                      e Zd ZdS )JaxRuntimeErrorN)rQ   rR   rS   rH   r3   r1   r|  r|    s        $r3   r|  c                   |rg S t          | |          }|                                }|r]t          j        |j                                                  }|                    |           t          t          |                    |g S r+   )	r   r   r   filter_tracebackr=   as_python_tracebackwith_tracebackr|  r`   )r&  debugr   r   excfiltered_tbs         r1   
check_implr    s    
 I
4
(
(%# - 1..002 2K{###
#c((
#
#,	)r3   c                p    ~g t          t          | |          j                                                  fS r+   )r   r   r   r   )r&  r  r   s      r1   check_abstract_evalr    s1    	S$//5::<<==	==r3   zCannot abstractly evaluate a checkify.check which was not functionalized. This probably means you tried to stage (jit/scan/pmap/...) a `check` without functionalizing it through `checkify.checkify`.c          
         |rg S t           j        j        st          t	          j        | t          j        t          |          d |t          | j
                  t          | j                  d          \  }}}|S )NT)callbacktokenoperandsoperand_avalsresult_avalshas_side_effect)r   xla_runtime_errorsvaluefunctionalization_errorr   emit_python_callbackr   r   
python_errr   avals_in	avals_out)ctxr&  r  r   out_opr|   s         r1   check_lowering_ruler    s|    
 I		"	( "
!!*	I%j(;;&&&&  ,&!Q 
-r3   c                    | rg S t           r+   )r  )r  r   r   s      r1   check_lowering_rule_unsupportedr    s    
 Ir3   c                D    t          | |          }t          |           g S r+   )r   r   )r&  r   r   s      r1   r  r    s$    
4
(
(%u	)r3   tpu)platformcpugpuc                   t          d t          | |          D                       fdt          | |          D             } t          ||           }t          ||           g g fS )Nc              3  R   K   | ]"\  }}|t           j        u|j        |         V  #d S r+   )r   
not_mappedr_   )rb   rg   dims      r1   rd   z&check_batching_rule.<locals>.<genexpr>   sE       1 1vq#H/// gcl////1 1r3   c              3  J   K   | ]\  }}t          j        ||          V  d S r+   )r   bdim_at_front)rb   r   dsizes      r1   rd   z&check_batching_rule.<locals>.<genexpr>"  sJ       = =a (At44 = = = = = =r3   r  )nextzipr   r   )batched_args
batch_dimsr&  r  errr  s        @r1   check_batching_ruler    s    	 1 1\:)F)F 1 1 1 
1 
1$= = = =!,
;;= = =,x..#s%    	R-r3   c               .    t          j        | ||d g g fS N)r&  r  )check_pr  )primalsr|   r&  r  s       r1   check_jvp_ruler  )  s"    	,(%8888	R-r3   z$dict[core.Primitive, ErrorCheckRule]rH  c                 2    t          j                    j        S r+   )r   currentrL  rH   r3   r1   get_tracebackr  5  s    		!	#	#	--r3   c                H     | j         |i |}t          | |||          }||fS r+   )r  
check_nans)rw   r   r$  in_valsr  r   r  s          r1   nan_error_checkr  8  s4    	7%f%%#444#	c/r3   c                   t           |vr|S d | j        r2t          j        t          j        fd|D                                 n
 |          }t          ||t          t                      | j                            S )Nc                    t          j        | j        t          j                  rdS t          j        t          j        |                     S )NF)r   
issubdtypera   r	   prng_keyr   isnanrf   s    r1   r  zcheck_nans.<locals>.isnanA  s7    
~agv// U739Q<<   r3   c                &    g | ]} |          S rH   rH   )rb   rg   r  s     r1   
<listcomp>zcheck_nans.<locals>.<listcomp>F  s!     7 7 7aq 7 7 7r3   )rt   rM  r   r   arrayr   r  r7   )rw   r   r$  r   any_nansr  s        @r1   r  r  =  s    ^##L! ! ! &7cgci 7 7 7 73 7 7 788999,1E#JJ 	UHh}	&J&J	K	KKr3   c          
        t          j        j        |g|R d|i}t          |vr| |fS t	          j        |j                  }t	          j        |          }t          j        |          }|dk     ||z   |k    z  }t          ||t          |j
                  |j                  }t          | t          j        |          t          t                      d|j        |                    } | |fS )Nslice_sizesr   dynamic_slice)r
   dynamic_slice_pr  r   r   r  r_   r   oob_payloadrangendimr   r   r  )	r   r$  operandr  start_indicesr   operand_dimsoob_maskrK   s	            r1   dynamic_slice_error_checkr  `  s     R=RRRkRR#^###:'-((,%%+)M**-aMK$?,$NO(-w|1D1DgmTT'
eSWX../[b[hjq0r0r
s
s%	r3   c           
        t          j        j        ||g|R  }t          |vr| |fS t	          j        |j                  }t	          j        |j                  }t          j        |          }|dk     ||z   |k    z  }t          ||t          |j
                  |j                  }	t          | t          j        |          t          t                      d|j        |	                    } | |fS )Nr   dynamic_update_slice)r
   dynamic_update_slice_pr  r   r   r  r_   r   r  r  r  r   r   r  )
r   r$  r  updater  r   r  update_dimsr  rK   s
             r1    dynamic_update_slice_error_checkr  p  s    "'H-HHH#^###:'-((,&&+)M**-aMK$?,$NO(-w|1D1DgmTT'
eSWX..J`biboqx0y0y
z
z%	r3   c          
        t           j                            ||||||||	          }
t          |vr| |
fS |}t	          j        |j                  }t          |j                  dz
  }|t	          j        |j                           }|t	          j        |          t	          j        |j                           z  }t          j
        |t          t          |                              }|dk     ||                    |j                  k    z  }t          |||j        |j                  }t!          | t          j        |          t          t%                      d|j        |                    } | |
fS )N)dimension_numbersr  unique_indicesindices_are_sortedmode
fill_valuer   )axisr   gather)r
   gather_pr  r   r   r  r_   r  start_index_mapr   expand_dimsre   r  astypera   r  r   r   r  )r   r$  r  r  r  r  r  r  r  r  r   dnumsr  num_batch_dimsupper_boundr  rK   s                    r1   gather_error_checkr    sT    	}0An+$: 	 	O 	O#
 ^###: %'-((,}*++a/.RXe&;<<=++&&rx0E'F'FGG+%n8M8M2N2NOOO+aMK4F4F}GZ4[4[$[\(-1FVV'
eSWX..(T[Tacj0k0k
l
l%	r3   c                    t           |v rQt          j        t          j        |d                    }t	          | |t          t                                          } t          t          j        | |||          S )z$Checks for division by zero and NaN.r   )	rn   r   r   equalr   r  r  r
   div_p)r   r$  rg   yany_zeros        r1   div_error_checkr    s\    N**wsyA''Hx)<]__)M)MNNE	E>1a	@	@@r3   c                t   t          j        t          j        |                     }t          j        ||j                  }t          j        |          |d                  }t          j        |          |         }t          j        |          |         }t          j        |||gt           j                  }	|	S )Nr   )ra   )r   argminlogical_notunravel_indexr_   r  ravelr   )
r  indicesdims_mapr   flat_idx	multi_idxoob_axisoob_axis_size	oob_indexrK   s
             r1   r  r    s    Z1122('-88)Yx  2/()M**84-i  *)Iy(M:#)LLL'	.r3   c                ,    g d}t          t           j                            D ]Q}||j        v r                    d           !                    |j        |j        |                             |dz  }Rt          j         fd|j        D             t          j	                  }t          j
        |t          j        |j                  j                  }t          j        ||j        t          |j                  dz
  f          }t!          j        |d          }t!          j        ||                    |j                            }t!          j        ||          }	t+          |	||j         j                  }
t!          j        |	          |
fS )Nr   r   c                <    g | ]}j         |         |         z
  S rH   )r_   )rb   r   r  r  s     r1   r  zscatter_oob.<locals>.<listcomp>  s?     G G G "-*[^; G G Gr3   )r  r  r_   inserted_window_dimsappendupdate_window_dimsr   r  scatter_dims_to_operand_dimsint64minimumiinfora   maxr
   broadcast_in_dimr   lessgreaterr  
logical_orr  r   )r  r  updatesr  posr   r  	lower_oob	upper_oobr  rK   r  s   `          @r1   scatter_oobr	    s   +	#W]##$$  aE&&&u'?'DEFFF	Qhcc G G G G G#(#EG G G# #+ 
;(?(?(CDD+$['-&)'-&8&81&<%>@ @+ hw"")k';#5#5gm#D#DEE)^Iy11(':GMK K'			G	##r3   c                   |                      |||||||	|
|	  	        }t          |vr||fS t          ||||          \  }}t          t                      | j        |j        |          }t          |||          }t          | |||          }||fS )zEChecks if indices are within bounds and update does not generate NaN.)update_jaxprupdate_constsr  r  r  r  )r  r   r	  r  r7   r_   r   r  )rw   r   r$  r  r  r  r  r  r  r  r  r  r   out_of_boundsrK   	oob_errors                   r1   scatter_error_checkr    s     			wl!5F+N	 	 	 	# ^###:&wBSTT-}	7='JJ)
e]I
6
6%
T5.#
6
6%	r3   4tuple[core.ClosedJaxpr, PyTreeDef, set[ErrorEffect]]c                    t          j        t          | j        | j        ||          }t          j        |          }t          |          \  }}t          j	        ||          \  }}}	\   t          j        ||	          }
 |            \  }}|
||fS r+   )r   r   r3  r  r  r  r   r  petrace_to_jaxpr_dynamicr   r  )r  r$  r&  flat_err_and_in_valscheckify_jaxpr_partialfunrJ   	new_jaxprr|   r  checked_jaxprr   error_effectss                r1   jaxpr_to_checkify_jaxprr    s     %,-@%+-2\>-57 7 	+,,#7<<-#x6s<PQQ)Q"9f55-$HJJ(M	-	//r3   c                  t          j        |           \  }t          t          g ||          fdfd|D             }|                      t                      j        |           }t          j        |          \  }t          t          g ||          t          fd|D                       \  }}	}
t          j	        j
        |g||R dt          |          i}t          |	d         |          \  }}|j        }|	dd          D ] }t          ||          \  }}
i ||j        }!|                    |          |fS )Nc                .    t          | gR  \  }}}|S r+   r  )jxprr|   r   r$  r&  in_avalss      r1   get_error_effects_from_jaxprz6cond_error_check.<locals>.get_error_effects_from_jaxpr  s0    +D.( 7-57 7 7MAq'Nr3   c                &    g | ]} |          S rH   rH   )rb   r  r   s     r1   r  z$cond_error_check.<locals>.<listcomp>  s%    EEED))$//EEEr3   c              3  6   K   | ]}t          |gR  V  d S r+   r  )rb   r  r$  r&  r  s     r1   rd   z#cond_error_check.<locals>.<genexpr>  s]       &K &K9= 
5+35 5 5&K &K &K &K &K &Kr3   branchesr   r   r\  )rA   r   r   r/  r   r   unionr%   r
   cond_pr  re   r   r   r   )r   r$  indexr#  opsr%  r   merged_errornew_branches	out_treesr|   err_and_outserr0r   merged_metadatatrr  r&  r   r  s    `               @@@r1   cond_error_checkr/    s    '..(H"3H"3s"344(       FEEEHEEE'//W0EFF,'55(H "3H"3s"344(% &K &K &K &K &K &KAI&K &K &K  K  K,	1 $$$ $ $\""$ $,
 Yq\<88)$N/abbM ; ;bB--FC::CM:OO		1	13	66r3   c               V   t          |
||g          \  }}}fd|D             }t          j        |           \  }}t          t          g |||          |z   }t          |||g|R  \  }}}|                     |          }t          j        |          \  }}t          t          g |||          |z   }t          |||g|R  \  }}}dgt          |          z  dgt          |          z  z   dgt          |          t          |          z   z  z   }t          j	        ||          }g ||||}g dgt          |          z  |R }t          j        j        |||t          |          t          |          t          |          z   |||	d}t          ||          \  }}||fS )Nc           	     V    g | ]%}t          j        d t          |                    &S r  )r   mapped_avalr/  )rb   r0   lengths     r1   r  z$scan_error_check.<locals>.<listcomp>  s0    OOOSt?3+?+?@@OOOr3   FT)reverser3  r  
num_consts	num_carrylinearunroll_split_transpose)r"   rA   r   r   r/  r  r   r  r  move_binders_to_frontr
   scan_pr  r   )r   r$  r4  r3  r  r5  r6  r7  r8  r9  in_flatr  carryxs	xs_mappedr%  r&  new_in_avalr|   r   r(  checked_jaxpr_r   tomover  new_in_flat
new_linearerr_and_outr  r   s      `                          r1   scan_error_checkrF    s    !:y*ABB&%OOOOBOOO) '..(HO%Ax%A&%A5%ABBYN+)%*2B5@B B B-!Q //88,'55(H O%Ax%A&%A5%ABBYN+ 7~8@!PCN!P !P !P.(A Gc(mm#tfs6{{&::gUc"gg-./&*>6BB-1&181e1b1+2%3x==(2622*
GF-VE

3x==(@9IK K K+ Hk22(#s	c/r3   
cond_jaxpr
body_jaxprc_consts_numr   c                   t          j        |           t          j        |          fd}t          j        |          }| j        d          }t          j        |g ||j                  \  }}	\   \   t          j        |          }
t          j	        |          \  }}t          t          |          }g |||j        }t          |
||g|R  \  }}}|||fS )Nc                 N    t          | g          \  }} | } g ||R  }|S r+   )r"   )c_consts_and_valsc_constsr   r   r|   body_frI  cond_fs        r1   
new_body_fz-checkify_while_body_jaxpr.<locals>.new_body_f:  sC     1L>BBNHd
&$-C3AJr3   )r   jaxpr_as_funr  r   r  r  r  close_jaxprrA   r   r   r/  r  )rG  rH  r$  r   rI  rP  new_body_f_c_consts_avalsr  r|   closed_jaxprr%  r&  r  r   r  rN  rO  s       `           @@r1   checkify_while_body_jaxprrV  4  s+    Z((&Z((&       Z((+&}}5..{ =On =O:D:M=O P P%B&&,'..(H(++(K8KnKz7JK#:NH$E/C$E $E $E %=	-	''r3   r'  c                    | j         }| j        } |                     | j        |d                   }t	          j        ||          S )zAConstructs a checked jaxpr which does not output its error value.N)rN  )r  r  r   rN  r   r  )r  r'  r  r  s       r1   ignore_error_output_jaxprrX  M  sC     <&
+%mmEM.//$BmCC)		)V	,	,,r3   c               N   |j         d         j        rt          d          t          |||g          \  }}}	t	          ||| g||	R  \  } }
t          |||| |          \  }
}
}|                     |          } t          j        |           \  }}t          |||| |          \  }}}
t          |          }dg|z  dg|z  z   dg|z  z   dgt          |	          z  z   }t          j        ||          }g |||	}t          t          |          }t          |||g|R  \  }}
}
t          ||          }dg|z  dg|z  z   dgt          |	          z  z   }t          j        ||          }g |||||	}t!          j        j        |||||z   |d}t'          ||          \  } }| |fS )Nr   zCheckify does not support batched while-loops (checkify-of-vmap-of-while). 
Hint: if possible, move the vmap to the outer level to get vmap-of-checkify-of-while.FT)cond_nconstsrG  body_nconstsrH  )	out_avalsr_   
ValueErrorr"   r4  rV  r   rA   r   r  r  r:  r   r/  r  rX  r
   while_pr  r   )r   r$  rZ  rG  r[  rH  r<  rM  b_constsr=  r|   r  r%  r&  checked_body_jaxpr_body_out_treer'  to_movechecked_body_jaxprcond_in_flatchecked_cond_jaxprcompat_cond_jaxpr_compat_cond_jaxprrC  all_out_valsr   s                             r1   while_loop_error_checkri  U  sE   !" 3
 2 3 3 3
 )<2NOO(HeJQQ5QQQ(%1*j2@%2>@ @!Q 
(
(
7
7%'..(H*C*ne\+C +C'}ax==.W~%(==v$%(-wU';<'/0CWMM/8/h//,_l33,4Z5=N@LN N Na01C^TTGn$v'<<wU?SS'./A7KKD(DXDD8DeD+!:K,9KM M M, m\::*%	r3   c       
           t          j        |           \  }}g ||}t          t          t          |                    }t          |||g|R  \  }}}t          |          }|j        t          |          z
  }t          j	        }g |g|z  |R }g |g|z  |R }g d g|z  |R }g d g|z  |R }g dg|z  |R }t          j        j        |||||||||	|
|d
}t          ||          S )NF)
r  in_shardingsout_shardings
in_layoutsout_layoutsresource_envr	  r7   inlinekeep_unused)rA   r   re   r   r/  r  r  r  r   UNSPECIFIEDr   pjit_pr  r   )r   r$  r  rk  rl  rm  rn  ro  r	  r7   rp  rq  vals_inr%  r&  new_vals_inr  r  r   r|   r'  num_out_error_valsshardingnew_in_shardingsnew_out_shardingsnew_in_layoutsnew_out_layoutsnew_donated_invarsrE  s                                r1   pjit_error_checkr}    sf   
 '..(H%(%W%+34455(6un7? LBJ L  L  L-1 x==.*S-?-??'(BzN2B\BBH
%77H-HH:dVn,:z::.@tf11@K@@/C%>1CNCC #%!'  + 
+	.	..r3   c          	     *   t          j        |           \  }}t          j        t	          j        t          |j        |j        ||                    }	t          |	          \  }	}
t          |j        ||          }t          |          \  }}t          j        j        |	|g||R i |}t          j        |
|          \  }}|r|\  }}t#          ||          \  }}n6t%          |t'          |          g          \  }}t          j        ||          }||fS r+   )rA   r   r  r   r   r   r3  r  r  r  lift_jvpr  rY  r   custom_jvp_call_pr  merge_linear_auxr   r"   r  )in_errr$  r5  jvp_jaxpr_thunkr  r  r  r%  r&  r)  
f_metadatajvpjvp_out_treeall_outsfstout_metadataerr_and_out_treer|   r   r   s                       r1   custom_jvp_call_ruler    sH    '//(H\+Z-=")>8E EF F "G" "J$j/BB#(--#|16<&<)0< < <4:< <()*lCC#| 5&a&'7BBGXX#Hs8}}o>>Hh 844G	(	r3   c                >     t           j         fd            }|S )Nc                    t          t          |           d          \  }}|rJ | z   |         | |z   z   d          }}d |D             } | \  }}}d |D             }	t          j        ||g||	R  }
t	          |
t          |          g          \  }}t          |          fdt          ||          D             }t          d           J | z            }| |z   |z   z            }g ||||S )Nr   c                :    g | ]}t          |          t          u S rH   typer   rb   ts     r1   r  z)lift_jvp.<locals>.jvp.<locals>.<listcomp>  s#    777T!WW$777r3   c                >    g | ]}t          |          t          u|S rH   r  r  s     r1   r  z)lift_jvp.<locals>.jvp.<locals>.<listcomp>  s(    KKKatAwwl/J/J/J/J/Jr3   c                    g | ]I\  }}|r3t          t          j        |                                                    nt	                    JS rH   )r   r   r.  at_least_vspacer  )rb   pznz_out_tangents_s      r1   r  z)lift_jvp.<locals>.jvp.<locals>.<listcomp>  sa     = = =1 5Lq!1!1!A!A!C!CDDD"#344= = =r3   )divmodr  r   
eval_jaxprr"   iterr  r  )r>  nraggedr  tangentszeros	jvp_jaxpr
jvp_consts	out_zerosnonzero_tangentsr   out_primalsnz_out_tangentsout_tangentsprimal_errstangent_errsr  r  r5  num_errss                   @r1   r  zlift_jvp.<locals>.jvp  sn   s2ww""IAv:h.q012a
l86K6L6L3MXG77h777E'6'>$Iz9KK8KKK
/)Z
M'
M<L
M
M
MC#-cC	NN3C#D#D KO,,= = = = #K ; ;= = =L  $''///Z
8 334Ka
l1Z<#889LE[E;EEEEr3   )r  r   )r  r5  r  r  s   ``` r1   r  r    sB    <F F F F F F <F" 
*r3   c          	        t          j        |           \  }	}
|
j        t          j        t          j        t          |j        |j	        ||
                    }t          |          \  }}t          j        fd            }fd}t          |          \  }}t          j        j        |||g|	|R ||d}t          j        ||          \  }}|r|\  }}t!          ||          \  }}n| |}}||fS )Nc                     | d d d         | dd d         }}|d          |d          }} | \  }}|d          }t          j        ||g|R  S )Nr   r   )r   r  )	r   r>  r  	fwd_jaxpr
fwd_constsxs_without_constsfwd_jaxpr_thunkr5  r  s	         r1   checkified_fwdz2custom_vjp_call_jaxpr_rule.<locals>.checkified_fwd  sv     SSqS	41:B899uXYY/B+OU3Iz:;;?9jE3DEEEEr3   c                     g dz   |  R S )Nr+   rH   )r   bwdr  s    r1   rh   z,custom_vjp_call_jaxpr_rule.<locals>.<lambda>  s     7)7CCJ77 r3   )r*  symbolic_zeros)rA   r   r  r  r   r   r   r3  r  r  r  rY  r   custom_vjp_call_pr  r  r   )r  r$  	fun_jaxprr  r5  r  r*  r  r  r%  r&  checkified_funfun_metadatar  bwd_fwd_out_treer  r  r  r  r|   r   r   r  s      ```                 @r1   custom_vjp_call_jaxpr_ruler    sj    '//(H (<+Y_!(.(D DE E. "G" "., <F F F F F F <F 
8	7	7	7	7$!3N!C!C.,16nd%-5%8?% %KT#% % %( ),EE#| )&a&'7BBGXXXG	(	r3   c          	        ~t          ||          }| }t          }|j                                        D ][}|j        |         }	|j        |         }
|j        |         }|j        |v rt          ||	|
i ||          }Gt          ||	|
i ||          }\|                    i |j	        |j	                  }|                    |j	                  }|g fS )Nr\  )
r   r]  r   r   r   r   rY   r   r   r   )r   r$  r&  r  r   r   discharged_errorrecharged_errorr   r   r   rK   s               r1   check_discharge_ruler    s   Xt,,) /o**,, 	3 	3l?<(D?<(D .G.00%&6dB&24 4 %_dD"g%13 3oo &..E9&E*:*DE / G G#,,y7J,KK/ 
2	r3   fCallable[..., Out]errorsfrozenset[ErrorCategory] Callable[..., tuple[Error, Out]]c                :     t           j         fd            }|S )at	  Functionalize `check` calls in `fun`, and optionally add run-time error checks.

  Run-time errors are either user-added :func:`~check` assertions, or
  automatically added checks like NaN checks, depending on the ``errors``
  argument.

  The returned function will return an Error object `err` along with the output
  of the original function. ``err.get()`` will either return ``None`` (if no
  error occurred) or a string containing an error message. This error message
  will correspond to the first error which occurred. ``err.throw()`` will raise
  a ValueError with the error message if an error occurred.

  By default only user-added :func:`~check` assertions are enabled. You can
  enable automatic checks through the ``errors`` argument.

  The automatic check sets which can be enabled, and when an error is generated:
    - ``user_checks``: a :func:`~check` evaluated to False.
    - ``nan_checks``: a floating-point operation generated a NaN value
      as output.
    - ``div_checks``: a division by zero.
    - ``index_checks``: an index was out-of-bounds.

  Multiple categories can be enabled together by passing in an error `Set` (eg.
  ``errors=nan_checks``). Multiple sets can be re-combined (eg.
  ``errors=float_checks|user_checks``)

  Args:
    fun: Callable which can contain user checks (see :func:`~check`).
    errors: A set of ErrorCategory values which defines the set of enabled
      checks. By default only explicit ``checks`` are enabled
      (``user_checks``). You can also for example enable NAN and
      DIV errors by passing the ``float_checks`` set, or for
      example combine multiple sets through set operations
      (``float_checks | user_checks``)
  Returns:
    A function which accepts the same arguments as ``fun`` and returns as output
    a pair where the first element is an ``Error`` value, representing the first
    failed :func:`~check`, and the second element is the original output of
    ``fun``.

  For example:

    >>> import jax
    >>> import jax.numpy as jnp
    >>> from jax.experimental import checkify
    >>>
    >>> @jax.jit
    ... def f(x):
    ...   y = jnp.sin(x)
    ...   return x+y
    >>> err, out = checkify.checkify(f, errors=checkify.float_checks)(jnp.inf)
    >>> err.throw()  # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
      ...
    jax._src.checkify.JaxRuntimeError: nan generated by primitive: sin
  c                     t          j        di f          } fd}t          t          j        |          |          \  }}t          j        |||dd          }t          j        |d|          \  }}}	\   t          j        t          j	        |                    }
t          |
t          g|	R  \  }}|t          j         |            |          fS )NrH   c                       i S r+   rH   )r   r  r   s   r1   rh   z/checkify.<locals>.checked_fun.<locals>.<lambda>j  s    qq$)&)) r3   Fcheckify)rA   tree_structurer   r  r   r  
debug_infor  rR  convert_constvars_jaxprr4  r]  r   )r   r   in_treeclosed_ffun_r   r  jaxpr_r|   r  r  r   out_flatr  r  s   ``           r1   checked_funzcheckify.<locals>.checked_funf  s      "b**G))))))H h!7!7AAND(M(GXujIIE5dBFFFAvrN25f==>>E$UFJHHHHOE8#$XXZZ::::r3   )r   api_boundary)r  r  r  s   `` r1   r  r  +  s;    v ; ; ; ; ; ; 
r3   msgr`   Nonec                *    t          | |dg|R i | dS )a  Check a predicate, add an error with msg if predicate is False.

  This is an effectful operation, and can't be staged (jitted/scanned/...).
  Before staging a function with checks, :func:`~checkify` it!

  Args:
    pred: if False, a FailedCheckError error is added.
    msg: error message if error is added. Can be a format string.
    fmt_args, fmt_kwargs: Positional and keyword formatting arguments for
      `msg`, eg.:
      ``check(.., "check failed on values {} and {named_arg}", x, named_arg=y)``
      Note that these arguments can be traced values allowing you to add
      run-time values to the error message.
      Note that tracking these run-time arrays will increase your memory usage,
      even if no error happens.

  For example:

    >>> import jax
    >>> import jax.numpy as jnp
    >>> from jax.experimental import checkify
    >>> def f(x):
    ...   checkify.check(x>0, "{x} needs to be positive!", x=x)
    ...   return 1/x
    >>> checked_f = checkify.checkify(f)
    >>> err, out = jax.jit(checked_f)(-3.)
    >>> err.throw()  # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
      ...
    jax._src.checkify.JaxRuntimeError: -3. needs to be positive!

  FN_checkr   r  fmt_args
fmt_kwargss       r1   rd  rd  u  s-    B 	sE3H333
33333r3   c           	        t          |           s|rdnd}t          | d|            t          j        ||f          D ]F}t	          |t
          t          j        f          s#t          d|dt          |           d          Gt          t                      |g|R i |}t          t          t          j        |           |          }t          ||           d S )Ndebug_checkrd  z& takes a scalar pred as argument, got zMFormatting arguments to checkify.check need to be PyTrees of arrays, but got z	 of type r   r  )is_scalar_pred	TypeErrorrA   r   r  r    r   ndarrayr  r   r  r   r]  r   r  r   )	r   r  r  r  r  	prim_nameargr   r   s	            r1   r  r    s   			 P!&3GI
yNNNN
O
OO_h
344 7 7ccE2:.// 7 66 6)-c6 6 6 7 7 77 }MhMMM*MM)
j#/$"7"7
C
C%uE""""""r3   Fr  c                   t          t          t          j        | j                                                            rt          |           } t          |           \  }}t          j	        |||dS r  )
r   r   r   r_   r   r   r#  r   r  r  )r   r  err_argstree_defs       r1   r   r     sb    RXu{))++	,	,-- %e$$E#E**(H	x(%	@	@	@@r3   boolc                    t          | t                    p<t          | t                    o'| j        dk    o| j        t          j        d          k    S )NrH   r  )r  r  r    r_   ra   r   )r   s    r1   r  r    sM    
T4
 
  *
T5
!
! *djB&6 *
*	&))
)+r3   c                *    t          | |dg|R i | dS )a  Check a predicate when running under checkify, otherwise is a no-op.

  A `debug_check` will only be run if it is transformed by :func:`~checkify`,
  otherwise the check will be dropped.

  Args:
    pred: if False, a FailedCheckError error is added.
    msg: error message if error is added.
    fmt_args, fmt_kwargs: Positional and keyword formatting arguments for
      `msg`, eg.:
      ``debug_check(.., "check failed on values {} and {named}", x, named=y)``
      Note that these arguments can be traced values allowing you to add
      run-time values to the error message.
      Note that tracking these run-time arrays will increase your memory usage,
      even if no error happens.

  For example:

    >>> import jax
    >>> import jax.numpy as jnp
    >>> from jax.experimental import checkify
    >>> def f(x):
    ...   checkify.debug_check(x!=0, "cannot be zero!")
    ...   return x
    >>> _ = f(0)  # running without checkify means no debug_check is run.
    >>> checked_f = checkify.checkify(f)
    >>> err, out = jax.jit(checked_f)(0)  # running with checkify runs debug_check.
    >>> err.throw()  # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
      ...
    jax._src.checkify.JaxRuntimeError: cannot be zero!

  TNr  r  s       r1   r  r    s-    D 	sD28222z22222r3   c                    t          | t                    s t          dt          |            d          t	          | d           dS )a	  Raise an Exception if ``error`` represents a failure. Functionalized by :func:`~checkify`.

  The semantics of this function are equivalent to:

  >>> def check_error(err: Error) -> None:
  ...   err.throw()  # can raise ValueError

  But unlike that implementation, ``check_error`` can be functionalized using
  the :func:`~checkify` transformation.

  This function is similar to :func:`~check` but with a different signature: whereas
  :func:`~check` takes as arguments a boolean predicate and a new error message
  string, this function takes an ``Error`` value as argument. Both :func:`~check`
  and this function raise a Python Exception on failure (a side-effect), and
  thus cannot be staged out by :func:`~jax.jit`, :func:`~jax.pmap`,
  :func:`~jax.lax.scan`, etc. Both also can
  be functionalized by using :func:`~checkify`.

  But unlike :func:`~check`, this function is like a direct inverse of
  :func:`~checkify`:
  whereas :func:`~checkify` takes as input a function which
  can raise a Python
  Exception and produces a new function without that effect but which produces
  an ``Error`` value as output, this ``check_error`` function can accept an
  ``Error`` value as input and can produce the side-effect of raising an
  Exception. That is, while :func:`~checkify` goes from
  functionalizable Exception
  effect to error value, this ``check_error`` goes from error value to
  functionalizable Exception effect.

  ``check_error`` is useful when you want to turn checks represented by an
  ``Error`` value (produced by functionalizing ``checks`` via
  :func:`~checkify`) back into Python Exceptions.

  Args:
    error: Error to check.

  For example, you might want to functionalize part of your program through
  checkify, stage out your functionalized code through :func:`~jax.jit`, then
  re-inject your error value outside of the :func:`~jax.jit`:

  >>> import jax
  >>> from jax.experimental import checkify
  >>> def f(x):
  ...   checkify.check(x>0, "must be positive!")
  ...   return x
  >>> def with_inner_jit(x):
  ...   checked_f = checkify.checkify(f)
  ...   # a checkified function can be jitted
  ...   error, out = jax.jit(checked_f)(x)
  ...   checkify.check_error(error)
  ...   return out
  >>> _ = with_inner_jit(1)  # no failed check
  >>> with_inner_jit(-1)  # doctest: +IGNORE_EXCEPTION_DETAIL
  Traceback (most recent call last):
    ...
  jax._src.JaxRuntimeError: must be positive!
  >>> # can re-checkify
  >>> error, _ = checkify.checkify(with_inner_jit)(-1)
  z1check_error takes an Error as argument, got type z	 instead.Fr  N)r  r   r  r  r   )r   s    r1   check_errorr    s_    z 
E5	!	! 9
 8!%e8 8 8 9 9 9uE""""""r3   )r   r   r   r   r   r(   rL   r   )
r  r  r   r   r   r  r  r   rL   r  )r  r0  r   r   rL   r1  )
r  r5  r  r6  r&  r7  r   r  rL   r8  )r   r   )rL   re  )r  r0  r&  r7  rL   r  )
rG  r0  rH  r0  r   r   rI  r   rL   r  )r'  r   )r  r  r  r  rL   r  )r   r   r  r`   rL   r  )rL   r  )r   r   rL   r  )
__future__r   collections.abcr   r   r   r   	itertoolsittypingr   r   r   numpyr   	jax.numpyr   jaxr	   r
   jax._srcr   r   r  r   r   r   r   r   r   r   r   r   rA   jax._src.ad_utilr   jax._src.api_utilr   jax._src.interpretersr   r   r   r   r  jax._src.tree_utilr   r   r   jax._src.typingr    jax._src.utilr!   r"   r#   r$   r%   r&   r'   register_exclusion__file__r   
unsafe_mapr  
unsafe_zipr  r   r   Intr  ErrorCategoryr   r  Payloadr7  r)   r2   r9   	Exceptionr(   total_ordering	dataclassEffectrM   control_flow_allowed_effectsadd_typelowerable_effectsrn   rt   r   r   r   rB   r   r]  count__next__r   r   r   transformation_with_auxr  r+  r/  r4  r3  r!  rY  r#  	Primitiver  rM  rz  pp_eqn_rulesr]  r|  def_implr  def_effectful_abstract_evalr  r  r  r  r  register_loweringr  primitive_batchersr  primitive_jvpsErrorCheckRulerH  rl   r  r  r  acos_pacosh_padd_pasin_pasinh_patan2_patan_patanh_pbessel_i0e_pbessel_i1e_pcbrt_pconv_general_dilated_pcos_pcosh_pcumlogsumexp_pcummax_pcummin_p	cumprod_pcumsum_p	digamma_pdot_general_p	erf_inv_perf_perfc_pexp_pexpm1_pfft_pigamma_grad_a_pigamma_p	igammac_pinteger_pow_plgamma_plinear_solve_plog1p_plog_p
logistic_pmul_ppad_ppow_ppsum_prandom_gamma_grad_preduce_preduce_prod_preduce_sum_preduce_window_preduce_window_sum_pregularized_incomplete_beta_prem_prng_uniform_prsqrt_psin_psinh_psqrt_psub_ptan_ptanh_pnan_primitives_primr   r  r  r  r  r  r  r  r  r  r	  r  	scatter_pscatter_add_pscatter_mul_pscatter_min_pscatter_max_pr  r/  r%  rF  r;  rV  rX  ri  r^  r}  rs  r  r  r  r  custom_vjp_call_jaxpr_pr  	frozensetuser_checks
nan_checksindex_checks
div_checksfloat_checksautomatic_checks
all_checksr  rd  r  r   r  r  r  rH   r3   r1   <module>rY     s   # " " " " " " . . . . . . . .             & & & & & & & & & &                             & & & & & &             ' ' ' ' ' '             # # # # # # % % % % % % # # # # # # % % % % % % ) ) ) ) ) ) ) ) ) ) ) ) $ $ $ $ $ $ * * * * * * & & & & & & 4 4 4 4 4 4 + + + + + + ' ' ' ' ' ' - - - - - - ! ! ! ! ! !G G G G G G G G G G G G G G G G G G $  #H - - - ! !( + + +CZCZT5[CJ^$
uRZ&'
(M	genn  
      9   . $t,,,* * * * *'. * * -, *  $ - -k : : :   " "; / / /0 0 0 0 0, 0 0 07 7 7 7 7| 7 7 7&K K K K K| K K K0E E E E E| E E E6 
? 
? 
? 
? 
?< 
? 
? 
? d###]. ]. ]. ]. ]. ]. ]. $#  ].~ U2r2r""
BHQKK 	Y Y Y Y	N 	N 	N 6 6 6
0 0 0 0d2 2 2I I I I$- $- $- $-LM M M
   
     $.
!
! 
> 
> 
> 
> ' '     j    	   	$> > %$>
 %*$          
  
  w ? %' ' ' '  w 3 %' ' ' '  w 3 %' ' ' '   (; G $   , '  57 7 7 7 7. . .  
L L LL#* Lck L39 Lcj L#+ L+L"zL+.;L8;8HL"L$'JL030JL )L !ZL *-);L >A\L ,	L !$	L 03|	L >A]	L
 #L
 &)]L
 58IL
 @CzL )L ![L +.)L 695HL ,L !$L 03/@L CF,L $L '*kL 479L ?BnL )L !YL ),	L 47:L )L ,/<L :=9JL "L %($7L )L ,/+LL )L !.L 14L >AYL *L "jL +.)L 69YL AD
L   B BE)	)/5AA,u   %>S  !   ,LS' (  0 0S\ A A A *SY   $ $ $2  $ 0i/0CS]SSS] "3)"34G474E#G #GS "3)"34G474E#G #GS "3)"34G474E#G #GS "3)"34G474E#G #GS 
 0 0 0 07 7 7 7< ,SZ   @ ,SZ ( ( ( (2 - - - -( ( (R 3S[ #/ #/ #/H -T[   < 6J1 2  *  @ <V7 8  4 -W 
 i)*++Yz""
y($$Y+,--
J&,. +
 1<H H H H HT!4 !4 !4 !4F# # # "' A A A A A+ + + +"3 "3 "3 "3J@# @# @# @# @# @#r3   