
    uki                       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l2m4Z4m5Z5 d d l2m6Z6 d d!l7m8Z8 d d"l9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA 	 d dlBmCc m ZD  e#j                  eG        e$j                  eG       e<eHcZHZIe=eJcZJZKeeLe8f   ZMeeNe8f   ZOePd#   ZQeReej                  e8f      ZTe&j                  ZU e
d$      ZVd% ZWd& ZX G d' d#eY      ZZej                   ej                  d(d()       G d* d+ej                                      Z^ej                  j                  e^       ej                  j                  e^       ej                  j                  e^       ej                  j                  e^        G d, d-eZ      Zd G d. d/eZ      Ze G d0 d1eZ      Zf G d2 d3eZ      Zgej                   G d4 d5eZ             Zhe&j                   ej                  d(6       G d7 d8                    Zj eji i i i       Zk ej                  d9      j                  Zndxd:Zod; Zpej                  d<        Zr	 	 	 	 	 	 dyd=Zs	 	 	 	 dzd>Zt	 	 	 	 	 	 d{d?Zud@ Zvej                  dA        Zwd|dBZx ej                  dC      ZzdD ez_{        d(ez_|        d}dEZ}e}ej                  ez<    G dF dGe      Zezj                  dH        Zezj                  dI        Z edJ      ZdK ZdL ZdM Z e,j                  ezedNO        e,j                  ezedPO        e,j                  ezedQO       dR Zee+j                  ez<   dS Zee*j                  ez<   eZi ZdTedU<   dV ZdW ZdX Zg 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                  ej                  ej                  ej                  ej                  ej                  ZeD ]  Z ej                  ee̫      ee<    dY Zeeej                  <   dZ Zeeej                  <   d[ Zeeej                  <   d\ 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                  <   e&j                   G d` da             Ze?	 	 	 	 	 	 d~db       Zd|dcZeeej                  <   dd Zeeej                  <   	 	 	 	 	 	 	 	 	 	 ddeZe?ddf       Zdg Zeeej                  <   dh Zeeej                  <   di Zeeej                  <   	 	 	 	 ddjZeee!j                  <   	 	 	 	 	 	 ddkZeeej                  <   	 	 	 	 ddlZ	 	 	 	 	 	 ddmZeeej                  <   dn Zeeez<    eegh      Z eeeh      Z eefh      Z eedh      Zeez  Zeez  Zeez  Zef	 	 	 ddoZdpdq	 	 	 ddrZds ZdpdqdtZ dduZddvZddwZy# eE$ r Y w xY w)    )annotations)CallableSequenceN)TypeVarAnyUnion)ad_checkpoint)api)api_util)callback)config)core)custom_derivatives)dtypes)effects)lax)linear_util)mesh)numpy)pjit)	shard_map)sharding_impls)source_info_util)traceback_util)	tree_util)SymbolicZero)ad)batching)mlir)partial_eval)PartitionSpec)tree_flatten)tree_mapFlatTree)tree_unflatten)Array)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/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/checkify.pypopattrr9   O   s    X#	#x	*    c                T    t               }t        | ||      |u sJ t        | ||       y r2   )objectr3   setattr)r5   namer7   sentinels       r8   
setnewattrr@   T   s,    X(	dH	%	11	1	#tSr:   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 r2   traceback_info)selfrD   s     r8   __init__zJaxException.__init__^   s
    (Dr:   c                .    t        j                  |        y r2   )jturegister_pytree_node_class)clss    r8   __init_subclass__zJaxException.__init_subclass__c   s    ""3'r:   c                    g | j                   fS r2   rC   rE   s    r8   r"   zJaxException.tree_flattenf   s    ##$$r:   c                    ~ | |      S r2    rJ   metadatapayloads      r8   r%   zJaxException.tree_unflatteni   s    x=r:   c                    t         r2   )NotImplementedErrorrM   s    r8   get_effect_typezJaxException.get_effect_typen   s    
