
    vh                       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l,m/Z/ d dl,m0Z1 d dl2m3Z3 d dl2m4Z4 d dl2m5Z5 d dl6m7Z7 d d l8m9Z: d d!l;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC  e&j                  eE        e'j                  eE       e>eFcZFZGe?eHcZHZIeeJe7f   ZKeeLe7f   ZMeNd"   ZOePeej                  e7f      ZRe)j                  ZS e
d#      ZTd$ ZUd% ZV G d& d"eW      ZXej                   ej                  d'd'(       G d) d*e!j                                      Z\e!j                  j                  e\       e!j                  j                  e\        G d+ d,eX      Z` G d- d.eX      Za G d/ d0eX      Zb G d1 d2eX      Zcej                   G d3 d4eX             Zde)j                   ej                  d'5       G d6 d7                    Zf efi i i i       Zg ej                  d8      j                  Zjdtd9Zkd: Zlej                  d;        Zn	 	 	 	 	 	 dud<Zo	 	 	 	 dvd=Zp	 	 	 	 	 	 dwd>Zqd? Zrej                  d@        ZsdxdAZt ej                  dB      Zvd'ev_w        dydCZxexej                  ev<    G dD dEez      Z{evj                  dF        Z}evj                  dG        Z ezdH      ZdI ZdJ ZdK Z e/j                  evedLM        e/j                  evedNM        e/j                  evedOM       dP Zee.j                  ev<   dQ Zee-j                  ev<   eZi ZdRedS<   dT ZdU ZdV Zg ej                  ej                   ej"                  ej$                  ej&                  ej(                  ej*                  ej,                  ej.                  ej0                  ej2                  ej4                  ej6                  ej8                  ej:                  ej<                  ej>                  ej@                  ejB                  ejD                  ejF                  ejH                  ejJ                  ejL                  ejN                  ejP                  ejR                  ejT                  ejV                  ejX                  ejZ                  ej\                  ej^                  ej`                  ejb                  ejd                  ejf                  ejh                  ejj                  ejl                  ejn                  ejp                  ejr                  ejt                  ejv                  ejx                  ejz                  ej|                  ej~                  ej                  ej                  ej                  ej                  ej                  ej                  ZeD ]  Z ej                  eeǫ      ee<    dW Zeeej                  <   dX Zeeej                  <   dY Zeeej                  <   dZ Zeeej                  <   d[ Zd\ Zd] 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                  <   eA	 	 	 	 	 	 dzd^       Zdxd_Zeeej                  <   d` Zeeej                  <   	 	 	 	 	 	 	 	 	 	 d{daZeAd|db       Zdc Zeeej                  <   dd Zeee"j                  <   de Zeeej                  <   	 	 	 	 d}dfZeeej                  <   	 	 	 	 	 	 d~dgZeee j                  <   	 	 	 	 ddhZ	 	 	 	 	 	 ddiZeee j                  <   dj Zeeev<    eech      Z eeah      Z eebh      Z ee`h      Zeez  Zeez  Zeez  Zef	 	 	 ddkZdldm	 	 	 ddnZdo ZdldmdpZddqZddrZddsZy)    )annotations)CallableSequenceN)TypeVarAnyUnion)dtypes)lax)	shard_map)api)api_util)ad_checkpoint)linear_util)callback)config)core)custom_derivatives)effects)pjit)mesh)sharding_impls)source_info_util)traceback_util)	tree_util)SymbolicZero)ad)batching)mlir)partial_eval)tree_flatten)tree_map)tree_unflatten)Array)PartitionSpec)as_hashable_function
split_listsafe_mapsafe_zipunzip3weakref_lru_cacheHashableWrapperforeachJaxExceptionOutc                6    t        | |      }t        | |       |S N)getattrdelattr)objattrnamevals      L/opt/face_recognition/venv/lib/python3.12/site-packages/jax/_src/checkify.pypopattrr7   K   s    X#	#x	*    c                T    t               }t        | ||      |u sJ t        | ||       y r0   )objectr1   setattr)r3   namer5   sentinels       r6   
setnewattrr>   P   s,    X(	dH	%	11	1	#tSr8   c                  :    e Zd ZdZd Zd Zd Zed        ZddZ	y)	r-   zKPython exception which can contain an error message with JAX run-time info.c                    || _         y r0   traceback_info)selfrB   s     r6   __init__zJaxException.__init__Z   s
    (Dr8   c                .    t        j                  |        y r0   )jturegister_pytree_node_class)clss    r6   __init_subclass__zJaxException.__init_subclass___   s    ""3'r8   c                    g | j                   fS r0   rA   rC   s    r6   r    zJaxException.tree_flattenb   s    ##$$r8   c                    ~ | |      S r0    rH   metadatapayloads      r6   r"   zJaxException.tree_unflattene   s    x=r8   c                    t         r0   )NotImplementedErrorrK   s    r6   get_effect_typezJaxException.get_effect_typej   s    
