
    Whu                       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/m0Z0 d dl/m1Z1 d dl/m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<  e!j=        e>            e"j=        e>           e8e?cZ?Z@e9eAcZAZBeeCe4f         ZDeeEe4f         ZFeGd         ZHeIeejJ        e4f                  ZKe$jL        ZL e
d           ZMd! ZNd" ZO G d# deP          ZQejR         ejS        d$d$%           G d& d'ejT                                          ZUejV        W                    eU           ejX        W                    eU            G d( d)eQ          ZY G d* d+eQ          ZZ G d, d-eQ          Z[ G d. d/eQ          Z\ejS         G d0 d1eQ                      Z]e$j^         ejS        d$2           G d3 d4                                  Z_ e_i i i i           Z` eja        d5          jb        Zcdd;Zdd< Zeejf        d=             ZgddEZhddIZiddQZjdR Zkejf        dS             ZlddTZm ejn        dU          Zod$eo_p        ddWZqeqejr        eo<    G dX dYes          Zteoju        dZ             Zveojw        d[             Zx esd\          Zyd] Zzd^ Z{d_ Z| e,j}        eoe{d`a            e,j}        eoezdba            e,j}        eoezdca           dd Z~e~e+j        eo<   de Zee*j        eo<   eZi Zdfedg<   dh Zdi Zdj 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<   dk Zeeej        <   dl Zeeej        <   dm Zeeej        <   dn Zeeej        <   do Zdp Zdq 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        <   e;dds            ZddtZeeej        <   du Zeeej        <   ddzZe;dd|            Zd} Zeeej        <   d~ Zeeej        <   d Zeeej        <   d Zeeej        <   d Zeeej        <   d Zd Zeeej        <   d Zeeeo<    ee\h          Z eeZh          Z ee[h          Z eeYh          Zeez  Zeez  Zeez  ZefddZddddZd ZdddZddZddZddZdS )    )annotations)CallableSequenceN)TypeVarAnyUnion)dtypes)lax)	shard_map)api)ad_checkpoint)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      W/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/jax/_src/checkify.pypopattrr3   E   s&    X#	#x	*    c                n    t                      }t          | ||          |u sJ t          | ||           d S r,   )objectr-   setattr)r/   namer1   sentinels       r2   
setnewattrr:   J   s@    XX(	dH	%	%	1	1	1	1	#tSr4   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     r2   __init__zJaxException.__init__T   s    (Dr4   c                .    t          j        |            d S r,   )jturegister_pytree_node_class)clss    r2   __init_subclass__zJaxException.__init_subclass__Y   s    "3'''''r4   c                    g | j         fS r,   r=   r?   s    r2   r   zJaxException.tree_flatten\   s    #$$r4   c                    ~ | |          S r,    rD   metadatapayloads      r2   r    zJaxException.tree_unflatten_   s    3x==r4   returnErrorEffectc                    t           r,   )NotImplementedErrorrG   s    r2   get_effect_typezJaxException.get_effect_typed   s    
r4   N)rM   rN   )
__name__
__module____qualname____doc__r@   rE   r   classmethodr    rQ   rI   r4   r2   r)   r)   Q   sv        SS) ) )
( ( (% % %   ;     r4   T)eqfrozenc                  ,    e Zd ZU ded<   ded<   ddZdS )	rN   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     r2   	<genexpr>z7ErrorEffect.__lt__.<locals>.<lambda>.<locals>.<genexpr>o   sE       #= #=') %'Hc"(mm#< #= #= #= #= #= #=r4   )tupler[   xs    r2   <lambda>z$ErrorEffect.__lt__.<locals>.<lambda>o   s.    U #= #=-.^#= #= #= = = r4   c                B    t          | j                   |           fS r,   )ra   rZ   )rh   r[   s    r2   ri   z$ErrorEffect.__lt__.<locals>.<lambda>q   s    AL))<<??; r4   rI   )r?   r\   unpackr[   s      @r2   __lt__zErrorEffect.__lt__n   s8    = =L;;;;FF4LL66%==()r4   N)r\   rN   )rR   rS   rT   __annotations__rl   rI   r4   r2   rN   rN   h   sD          !   0000* * * * * *r4   rN   c                      e Zd Zd Zd ZdS )DivisionByZeroErrorc                    dS )Nzdivision by zerorI   rG   s    r2   __str__zDivisionByZeroError.__str__y   s    r4   c                ,    t          t          d          S NrI   )rN   ro   rG   s    r2   rQ   z#DivisionByZeroError.get_effect_type|   s    *B///r4   N)rR   rS   rT   rq   rQ   rI   r4   r2   ro   ro   w   s2          0 0 0 0 0r4   ro   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      r2   r@   zNaNError.__init__   s&    	GG^$$$DIIIr4   c                "    g | j         | j        ffS r,   )r>   rx   rG   s    r2   r   zNaNError.tree_flatten   s    $di011r4   c                     | | S r,   rI   )rD   rK   _s      r2   r    zNaNError.tree_unflatten   s    3>r4   c                ,    t          t          d          S rs   )rN   ru   rG   s    r2   rQ   zNaNError.get_effect_type   s    x$$$r4   c                    d| j          dS )Nznan generated by primitive: .)rx   rG   s    r2   rq   zNaNError.__str__   s    6$)6666r4   )
rR   rS   rT   r@   r   rV   r    rQ   rq   __classcell__rz   s   @r2   ru   ru      s            2 2 2   ;% % %7 7 7 7 7 7 7r4   ru   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,   )rw   r@   rx   operand_shape_payload)r?   r>   ry   r   rL   rz   s        r2   r@   zOOBError.__init__   s5    	GG^$$$DI&DDMMMr4   c                :    | j         g| j        | j        | j        ffS r,   )r   r>   rx   r   rG   s    r2   r   zOOBError.tree_flatten   s     ]Od149d>PQRRr4   c                "     | g ||d         R  S Nr   rI   rJ   s      r2   r    zOOBError.tree_unflatten   s!    3%%'!*%%%%r4   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   rG   s    r2   rq   zOOBError.__str__   sl    A'A A]1%A A }QA A -1M!,<A A A Br4   c                h    t          t          t          j        dt          j                  f          S )N)   )rN   r   r   ShapeDtypeStructjnpint32rG   s    r2   rQ   zOOBError.get_effect_type   s$    x#"6tSY"G"G!IJJJr4   
rR   rS   rT   r@   r   rV   r    rq   rQ   r   r   s   @r2   r   r      s            S S S & & ;&B B BK K K K K K Kr4   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,   )rw   r@   
fmt_stringargskwargs)r?   r>   r   akrz   s        r2   r@   zFailedCheckError.__init__   s4    	GG^$$$ DODIDKKKr4   c                :    | j         | j        f| j        | j        ffS r,   )r   r   r>   r   rG   s    r2   r   zFailedCheckError.tree_flatten   s%    Y$ $/24 4r4   c                &    |\  }} | g ||R i |S r,   rI   )rD   rK   rL   r   r   s        r2   r    zFailedCheckError.tree_unflatten   s.    LD&3**4***6***r4   c                @     | j         j        | j        i | j        dz   S )Nz (`check` failed))r   formatr   r   rG   s    r2   rq   zFailedCheckError.__str__   s*    "DO"DI===!" #r4   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`   rb   )rc   rh   s     r2   re   z3FailedCheckError.get_effect_type.<locals>.<genexpr>   s3      CCc"17AG44CCCCCCr4   )rB   tree_leavesr   r   rN   r   rf   )r?   valss     r2   rQ   z FailedCheckError.get_effect_type   sL    ?DIt{344DCCdCCCCCE E Er4   r   r   s   @r2   r   r      s            4 4 4 + + ;+# # #E E E E E E Er4   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>   rw   r@   )r?   r>   rz   s     r2   __post_init__zBatchedError.__post_init__   sE    $,335566q9HN	GG^$$$$$r4   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mapra   )rc   idxes      r2   re   z'BatchedError.__str__.<locals>.<genexpr>   s_       ? ?a H		#c3--(@(@GGAGG ? ? ? ? ? ?r4   )r   r   itemsrG   s    r2   rq   zBatchedError.__str__   sC    99 ? ?#'#5#;#;#=#=? ? ? ? ? ?r4   )rR   rS   rT   rm   r   rq   r   r   s   @r2   r   r      sU         4444% % % % %
? ? ? ? ? ? ?r4   r   )rX   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   rM   
str | Nonec                P    |                                  }|t          |          S dS )zCReturns error message if error happened, None if no error happened.N)get_exceptionra   )r?   exps     r2   getz	Error.get   s(    




C
XXo4r4   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        r2   r   zError.get_exception   s    
3rx**,,--.. 9((***hj $
 0 0 2 2 & &
,:l# 	&H%J		dnS]];"mJ79 9 	94r4   c                $    t          |            d S r,   )_check_errorrG   s    r2   throwzError.throw   s    r4   c                2    d|                                   dS )NzError())r   rG   s    r2   rq   zError.__str__   s    !DHHJJ!!!!r4   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,   rI   )rh   is     r2   ri   z.Error._get_batched_exception.<locals>.<lambda>  s
    AaD r4   )r   r`   r   r   r   ndindexr   r   r   r   r    r   r   r   )
r?   r`   r   r   r   r   r   r   rL   	jax_errors
             r2   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 -(((Tr4   effect_typerN   c                    i | j         ||i}i | j        ||i}i | j        ||i}i | j        |}	t	          |||	|          S r,   )r   r   r   r   r   )