r:   N)returnErrorEffect)
__name__
__module____qualname____doc__rF   rK   r"   classmethodr%   rU   rO   r:   r8   r/   r/   [   s-    S)
(%  r:   T)eqfrozenc                  *    e Zd ZU ded<   ded<   ddZy)rW   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r2   )shapestrdtype).0sds     r8   	<genexpr>z7ErrorEffect.__lt__.<locals>.<lambda>.<locals>.<genexpr>y   s)      #=') %'HHc"((m#< #=s   +-)tuplera   xs    r8   <lambda>z$ErrorEffect.__lt__.<locals>.<lambda>y   s    U #=-.^^#= = r:   c                >    t        | j                         |       fS r2   )rf   r`   )rm   ra   s    r8   rn   z$ErrorEffect.__lt__.<locals>.<lambda>{   s    ALL)<?; r:   rO   )rE   otherunpackra   s      @r8   __lt__zErrorEffect.__lt__x   s"    =L;F4L6%=()r:   N)rp   rW   )rX   rY   rZ   __annotations__rr   rO   r:   r8   rW   rW   r   s     ! 00*r:   rW   c                      e Zd Zd Zd Zy)DivisionByZeroErrorc                     y)Nzdivision by zerorO   rM   s    r8   __str__zDivisionByZeroError.__str__   s    r:   c                "    t        t        d      S NrO   )rW   ru   rM   s    r8   rU   z#DivisionByZeroError.get_effect_type   s    *B//r:   N)rX   rY   rZ   rw   rU   rO   r:   r8   ru   ru      s    0r:   ru   c                  @     e Zd Z fdZd Zed        Zd Zd Z xZ	S )NaNErrorc                2    t         |   |       || _        y r2   )superrF   prim)rE   rD   primitive_name	__class__s      r8   rF   zNaNError.__init__   s    	G^$DIr:   c                6    g | j                   | j                  ffS r2   )rD   r~   rM   s    r8   r"   zNaNError.tree_flatten   s    $$dii011r:   c                     | | S r2   rO   )rJ   rQ   _s      r8   r%   zNaNError.tree_unflatten   s    >r:   c                "    t        t        d      S ry   )rW   r{   rM   s    r8   rU   zNaNError.get_effect_type   s    x$$r:   c                "    d| j                    dS )Nznan generated by primitive: .)r~   rM   s    r8   rw   zNaNError.__str__   s    )$))A66r:   )
rX   rY   rZ   rF   r"   r\   r%   rU   rw   __classcell__r   s   @r8   r{   r{      s+    2  %7r:   r{   c                  @     e Zd Z fdZd Zed        Zd Zd Z xZ	S )OOBErrorc                N    t         |   |       || _        || _        || _        y r2   )r}   rF   r~   operand_shape_payload)rE   rD   r   r   rR   r   s        r8   rF   zOOBError.__init__   s&    	G^$DI&DDMr:   c                b    | j                   g| j                  | j                  | j                  ffS r2   )r   rD   r~   r   rM   s    r8   r"   zOOBError.tree_flatten   s*    ]]Od11499d>P>PQRRr:   c                     | g ||d    S Nr   rO   rP   s      r8   r%   zOOBError.tree_unflatten   s    %%'!*%%r:   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   rM   s    r8   rw   zOOBError.__str__   sW    ''( )]]1%&&A}}Q DMM!,<+=RA Br:   c                h    t        t        t        j                  dt        j
                        f      S )N)   )rW   r   r
   ShapeDtypeStructnpint32rM   s    r8   rU   zOOBError.get_effect_type   s#    x#"6"6tRXX"F!HIIr:   