r8   N)returnErrorEffect)
__name__
__module____qualname____doc__rD   rI   r    classmethodr"   rS   rM   r8   r6   r-   r-   W   s-    S)
(%  r8   T)eqfrozenc                  *    e Zd ZU ded<   ded<   ddZy)rU   ztype[JaxException]
error_typez tuple[api.ShapeDtypeStruct, ...]shape_dtypesc                6    d fd} ||        ||      k  S )Nc                :    t        d | j                  D              S )Nc              3  ^   K   | ]%  }|j                   t        |j                        f ' y wr0   )shapestrdtype).0sds     r6   	<genexpr>z7ErrorEffect.__lt__.<locals>.<lambda>.<locals>.<genexpr>u   s)      #=') %'HHc"((m#< #=s   +-)tupler_   xs    r6   <lambda>z$ErrorEffect.__lt__.<locals>.<lambda>u   s    U #=-.^^#= = r8   c                >    t        | j                         |       fS r0   )rd   r^   )rk   r_   s    r6   rl   z$ErrorEffect.__lt__.<locals>.<lambda>w   s    ALL)<?; r8   rM   )rC   otherunpackr_   s      @r6   __lt__zErrorEffect.__lt__t   s"    =L;F4L6%=()r8   N)rn   rU   )rV   rW   rX   __annotations__rp   rM   r8   r6   rU   rU   n   s     ! 00*r8   rU   c                      e Zd Zd Zd Zy)DivisionByZeroErrorc                     y)Nzdivision by zerorM   rK   s    r6   __str__zDivisionByZeroError.__str__   s    r8   c                "    t        t        d      S NrM   )rU   rs   rK   s    r6   rS   z#DivisionByZeroError.get_effect_type   s    *B//r8   N)rV   rW   rX   ru   rS   rM   r8   r6   rs   rs   }   s    0r8   rs   c                  @     e Zd Z fdZd Zed        Zd Zd Z xZ	S )NaNErrorc                2    t         |   |       || _        y r0   )superrD   prim)rC   rB   primitive_name	__class__s      r6   rD   zNaNError.__init__   s    	G^$DIr8   c                6    g | j                   | j                  ffS r0   )rB   r|   rK   s    r6   r    zNaNError.tree_flatten   s    $$dii011r8   c                     | | S r0   rM   )rH   rO   _s      r6   r"   zNaNError.tree_unflatten   s    >r8   c                "    t        t        d      S rw   )rU   ry   rK   s    r6   rS   zNaNError.get_effect_type   s    x$$r8   c                "    d| j                    dS )Nznan generated by primitive: .)r|   rK   s    r6   ru   zNaNError.__str__   s    )$))A66r8   )
rV   rW   rX   rD   r    rZ   r"   rS   ru   __classcell__r~   s   @r6   ry   ry      s+    2  %7r8   ry   c                  @     e Zd Z fdZd Zed        Zd Zd Z xZ	S )OOBErrorc                N    t         |   |       || _        || _        || _        y r0   )r{   rD   r|   operand_shape_payload)rC   rB   r}   r   rP   r~   s        r6   rD   zOOBError.__init__   s&    	G^$DI&DDMr8   c                b    | j                   g| j                  | j                  | j                  ffS r0   )r   rB   r|   r   rK   s    r6   r    zOOBError.tree_flatten   s*    ]]Od11499d>P>PQRRr8   c                     | g ||d    S Nr   rM   rN   s      r6   r"   zOOBError.tree_unflatten   s    %%'!*%%r8   c           	         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   rK   s    r6   ru   zOOBError.__str__   sW    ''( )]]1%&&A}}Q DMM!,<+=RA Br8   c                h    t        t        t        j                  dt        j
                        f      S )N)   )rU   r   r   ShapeDtypeStructjnpint32rK   s    r6   rS   zOOBError.get_effect_type   s#    x#"6"6tSYY"G!IJJr8   
rV   rW   rX   rD   r    rZ   r"   ru   rS   r   r   s   @r6   r   r      s.    S & &BKr8   r   c                  @     e Zd Z fdZd Zed        Zd Zd Z xZ	S )FailedCheckErrorc                N    t         |   |       || _        || _        || _        y r0   )r{   rD   
fmt_stringargskwargs)rC   rB   r   akr~   s        r6   rD   zFailedCheckError.__init__   s%    	G^$ DODIDKr8   c                b    | j                   | j                  f| j                  | j                  ffS r0   )r   r   rB   r   rK   s    r6   r    zFailedCheckError.tree_flatten   s.    YY$  $//24 4r8   c                &    |\  }} | g ||i |S r0   rM   )rH   rO   rP   r   r   s        r6   r"   zFailedCheckError.tree_unflatten   s#    LD&**4*6**r8   c                h     | j                   j                  | j                  i | j                  dz   S )Nz (`check` failed))r   formatr   r   rK   s    r6   ru   zFailedCheckError.__str__   s0    "DOO""DII==!" #r8   c                    t        j                  | j                  | j                  f      }t	        t
        t        d |D                    S )Nc              3  p   K   | ].  }t        j                  |j                  |j                         0 y wr0   )r   r   rc   re   )rf   rk   s     r6   rh   z3FailedCheckError.get_effect_type.<locals>.<genexpr>   s%     Cc""177AGG4Cs   46)rF   tree_leavesr   r   rU   r   ri   )rC   valss     r6   rS   z FailedCheckError.get_effect_type   s=    ??DIIt{{34DCdCCE Er8   r   r   s   @r6   r   r      s,    4 + +#Er8   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                  j                               d   j                  }t        |   |       y r   )listr   valuesrB   r{   rD   )rC   rB   r~   s     r6   __post_init__zBatchedError.__post_init__   s4    $,,3356q9HHN	G^$r8   c                b    dj                  d | j                  j                         D              S )N
c              3  l   K   | ],  \  }}d dj                  t        t        |             d|  . yw)zat mapped index z, z: N)joinmaprd   )rf   idxes      r6   rh   z'BatchedError.__str__.<locals>.<genexpr>   s9      ?a (		#c3-(@'AA3G ?s   24)r   r   itemsrK   s    r6   ru   zBatchedError.__str__   s/    99 ?#'#5#5#;#;#=? ? ?r8   )rV   rW   rX   rq   r   ru   r   r   s   @r6   r   r      s    44%
?r8   r   )r\   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y)Errorzdict[ErrorEffect, Bool]_predzdict[ErrorEffect, Int]_codezdict[Int, PyTreeDef]	_metadatazdict[ErrorEffect, Payload]r   c                >    | j                         }|t        |      S y)zCReturns error message if error happened, None if no error happened.N)get_exceptionrd   )rC   exps     r6   getz	Error.get   s!    



C
Xor8   c                   t        t        t        j                  | j                  j                                     r| j                         S d}d}| j                  j                         D ]!  \  }}| j                  |   s|||k  s|}|}# |/t        | j                  t        |         | j                  |         S y)zFReturns Python exception if error happened, None if no error happened.N)anyr   nprc   r   r   _get_batched_exceptionr   r   r"   r   intr   )rC   min_code
cur_effecterror_effectcodes        r6   r   zError.get_exception   s    
3rxx**,-.((**hj $

 0 0 2 &
,::l#H%J	& 
	dnnS];"mmJ79 	9r8   c                    t        |        y r0   )_check_errorrK   s    r6   throwzError.throw   s
    r8   c                *    d| j                          dS )NzError())r   rK   s    r6   ru   zError.__str__   s    DHHJ<q!!r8   c                   t        j                  t        | j                  j	                               d         }i }t        j
                  | D ]  }d }d }| j                  j                         D ]*  \  }}| j                  |   |   s|	||   |k  s$||   }|}, |Qt        |fd| j                  |         }t        | j                  t        |         |      }	|	||<    |rt        |      S y )Nr   c                    | |   S r0   rM   )rk   is     r6   rl   z.Error._get_batched_exception.<locals>.<lambda>  s
    AaD r8   )r   rc   r   r   r   ndindexr   r   r!   r   r"   r   r   r   )
rC   rc   r   r   r   r   r   r   rP   	jax_errors
             r6   r   zError._get_batched_exception  s    HHT$**++-.q12EMzz5! 'hj $

 0 0 2 &