r?   r   predr   rK   rL   new_errs	new_codesnew_payloadnew_metadatas
             r2   _updatezError._update  si    4$*4d 34H54:5+t!45I=T]={G&<=K1dn11L9lK@@@r4   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`   rb   )r   s    r2   ri   z0Error._add_placeholder_effects.<locals>.<lambda>#  s    sx99 r4   )
r   copyr   r   keysr   r   r[   r   r   )r?   r   new_errnew_coder   effects         r2   _add_placeholder_effectszError._add_placeholder_effects  s    jooGz  H-$$&&K  	tz((	(	("996;NOOQ QF (DNK@@@r4   c                ,    t          j        | g|R i |S r,   )dataclassesreplace)r?   r   r   s      r2   _replacezError._replace)  s#    t5d555f555r4   c                8    | j         | j        | j        f| j        fS r,   )r   r   r   r   rG   s    r2   r   zError.tree_flatten.  s    ZT]3dnFFr4   c                *    |\  }}} | ||||          S r,   rI   )rD   rK   datar   r   rL   s         r2   r    zError.tree_unflatten1  s$    D$3tT8W---r4   N)rM   r   )rM   r   )rM   r   )r   rN   )r   r   )rR   rS   rT   rm   r   r   r   rq   r   r   r   r   r   rV   r    rI   r4   r2   r   r      s         !   !!!!&&&&      $  " " "
   *A A A AA A A A6 6 6
G G G . . ;. . .r4   r   r   errorr   Bool	new_errorrM   c                    t                      }|                                }t          |          \  }}t          | ||||i||          S r,   )	next_coderQ   r   update_error)r   r   r   r   r   r   r   s          r2   assert_funcr   9  sK    	$))+++*955+|	eT4$)={K	X	XXr4   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   rK   rL   r   err_of_typeout_errout_codecur_payloadout_payloads              r2   r   r   ?  s    U33+$'ZU[__["%E%EtLL("";55+9,SZEE{T[\\KKK	{GXx	M	MMr4   c                     | | \  }}t          j        ||f          \  }}|                    |t          |j                                                  f           |S r,   )rB   r   storesetr   r   )fr   invalsr   outout_valsout_trees          r2   %_flatten_and_get_error_metadata_thunkr  M  s\    q&z*%'55(H++xU[--//001222	/r4   	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  rI   c              3  4   K   | ]}t          |          V  d S r,   )r(   rc   cs     r2   re   z(default_checkify_rule.<locals>.<genexpr>j  s*      55/!$$555555r4   out_axes)closurec                 b                 d         j         t                    z
  } g d| z  R S )Nr   r   )
num_leaveslen)out_err_numrK   out_val_axess    r2   out_axes_thunkz-default_checkify_rule.<locals>.out_axes_thunku  s:    HJJqM,s</@/@@k/tK/,///r4   r,   in_axes)r  r  )bindrB   r   r  dictpop
isinstancer   ClosedJaxprjaxprconstsrf   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  rK   r  s                     @@r2   default_checkify_ruler.  T  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	r4   r  core.ClosedJaxprtuple[Error, list[core.Value]]c                h    t          j        |          \  }}t          | j        | j        ||g||R  S r,   )rB   r   checkify_jaxpr_flatr  r   )r  r'  r   r   r(  r)  s         r2   checkify_jaxprr3    sQ    '..(H	U[%,+X
I8@
ICG
I 
I 
I Ir4   
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   Literalr1   )r9  envs    r2   read_envz%checkify_jaxpr_flat.<locals>.read_env  s'    #t|$$ Wns8Or4   core.Varr1   r   c                    || <   d S r,   rI   )r9  r1   r=  s     r2   	write_envz&checkify_jaxpr_flat.<locals>.write_env  s    CHHHr4   )
name_stackr   )r9  r:  )r9  r?  r1   r   )r#   r  rB   r    r   	last_usedr   	constvarsinvarseqnserror_checksr   r  r   r   r.  r   current_name_stacksource_inforB  user_context	tracebackr  multiple_resultsoutvarsclean_up_dead_vars)r  r   r'  r)  r   r(  in_argsr   rC  r>  rA  eqnr   checkify_rulerB  outvalsr=  s                   @r2   r2  r2    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,   rg   r  s     r2   re   z/checkify_jaxpr_flat_hashable.<locals>.<genexpr>  s$      ........r4   )rf   r2  )r  hashable_constsr'  r)  r   r   s         r2   r$  r$    s:    ..o.....&	UFNH	Lt	L	L	LLr4   c                ^     | | }t          |          \  }}|                    |           |S r,   )r   r   )r   r   r   ansr  s        r2   flatten_fun_outputrX    s5    	4#s##-#x++h	*r4   c                j   t           }| j                                        D ]v}| j        |         | j        |         | j        |         }}}t          j        |          d         }t          |fd|||f          \  }}}	|                    |||i |	          }w|	                    | j
                  }|S )Nr   c                    | |         S r,   rI   )rh   r   s     r2   ri   z#_reduce_any_error.<locals>.<lambda>  s
    af r4   r   )
init_errorr   r   r   r   r   argsortr   r   r   r   )
r   	out_errorr   errscodespayloadsreduced_idxr   r   rL   s
             r2   r&  r&    s    )k&&(( I Il"[6"[6"^L9 %D +d##B'K"#D#D#D$(%#:< <D$!!,dBHHII  5? ;;)	r4   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)  NrI   )rc   r   vs      r2   re   z_pp_check.<locals>.<genexpr>  s;       . .Va*__ a&,___. .r4   )
annotation  )rI  r   	summarizerB  sortedr  r   r   pptextr  r8   pp_kv_pairspp_varsrE  concat)rP  contextsettingsrj  name_stack_annotationtrimmed_paramsrhss          r2   	_pp_checkry    s   '2 *3?;;;-1  '1<<s9<<<<7;  . .sz/?/?/A/A . . . . ..	cm(5J	K	K		.'8	<	<	c		T\#*g>>	>	@# 
b*55<<	=	==r4   c                      e Zd ZdS )JaxRuntimeErrorN)rR   rS   rT   rI   r4   r2   r{  r{    s        $r4   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{  ra   )r)  debugr   r   excfiltered_tbs         r2   
check_implr    s    
 I
4
(
(%# - 1..002 2K{###
#c((
#
#,	)r4   c                p    ~g t          t          | |          j                                                  fS r,   )r   r    r   r   )r)  r  r   s      r2   check_abstract_evalr    s1    	S$//5::<<==	==r4   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         r2   check_lowering_ruler     s|    
 I		"	( "
!!*	I%j(;;&&&&  ,&!Q 
-r4   c                    | rg S t           r,   )r  )r  r   r   s      r2   check_lowering_rule_unsupportedr    s    
 Ir4   c                D    t          | |          }t          |           g S r,   )r    r   )r)  r   r   s      r2   r  r    s$    
4
(
(%u	)r4   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`   )rc   rh   dims      r2   re   z&check_batching_rule.<locals>.<genexpr>"  sE       1 1vq#H/// gcl////1 1r4   c              3  J   K   | ]\  }}t          j        ||          V  d S r,   )r   bdim_at_front)rc   r   dsizes      r2   re   z&check_batching_rule.<locals>.<genexpr>$  sJ       = =a (At44 = = = = = =r4   r  )nextzipr    r   )batched_args
batch_dimsr)  r  errr  s        @r2   check_batching_ruler  !  s    	 1 1\:)F)F 1 1 1 
1 
1$= = = =!,
;;= = =,x..#s%    	R-r4   c               .    t          j        | ||d g g fS N)r)  r  )check_pr  )primalsr}   r)  r  s       r2   check_jvp_ruler  +  s"    	,(%8888	R-r4   z$dict[core.Primitive, ErrorCheckRule]rG  c                 2    t          j                    j        S r,   )r   currentrK  rI   r4   r2   get_tracebackr  7  s    		!	#	#	--r4   c                H     | j         |i |}t          | |||          }||fS r,   )r  
check_nans)rx   r   r'  in_valsr  r  r  s          r2   nan_error_checkr  :  s4    	7%f%%#444#	c/r4   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   
issubdtyperb   r	   prng_keyr   isnanrg   s    r2   r  zcheck_nans.<locals>.isnanC  s7    
~agv// U739Q<<   r4   c                &    g | ]} |          S rI   rI   )rc   rh   r  s     r2   
<listcomp>zcheck_nans.<locals>.<listcomp>H  s!     7 7 7aq 7 7 7r4   )ru   rL  r   r   arrayr   r  r8   )rx   r   r'  r  any_nansr  s        @r2   r  r  ?  s    ^##L! ! ! &7cgci 7 7 7 73 7 7 788999,1E#JJ 	UHh}	&J&J	K	KKr4   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_maskrL   s	            r2   dynamic_slice_error_checkr  b  s     R=RRRkRR#^###:'-((,%%+)M**-aMK$?,$NO(-w|1D1DgmTT'
eSWX../[b[hjq0r0r
s
s%	r4   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  rL   s
             r2    dynamic_update_slice_error_checkr  r  s    "'H-HHH#^###:'-((,&&+)M**-aMK$?,$NO(-w|1D1DgmTT'
eSWX..J`biboqx0y0y
z
z%	r4   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_dimsrf   r  astyperb   r  r   r   r  )r   r'  r  r  r  r  r  r  r  r  r  dnumsr  num_batch_dimsupper_boundr  rL   s                    r2   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%	r4   c                    t           |v rQt          j        t          j        |d                    }t	          | |t          t                                          } t          t          j        | |||          S )z$Checks for division by zero and NaN.r   )	ro   r   r   equalr   r  r  r
   div_p)r   r'  rh   yany_zeros        r2   div_error_checkr    s\    N**wsyA''Hx)<]__)M)MNNE	E>1a	@	@@r4   c                t   t          j        t          j        |                     }t          j        ||j                  }t          j        |          |d                  }t          j        |          |         }t          j        |          |         }t          j        |||gt           j                  }	|	S )Nr   )rb   )r   argminlogical_notunravel_indexr`   r  ravelr   )
r  indicesdims_mapr   flat_idx	multi_idxoob_axisoob_axis_size	oob_indexrL   s
             r2   r  r    s    Z1122('-88)Yx  2/()M**84-i  *)Iy(M:#)LLL'	.r4   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 rI   )r`   )rc   r   r  r  s     r2   r  zscatter_oob.<locals>.<listcomp>  s?     G G G "-*[^; G G Gr4   )r  r  r`   inserted_window_dimsappendupdate_window_dimsr   r  scatter_dims_to_operand_dimsint64minimumiinforb   maxr
   broadcast_in_dimr   lessgreaterr  
logical_orr  r   )r  r  updatesr  posr   r  	lower_oob	upper_oobr  rL   r  s   `          @r2   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	##r4   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  r8   r`   r   r  )rx   r   r'  r  r  r  r
  r  r  r  r  r  r  out_of_boundsrL   	oob_errors                   r2   scatter_error_checkr    s     			wl!5F+N	 	 	 	# ^###:&wBSTT-}	7='JJ)
e]I
6
6%
T5.#
6
6%	r4   4tuple[core.ClosedJaxpr, PyTreeDef, set[ErrorEffect]]c                    t          j        t          | j        | j        ||          }t          j        |          }t          |          \  }}t          j	        ||          \  }}}	\   t          j        ||	          }
 |            \  }}|