rX   rY   rZ   rF   r"   r\   r%   rw   rU   r   r   s   @r8   r   r      s.    S & &BJr:   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 r2   )r}   rF   
fmt_stringargskwargs)rE   rD   r   akr   s        r8   rF   zFailedCheckError.__init__   s%    	G^$ DODIDKr:   c                b    | j                   | j                  f| j                  | j                  ffS r2   )r   r   rD   r   rM   s    r8   r"   zFailedCheckError.tree_flatten   s.    YY$  $//24 4r:   c                &    |\  }} | g ||i |S r2   rO   )rJ   rQ   rR   r   r   s        r8   r%   zFailedCheckError.tree_unflatten   s#    LD&**4*6**r:   c                h     | j                   j                  | j                  i | j                  dz   S )Nz (`check` failed))r   formatr   r   rM   s    r8   rw   zFailedCheckError.__str__   s0    "DOO""DII==!" #r:   c                    t        j                  | j                  | j                  f      }t	        t
        t        d |D                    S )Nc              3  p   K   | ].  }t        j                  |j                  |j                         0 y wr2   )r
   r   re   rg   )rh   rm   s     r8   rj   z3FailedCheckError.get_effect_type.<locals>.<genexpr>   s%     Cc""177AGG4Cs   46)rH   tree_leavesr   r   rW   r   rk   )rE   valss     r8   rU   z FailedCheckError.get_effect_type   s=    ??DIIt{{34DCdCCE Er:   r   r   s   @r8   r   r      s,    4 + +#Er:   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   valuesrD   r}   rF   )rE   rD   r   s     r8   __post_init__zBatchedError.__post_init__   s4    $,,3356q9HHN	G^$r:   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maprf   )rh   idxes      r8   rj   z'BatchedError.__str__.<locals>.<genexpr>   s9      ?a (		#c3-(@'AA3G ?s   24)r   r   itemsrM   s    r8   rw   zBatchedError.__str__   s/    99 ?#'#5#5#;#;#=? ? ?r:   )rX   rY   rZ   rs   r   rw   r   r   s   @r8   r   r      s    44%
?r:   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_exceptionrf   )rE   exps     r8   getz	Error.get   s!    



C
Xor:   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   r   re   r   r   _get_batched_exceptionr   r   r%   r   intr   )rE   min_code
cur_effecterror_effectcodes        r8   r   zError.get_exception   s    
3rxx**,-.((**hj $

 0 0 2 &
,::l#H%J	& 
	dnnS];"mmJ79 	9r:   c                    t        |        y r2   )_check_errorrM   s    r8   throwzError.throw  s
    r:   c                *    d| j                          dS )NzError())r   rM   s    r8   rw   zError.__str__  s    DHHJ<q!!r:   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 r2   rO   )rm   is     r8   rn   z.Error._get_batched_exception.<locals>.<lambda>  s
    AaD r:   )r   re   r   r   r   ndindexr   r   r#   r   r%   r   r   r   )
rE   re   r   r   r   r   r   r   rR   	jax_errors
             r8   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' -((r:   c                    i | j                   ||i}i | j                  ||i}i | j                  ||i}i | j                  |}	t	        |||	|      S r2   )r   r   r   r   r   )
rE   effect_typepredr   rQ   rR   new_errs	new_codesnew_payloadnew_metadatas
             r8   _updatezError._update  sn    4$**4d 34H54::5+t!45I=T]]={G&<=K1dnn11L9lK@@r:   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 r2   )jnponesre   rg   )r   s    r8   rn   z0Error._add_placeholder_effects.<locals>.<lambda>/  s    sxx9 r:   )
r   copyr   r   keysr   r#   ra   r   r   )rE   r   new_errnew_coder   effects         r8   _add_placeholder_effectszError._add_placeholder_effects&  s    jjooGzz H--$$&K 	tzz(	("96;N;NOQF  (DNNK@@r:   c                4    t        j                  | g|i |S r2   )dataclassesreplace)rE   r   r   s      r8   _replacezError._replace5  s    t5d5f55r:   c                `    | j                   | j                  | j                  f| j                  fS r2   )r   r   r   r   rM   s    r8   r"   zError.tree_flatten:  s$    ZZT]]3dnnFFr:   c                $    |\  }}} | ||||      S r2   rO   )rJ   rQ   datar   r   rR   s         r8   r%   zError.tree_unflatten=  s    D$tT8W--r:   N)rV   z
str | None)rV   zJaxException | None)rV   zBatchedError | None)r   rW   )r   zset[ErrorEffect])rX   rY   rZ   rs   r   r   r   rw   r   r   r   r   r"   r\   r%   rO   r:   r8   r   r      s`     
! 	!!&&$"
*AA6
G . .r:   r   r   c                v    t               }|j                         }t        |      \  }}t        | ||||i||      S r2   )	next_coderU   r"   update_error)errorr   	new_errorr   r   r   r   s          r8   assert_funcr   E  s@    	$))++*95+|	eT4$)={K	XXr:   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   rQ   rR   r   err_of_typeout_errout_codecur_payloadout_payloads              r8   r   r   K  s    U3+$'ZZU[[__["%EtL("";5+9,,SZZE{T[\KK	{GXx	MMr:   c                     | | \  }}t        j                  ||f      \  }}|j                  |t        |j                  j                               f       |S r2   )rH   r"   storesetr   r   )fr   invalsr   outout_valsout_trees          r8   %_flatten_and_get_error_metadata_thunkr  Y  sP    &z*%''5(H++xU[[--/012	/r:   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  rO   c              3  2   K   | ]  }t        |        y wr2   )r-   rh   cs     r8   rj   z(default_checkify_rule.<locals>.<genexpr>v  s     5/!$5s   
debug_infoout_axes)closurec                 X            d   j                   t              z
  } g d| z  S )Nr   )r   )