,::l#C(cX!5CyH%J	& 
	s0$--
2KL"4>>#h-#@'J	&c' -((r8   c                    i | j                   ||i}i | j                  ||i}i | j                  ||i}i | j                  |}	t	        |||	|      S r0   )r   r   r   r   r   )
rC   effect_typepredr   rO   rP   new_errs	new_codesnew_payloadnew_metadatas
             r6   _updatezError._update  sn    4$**4d 34H54::5+t!45I=T]]={G&<=K1dnn11L9lK@@r8   c                p   | j                   j                         }| j                  j                         }| j                  j                         }|D ]L  }|| j                   j	                         vs d||<   t        t        d |j                              ||<   d||<   N t        ||| j                  |      S )zCFill out Error with `effects` and np.ones arrays of their payloads.Fc                V    t        j                  | j                  | j                        S r0   )r   onesrc   re   )r   s    r6   rl   z0Error._add_placeholder_effects.<locals>.<lambda>)  s    sxx9 r8   )
r   copyr   r   keysr   r!   r_   r   r   )rC   r   new_errnew_coder   effects         r6   _add_placeholder_effectszError._add_placeholder_effects   s    jjooGzz H--$$&K 	tzz(	("96;N;NOQF  (DNNK@@r8   c                4    t        j                  | g|i |S r0   )dataclassesreplace)rC   r   r   s      r6   _replacezError._replace/  s    t5d5f55r8   c                `    | j                   | j                  | j                  f| j                  fS r0   )r   r   r   r   rK   s    r6   r    zError.tree_flatten4  s$    ZZT]]3dnnFFr8   c                $    |\  }}} | ||||      S r0   rM   )rH   rO   datar   r   rP   s         r6   r"   zError.tree_unflatten7  s    D$tT8W--r8   N)rT   z
str | None)rT   zJaxException | None)rT   zBatchedError | None)r   rU   )r   zset[ErrorEffect])rV   rW   rX   rq   r   r   r   ru   r   r   r   r   r    rZ   r"   rM   r8   r6   r   r      s`     
! 	!!&&$"
*AA6
G . .r8   r   r   c                v    t               }|j                         }t        |      \  }}t        | ||||i||      S r0   )	next_coderS   r    update_error)errorr   	new_errorr   r   r   r   s          r6   assert_funcr   ?  s@    	$))++*95+|	eT4$)={K	XXr8   c                p   | j                   j                  |d      }||z  }t        j                  || j                  j                  |d      |      }| j
                  j                  |d       }	|	0t        t        j                  t        j                  |      |	|      }
n|}
| j                  |||||
      S )NFr   )
r   r   r
   selectr   r   r!   	functoolspartialr   )r   r   r   rO   rP   r   err_of_typeout_errout_codecur_payloadout_payloads              r6   r   r   E  s    U3+$'ZZU[[__["%EtL("";5+9,,SZZE{T[\KK	{GXx	MMr8   c                     | | \  }}t        j                  ||f      \  }}|j                  |t        |j                  j                               f       |S r0   )rF   r    storesetr   r   )fr   invalsr   outout_valsout_trees          r6   %_flatten_and_get_error_metadata_thunkr  S  sP    &z*%''5(H++xU[[--/012	/r8   c                d   d|vr| | j                   |i |fS t        j                  |      \  }}t        |      }d|v rt	        |g dg|z  |d         }|j                  d      }t        |t        j                        r|j                  |j                  }
}	n|d}
}	t        d |
D              }t        j                  t        j                  t        |	j                         |	|||      }t#        |      \  }t        | t        j$                        r?|j                  d      t'        	      fd
       }t	        |g d|z  |d   |      } | j                   |g||i |}        \  }}t)        ||      \  }}t        | t        j$                        rt+        |      }||fS )z6Default rule for primitives in `checkify` interpreter.
call_jaxprdonated_invarsF)r  rM   c              3  2   K   | ]  }t        |        y wr0   )r+   rf   cs     r6   rh   z(default_checkify_rule.<locals>.<genexpr>p  s     5/!$5s   
debug_infoout_axes)closurec                 X            d   j                   t              z
  } g d| z  S )Nr   )r   )
num_leaveslen)out_err_numrO   out_val_axess    r6   out_axes_thunkz-default_checkify_rule.<locals>.out_axes_thunk|  s3    JqM,,s</@@k/tK/,//r8   r0   in_axes)r  r  )bindrF   r    r  dictpop
isinstancer   ClosedJaxprjaxprconstsri   luhashable_partial	wrap_initcheckify_jaxpr_flat_hashabler  r  MapPrimitiver%   r"   _reduce_any_error)	primitiver   enabled_errorsr   paramserr_valserr_treenum_error_valsr  r  r  consts_partial_checkifyr  all_valsr  r   r  rO   r  s                     @@r6   default_checkify_ruler+  Z  s    .)..&3F333 ''.(Hx=.& *EE7>+A *E+12B+C*E FF zz,'*
D,,-$$j&7&76E6E5f55'((ll/E<L<LMWnh0  E H 	4,,-::j)L,/0 00 &GGN2GVI5FG!/1F Y^^,KxK&KFK(
+(A"8X6/%	4,,-e$E	r8   c                |    t        j                  |      \  }}t        | j                  | j                  ||g|| S r0   )rF   r    checkify_jaxpr_flatr  r  )r  r#  r   r   r%  r&  s         r6   checkify_jaxprr.    sI    ''.(H	U[[%,,+X
I8@
ICG
I Ir8   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                  |j                  t        j                  t         |j                              }t#        j$                         |j&                  j(                  z   }t#        j*                  |j&                  j,                  |      5   |||g|i |j.                  \  }}d d d        |j                  j0                  rt        |
|j2                         n |
|j2                  d          t	        j4                  ||       2 |t        |	| j2                        fS # 1 sw Y   xY w)Nc                Z    t        | t        j                        r| j                  S |    S r0   )r  r   Literalr5   )varenvs    r6   read_envz%checkify_jaxpr_flat.<locals>.read_env  s#    #t||$WWns8Or8   c                    || <   y r0   rM   )r2  r5   r3  s     r6   	write_envz&checkify_jaxpr_flat.<locals>.write_env  s    CHr8   )
name_stackr   )r2  z	core.Atom)r2  zcore.Varr5   r   )r&   r  rF   r"   r   	last_usedr,   	constvarsinvarseqnsr   error_checksr   r"  r   r   r+  r   current_name_stacksource_infor7  user_context	tracebackr$  multiple_resultsoutvarsclean_up_dead_vars)r  r  r#  r&  r   r%  in_argsr   r8  r4  r6  eqnr   checkify_ruler7  outvalsr3  s                   @r6   r-  r-    s     # (;(;'<=(G