||fS r,   )r   r   r2  r  r   r!  r#  r  petrace_to_jaxpr_dynamicr   r  )r  r'  r)  flat_err_and_in_valscheckify_jaxpr_partialfunrK   	new_jaxprr}   r   checked_jaxprr  error_effectss                r2   jaxpr_to_checkify_jaxprr    s     %,-@%+-2\>-57 7 	+,,#7<<-#x6s<PQQ)Q"9f55-$HJJ(M	-	//r4   c                  t          j        |           \  }t          t          j        g ||          fdfd|D             }|                      t                      j        |           }t          j        |          \  }t          t          j        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      r2   get_error_effects_from_jaxprz6cond_error_check.<locals>.get_error_effects_from_jaxpr  s0    +D.( 7-57 7 7MAq'Nr4   c                &    g | ]} |          S rI   rI   )rc   r  r  s     r2   r  z$cond_error_check.<locals>.<listcomp>  s%    EEED))$//EEEr4   c              3  6   K   | ]}t          |gR  V  d S r,   r  )rc   r  r'  r)  r  s     r2   re   z#cond_error_check.<locals>.<genexpr>  s]       &K &K9= 
5+35 5 5&K &K &K &K &K &Kr4   branchesr   r   r[  )rB   r   r   r   get_avalr   r   unionr&   r
   cond_pr  rf   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    `               @@@r2   cond_error_checkr/    s    '..(H 1( 1S 122(       FEEEHEEE'//W0EFF,'55(H  1( 1S 122(% &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6r4   c               j   t          |
||g          \  }}}fd|D             }t          j        |           \  }}t          t          j        g |||          |z   }t          |||g|R  \  }}}|                     |          }t          j        |          \  }}t          t          j        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           	     `    g | ]*}t          j        d t          j        |                    +S r  )r   mapped_avalr#  )rc   r1   lengths     r2   r  z$scan_error_check.<locals>.<listcomp>  s2    MMM3t4=+=+=>>MMMr4   FT)reverser3  r  
num_consts	num_carrylinearunroll_split_transpose)r#   rB   r   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      `                          r2   scan_error_checkrF    s    !:y*ABB&%MMMM"MMM) '..(HDM#?X#?#?#?@@9L+)%*2B5@B B B-!Q //88,'55(H DM#?X#?#?#?@@9L+ 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/r4   
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           j        |          }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        r2   
new_body_fz-checkify_while_body_jaxpr.<locals>.new_body_f<  sC     1L>BBNHd
&$-C3AJr4   )r   jaxpr_as_funr!  r#  r  r  r  close_jaxprrB   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       `           @@r2   checkify_while_body_jaxprrV  6  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 %=	-	''r4   r*  c                    | j         }| j        } |                     | j        |d                   }t	          j        ||          S )zAConstructs a checked jaxpr which does not output its error value.N)rM  )r   r  r   rM  r   r  )r  r*  r   r  s       r2   ignore_error_output_jaxprrX  O  sC     <&
+%mmEM.//$BmCC)		)V	,	,,r4   c               X   |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          j        |          }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#   r3  rV  r   rB   r   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                             r2   while_loop_error_checkri  W  sG   !" 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//,T]L11,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\::*%	r4   c                  t          j        |           \  }}g ||}t          t          t          j        |                    }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  r8   inlinekeep_unusedcompiler_options_kvs)rB   r   rf   r   r   r#  r  r  r  r   UNSPECIFIEDr   pjit_pr  r    )r   r'  r  rk  rl  rm  rn  ro  r  r8   rp  rq  rr  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                                 r2   pjit_error_checkr~    sk    '..(H%(%W%+3t}k2233(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 #%!'/  + 
+	.	..r4   c               D   t          j        |           \  }}g ||}t          t          t          j        |                    }t          t          j        |          ||g|R  \  }	}
}|	j	        |	j
        c}\   t          j        j        |d|i|}t          |