num_leaveslen)out_err_numrQ   out_val_axess    r8   out_axes_thunkz-default_checkify_rule.<locals>.out_axes_thunk  s3    JqM,,s</@@k/tK/,//r:   r2   in_axes)r  r  )bindrH   r"   r  dictpop
isinstancer   ClosedJaxprjaxprconstsrk   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  rQ   r  s                     @@r8   default_checkify_ruler-  `  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	r:   c                |    t        j                  |      \  }}t        | j                  | j                  ||g|| S r2   )rH   r"   checkify_jaxpr_flatr  r  )r  r%  r   r   r'  r(  s         r8   checkify_jaxprr0    sI    ''.(H	U[[%,,+X
I8@
ICG
I Ir:   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 r2   )r  r   Literalr7   )varenvs    r8   read_envz%checkify_jaxpr_flat.<locals>.read_env  s#    #t||$WWns8Or:   c                    || <   y r2   rO   )r4  r7   r5  s     r8   	write_envz&checkify_jaxpr_flat.<locals>.write_env  s    CHr:   )
name_stackr   )r4  z	core.Atom)r4  zcore.Varr7   r   )r(   r  rH   r%   r   	last_usedr.   	constvarsinvarseqnsr   error_checksr   r$  r   r   r-  r   current_name_stacksource_infor9  user_context	tracebackr&  multiple_resultsoutvarsclean_up_dead_vars)r  r  r%  r(  r   r'  in_argsr   r:  r6  r8  eqnr  checkify_ruler9  outvalsr5  s                   @r8   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r2   rl   r
  s     r8   rj   z/checkify_jaxpr_flat_hashable.<locals>.<genexpr>  s     ..   )rk   r/  )r  hashable_constsr%  r(  r   r  s         r8   r!  r!    s(    .o..&	UFNH	Lt	LLr:   c                N     | | }t        |      \  }}|j                  |       |S r2   )r"   r   )r   r   r   ansr  s        r8   flatten_fun_outputrP    s*    	4#s#-#x++h	*r:   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 r2   rO   )rm   r   s     r8   rn   z#_reduce_any_error.<locals>.<lambda>  s
    af r:   r   )
init_errorr   r   r   r   r   argsortr#   r   r   r   )
r   	out_errorr   errscodespayloadsreduced_idxr   r   rR   s
             r8   r#  r#    s    )kk&&( Il"[[6"[[6"^^L9 %D ++d#B'K"#D$(%#:<D$!!,dBHII   5?? ;)	r:   checkc                     y)NTrO   )r   s    r8   rn   rn     s    r:   c                   |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(  NrO   )rh   r   vs      r8   rj   z_pp_check.<locals>.<genexpr>  s&      .Va*_ a& .rL  )
annotation  )r@  r   	summarizer9  sortedr&  r   r   pptextr$  r>   pp_kv_pairspp_varsr<  concat)rG  contextsettingsrb  name_stack_annotationtrimmed_paramsrhss          r8   	_pp_checkrq    s    '' !**3??;-1  '11 s99:!<7;  .szz/?/?/A . ..	cmm((5J	K			.'8	<	c	T\\#**g>	>	@# 
b*5<<	==r:   c                      e Zd Zy)JaxRuntimeErrorN)rX   rY   rZ   rO   r:   r8   rs  rs    s    r:   rs  c                    |rg S t        | |      }|j                         }|rSt        j                  |j                  j                               }|j                  |       t        t        |            |g S r2   )	r%   r   r   filter_tracebackrD   as_python_tracebackwith_tracebackrs  rf   )r(  debugr   r   excfiltered_tbs         r8   
check_implr{    sm    
I
4
(%# 11..02K{#
#c(
#,	)r:   c                b    ~g t        t        | |      j                  j                               fS r2   )r   r%   r   r   )r(  rx  r   s      r8   check_abstract_evalr}    s+    	S$/55::<=	==r:   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d      \  }}}|S )NTF)r   tokenoperandsoperand_avalsresult_avalshas_side_effectreturns_token)r   xla_runtime_errorsvaluefunctionalization_errorr   emit_python_callbackr   r   
python_errr   avals_in	avals_out)ctxr(  rx  r   out_opr   s         r8   check_lowering_ruler    sr    
I		"	"	(	(
!!..	I%%j(;&&,&!Q 
-r:   c                    | rg S t         r2   )r  )rx  r   r   s      r8   check_lowering_rule_unsupportedr    s    
Ir:   c                4    t        | |      }t        |       g S r2   )r%   r   )r(  r   r   s      r8   r  r  $  s    
4
(%u	)r:   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r2   )r   
not_mappedre   )rh   rm   dims      r8   rj   z&check_batching_rule.<locals>.<genexpr>1  s1      1vq#H/// ggcl 1s   .0c              3  R   K   | ]  \  }}t        j                  ||         y wr2   )r   bdim_at_front)rh   r   dsizes      r8   rj   z&check_batching_rule.<locals>.<genexpr>3  s,      =a ((At4 =s   $'rx  )nextzipr%   r   )batched_args
batch_dimsr(  rx  errr  s        @r8   check_batching_ruler  0  sU    	 1\:)F 1 
1$=!,
;=,x.#s% 	R-r:   c               6    t        j                  | ||d g g fS N)r(  rx  )check_pr  )primalsr   r(  rx  s       r8   check_jvp_ruler  :  s    	,,(%8	R-r:   z$dict[core.Primitive, ErrorCheckRule]r>  c                 >    t        j                         j                  S r2   )r   currentrB  rO   r:   r8   get_tracebackr  F  s    		!	!	#	-	--r:   c                J     | j                   |i |}t        | |||      }||fS r2   )r  
check_nans)r~   r   r%  in_valsr&  r  r  s          r8   nan_error_checkr  I  s0    		7%f%#44#	c/r:   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   
issubdtyperg   prng_keyr   r   isnanrl   s    r8   r  zcheck_nans.<locals>.isnanR  s4    &//277399Q<  r:   )r{   rC  r   r   arrayr   r  r>   )r~   r   r%  r  r  rm   any_nanss          r8   r  r  N  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
                  |      }t        j
                  |j                  |j                        }t        j
                  ||j                        }|dk  ||z   |kD  z  }t        ||t        |j                        |j                        }t        | t	        j                  |      t        t               d|j                  |            } | |fS )Nslice_sizesrg   r   dynamic_slice)r   dynamic_slice_pr  r   r   r  r   re   rg   oob_payloadrangendimr   r   r  )	r   r%  operandr  start_indicesr  operand_dimsoob_maskrR   s	            r8   dynamic_slice_error_checkr  q  s      R=RkR#^##:))M*-'--}/B/BC,M,?,?@+aMK$?,$NO(-w||1DgmmT'
eSWWX./[b[h[hjq0r
s%	r:   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  re   r   r  r  r  r   r   r  )
r   r%  r  updater  r  r  update_dimsr  rR   s
             r8    dynamic_update_slice_error_checkr    s    ""''H-H#^##:'--(,&+))M*-aMK$?,$NO(-w||1DgmmT'
eSWWX.J`biboboqx0y
z%	r:   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  re   r  start_index_mapr   expand_dimsrk   r  astyperg   r  r   r   r  )r   r%  r  r  r  r  r  r  r  r  r  dnumsr  num_batch_dimsupper_boundr  rR   s                    r8   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%	r:   c                    t         |v rGt        j                  t        j                  |d            }t	        | |t        t                           } t        t        j                  | |||      S )z$Checks for division by zero and NaN.r   )	ru   r   r   equalr   r  r  r   div_p)r   r%  rm   yany_zeros        r8   div_error_checkr    sO    N*wwsyyA'Hx)<]_)MNE	E>1a	@@r:   c                |   t        j                  t        j                  |             }t        j                  ||j                        }t        j
                  |      |d      }t        j
                  |      |   }t        j                  |      |   }t        j
                  |||gt        j                        }	|	S )Nr   r  )	r   argminlogical_notunravel_indexre   r  ravelr   r   )