Xx
0%nnU#)
 
)U__f-	)U\\7+ ZZ 1c3::&F $$y(()>NPM!4469S9SSJ		&	&s'@'@2<
> <$UN <&,<03

<neW< }}%%ig.A(Ci01 
Hemm,	,,< <s   GG#	c                D    t        d |D              }t        | |||g| S )Nc              3  4   K   | ]  }|j                     y wr0   rj   r  s     r6   rh   z/checkify_jaxpr_flat_hashable.<locals>.<genexpr>  s     ..   )ri   r-  )r  hashable_constsr#  r&  r   r  s         r6   r  r    s(    .o..&	UFNH	Lt	LLr8   c                N     | | }t        |      \  }}|j                  |       |S r0   )r    r   )r   r   r   ansr  s        r6   flatten_fun_outputrN    s*    	4#s#-#x++h	*r8   c                h   t         }| j                  j                         D ]r  }| j                  |   | j                  |   | j                  |   }}}t        j                  |      d   }t        |fd|||f      \  }}}	|j                  |||i |	      }t |j                  | j                        }|S )Nr   c                    | |   S r0   rM   )rk   r   s     r6   rl   z#_reduce_any_error.<locals>.<lambda>  s
    af r8   r   )
init_errorr   r   r   r   r   argsortr!   r   r   r   )
r   	out_errorr   errscodespayloadsreduced_idxr   r   rP   s
             r6   r!  r!    s    )kk&&( Il"[[6"[[6"^^L9 %D ++d#B'K"#D$(%#:<D$!!,dBHII   5?? ;)	r8   checkc                   |j                   rt        j                  | j                         nd }|j                  rd| j                   j                   dnd }t	        d | j
                  j                         D              }t        j                  j                  | j                  j                  |      t        j                  |||      t        j                  j                  d      t        j                  | j                  |      z   g}t        j                  j                  t        j                  j                  d|      g|      S )N[]c              3  4   K   | ]  \  }}|d k7  r||f  yw)r&  NrM   )rf   r   vs      r6   rh   z_pp_check.<locals>.<genexpr>  s&      .Va*_ a& .rJ  )
annotation  )r>  r   	summarizer7  sortedr$  r   r   pptextr"  r<   pp_kv_pairspp_varsr:  concat)rE  contextsettingsr_  name_stack_annotationtrimmed_paramsrhss          r6   	_pp_checkrn    s    '' !**3??;-1  '11 s99:!<7;  .szz/?/?/A . ..	cmm((5J	K			.'8	<	c	T\\#**g>	>	@# 
b*5<<	==r8   c                      e Zd Zy)JaxRuntimeErrorN)rV   rW   rX   rM   r8   r6   rp  rp    s    r8   rp  c                    |rg S t        | |      }|j                         }|rSt        j                  |j                  j                               }|j                  |       t        t        |            |g S r0   )	r"   r   r   filter_tracebackrB   as_python_tracebackwith_tracebackrp  rd   )r&  debugr   r   excfiltered_tbs         r6   
check_implrx    sm    
I
4
(%# 11..02K{#
#c(
#,	)r8   c                b    ~g t        t        | |      j                  j                               fS r0   )r   r"   r   r   )r&  ru  r   s      r6   check_abstract_evalrz    s+    	S$/55::<=	==r8   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)r   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&  ru  r   out_opr   s         r6   check_lowering_ruler    so    
I		"	"	(	(
!!..	I%%j(;&&,&!Q 
-r8   c                    | rg S t         r0   )r  )ru  r   r   s      r6   check_lowering_rule_unsupportedr    s    
Ir8   c                4    t        | |      }t        |       g S r0   )r"   r   )r&  r   r   s      r6   r  r    s    
4
(%u	)r8   tpu)platformcpugpuc                   t        d t        | |      D              fdt        | |      D        } t        ||       }t        ||       g g fS )Nc              3  d   K   | ](  \  }}|t         j                  ur|j                  |    * y wr0   )r   
not_mappedrc   )rf   rk   dims      r6   rh   z&check_batching_rule.<locals>.<genexpr>)  s1      1vq#H/// ggcl 1s   .0c              3  R   K   | ]  \  }}t        j                  ||         y wr0   )r   bdim_at_front)rf   r   dsizes      r6   rh   z&check_batching_rule.<locals>.<genexpr>+  s,      =a ((At4 =s   $'ru  )nextzipr"   r   )batched_args
batch_dimsr&  ru  errr  s        @r6   check_batching_ruler  (  sU    	 1\:)F 1 
1$=!,
;=,x.#s% 	R-r8   c               6    t        j                  | ||d g g fS N)r&  ru  )check_pr  )primalsr   r&  ru  s       r6   check_jvp_ruler  2  s    	,,(%8	R-r8   z$dict[core.Primitive, ErrorCheckRule]r<  c                 >    t        j                         j                  S r0   )r   currentr@  rM   r8   r6   get_tracebackr  >  s    		!	!	#	-	--r8   c                J     | j                   |i |}t        | |||      }||fS r0   )r  
check_nans)r|   r   r#  in_valsr$  r   r  s          r6   nan_error_checkr  A  s0    		7%f%#44#	c/r8   c           
        t         |vr|S d }| j                  r<t        j                  t        j                  |D cg c]
  } ||       c}            n ||      }t        ||t        t               | j                              S c c}w )Nc                    t        j                  | j                  t        j                        ryt        j
                  t        j                  |             S )NF)r   
issubdtypere   r	   prng_keyr   isnanrj   s    r6   r  zcheck_nans.<locals>.isnanJ  s2    
~~aggv/77399Q<  r8   )ry   rA  r   r   arrayr   r  r<   )r|   r   r#  r   r  rk   any_nanss          r6   r  r  F  sr    ^#L! && ggcii3 7aq 789,1#J 	UHh}		&J	KK !8s   Bc          
        t        j                  j                  |g|d|i}t        |vr| |fS t	        j
                  |j                        }t	        j
                  |      }t        j
                  |      }|dk  ||z   |kD  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  rc   r   oob_payloadrangendimr   r   r  )	r   r#  operandr  start_indicesr   operand_dimsoob_maskrP   s	            r6   dynamic_slice_error_checkr  i  s      R=RkR#^##:'--(,%+))M*-aMK$?,$NO(-w||1DgmmT'