|          S )Nr  )rB   r   rf   r   r   r#  r  r  rR  r  r   r   remat_pr  r    )r   r'  r  ru  r  r(  r)  rv  r  rA  r  r}   r  rE  s                 r2   remat_error_checkr    s    '..(H%(%W%+3t}k2233( 7nU^X!B8@!B !B !B.(A$*N,A-%*K 5} 5-35 5+	+	.	..r4   c               z   |                     d          x}t          d          t          j        |           \  }}	t	          |          }
g i g|
z  |R }g ||}t          t          t          j        |                    }t          |          D ]h\  }}t          j
                             t          |                    x}st          dt          |                      ||||         |          ||<   it          j        |j                                                  5  t          t!          j        |          ||	g|R  \  }}d d d            n# 1 swxY w Y   |j        t	          |          z
  t&          j        fd            }t          j        |j                                                  5  t!          j        |j                  \  }}}\   d d d            n# 1 swxY w Y   t          j        ||          g d|j        igz  |R }t'          j        t'          j        t          j                  j        j                  }t;          dj        ||d|}t<          j                             |          \  }}t=          j        j!        |g|R i |}tE          ||          S )Nmeshz2Mesh must be provided for shard_map with checkify.zUnsupported aval type: c                     t          j        j        j        g| R  }t	          |g          \  }}d |D             }g ||R S )Nc                :    g | ]}t          j        |d g          S r  )r
   r  )rc   r   s     r2   r  zLshard_map_error_check.<locals>.expand_errors_leading_dim.<locals>.<listcomp>  s&    222COAs##222r4   )r   