r  indicesdims_mapr   flat_idx	multi_idxoob_axisoob_axis_size	oob_indexrR   s
             r8   r  r    s    ZZ12('--8)YYx 2/())M*84-ii *)IIy(M:"((K'	.r:   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  re   inserted_window_dimsappendupdate_window_dimsr   r  scatter_dims_to_operand_dimsint64minimumiinforg   maxr   broadcast_in_dimr   lessgreaterr  
logical_orr  r   )r  r  updatesr  r  posr   r  	lower_oob	upper_oobr  rR   s               r8   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>   re   r   r  )r~   r   r%  r  r  r  r   r  r  r  r  r  r  out_of_boundsrR   	oob_errors                   r8   scatter_error_checkr    s     			wl!5F+N	 	 	# ^##:&wBST-}		7=='J)
e]I
6%
T5.#
6%	r:   c                      e Zd Zd Zy)ErrorEffectsc                    || _         y r2   )r7   )rE   r7   s     r8   rF   zErrorEffects.__init__  s	    DHr:   N)rX   rY   rZ   rF   rO   r:   r8   r  r    s    r:   r  c                8     fd} j                   j                  j                         }t        j                  |i f      }t        j                  |||      \  }}|j                         \  }	}
|
j                         j                  }
||	j                  |
fS )Nc                     t        j                  j                  g|  \  }}t        t	        |j
                  j                                     }||f|fS r2   )r/  r  r  r  r   r   r   )r  r   r  error_effectsr%  r(  r  s       r8   fun_wrappedz,jaxpr_to_checkify_jaxpr.<locals>.fun_wrapped  sW    $U\\>8F>DFJE3 U[[%5%5%7!89M3<&&r:   )r  r  with_unknown_namesr$   flattenpetrace_to_jaxprrq   	unflattenr7   tree)r  r%  r(  flat_err_and_in_valsr  r  
args_avalschecked_jaxprfull_out_avals	out_avalsr
  s   ```        r8   jaxpr_to_checkify_jaxprr    s    
' {{%%88:*!5r :;*"$"3"3KZ"X-+224)]))+//-			55r:   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 r2   r  )jxprr   r   r%  r(  in_avalss      r8   get_error_effects_from_jaxprz6cond_error_check.<locals>.get_error_effects_from_jaxpr  s&    +D.( 7-57MAq'Nr:   c              3  :   K   | ]  }t        |g   y wr2   r  )rh   r  r%  r(  r  s     r8   rj   z#cond_error_check.<locals>.<genexpr>  s/      &K9= 
5+35&Ks   branchesr   r   rS  )rH   r"   r   r   get_avalr   r   unionr+   r   cond_pr  rk   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    `                  @@r8   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   rH   r"   r   r  r   r  r  move_binders_to_frontr   scan_pr  r%   )r   r%  r.  r/  r  r0  r1  r2  r3  r4  in_flatr  carryxsr7   	xs_mappedr'  r(  new_in_avalr   r   r%  checked_jaxpr_r  tomover  new_in_flat
new_linearerr_and_outr  r  s                                  r8   scan_error_checkrB  ,  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}| j                  d  }t        j                  |t        j                  g ||j                  i f      |j                  j                  j                               \  }}t        j                  |      \  }	}
t        t         j                  |	      }	g |	||j                  }t        |||
g| \  }}}|||fS )Nc                 l    t        | g      \  }} | }t        j                   g ||        |S r2   )r(   r   dce_sink)c_consts_and_valsc_constsr   r  body_fc_consts_numcond_fs       r8   
new_body_fz-checkify_while_body_jaxpr.<locals>.new_body_fT  s=     1L>BNHd
$-CLL((C()Jr:   r  )r   jaxpr_as_funr  r  r  r$   r  r  r  r  rH   r"   r   r   r  )
cond_jaxpr
body_jaxprr%  r   rI  rK  c_consts_avalsr  r   r'  r(  r  r  r
  rH  rJ  s       `         @@r8   checkify_while_body_jaxprrP  N  s    Z(&Z(& &&}5.?.?:+>+>?DE!!,,??AC(% ''.(H)(K8KnKz7J7JK#:^X$>(<$> %=	-	''r:   c                    | j                   }| j                  } | j                  | j                  |d       }t	        j
                  ||      S )zAConstructs a checked jaxpr which does not output its error value.N)rD  )r  r  r   rD  r   r  )r  r)  r  	new_jaxprs       r8   ignore_error_output_jaxprrS  h  sD     <<&
++%mmEMM./$BmC)			)V	,,r:   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_nconstsrM  body_nconstsrN  )r  re   
ValueErrorr(   r0  rP  r   rH   r"   r  r  r6  r   r   r   r  rS  r   while_pr  r%   )r   r%  rU  rM  rV  rN  r8  rG  b_constsr9  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_jaxprr?  all_out_valsr  s                             r8   while_loop_error_checkrc  p  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\:*%	r:   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)rH   r"   rk   r   r   r   r  r  r  r   UNSPECIFIEDr   jit_pr  r%   )r   r%  r  re  rf  rg  rh  r  ri  r>   rj  rk  rl  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_layoutsrA  s                                 r8   pjit_error_checkrx    sC    ''.(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@/

#%!'/+ 
+	..r:   c               \   t        j                  |       \  }}g ||}t        t        t        j
                  |            }t        t        j                  |      ||g| \  }	}
}|	j                  |	j                  c}\   t        j                  j                  |d|i|}t        |
|      S )Nr  )rH   r"   rk   r   r   r   r  r  close_jaxprr  r  r	   remat_pr  r%   )r   r%  r  ro  r&  r'  r(  rp  r  r=  r  r   r  rA  s                 r8   remat_error_checkr|    s    ''.(H%(%W%+3t}}k23( 7nnU^X!B8@!B.(A$**N,A,A-%%**K 5} 5-35+	+	..r:   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:                  t=        j>                        i f      j@                  jB                        \  }d d d        d d d        g t        |jD                        gz  |}tG        jH                  tG        jJ                  t        jL                  j@                  jB                        j@                  jN                        }tQ        d	j@                  ||d|}t        jR                  jU                  |      \  }}t        jR                  jV                  |g|i |}tY        ||      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   #x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:  outsrW  r   r  rq  s       r8   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_specsrO   )-r   rW  rH   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  rz  r  extend_axis_env_ndre   r   r  r$   r  rk   r  r  r  
axis_namesr  r  r   r  r  r  shard_map_pget_bind_paramsr  r%   )r   r%  r  r  r  ro  r   r   r'  r(  r)  new_in_specsrp  r  r~  r  r   ra  sharderr  r   r  new_out_specssubfun
new_paramsrA  r  rq  s                             @@r8   shard_map_error_checkr    s7    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 3F4E4Ei4P 3((!% 6 67<= &&113M13 3 Ma(),>>L)L-ll4??}/B/B/M/MN=//&   		* $$44Z@-!Z""''KK
K+	+	..K     3 3 3 3sa   *M)M&MMM)'N=AM6NMMM&	!M))M36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 )Nr  )rH   r"   r  r   r   r   r/  r  r  r  r  lift_jvpr  rP  r   custom_jvp_call_pr  merge_linear_auxr%   r(   r  )in_errr%  r0  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                       r8   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	(	r:   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   r  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  r0  num_errss                       r8   r  zlift_jvp.<locals>.jvp7  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  r0  r  r  s   ``` r8   r  r  5  s"    F" 
cm&>&>	??r:   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   r  )	r   r:  r  	fwd_jaxpr
fwd_constsxs_without_constsfwd_jaxpr_thunkr0  r  s	         r8   checkified_fwdz,custom_vjp_call_rule.<locals>.checkified_fwdX  sn    SqS	41:B89uXY/B8O88%@Iz:;??9jE3DEEr:   c                 2    g dz   j                   |  S )Nr2   )r  )r   bwdr  s    r8   rn   z&custom_vjp_call_rule.<locals>.<lambda>c  s%    $Qgh&6$Q9I9I9I49P$Q r:   )r'  symbolic_zeros)rH   r"   r  r  r   r   r   r/  r  r  r  r  rP  r   custom_vjp_call_pr  r  r%   )r  r%  r  r  r0  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      ```                  @r8   custom_vjp_call_ruler  J  s`   
 ''/(H  (<<+Z-=-="))>8E!!,,.. "G".,F <<3B3M3MO	Q!$
1$);<R)S&,1166,
%%%+4#%( )),E#|&a&'7BGX 
(	 XG	(	r:   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 )NrS  )
r%   rT  r   r   r   r   r`   r   r   r   )r   r%  r(  rx  r   r   discharged_errorrecharged_errorr   r   r   rR   s               r8   check_discharge_ruler  t  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	r:   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       j	                         }t        j                  |||      \  }}t        j                  |      \  }}t        |t        g| \  }	}
|	|j                  |
      j                         fS )NrO   c                       i S r2   rO   )r   r   r   s   r8   rn   z/checkify.<locals>.checked_fun.<locals>.<lambda>  s    q$)&) r:   checkify)r$   r  r   r  r  r  r  separate_constsr0  rT  update_from_listr  )r   r   r  closed_fr  jaxpr_r  r  r  r   out_flaterrorsr   s   ``         r8   checked_funzcheckify.<locals>.checked_fun  s     R)H)H$$ZD&ATTVJ))(HjIFI&&v.ME6$UFJHHOE8),,X6@@BBBr:   )r   api_boundary)r   r  r  s   `` r8   r  r    s(    v 
C 
C 
r:   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   msgrx  fmt_args
fmt_kwargss        r8   r[  r[    s    P 	sE3H3
3r:   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_checkr[  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	TypeErrorrH   r   r  r&   r   ndarrayr  r   r  r   rT  r   r  r   )	r   r  rx  r  r  	prim_nameargr   r   s	            r8   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"r:   c                   t        t        t        j                  | j                  j                                     rt        |       } t        |       \  }}t        j                  |||dS r  )
r   r   r   re   r   r   r#  r"   r  r  )r   rx  err_argstree_defs       r8   r   r     sN    RXXu{{))+	,-e$E#E*(H	x(%	@@r:   c                    t        | t              xsE t        | t              xr3 | j                  dk(  xr" | j                  t        j                  d      k(  S )NrO   bool)r  r  r&   re   rg   r   )r   s    r8   r  r  $  sJ    
T4
  )
T5
! )djjB&6 )
**(
(*r:   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       r8   r  r  *  s    D 	sD282z2r:   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    r8   check_errorr  O  s;    z 
E5	!
 !!%eY8 9 9uE"r:   )r   r   r   Boolr   r/   rV   r   )
r$  zcore.Primitiver   r   r  
core.Valuer&  r   rV   z"tuple[Error, Sequence[core.Value]])r  core.ClosedJaxprr   r   rV   ztuple[Error, list[core.Value]])
r  
core.Jaxprr  zSequence[core.Value]r(  	PyTreeDefr   r  rV   ztuple[Error, list[Any]])r   r   )rV   zcore.pp.Doc)r  r  r(  r  rV   4tuple[core.ClosedJaxpr, PyTreeDef, set[ErrorEffect]])
rM  r  rN  r  r   r   rI  r   rV   r  )r)  r   )r   r   r  r  )r  r   r%  r   r  lu.WrappedFunr  r  )r  r   r0  r   r  r  rV   r  )r  r  r  r  r  r  )r   zCallable[..., Out]r  zfrozenset[ErrorCategory]rV   z Callable[..., tuple[Error, Out]])r   r  r  rf   rx  r  rV   None)rV   r  )r   r  r  rf   rV   r  )r   r   rV   r  (  
__future__r   collections.abcr   r   r   r   	itertoolsittypingr   r   r   r   r   jax._srcr	   r
   r   r   r   r   r   r   r   r   r   r  r   r  r   r   r   r  r   r   r   r   rH   jax._src.ad_utilr   jax._src.interpretersr   r   r   r    r  jax._src.partition_specr!   r  jax._src.tree_utilr"   r#   r$   r%   jax._src.typingr&   jax._src.utilr'   r(   r)   r*   r+   r,   r-   r.   jax.experimental.shard_mapexperimentalr   ImportErrorregister_exclusion__file__r   
unsafe_mapr  
unsafe_zipr  r  r   Intr  ErrorCategoryr   r  Payloadr  r0   r9   r@   	Exceptionr/   total_ordering	dataclassEffectrW   lowerable_effectsadd_typecontrol_flow_allowed_effects"custom_derivatives_allowed_effectsremat_allowed_effectsru   r{   r   r   r   rI   r   rT  count__next__r   r   r   transformation_with_aux2r  r-  r0  r/  r!  rP  r#  	Primitiver  is_effectfulrC  rq  pp_eqn_rulesrW  rs  def_implr{  def_effectful_abstract_evalr}  r  r  r  r  register_loweringr  primitive_batchersr  primitive_jvpsErrorCheckRuler>  rs   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_pregister_staticr  r  r,  r"  rB  r7  rP  rS  rc  rX  rx  rn  r|  r{  r  r  r  r  r  r  r  r  	frozensetuser_checks
nan_checksindex_checks
div_checksfloat_checksautomatic_checks
all_checksr  r[  r  r   r  r  r  rO   r:   r8   <module>rp     sr   # .    & &  "      '    & % !  ( # % # % ) $ * & 4 6 + 1 - !P P P(( $  # #H - ! ! !( +CZCZT5[CJ^$
uRZZ&'
(MM	en
9 . $t,*'.. * - *    " "; /  $ $ - -k :  * * 3 3K @    & &{ 30, 07| 7&J| J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 
    667@6R6 6"7> ,SZZ @ ,SZZ ( (.>( ( ( O(4 - -(R 3S[[ %/L ,TZZ 	/ '8]"" #9/9/9/t $9V   ), (5  &6 B 6J11 2@)@.;@*&%5& ,& *.	&N 6J11 24 -W 
 )*+z"
($+,-
J&,. +
 1<G-G2GV (4(4 	(4T# "' A*"3J@#e(  s   /	e0 0e98e9