eSWWX./[b[h[hjq0r
s%	r8   c           
        t        j                  j                  ||g| }t        |vr| |fS t	        j
                  |j                        }t	        j
                  |j                        }t        j
                  |      }|dk  ||z   |kD  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  rc   r   r  r  r  r   r   r  )
r   r#  r  updater  r   r  update_dimsr  rP   s
             r6    dynamic_update_slice_error_checkr  y  s    ""''H-H#^##:'--(,&+))M*-aMK$?,$NO(-w||1DgmmT'
eSWWX.J`biboboqx0y
z%	r8   c          
        t         j                  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                  |j                        kD  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  rc   r  start_index_mapr   expand_dimsri   r  astypere   r  r   r   r  )r   r#  r  r  r  r  r  r  r  r  r   dnumsr  num_batch_dimsupper_boundr  rP   s                    r6   gather_error_checkr    sC    	}0An+$: 	 	O#
 ^##: %'--(,}**+a/.RXXe&;&;<=++&rxx0E0E'FGG+%n8M2NO+aMK4F4F}GZGZ4[$[\(-1F1FV'
eSWWX.(T[TaTacj0k
l%	r8   c                    t         |v rGt        j                  t        j                  |d            }t	        | |t        t                           } t        t        j                  | |||      S )z$Checks for division by zero and NaN.r   )	rs   r   r   equalr   r  r  r
   div_p)r   r#  rk   yany_zeros        r6   div_error_checkr    sO    N*wwsyyA'Hx)<]_)MNE	E>1a	@@r8   c                |   t        j                  t        j                  |             }t        j                  ||j                        }t        j
                  |      |d      }t        j
                  |      |   }t        j                  |      |   }t        j
                  |||gt         j                        }	|	S )Nr   )re   )r   argminlogical_notunravel_indexrc   r  ravelr   )
r  indicesdims_mapr   flat_idx	multi_idxoob_axisoob_axis_size	oob_indexrP   s
             r6   r  r    s    ZZ12('--8)YYx 2/())M*84-ii *)IIy(M:#))L'	.r8   c                   g }d}t        t        | j                              D ]R  }||j                  v r|j	                  d       #|j	                  |j                  |j
                  |             |dz  }T t        j                  |j                  D cg c]  }| j                  |   ||   z
   c}t        j                        }t        j                  |t        j                  |j                        j                        }t        j                  ||j                  t        |j                        dz
  f      }t!        j"                  |d      }t!        j$                  ||j'                  |j                              }	t!        j(                  ||	      }
t+        |
||j                  | j                        }t!        j,                  |
      |fS c c}w )Nr   r   )r  r  rc   inserted_window_dimsappendupdate_window_dimsr   r  scatter_dims_to_operand_dimsint64minimumiinfore   maxr
   broadcast_in_dimr   lessgreaterr  
logical_orr  r   )r  r  updatesr  r  posr   r  	lower_oob	upper_oobr  rP   s               r6   scatter_oobr    s   +	#W]]#$ aE&&&u'?'?'DEF	Qhc #(#E#EG "--*[^; G#+ 

;(?(C(CD+$$['--&)'--&81&<%>@+ hhw")kk';#5#5gmm#DE)^^Iy1('::GMMK'		G	##Gs   Gc                  | j                  |||||||	|
|	      }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  r<   rc   r   r  )r|   r   r#  r  r  r  r  r  r  r  r  r  r   out_of_boundsrP   	oob_errors                   r6   scatter_error_checkr    s     			wl!5F+N	 	 	# ^##:&wBST-}		7=='J)
e]I
6%
T5.#
6%	r8   c                X   t        j                  t        | j                  | j                  ||      }t        j                  || j                  j                        }t        |      \  }}t        j                  ||      \  }}}	\   t        j                  ||	      }
 |       \  }}|
||fS Nr
  )r   r   r-  r  r  r  r  r  r  petrace_to_jaxpr_dynamicr   r  )r  r#  r&  flat_err_and_in_valscheckify_jaxpr_partialfunrO   	new_jaxprr   r  checked_jaxprr  error_effectss                r6   jaxpr_to_checkify_jaxprr
    s     %,,-@%++-2\\>-57 	+8N8NO#7<-#x66s<PQ)Q""9f5-$J(M	-	//r8   c                  t        j                  |       \  }t        t        j                  g ||      fd}|D cg c]
  } ||       }	}| j                   t               j                  |	       }
t        j                  |
      \  }t        t        j                  g ||      t        fd|D              \  }}}t        j                  j                  |g||dt        |      i|}t        |d   |      \  }}|j                  }|dd  D ]!  }t        ||      \  }}i ||j                  }# |j                  |      |fS c c}w )Nc                ,    t        | g \  }}}|S r0   r
  )jxprr   r   r#  r&  in_avalss      r6   get_error_effects_from_jaxprz6cond_error_check.<locals>.get_error_effects_from_jaxpr  s&    +D.( 7-57MAq'Nr8   c              3  :   K   | ]  }t        |g   y wr0   r  )rf   r  r#  r&  r  s     r6   rh   z#cond_error_check.<locals>.<genexpr>  s/      &K9= 
5+35&Ks   branchesr   r   rQ  )rF   r    r   r   get_avalr   r   unionr)   r
   cond_pr  ri   r"   r   r   )r   r#  indexr  opsr$  r%  r  r  r   merged_errornew_branches	out_treesr   err_and_outserr0r   merged_metadatatrr  r&  r  s    `                  @@r6   cond_error_checkr    sw    ''.(H 1( 1S 12( =EED)$/E'E//W0EF,''5(H  1( 1S 12(% &KAI&K  K,	1 ...\".&,.,
 Yq\<8)$NN/abM ;bB-FC::CMM:O; 
	13	66) Fs   Ec                  t        |
||g      \  }}}|D cg c],  }t        j                  |dt        j                  |            . }}t	        j
                  |       \  }}t        t        j                  g |||      |z   }t        |||g| \  }}}| j                  |      }t	        j
                  |      \  }}t        t        j                  g |||      |z   }t        |||g| \  }}}dgt        |      z  dgt        |      z  z   dgt        |      t        |      z   z  z   }t        j                  ||      }g ||||}g dgt        |      z  |}t        j                  j                  ||||t        |      t        |      t        |      z   |||	d}t        ||      \  }}||fS c c}w )Nr   FT)reverselengthr  
num_consts	num_carrylinearunroll_split_transpose)r&   r   mapped_avalr  rF   r    r   r
  r   r  r  move_binders_to_frontr
   scan_pr  r"   )r   r#  r!  r"  r  r#  r$  r%  r&  r'  in_flatr  carryxsr5   	xs_mappedr%  r&  new_in_avalr   r   r  checked_jaxpr_r  tomover  new_in_flat