eval_jaxprr  r   r#   )r>  outsr_  r  rw  s      r2   expand_errors_leading_dimz8shard_map_error_check.<locals>.expand_errors_leading_dim  s\    ?=.0DJrJJJDD#5"677JD$22T222DD<4<<r4   r   )r  in_names	out_namesrI   )#r   r]  rB   r   r  r   r   r   r#  	enumerateshard_aval_handlerstypeextend_axis_env_ndr`   r   r  r  rR  r  r!  r#  r  r  r  
axis_namesr"  r  r  r   r  r   shard_map_pget_bind_paramsr  r    )r   r'  r  r  r  ru  r   r  r(  r)  r*  new_in_namesrv  r  r   ri  sharderr  r}   r  r   new_out_namessubfun
new_paramsrE  r  rw  s                            @@r2   shard_map_error_checkr    sk    jj   d)
I
J
JJ'..(Hx==.6RD>)6X66,%(%W%+#dm[1122(!! 4 4da/33DGG<<<G <:a::;;;'$Q33HQKKtz//1122  !8
u~x":B" " "M8Q              
  *S^^;<     < tz//1122  4!=#9 E1fb               "5&11- Oq$/*+.@@NINN-l4?##]%8-:N &    		 * '77
CC-!Z%*6NKNNN:NN+	+	.	..s$   *&EE #E !G..G25G2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,   )rB   r   r!  r#  r   r   r2  r  r   r  lift_jvpr  rX  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                       r2   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	(	r4   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 rI   r  r   rc   ts     r2   r  z)lift_jvp.<locals>.jvp.<locals>.<listcomp>  s#    777T!WW$777r4   c                >    g | ]}t          |          t          u|S rI   r  r  s     r2   r  z)lift_jvp.<locals>.jvp.<locals>.<listcomp>  s(    KKKatAwwl/J/J/J/J/Jr4   c                    g | ]I\  }}|r3t          t          j        |                                                    nt	                    JS rI   )r   r   r#  to_tangent_avalr  )rc   pznz_out_tangents_s      r2   r  z)lift_jvp.<locals>.jvp.<locals>.<listcomp>   sa     = = =1 5Lq!1!1!A!A!C!CDDD"#344= = =r4   )divmodr  r   r  r#   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                   @r2   r  zlift_jvp.<locals>.jvp  sm   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Er4   )r!  r#  )r  r5  r  r  s   ``` r2   r  r    sB    <F F F F F F <F" 
*r4   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	         r2   checkified_fwdz2custom_vjp_call_jaxpr_rule.<locals>.checkified_fwd4  sv     SSqS	41:B899uXYY/B+OU3Iz:;;?9jE3DEEEEr4   c                     g dz   |  R S )Nr,   rI   )r   bwdr  s    r2   ri   z,custom_vjp_call_jaxpr_rule.<locals>.<lambda>=  s     7)7CCJ77 r4   )r*  symbolic_zeros)rB   r   r  r!  r#  r   r   r2  r  r   r  rX  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      ```                 @r2   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	(	r4   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   rZ   r   r   r   )r   r'  r)  r  r   r   discharged_errorrecharged_errorr   r   r   rL   s               r2   check_discharge_ruler  L  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	r4   r   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 )NrI   c                       i S r,   rI   )r   r   r   s   r2   ri   z/checkify.<locals>.checked_fun.<locals>.<lambda>  s    qq$)&)) r4   Fcheckify)rB   tree_structurer   r!  r#  r  
debug_infor  rR  convert_constvars_jaxprr3  r\  r    )r   r   in_treeclosed_ffun_r  r  jaxpr_r}   r   r  r   out_flatr  r   s   ``           r2   checked_funzcheckify.<locals>.checked_fun  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::::r4   )r   api_boundary)r   r  r  s   `` r2   r  r  t  s;    v ; ; ; ; ; ; 
r4   Fr  msgra   r  boolNonec               *    t          | ||g|R i | dS )an  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.
    debug: Whether to turn on debugging mode. If True, check will be removed
      during execution. If False, the the check must be functionalized using
      checkify.checkify.
    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!

  N_check)r   r  r  fmt_args