new_linearerr_and_outr  r   s                                  r6   scan_error_checkr5    s    !:y*AB&%JLM3t4==+=>M)M ''.(HDMM#?X#?#?#?@9L+)%*2B5@B-!Q //8,''5(H DMM#?X#?#?#?@9L+ 7~8@!PCN!P.(A Gc(m#tfs6{&::gUc"g-./&**>6B-1&181e1b1+2%3x=(262*

GF-VE
3x=(@9IK+ Hk2(#s	c/5 Ns   1F;c                   t        j                  |       t        j                  |      fd}t        j                  ||j                  j
                        }| j                  d  }t        j                  |g ||j                        \  }}	\   \   t        j                  |      }
t        j                  |      \  }}t        t         j                  |      }g |||j                  }t        |
||g| \  }}}|||fS )Nc                 F    t        | g      \  }} | } g || }|S r0   )r&   )c_consts_and_valsc_constsr   r   r   body_fc_consts_numcond_fs        r6   
new_body_fz-checkify_while_body_jaxpr.<locals>.new_body_fD  s6     1L>BNHd
$-C3AJr8   r
  )r   jaxpr_as_funr  r  r  r  r  r  r  close_jaxprrF   r    r   r  r
  )
cond_jaxpr
body_jaxprr#  r   r;  r=  new_body_f_c_consts_avalsr  r   closed_jaxprr%  r&  r  r  r	  r:  r<  s       `           @@r6   checkify_while_body_jaxprrE  >  s    Z(&Z(& ZJ4D4D4O4OP+&&}5...{ =Sn =S>H>Q>Q=S T%B&,''.(H)(K8KnKz7J7JK#:NH$E/C$E %=	-	''r8   c                    | j                   }| j                  } | j                  | j                  |d       }t	        j
                  ||      S )zAConstructs a checked jaxpr which does not output its error value.N)rB  )r  r  r   rB  r   r  )r  r'  r  r  s       r6   ignore_error_output_jaxprrG  W  sD     <<&
++%mmEMM./$BmC)			)V	,,r8   c               *   |j                   d   j                  rt        d      t        |||g      \  }}}	t	        ||| g||	 \  } }
t        |||| |      \  }
}
}| j                  |      } 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| \  }}
}
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_nconstsr@  body_nconstsrA  )	out_avalsrc   
ValueErrorr&   r.  rE  r   rF   r    r  r  r)  r   r   r  r
  rG  r
   while_pr  r"   )r   r#  rI  r@  rJ  rA  r+  r9  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_jaxprr2  all_out_valsr   s                             r6   while_loop_error_checkrX  _  s   !""
 2 3 3
 )<2NO(HeJQQ5Q(%1*j2@%2>@!Q 
(
(
7%''.(H*C*ne\+C'}ax=.W~%(==v$%(-wU';<'//0CWM/8/h//,T]]L1,4Z5=N@LNa01C^TGn$v'<<wU?SS'../A7KD(DXDD8DeD+!!:K,9KM, m\:*%	r8   c                  t        j                  |       \  }}g ||}t        t        t        j
                  |            }t        |||g| \  }}}t        |      }|j                  t        |      z
  }t        j                  }g |g|z  |}g d g|z  |}g dg|z  |}g |g|z  |}g d g|z  |}t        j                  j                  |||||||||	|
||d}t        ||      S )NF)r  in_shardingsout_shardings
in_layoutsout_layoutsr  ctx_meshr<   inlinekeep_unusedcompiler_options_kvs)rF   r    ri   r   r   r  r
  r  r  r   UNSPECIFIEDr   pjit_pr  r"   )r   r#  r  rZ  r[  r\  r]  r  r^  r<   r_  r`  ra  vals_inr%  r&  new_vals_inr  r  r  r   r'  num_out_error_valsshardingnew_in_shardingsnew_in_layoutsnew_donated_invarsnew_out_shardingsnew_out_layoutsr4  s                                 r6   pjit_error_checkrm    sE    ''.(H%(%W%+3t}}k23(6un7? LBJ L-1 x=.**S-??''(BzN2B\B:dVn,:z:.C%>1CNCH
%77H-H@tf11@K@/  #%!'/+ 
+	..r8   c               \   t        j                  |       \  }}g ||}t        t        t        j
                  |            }t        t        j                  |      ||g| \  }	}
}|	j                  |	j                  c}\   t        j                  j                  |d|i|}t        |
|      S )Nr  )rF   r    ri   r   r   r  r
  r  r?  r  r  r   remat_pr  r"   )r   r#  r  rd  r$  r%  r&  re  r  r0  r  r   r  r4  s                 r6   remat_error_checkrp    s    ''.(H%(%W%+3t}}k23( 7nnU^X!B8@!B.(A$**N,A,A-%%**K 5} 5-35+	+	..r8   c               <   |j                  d      x}t        d      t        j                  |       \  }}	t	        |      }
g t               g|
z  |}g ||}t        t        t        j                  |            }|j                  d      }|j                  d      }t        |      D ]X  \  }}t        j                  j                  t        |            x}st        dt        |              ||||||   |      ||<   Z t        j                  ||      5  t        j                   t        j"                  ||            5  t%        j&                  |      5  t)        t+        j,                  |      ||	g| \  }}d d d        d d d        d d d        j.                  t	        |      z
  fd}t        j0                  |j2                  j5                               5  t%        j&                  |      5  t+        j6                  t9        j:                  |j<                  j>                        j@                        \  }}}\   d d d        d d d        t        jB                  |      g t        |jD                        gz  |}t9        jF                  t9        j:                  t        jH                  j<                  j>                        j<                  jJ                        }tM        d	j<                  ||d|}t        jN                  jQ                  |      \  }}t        jN                  jR                  |g|i |}tU        ||      S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   9xY w# 1 sw Y   >xY w)
Nr   z2Mesh must be provided for shard_map with checkify.manual_axes	check_vmazUnsupported aval type: c                     t        j                  j                  j                  g|  }t	        |g      \  }}|D cg c]  }t        j                  |dg       }}g ||S c c}w r   )r   
eval_jaxprr  r  r&   r
   r  )r-  outsrU  r   r  rf  s       r6   expand_errors_leading_dimz8shard_map_error_check.<locals>.expand_errors_leading_dim  sk    ??=..0D0DJrJDD#5"67JD$-12COOAs#2D2D<4< 3s   A(r
  )r  in_specs	out_specsrM   )+r   rL  rF   r    r  Pr   r   r   r  	enumerateshard_aval_handlerstypejshmap_extend_axis_envmesh_libuse_abstract_mesh_as_manual_meshr   
_check_vmar
  r  r?  r  extend_axis_env_ndrc   r   r  r  r  r  r  r  r  
axis_namesr  ru  r  r  shard_map_pget_bind_paramsr  r"   )r   r#  r  rx  ry  rd  r   r   r%  r&  r'  new_in_specsre  r  rr  rs  r   r^  sharderr  r   rw  r  new_out_specssubfun
new_paramsr4  r  rf  s                              @@r6   shard_map_error_checkr    sG    jj  d)
I
JJ''.(Hx=.7QSEN*7h7,%(%W%+#dmm[12(

=)+jj%)! Lda//33DG<<G<0a	:;;$YQKHQKL
 	k2 ""6#9#9$#LM)$ "9
u~x":B"M8Q	    **S^; tzz//12 F4E4Ei4P 44
. - 3 3 > >	@E1fb  ""5&1- Ma(),>>L)L-ll4??}/B/B/M/MN=//&   		* $$44Z@-!Z""''KK
K+	+	..O        sa   *M7M*&MM*M7'N=ANNM'"M**M4	/M77NN		NNc          	     d   t        j                  |       \  }}t        j                  t	        j
                  t        |j                  |j                  ||      |j                  j                        }	t        |	      \  }	}
t        |j                  ||      }t        |      \  }}t        j                  j                   |	|g||i |}t        j"                  |
|      \  }}|r|\  }}t%        ||      \  }}||fS t'        |t)        |      g      \  }}t        j$                  ||      }||fS r  )rF   r    r  r  r   r   r-  r  r  r  r  lift_jvpr  rN  r   custom_jvp_call_pr  merge_linear_auxr"   r&   r  )in_errr#  r#  jvp_jaxpr_funr  r  r$  r%  r&  r)  
f_metadatajvpjvp_out_treeall_outsfstout_metadataerr_and_out_treer   r   r  s                       r6   custom_jvp_call_ruler    sD    ''/(H\\+Z-=-="))>8E!!,,. "G"J$$j-@#(-#|1166<&<)0<4:<())*lC#|&a&'7BGX
 
(	 $Hs8}o>Hh  84G	(	r8   c                X      fd}t        j                  |j                        S )Nc            	        t        t        |       d      \  }}|rJ | z   | | |z   z   d  }}|D cg c]  }t        |      t        u  }} j                  | \  }}}	|D cg c]  }t        |      t        us| }
}t        j                  ||g||
 }t        |t        |	      g      \  }}t        |      }t        ||	      D cg c]>  \  }}|r,t        t        j                  |      j                               n
t        |      @ }}}t        |d       J | z    }| |z   |z   z    }g ||||S c c}w c c}w c c}}w )Nr   )divmodr  r}  r   call_wrappedr   ru  r&   iterr  r  to_tangent_avalr  )r-  nraggedr  tangentstzeros	jvp_jaxpr
jvp_consts	out_zerosnonzero_tangentsr   out_primalsnz_out_tangentsnz_out_tangents_pzout_tangentsprimal_errstangent_errsr  r#  num_errss                       r6   r  zlift_jvp.<locals>.jvp(  s   s2w"IAv::h.q12a
l86K6L3MXG.67T!W$7E7'A}'A'A5'I$Iz9#+KatAwl/JKK
//)Z
M'
M<L
MC#-cC	N3C#D KO, !$K ;=1  !q!1!A!A!CD"#345 =L =  $'///Z
8 34Ka
l1Z<#89LE[E;EEEE 8K=s   E&E=EAEr
  )r  r  r  )r  r#  r  r  s   ``` r6   r  r  &  s"    F" 
cm&>&>	??r8   c          	        t        j                  |       \  }	}
|
j                  t        j                  t        j                  t        |j                  |j                  ||
      |j                  j                        }t        |      \  }}fd}t        j                  |j                        }t        j                  fdj                        }t        |      \  }}t        j                  j                  |||g|	|||d}t        j                   ||      \  }}|r|\  }}t#        ||      \  }}||fS | |}}||fS )Nr
  c                     | d d d   | dd d   }}|d  |d  }} j                   | \  }}|d  }t        j                  ||g| S )Nr   r   )r  r   ru  )	r   r-  r  	fwd_jaxpr
fwd_constsxs_without_constsfwd_jaxpr_thunkr#  r  s	         r6   checkified_fwdz,custom_vjp_call_rule.<locals>.checkified_fwdI  sn    SqS	41:B89uXY/B8O88%@Iz:;??9jE3DEEr8   c                 2    g dz   j                   |  S )Nr0   )r  )r   bwdr  s    r6   rl   z&custom_vjp_call_rule.<locals>.<lambda>T  s%    $Qgh&6$Q9I9I9I49P$Q r8   )r  symbolic_zeros)rF   r    r  r  r  r   r   r-  r  r  r  r  rN  r   custom_vjp_call_pr  r  r"   )r  r#  r  r  r#  r  r  r  r  r%  r&  checkified_funfun_metadatar  checkified_fwd_wrappedbwd_fwd_out_treer  r  r  r  r   r   r  r  s      ```                  @r6   custom_vjp_call_ruler  ;  s`   
 ''/(H  (<<+Z-=-="))>8E!!,,.. "G".,F <<3B3M3MO	Q!$
1$);<R)S&,1166,
%%%+4#%( )),E#|&a&'7BGX 
(	 XG	(	r8   c          	        ~t        ||      }| }t        }|j                  j                         D ]^  }|j                  |   }	|j                  |   }
|j
                  |   }|j                  |v rt        ||	|