fmt_kwargss        r2   rc  rc    s-    P 	sE3H333
33333r4   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_checkrc  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	TypeErrorrB   r   r  r!   r   ndarrayr  r   r  r   r\  r   r  r   )	r   r  r  r  r  	prim_nameargr   r   s	            r2   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""""""r4   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       r2   r   r     sb    RXu{))++	,	,-- %e$$E#E**(H	x(%	@	@	@@r4   c                    t          | t                    p<t          | t                    o'| j        dk    o| j        t          j        d          k    S )NrI   r  )r  r  r!   r`   rb   r   )r   s    r2   r  r    sM    
T4
 
  *
T5
!
! *djB&6 *
*	&))
)+r4   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   r  r  r  s       r2   r  r    s-    D 	sD28222z22222r4   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    r2   check_errorr  (  s_    z 
E5	!	! 9
 8!%e8 8 8 9 9 9uE""""""r4   )r   r   r   r   r   r)   rM   r   )
r  r  r   r   r   r  r  r   rM   r	  )r  r/  r   r   rM   r0  )
r  r4  r   r5  r)  r6  r   r  rM   r7  )r   r   )rM   rd  )r  r/  r)  r6  rM   r  )
rG  r/  rH  r/  r   r   rI  r   rM   r  )r*  r   )r   r  r  r  rM   r  )r   r   r  ra   r  r  rM   r  )rM   r  )r   r   r  ra   rM   r  )r   r   rM   r  )
__future__r   collections.abcr   r   r   r   	itertoolsittypingr   r   r   numpyr   	jax.numpyr   jaxr	   r
   jax.experimentalr   jax._srcr   r   r   r!  r   r   r   r   r   r   r   r   r   rB   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  Payloadr6  r*   r3   r:   	Exceptionr)   total_ordering	dataclassEffectrN   control_flow_allowed_effectsadd_typelowerable_effectsro   ru   r   r   r   rC   r   r\  count__next__r   r   r   transformation_with_aux2r  r.  r3  r2  r$  rX  r&  	Primitiver  rL  ry  pp_eqn_rulesr]  r{  def_implr  def_effectful_abstract_evalr  r  r  r  r  register_loweringr  primitive_batchersr  primitive_jvpsErrorCheckRulerG  rm   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~  rt  r  r  r  r  r  r  r  r  custom_vjp_call_jaxpr_pr  	frozensetuser_checks
nan_checksindex_checks
div_checksfloat_checksautomatic_checks
all_checksr  rc  r  r   r  r  r  rI   r4   r2   <module>rp     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   0 0 0 0d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[ %/ %/ %/L -T[ 	/ 	/ 	/ '8]" #4/ 4/ 4/j '<Y" #  < 6J1 2  *  @ <V7 8  4 -W 
 i)*++Yz""
y($$Y+,--
J&,. +
 1<H H H H HX (4 (4 (4 (4 (4 (4T# # # "' A A A A A+ + + +"3 "3 "3 "3J@# @# @# @# @# @#r4   