i ||      }Ot        ||	|
i ||      }` |j                  i |j                  |j                        }|j                  |j                        }|g fS )NrQ  )
r"   rR  r   r   r   r   r^   r   r   r   )r   r#  r&  ru  r   r   discharged_errorrecharged_errorr   r   r   rP   s               r6   check_discharge_ruler  e  s    Xt,) /oo**, 	3l??<(D??<(D  .G.0%&6dB&24 %_dD"g%13o	3 &..E9&&E*:*D*DE / G#,,y7J7J,K/ 
2	r8   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        j                  d       }t        j                  t        j                  ||      |      \  }}t        j                  |d      \  }}}	\   t        j                  t        j                  |            }
t        |
t        g|	 \  }}|t        j                   |       |      fS )NrM   c                       i S r0   rM   )r   r   r   s   r6   rl   z/checkify.<locals>.checked_fun.<locals>.<lambda>  s    q$)&) r8   checkifyr
  )rF   tree_structurer   r  flatten_funr  r  r  r  r?  convert_constvars_jaxprr.  rR  r"   )r   r   in_treeclosed_fru  fun_r  jaxpr_r   r  r  r   out_flaterrorsr   s   ``           r6   checked_funzcheckify.<locals>.checked_fun  s       "b*G)H
AtV<E))",,xBG+I*13ND( 55dB?FAvrNN255f=>E$UFJHHOE8#$$XZ:::r8   )r   api_boundary)r   r  r  s   `` r6   r  r    s&    v ; ; 
r8   Fr  c               &    t        | ||g|i | y)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   msgru  fmt_args
fmt_kwargss        r6   rY  rY    s    P 	sE3H3
3r8   c           	        t        |       s|rdnd}t        | d|        t        j                  ||f      D ]=  }t	        |t
        t        j                  f      r$t        d|dt        |       d       t        t               |g|i |}t        t        t        j                  |       |      }t        ||       y )Ndebug_checkrY  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	TypeErrorrF   r   r  r#   r   ndarrayr}  r   r  r   rR  r   r  r   )	r   r  ru  r  r  	prim_nameargr   r   s	            r6   r  r    s    		!&GI
yk!GvN
OO__h
34 7ccE2::./ 4yc16 7 77
 }MhM*M)
j#//$"7
C%uE"r8   c                   t        t        t        j                  | j                  j                                     rt        |       } t        |       \  }}t        j                  |||dS r  )
r   r   r   rc   r   r   r!  r    r  r  )r   ru  err_argstree_defs       r6   r   r     sN    RXXu{{))+	,-e$E#E*(H	x(%	@@r8   c                    t        | t              xsE t        | t              xr3 | j                  dk(  xr" | j                  t        j                  d      k(  S )NrM   bool)r  r  r#   rc   re   r   )r   s    r6   r  r    sJ    
T4
  *
T5
! *djjB&6 *
**		&)
)+r8   c                &    t        | |dg|i | y)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       r6   r  r    s    D 	sD282z2r8   c                n    t        | t              st        dt        |        d      t	        | d       y)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    r6   check_errorr  C  s;    z 
E5	!
 !!%eY8 9 9uE"r8   )r   r   r   Boolr   r-   rT   r   )
r"  zcore.Primitiver   r   r   
core.Valuer$  r   rT   z"tuple[Error, Sequence[core.Value]])r  core.ClosedJaxprr   r   rT   ztuple[Error, list[core.Value]])
r  
core.Jaxprr  zSequence[core.Value]r&  	PyTreeDefr   r  rT   ztuple[Error, list[Any]])r   r   )rT   zcore.pp.Doc)r  r  r&  r  rT   4tuple[core.ClosedJaxpr, PyTreeDef, set[ErrorEffect]])
r@  r  rA  r  r   r   r;  r   rT   r  )r'  r   )r   r   r  r  )r  r   r#  r   r  lu.WrappedFunr  r  )r  r   r#  r   r  r  rT   r  )r  r  r  r  r  r  )r   zCallable[..., Out]r  zfrozenset[ErrorCategory]rT   z Callable[..., tuple[Error, Out]])r   r  r  rd   ru  r  rT   None)rT   r  )r   r  r  rd   rT   r  )r   r   rT   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   r  r   r   r   r   rF   jax._src.ad_utilr   jax._src.interpretersr   r   r   r   r  jax._src.tree_utilr    r!   r"   jax._src.typingr#   jax._src.partition_specr$   rz  jax._src.utilr%   r&   r'   r(   r)   r*   r+   r,   register_exclusion__file__r   
unsafe_mapr  
unsafe_zipr  r  r   Intr}  ErrorCategoryr   r  Payloadr  r.   r7   r>   	Exceptionr-   total_ordering	dataclassEffectrU   control_flow_allowed_effectsadd_typelowerable_effectsrs   ry   r   r   r   rG   r   rR  count__next__r   r   r   transformation_with_aux2r  r+  r.  r-  r  rN  r!  	Primitiver  rA  rn  pp_eqn_rulesrL  rp  def_implrx  def_effectful_abstract_evalrz  r  r  r  r  register_loweringr  primitive_batchersr  primitive_jvpsErrorCheckRuler<  rq   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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  r5  r*  rE  rG  rX  rM  rm  rc  rp  ro  r  r  r  r  r  r  r  r  	frozensetuser_checks
nan_checksindex_checks
div_checksfloat_checksautomatic_checks
all_checksr  rY  r  r   r  r  r  rM   r8   r6   <module>rd     s   # .    & &     ' (   " &    '   % # % # % ) $ * & 4 + ' - ! 6P P P $  # #H - ! ! !( +CZCZT5[CJ^$
uRZZ&'
(MM	en
9 . $t,*'.. * - *  $ $ - -k :    " "; /0, 07| 7&K| K0E| E6 
?< 
? 
? d#]. ]. $  ].~ 2r2r"
BHHQK  	Y	N  13=1$'1,N1fII+II$-2;$-)$-.E$-LM
    $..
! 
> '  ' j  	  	$$> %>
 %$   

   w ? %'   w 3 %'   w 3 %' (;  G $ ,  '  572 7.
LL#** Lckk L399 Lcjj L#++ L++L"zzL+.;;L8;8H8HL""L$'JJL030J0JL ))L !ZZL *-););L >A\\L ,,	L !$	L 03||	L >A]]	L
 ##L
 &)]]L
 58IIL
 @CzzL ))L ![[L +.))L 695H5HL ,,L !$L 03/@/@L CF,,L $$L '*kkL 4799L ?BnnL ))L !YYL ),		L 47::L ,,L !$ 1 1L ""L %($7$7L ))L ,/+L+LL ))L !..L 14L >AYYL **L "jjL +.))L 69YYL AD

L   BE)	))/5A,uB %>S   ! ,LS'' (0 0S\\ A *SYY $2$ 0i//0CS]]SS]] "3)"3"34G474E4E#GS "3)"3"34G474E4E#GS "3)"3"34G474E4E#GS "3)"3"34G474E4E#GS 
 007@0R0 07> ,SZZ @ ,SZZ ( (.>( ( ( O(2 - -(R 3S[[ %/L -T[[ 	/ '8]"" #;/;/;/x $9V   ), (5  &6 B 6J11 2@)@.;@*&%5& ,& *.	&N 6J11 24 -W 
 )*+z"
($+,-
J&,. +
 1<J-J2J\ (4(4 	(4T# "' A+"3J@#r8   