
    ukis             	      "   U d dl mZ d dlmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZ d dlZd dlZd dlmZmZmZ d dlmZ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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z? d dl@mAZAmBZBmCZC d dlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZR eGeScZSZTeFeUcZUZVd ZWeXZYeXZZeXZ[eZ\eZ] G d de^      Z_ e	d       G d d             Z` G d d e(d!         Za	 	 	 	 dd"Zbe#j                  	 	 	 	 	 	 	 	 	 	 dd#       Zde#j                  	 	 	 	 	 	 	 	 	 	 dd$       Zei Zfd%egd&<   i Zhd%egd'<   i Zid%egd(<   	 	 dd)Zjed*d+d,d-e,f   Zk G d. d!e)      Zle$j                  	 d	 	 	 	 	 	 	 dd0       Zne#j                  	 	 	 	 	 	 	 	 	 	 dd1       Zpe#j                  	 	 	 	 	 	 	 	 	 	 dd2       Zq	 	 	 	 	 	 dd3Zre#j                  	 	 	 	 	 	 	 	 	 	 dd4       Zse#j                  	 	 	 	 	 	 	 	 	 	 dd5       Zt ed,d6g      Zu ed-d6g      Zv ed+g       Zw G d7 d*e      Zx	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd8Zy	 	 	 	 dd9Zz	 	 	 	 	 	 	 	 	 	 dd:Z{eNdd;       Z|eNdd<       Z}eNdd=       Z~eNdd>       Zdd?Z	 	 	 	 	 	 	 	 dd@Z	 d	 	 	 	 	 	 	 	 	 ddAZeN	 	 	 	 	 	 	 	 ddB       ZdC Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddDZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddEZdF ZeN	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddG       ZeZ G dH dI      Z e       Z G dJ dK      Z e       Z G dL dMe      Zeeeef   Zeeef   ZddNZe^ee4df   ee4df   ee   ee   ee1   f   ZeedOef   ee   ee   e4gef   Zi ZdPegdQ<   	 	 	 	 	 	 	 	 	 	 	 	 ddRZeee   ee   ee   ee   eXeege^eef   f   Zeeeef   e.ge.f   Z	 	 	 	 	 	 ddSZeej:                  dT	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddUZeee   ee   ee   ee   eXeXeege^eef   f   ZedV	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddWZeN	 	 	 	 	 	 	 	 	 	 	 	 ddX       Z eedYdZ       eejD                  <    eedYd[       eejF                  <   dd\Zdd]Zdd^Z eNe      Z	 	 	 	 	 	 dd_Z eeNd/`      	 	 	 	 	 	 dda       Z	 d	 	 	 ddbZ	 d	 	 	 ddcZdddZeN	 	 	 	 dde       Zeee   e4ge^ee   ee4df   f   f   Z	 	 	 	 	 	 ddfZi Zdgegdh<   	 	 ddiZeeejD                  <   eN	 	 ddj       Z	 	 ddkZeeejF                  <   eNddl       ZddmZeNddn       Z	 	 ddoZeN	 	 ddp       Zdq ZddrZ	 	 ddsZddtZeNddu       Z G dv dwejR                        Zdx ej~                  e<   ddyZ G dz d{e      Z G d| d}      Zeeeedf      eee.   ge^eeedf      ee4df   f   f   Zi Zd~egd<   ee4ge^eeeXdf      ee4df   f   f   Zi Zdegd<   	 	 ddZeOdd       Z	 	 	 	 	 	 ddZe	 G d d             Z G d dejP                        Ze#j                  d        Zi Zd%egd<   e#j                  d        Zd Ze#j                  d        ZeN	 	 	 	 	 	 	 	 dd       Ze$j                  dd/d/d	 	 	 	 	 	 	 	 	 	 	 dd       Zd Z	 	 	 	 	 	 ddZ G d d      ZeZeZddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZd ZddZeNdd       Zd ZeNd        Zd ZddZd Zy)    )annotations)
namedtuple)CallableSequenceN)	dataclass)partial)Any
NamedTupleUnion)finalizerefReferenceTypeWeakValueDictionary)ad_util)api_util)config)core)dtypes)effects)linear_util)profiler)source_info_util)xla_metadata_lib)TraceTracerTraceTagJaxprLiteralget_avalAbstractValueClosedJaxprnew_jaxpr_eqnVarDropVarAtomJaxprEqn	Primitivemapped_avalunmapped_avalget_referentJaxprEqnContexttypeof)
SourceInfo)AbstractRef
ReadEffect)	PyTreeDeftreedef_tupleFlatTree)unzip2safe_zipsafe_maptoposort
split_listmerge_listspartition_list
OrderedSetas_hashable_functionweakref_lru_cachemulti_weakref_lru_cache	subs_listHashableFunctionforeachc                    | S N xs    ]/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/interpreters/partial_eval.pyidentityrG   8   s        c                  T    e Zd ZdZd	dZed
d       Zedd       ZddZddZ	ddZ
y)
PartialValao  Partial value: either a known value or an unknown (abstract) value.

  Represented as a pair `(aval_opt, const)` of one of two kinds:
  * `(None, <Constant>)` indicates a known value, where the constant is either a
    Tracer or satisfies `core.valid_jaxtype(const)`;
  * `(<AbstractValue>, None)` indicates an unknown value characterized by an
    abstract value.
  c                6   |\  }}t         j                  j                  ret        |t        t        d       f      sJ |       |6t        |t        j                        st        j                  |      sJ |       |d u |d u z  sJ t        j                  | |      S rB   )r   enable_checksvalue
isinstancer    typer   r   valid_jaxtypetuple__new__)clsxspvconsts       rF   rR   zPartialVal.__new__J   s    IB!!]DJ78<"<8mz%=  '0*/0 ( DjUd]+++==b!!rH   c                    t        d |f      S rB   rJ   )rS   rV   s     rF   knownzPartialVal.knownU   s    tUm$$rH   c                    t        |d f      S rB   rX   )rS   avals     rF   unknownzPartialVal.unknownY   s    tTl##rH   c                    | d   d u S )Nr   rC   selfs    rF   is_knownzPartialVal.is_known]   s    7d?rH   c                    | d   | d   S dS )z)Get the known value, if known, else None.r   N   rC   r^   s    rF   	get_knownzPartialVal.get_known`   s    1go47/4/rH   c                F    | j                         }|t        |      S | d   S )zEGet AbstractValue directly (if unknown) or from the constant (known).r   )rc   r   r_   rY   s     rF   r   zPartialVal.get_avald   s'    NNEe_!WnrH   N)rT   z'tuple[AbstractValue | None, core.Value])rV   z
core.ValuereturnrJ   )r[   r    rf   rJ   rf   bool)rf   zcore.Value | Nonerf   r    )__name__
__module____qualname____doc__rR   classmethodrY   r\   r`   rc   r   rC   rH   rF   rJ   rJ   A   sC    	" % % $ $0rH   rJ   T)frozenc                  "    e Zd ZU ded<   ded<   y)EffectHandlezlist[Tracer]parentsJaxprEqnReciperecipeNrj   rk   rl   __annotations__rC   rH   rF   rq   rq   l   s    rH   rq   c                       e Zd Zd fdZd ZddZddZddZddZddZ	d Z
d	 Zd
 ZddZddZd Zd Zd Zd Z xZS )
JaxprTracec                    t         |           || _        || _        || _        d| _        g | _        t        j                         | _	        y NF)
super__init__
name_stacktagparent_tracerequires_loweffect_handlesitcountcounter)r_   r   r}   r~   	__class__s       rF   r|   zJaxprTrace.__init__s   sA    	G DODH$DD/1D88:DLrH   c                    t        |t              rR|j                  j                  | j                  u r0|j                  | u r|S t        | |j                  t        |            S | j                  |      S rB   )rN   JaxprTracer_tracer~   pvalFreeVar	new_const)r_   rE   s     rF   to_jaxpr_tracerzJaxprTrace.to_jaxpr_tracer|   sV    ![!ahhlldhh&>	
T	444^^ArH   c                B    t        | t        j                  |      d       S rB   )r   rJ   rY   )r_   vals     rF   r   zJaxprTrace.new_const   s    tZ--c2D99rH   c                l    t        |      }t        | t        j                  |      t	        ||            S rB   )r   r   rJ   r\   r   r_   r   r[   s      rF   new_instantiated_literalz#JaxprTrace.new_instantiated_literal   s,    C=DtZ//5wsD7IJJrH   c                j    t        |      }t        | t        j                  |      t	        |            S rB   )r   r   rJ   r\   ConstVarr   s      rF   new_instantiated_constz!JaxprTrace.new_instantiated_const   s)    C=DtZ//5x}EErH   c                    |j                         }|8|j                         }t        | t        j	                  |      t                     S | j                  |      S rB   )rc   r   r   rJ   r\   LambdaBindingr   )r_   r   rV   r[   s       rF   new_argzJaxprTrace.new_arg   sK    NNE
 }]]_dz11$7II^^E""rH   c                    |j                   j                         }||S t        j                  |      r| j	                  |      S | j                  |      S rB   )r   rc   r   is_literalabler   r   )r_   tracerrV   s      rF   instantiate_constzJaxprTrace.instantiate_const   sN    KK!!#E}m			U	#,,U33**511rH   c                    | j                  |      j                  j                         }|J t        j                  | j
                        5  t        j                  |      cd d d        S # 1 sw Y   y xY wrB   )r   r   rc   r   set_current_tracer   cur_qdd)r_   rE   rV   s      rF   r   zJaxprTrace.cur_qdd   s`      #((224E}U!!$"3"34 #||E"# # #s   A,,A5c                   t        j                  | j                        5  |t        v r1t	        | j
                  |      }t        |   | g|i |cd d d        S | j                  |||      cd d d        S # 1 sw Y   y xY wrB   )r   r   r   custom_partial_eval_rulesmapr   default_process_primitive)r_   	primitivetracersparamss       rF   process_primitivezJaxprTrace.process_primitive   s    			 1 1	2 J	/	/d**G4(3DM7MfMJ J
 --i&IJ J Js   0A6A66A?c           	     "   t        | j                  |      }|D cg c]  }|j                  j                          }}t	        d |D              r|j                  | j                  ||      S t        | j                  |      }|D cg c]  }|j                   }} |j                  |i |\  }}| j                         }	t        j                         j                  |	      }
|j                  r|D cg c]"  }t        | t         j#                  |      d       $ }}t%        | ||||||
      }t&        j(                  j+                  |      r%| j,                  j/                  t1        ||             |D ]	  }||_         |S t        | t         j#                  |      d       }t%        | ||g||||
      }t&        j(                  j+                  |      r%| j,                  j/                  t1        ||             ||_        |S c c}w c c}w c c}w )Nc              3  $   K   | ]  }|d u 
 y wrB   rC   .0cs     rF   	<genexpr>z7JaxprTrace.default_process_primitive.<locals>.<genexpr>   s     
)Q1D=
)   r}   )r   r   r   rc   allbind_with_tracer   r   r[   abstract_eval_current_truncated_name_stackr   currentreplacemultiple_resultsr   rJ   r\   new_eqn_reciper   partial_eval_kept_effects	filter_inr   appendrq   rt   )r_   r   r   r   tconstsavalsout_avaleffsr}   sourcer[   out_tracerseqn
out_tracers                  rF   r   z$JaxprTrace.default_process_primitive   s    $&&0G*12Qaff 2F2

)&
))&&t'8'8&&II$(('2G$%QVV%E%,Y,,e>v>NHd335J%%'//:/FF!!!)+ !z'9'9$'?F +k +4+y&$!#c		*	*	4	4T	:""<#=>*!sAH*tZ%7%7%A4Hj4:,	!41c		*	*	4	4T	:""<#=>j1 3 &
+s   !HH5'Hc           	     z   t        | j                  |      }t        j                  |      }|r || ||||      S t        j                  |      xs d }t        |D cg c]  }|j                   c}      \  }}	}
|j                         }t        || j                  |j                  d      }t        |t        |      t        |	            \  }} |||d      }|ft        |
      z   }|j                  | j                  ||      } |       \  }}}}}t        |t!        |      g      \  }}|
}t#        |||      }t        | j$                  t        | j&                  |            }t        | j                  |      }|D cg c]  }|j)                         r| }}t+        |      t+        |      z   }t-        |      }t/        |t0        j2                        rt5        |      }t7        ||      } ||t        t8        j:                  |      |      }|D cg c]"  }t=        | t>        jA                  |      d       $ } }| jC                         }!tE        jF                         jI                  |!      }"tK        | g |||| |||jL                  |"      }#| D ]	  }|#|_'         tQ        || |      S c c}w c c}w c c}w )Nc                    | S rB   rC   p___s      rF   <lambda>z)JaxprTrace.process_call.<locals>.<lambda>       A rH   Fr   
call_jaxprr   ))r   r   call_partial_eval_rulesgetcall_param_updaterspartition_pvalsr   with_unknown_namestrace_to_subjaxpr_nounits_fwdr~   
debug_infopartial_eval_wrapper_nounitsrQ   r   r   r7   sumr>   r   r   r`   lenconvert_constvars_jaxprrN   r   ClosedCallPrimitiveclose_jaxprdictopnot_r   rJ   r\   r   r   r   r   r   r   rt   r8   )$r_   r   fr   r   ruleupdate_paramsr   	in_knownsin_avals	in_constsf_auxconst_paramsfun_and_argsoutfwds
out_knownsout_typejaxprenv
out_constsnon_fwd_resin_consts_fullresres_tracersenv_tracersunknown_arg_tracersnum_new_args	new_jaxprstaged_paramsar   r}   r   r   s$                                       rF   process_callzJaxprTrace.process_call   s   $&&0G"&&y1D$	1gv66'++I6N;MM%4g5Naff5N%O"Ix 	
A	&q$((ALL%	HB*2uY/?xQGB !A6L 55++L

#
#D$5$5|\
RC-0U*D*hs(s:.?@JN
D.+
6C d,,c$..#.FGKd**C0K&-BQZZ\1BB{#c+&66L'.I)T556i(iI6M!-RWWi1H".0M %& tZ%7%7%:DA &K &335J%%'//:/FF
QQ{Q=PQ$i!C (S!((z;
;;_ 6O< C&s   J.>J3J3'J8c           	       () t        | j                  |      }t        j                  |      xs d }t	        |D cg c]  }|j
                   c}      \  }}}	t        ||d         \  }
}t        |
|      D cg c]  \  }}t        |d   ||       }}}t        || j                  |j                  d      }t        |t        |      t        |            \  }( |||d      }|d   )t        )      ()fd       }t        |t        |      |	      }|j!                  | j"                  |g|	|      } (       \  }}}}t%        |t'        |      t'        |j(                        z
  g      \  }}t+        j,                  |d
   |d   fg      5  t/        |      }d d d         |d          }t        ||      \  }}dt'        |      z  dt'        |      z  z   g |
z   }t        | j0                  |      }t        | j                  |      }|D cg c]  }|j3                         r| }}t'        |      t'        |      z   }  ||t        t4        j6                  |      |       }!t        |!|t        |            }!|!d= t        ||      D "cg c]  \  }}"t9        |d   ||"       }#}}"|#D "cg c]"  }"t;        | t<        j?                  |"      d       $ }$}"t+        j@                  |jB                  |d
   h      }%tE        jF                         }&tI        | g ||||$||!|%|&      }'|$D ]	  }|'|_%         tM        ||$|      S c c}w c c}}w # 1 sw Y   xY wc c}w c c}"}w c c}"w )Nc                    | S rB   rC   r   s      rF   r   z(JaxprTrace.process_map.<locals>.<lambda>  r   rH   in_axes	axis_sizeFr   out_axes_thunk)closurec                             \  } }}}t        |               \  }}t        |      dt        |j                        z  z   S )Nr   )r9   rQ   r   	constvars)r   r   r   out_axesr   r   s       rF   const_out_axes_thunkz4JaxprTrace.process_map.<locals>.const_out_axes_thunk$  sC     #j!UA":~/?@ka8_tc%//&::::rH   )r   r   	axis_namer   rB   r   r  r   )'r   r   r   r   r   r   r9   zipr(   trace_to_subjaxpr_nounits2r~   r   r   rQ   r;   r   r   r   r7   r   r  r   extend_axis_env_ndr   r   r`   r   r   r)   r   rJ   r\   filter_named_axis_effectsr   r   r   r   rt   r8   )*r_   r   r   r   r   r   r   r   r   r   unk_in_axesconst_in_axesaxr[   in_avals_mappedr   r  r   r   out_avals_mappedr   r   r   r   r   r  staged_out_axesr   staged_in_axesconst_tracersr   r   r   r   r   	out_avalsr   r   src_infor   r   r   s*                                           @@rF   process_mapzJaxprTrace.process_map  s   $&&0G'++I6N;MM%4g5Naff5N%O"Ix "0	6);L!MK'*;'AC#2t #6+#6DA CO C 	#1dhheDA)!U9-=*/*@BFAs !A6L,-N.1; 2; eM.B';=L 
#
#D$5$5I
UC/2u,J % s3x#eoo2F'F&GHOJ 
	 	 6+#6{8K"L!M	N 2*51j2 (v&')H'
H=OQCH_wS'99OkOKN 33S9Md**C0K&-BQZZ\1BB}%K(88L!&#bggy*A<PM"'"8ZQM&' "/3CDFR vk2B: FI F &' tZ%7%7%:DA 'K '))%--&:M9NOD'')H
SSS?RS$ihPC(S!((z;
;;A 6OC22 2 CF's/   M;M
MM'MM"1'M(Mc                V    t        j                         t        | j                        d  S rB   )r   current_name_stackr   r}   r^   s    rF   r   z(JaxprTrace._current_truncated_name_stackR  s"    ..0T__1E1FGGrH   c                   t        | j                  |      }t        d |D              r\t        j                  | j
                        5  |D cg c]  }|j                  d    }} |j                  ||g|d|icd d d        S ~~t        j                  |       5   |j                  | cd d d        S c c}w # 1 sw Y   >xY w# 1 sw Y   y xY w)Nc              3  <   K   | ]  }|j                           y wrB   r`   r   r   s     rF   r   z5JaxprTrace.process_custom_jvp_call.<locals>.<genexpr>W       
)A1::<
)   rb   symbolic_zeros)	r   r   r   r   r   r   r   bindcall_wrapped)r_   primfunjvpr   r  r   valss           rF   process_custom_jvp_callz"JaxprTrace.process_custom_jvp_callU  s    $&&0G

)
))!!$"3"34 I#*+aq	++tyycHDHHI I
 	^				% (Sw'( ( ,I I( (s*   B:B5#B:C5B::CCc           
        t        | j                  |      }t        ||d   j                  g      \  }}t	        d |D              sJ t	        d |D              }|rP|D cg c]  }|j
                  d    }	}|D cg c]  }|j
                  d    }
} |j                  |g|	|
i |S |d   D cg c]"  }t        | t        j                  |      d       $ }}t        | j                  |      }t        ||      }t        | ||||t        j                  t        j                                }|D ]	  }||_         |S c c}w c c}w c c}w )Nres_treec              3  <   K   | ]  }|j                           y wrB   r  r  s     rF   r   z6JaxprTrace.process_custom_transpose.<locals>.<genexpr>d  s     0Aqzz|0r  c              3  <   K   | ]  }|j                           y wrB   r  r  s     rF   r   z6JaxprTrace.process_custom_transpose.<locals>.<genexpr>e  s     ;q!**,;r  rb   	out_types)call)r   r   r7   
num_leavesr   r   r  r   rJ   r\   r   r   r   r   
no_effectsr   r   rt   )r_   r   r*  r   r   res_tslin_tslin_all_knownr   	res_cvals	lin_cvalsr[   r   
in_tracers
new_paramsr   s                   rF   process_custom_transposez#JaxprTrace.process_custom_transposea  sP   $&&0G&*<*G*G)HINFF00000;F;;M&,-166!9-i-&,-166!9-i-TYYt>i>)>v>> "(!46 !z'9'9$'?F 6k 6t--w7jT*j4[$

//+3357c*!sAH* .-6s    E <E3'E
c           	     $   t        | j                  |      }t        d |D              r^|D cg c]  }|j                  d    }	}t	        j
                  | j                        5   |j                  ||g|	||dcd d d        S t        | j                  |      }dt        |      z  }
t        d |D              t        || j                  |j                  d      }t        ||
      \  }}t        ||      }|j!                  | j                  ||f|      } |       \  }}}}t#        |      rJ t        | j                  t        | j$                  |            }t        | j                  |      }|D cg c]"  }t'        | t(        j+                  |      d       $ }}t-        t/        |            }t1        t2        j4                  j                        t6        fd              }| j9                         }t;        j<                         j?                  |	      }t        ||t        |      t        |      z   |||
      }tA        | g |||||||jB                  |      }|D ]	  }||_"         |S c c}w # 1 sw Y   xY wc c}w )Nc              3  <   K   | ]  }|j                           y wrB   r  r  s     rF   r   z5JaxprTrace.process_custom_vjp_call.<locals>.<genexpr>v  r  r  rb   	out_treesr  Fc              3  4   K   | ]  }|j                     y wrB   r[   r  s     rF   r   z5JaxprTrace.process_custom_vjp_call.<locals>.<genexpr>~  s     -QVV-s   Tr   c                 `    t        j                         |       }t        |      \  }}}||fS rB   )_interleave_funr   trace_to_jaxpr_dynamic)zerosfwd_	fwd_jaxprr   r   fwdr   s        rF   fwd_jaxpr_thunkz;JaxprTrace.process_custom_vjp_call.<locals>.fwd_jaxpr_thunk  s8     S335u=d3D(CiFrH   r   r   rD  
num_constsbwdr8  r  )#r   r   r   r   r   r   r   r  r   r   rQ   r  r~   r   r   r   r   anyr   r   rJ   r\   r   r   r   lu	wrap_init_memoizer   r   r   r   r   r   rt   )r_   r   r   rC  rG  r   r8  r  r   r#  r   r   r   r   r   r   r  r   r   r   r   r   r   closed_jaxprrD  r}   r   r   r   s      `                        @rF   process_custom_vjp_callz"JaxprTrace.process_custom_vjp_callt  su   $&&0G

)
))!()AaffQi)d)!!$"3"34 8tyyC 8t 8y(688 8 $(('2G3w<'I-W--H	#Atxxt	DB*2y(CGBInEF


t002sC.&
IC(+%J	5#:d,,c$..#.FGKd**C0K%' tZ%7%7%:DA 'K '6u=>LR\\cnn5  6
 335J%%'//:/FF's8c#h&%F EE{EWE$dFEMM6KC(S!((Q *8 8's   I;&J ;'J J
)r   r   r}   zsource_info_util.NameStackr~   r   )rf   r   )r   rJ   rf   r   )r   r   rf   r   r   lu.WrappedFun)rj   rk   rl   r|   r   r   r   r   r   r   r   r   r   r   r  r   r$  r4  rM  __classcell__r   s   @rF   rx   rx   q   sZ    :KF
#2#J>6<pC<JH
(&+rH   rx   r   c                   | D cg c]  }|j                          }}| D cg c]#  }|j                         r|j                         % }}| D cg c]#  }|j                         s|j                         % }}|||fS c c}w c c}w c c}w rB   )r`   r   rc   )pvalsr   knownsr   r   s        rF   r   r     sy     */FDMMOF&F).FdmmoDMMOF%F).FdmmoDNNF&F		 GFFs   A?BBB	&B	c                   t        |      t        |      }}|D cg c]@  }|rt        j                  t        |            nt        j	                  t        |            B }}t               }	t        ||	      t        ||	      cxu r|	u sJ  J  | |      \  }
^ }}}}t        |      \  }}}|j                  g ||||
|       g ||S c c}w rB   )iterrJ   rY   nextr\   objectr   store)r   rY  r   r   r   	in_avals_
in_consts_rY   in_pvalssentinelr   
maybe_fwds	out_pvalsr   r   r   r  r   s                     rF   r   r     s     x.$y/Z)?HJ6; 5:jtJ/0  i12 J( JX(	i	"d:x&@	LH	LL	LL	L./k+%	+:y#s&5i&@#*i++>
>J>	>5>#>?	:		Js   ACc                   t        |      t        |      }}|D cg c]@  }|rt        j                  t        |            nt        j	                  t        |            B }}t               }	t        ||	      t        ||	      cxu r|	u sJ  J  | |      \  }
^ }}}}t        |      \  }}}|D cg c]  }t        |       }}|j                  g ||||
|       g ||S c c}w c c}w rB   )	rV  rJ   rY   rW  r\   rX  r   r,   rY  )r   rY  r   r   r   rZ  r[  rY   r\  r]  r   r^  r_  r   r   r   r   r   r	res_avalss                       rF   partial_eval_wrapper_nounits2rc    s    x.$y/Z)?HJ6; 5:jtJ/0  i12 J( JX(	i	"d:x&@	LH	LL	LL	L./k+%	+:y#s-i8*a"%&Qvay&)&++>
>J>	>5>#>?	:		J 's   AC(1C-zdict[Primitive, Callable]r   r   r   c               z    t        t        j                  | ||      |      \  }}}t        d |D              sJ |S )Nr<  c              3  <   K   | ]  }t        |t                y wrB   )rN   r    )r   r[   s     rF   r   z$abstract_eval_fun.<locals>.<genexpr>  s     CZm,Cr  )r?  rI  rJ  r   )r!  r   r   r   r   	avals_outs         rF   abstract_eval_funrg    s>    *ll3:6?/!Y	CC	CC	C	rH   rs   r   r   r   c                  \    e Zd ZddgZ	 	 ddZd Zedd       Zedd       Zd Z	d Z
d	 Zy
)r   r   rt   c                \    t        |t              sJ |\  }}|| _        || _        || _        y rB   )rN   rJ   r   r   rt   )r_   tracer   rt   rU   rV   s         rF   r|   zJaxprTracer.__init__  s0    dJ'''IBDKDIDKrH   c                <    d| j                    d| j                   dS )NzTraced<:>)r[   r   r^   s    rF   __repr__zJaxprTracer.__repr__  s    TYYKqQ//rH   c                6    | j                   j                         S rB   )r   r   r^   s    rF   r[   zJaxprTracer.aval  s    99rH   c                f    t        | j                  t              r| j                  j                  S g S rB   )rN   rt   rs   r2  r^   s    rF   rr   zJaxprTracer.parents  s%    $++~.[[###irH   c                h    | j                   j                         }|t        j                  |      S | S rB   )r   rc   r   
full_lowerre   s     rF   rr  zJaxprTracer.full_lower  s.    II!E__U##krH   c                6    | j                   j                         S rB   )r   r`   r^   s    rF   r`   zJaxprTracer.is_known  s    99rH   c                   | j                   j                         r#t        | j                   j                               S t	        | j
                  t        t        t        f      rt        | j
                  j                        S | S rB   )
r   r`   r*   rc   rN   rt   r   r   r   r   r^   s    rF   r*   zJaxprTracer.get_referent   sW    yy$))--/00	DKK'8W!=	>$++//**krH   N)rj  rx   r   rJ   rt   zJaxprTracerRecipe | Noneri   )rf   Sequence[JaxprTracer])rj   rk   rl   	__slots__r|   rn  propertyr[   rr   rr  r`   r*   rC   rH   rF   r   r     sU    x )/0       rH   Fc                   t        j                         }t        j                         5 }t	        ||t                     }t        j                  |      5  t        | ||| j                        } t        j                  |      5  | j                  |      \  }\  }}}	|	rJ 	 d d d        ~~ fcd d d        cd d d        S # 1 sw Y   "xY w# 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY wrB   )r   r  r   take_current_tracerx   r   ensure_no_leakstrace_to_subjaxpr_nounitsr   r   r  )
r!  rS  instantiater  r   rj  r   r_  r   r   s
             rF   trace_to_jaxpr_nounitsr}  	  s    
 (::<  &L|%7DE			e	$ &%c5+s~~Nc!!%( *-*:*:5*A''	63w3 Iv%& && & & & && & &s;   +C#.CC C.	C#C
CC	C##C,c                    t        d |D              sJ |       t        | ||||      \  }}}}|D 	cg c]  }	|	j                   }
}	~||
||ffS c c}	w )Nc              3  <   K   | ]  }t        |t                y wrB   rN   rJ   r   rU   s     rF   r   z,trace_to_subjaxpr_nounits.<locals>.<genexpr>!       ;BZJ';r  )r   _trace_to_subjaxpr_nounitsr   )r   rj  r|  r   r\  r   r   r   r   r   r_  s              rF   r{  r{    sl     
;(;	;EXE	;(BXz)3%+uj#*+!qvv+)+	J,	,, ,s   Ac                `   t        |t              sJ t        d |D              sJ |       t        j                         }t        j                         5 }t        |||      }t        | ||||      \  }}	}
}|D cg c]  }|j                   }}~d d d        	
ffS c c}w # 1 sw Y   xY w)Nc              3  <   K   | ]  }t        |t                y wrB   r  r  s     rF   r   z-trace_to_subjaxpr_nounits2.<locals>.<genexpr>0  r  r  )
rN   r   r   r   r  r   ry  rx   r  r   )r   r~   r   r|  r\  r  r   rj  r   r   r   r   r   r_  s                 rF   r  r  (  s     
C	""	"	;(;	;EXE	;'::<  L|%7=E*D	5+x+5'K
C!,-A-I- 
J,	,, .	 s   &B$:BB$B$$B-c                   |D cg c]  }|j                          }}|D cg c]#  }|j                         s|j                         % }}|D cg c]$  }|j                         r|j                  |      & }}t        |||      }	t	        j
                  |      5   | |	 }
d d d        t        
t        t        f      s
J d|
        t        d |
D              s
J d|
        t        |t              r|gt        |
      z  }t        |j                  |
      }t        ||      D cg c]  \  }}|r|j                  |      n| }}}|D cg c]  }|j                         r| }}t!        |||j"                  |j%                               \  }}}||||fS c c}w c c}w c c}w # 1 sw Y   xY wc c}}w c c}w )Nz;Got unexpected return type when tracing function to jaxpr: c              3  ~   K   | ]5  }t        |t        j                        xs t        j                  |       7 y wrB   )rN   r   r   rP   r   rE   s     rF   r   z-_trace_to_subjaxpr_nounits.<locals>.<genexpr>F  s.     NQZ4;;'@4+=+=a+@@Ns   ;=)r`   rc   r   r8   r   r   rN   listrQ   r   rh   r   r   r   r  r   tracers_to_jaxprr   r   )r   rj  r|  r\  r   r   r   r   r2  in_argsansr   instr   out_tracers_r   r   r   s                     rF   r  r  :  s    1999)908P P)P08Pd#P*P	:y9'e$ 
W+C	C$	' KCC5IK	'	N#N	N KCC5IK	NT"-#c(*KE))3/+ #K =?T1 04((+: ?+ ?(=

!=,=+, 4 4##%'%S 
eZ	,,' :PP ?=s9   FF"F"F'&F'F,+F9F?'F?,F6c           	        t        d |D              sJ |       t        j                         }t        j                         5 }t        |||      }t        j                  |      5  t        | ||||      \  }}	}
}d d d        D cg c]  }|j                   }}|D cg c]#  }|j                         s|j                         % }}t        |      D ci c]  \  }}t        |      | }}}
D cg c]  }|j                  t        |             }}t        |
|      D cg c]
  \  }}|	| }}}~d d d        	ffS # 1 sw Y   xY wc c}w c c}w c c}}w c c}w c c}}w # 1 sw Y   8xY w)Nc              3  <   K   | ]  }t        |t                y wrB   r  r  s     rF   r   z0trace_to_subjaxpr_nounits_fwd.<locals>.<genexpr>]  r  r  )r   r   r  r   ry  rx   r   r  r   r`   rc   	enumerateidr   r  )r   r~   r   r|  r\  r  r   rj  r   r   r   r   r   r_  r   r   ir   id_mapr   rC  pruned_constss                         rF   r   r   V  sn    
;(;	;EXE	;'::<  L|%7=E				& 7,F
UK:-7)k5*c7 "--A-I- 3;R$$--/$.."RIR#,Y#7841abeQh8F89CDAfjjA/DDD%(T%:J61cckQJMJ 
y-5	557 7 . S8DJ sl   #E0%E	:E0EE0E5EE0E-E04!E%E0&
E*1E*5E0	E	"E00E9c                   t        d |D              sJ |       t        j                         }t        j                         5 }t        |||      }t        | ||||      \  }}	}
}|D cg c]  }|j                   }}d d d        |D cg c]#  }|j                         s|j                         % }}t        |      D ci c]  \  }}t        |      | }}}
D cg c]  }|j                  t        |             }}D cg c]#  }|j                         s|j                         % }}t        |      D ci c]  \  }}t        |      | }}}|
D cg c]  }|j                  t        |             }}t        |
||      D cg c]  \  }}}||| }}}}~	||||ffS c c}w # 1 sw Y   7xY wc c}w c c}}w c c}w c c}w c c}}w c c}w c c}}}w )Nc              3  <   K   | ]  }t        |t                y wrB   r  r  s     rF   r   z1trace_to_subjaxpr_nounits_fwd2.<locals>.<genexpr>{  r  r  )r   r   r  r   ry  rx   r  r   r`   rc   r  r  r   r  )r   r~   r   r|  r\  r  r   rj  r   r   r   r   r   r_  r   r   r  r   r  
input_fwdsr   output_fwdsf1f2r  s                            rF   trace_to_subjaxpr_nounits_fwd2r  t  s    
;(;	;EXE	;'::<  .L|%7=E&@	5+x'5#K!,-A-I-	. 2:P P)P!*9!56ABqE1H6&6=C!D&**RU"3!D*!D 1:P P*P!*:!67ABqE1H7&7>D"E6::be#4"E+"E&)&*k&J 1 1BjRZ  1- 1 	[)]CH	HH! .	. . Q6!D Q7"E1sT   &F2(F-;F2	F?F?G!G
GG=G!GG-F22F<r   c                  h    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<   y)rs   r	   eqn_idru  r2  zSequence[ref[JaxprTracer]]out_tracer_refszSequence[core.AbstractValue]r  r'   r   dict[str, Any]r   core.Effectsr   source_info_util.SourceInfosource_infor+   ctxNru   rC   rH   rF   rs   rs     s7    
+##--))
**rH   c                   |j                   s|j                  r3d|v sJ d|vs)t        |d         t        |d   j                        k(  sJ |j                  rZd|v r't        |d         t        |d   j                        k(  sJ d|v r't        |d         t        |d   j                        k(  sJ |D cg c]  }|j                   }	}|xsO t        t        j                  j                  t        j                  j                  t        j                               }t        t        | j                        t        |      t!        t"        |      |	|||||	      S c c}w )Nr   donated_invarsr   )call_primitivemap_primitiver   invarsr[   r+   r   compute_on_context_managerrM   threefry_partitionabler   current_xla_metadatars   rW  r   rQ   r   r   )
rj  r2  r   r   r   r   r  r  r   r  s
             rF   r   r     s_    !8!86!!!F*'()S1E1L1L-MMO Ny!"c&*>*E*E&FFH G&'()S1E1L1L-MMO N*+!qvv+)+ 	''--##))++-#
 
U]]+U:->C@U!9fg{
  ,s   6Ec           	        |\	  }}}}}}}}	}
|D cg c]
  } | |       }}|D cg c]	  } |        }}t        ||      D cg c]  \  }}|t        |      n | |       }}}t        ||||||	|
      S c c}w c c}w c c}}w rB   )r  r$   r"   )getvarrt   r   r2  r  r  r   r   effsrcr  r   r  t_refr   r   outvarss                    rF   recipe_to_eqnr    s     1j/9dFC *+1VAY+&+&56U6+6Y46A 9WQZ&)3 6' 6	vwfc3	DD	 ,66s   A8A=Bc                ,   t        j                         i i }i }i }dfd}dfd}t               }	g }
t        } |g | ||      }d }t	        ||      }|D ]  j
                  }t        |t              r|j                  |	vs/t        ||j                        }t        |j                  |j                        D cg c]$  \  }} |       t        |      n | |             & }}}|
j                  t!        |||j"                  |j$                  |j&                  |j(                  |j*                               |	j-                  |j                         t        |t.              r7t1        fd| D              st        j2                  d        |       Jt        |t4              re|j7                  t9        |j:                              }|/ |      x}|t9        |j:                        <   |j:                  ||<   |t9              <   t        |t<              r|j:                  | |      <   t        |t>              r|J tA        |       tC        |jE                               \  }}g |t        ||       }tC        |jE                               \  }}t        ||      }tG        ||||
      }tI        ||||
||      }tJ        jL                  jN                  xr t        jP                  |       |||fS c c}}w )	a  Constructs Jaxpr given tracers for inputs and outputs.

  Params:
    in_tracers: the tracers that were created for the function inputs
    out_tracers: the tracers that were output by the function.
    debug_info: the debug info for the function.

  Returns: a triple of a `Jaxpr`, a list of constant values corresponding to
    the `constvars` in the returned Jaxps, and a list of environment values.
    The vars for the environment values have been prepended to the Jaxpr's
    `invars`.
  c                n    t        | j                        t        u r| j                  S t        |          S rB   )rO   rt   r   r  )r   t_to_vars    rF   get_atomz"tracers_to_jaxpr.<locals>.get_atom  s)    AHH~0188Ehr!uoErH   c                v    | J  | j                         }j                  t        |       |      }||u sJ |S rB   )r[   
setdefaultr  )r   varvar_gensymr  s      rF   newvarz tracers_to_jaxpr.<locals>.newvar  sA    ==
.Cr!uc*D$;;JrH   c                V    | j                   }t        |t              r|j                  S dS )N)rt   rN   rs   r  )r   ra  s     rF   sort_keyz"tracers_to_jaxpr.<locals>.sort_key  s#    	A!!^4188<"<rH   )keyc              3  &   K   | ]  }|u  
 y wrB   rC   )r   	in_tracerr   s     rF   r   z#tracers_to_jaxpr.<locals>.<genexpr>  s     <Ii<s   zTracer not in input tracers: )r   r   rf   r%   )r   zJaxprTracer | Nonerf   r#   ))r   r  setr6   sortedrt   rN   rs   r  r   r2  r  r  r  r$   r   r"   r   r   r   r  r  addr   rH  escaped_tracer_errorr   r   r  r   r   r   	TypeErrorr3   itemsmake_jaxpr_effectsr   r   rL   rM   check_jaxpr)r2  r   r   r   r   r   constid_to_varr  r  processed_eqn_idseqns	reachabler   r  ra  in_atomsr   rfr  r  env_varsenv_valsr  
const_vars
const_valsjaxpr_effectsr   r  r   r  s                              @@@rF   r  r    s   $ ;;=&"$(& "#').F e $)B
B[B>BC'= 7)' a	A!^$	
*	*x. #AKK1B1B CEq" "$71:6"$<? E EM(GQ[[!(("#))Q]]AEEC 	Dahh'	A}	%<<<''-J1#+NOOQi	Ax	 r!%%y)c	*0)3nRY'eeshr!uo	Aw	uuc&)n	Aw	
	
UaL9< ciik*(H2X2Hj12&!&,,.1*j+&'$Z$G-

F}% 	8!1!1%!8	
H	$$EEs   )Lc                v    t        || j                        \  }}| j                  |g || j                        S )Nr  r  )r9   r  r   r  )r   whichr  envvarss       rF   move_envvarsr     s9    %eU__=)W	3LW3Lu||3L	MMrH   c                X    t        t        | j                        g       | j                  fS )zMMoves the constvars to the start of invars and returns the consts explicitly.)r!   r   r   r   r   s    rF   separate_constsr  %  s$     
,U[[92	>	LLrH   c                   t         j                  j                  xr t        j                  |        | j
                  j                  d}n2dt        | j                        z  g | j
                  j                  z   }| j
                  j                  |      }| j                  d| j                  | j                  z   |      }t         j                  j                  xr t        j                  |       |S )z+Moves the constvars to the start of invars.N) 	arg_namesrC   r  r  r   )r   rL   rM   r   r  r   r  r   r  _replacer   r  )r   r  dbglifted_jaxprs       rF   r   r   *  s     	8!1!1%!8
'IEOO,,/M1A1A1K1K/MMI!!I!6#5??U\\9c  K,?!1!1,!?	rH   c                   |dk(  r| j                         S t        j                  j                  xr t	        j
                  |        t        | j                  |g      \  }}| j                  j                  | j                  }n3| j                  j                  | j                  j                  |d       }| j                  t        |      ||      }t        j                  j                  xr t	        j
                  |       |S )zGMove n invars to constvars. Like an inverse of convert_constvars_jaxpr.r   Nr  r  )r   r   rL   rM   r   r  r7   r  r   r  r  rQ   )r   nr  r  r  r  s         rF   convert_invars_to_constvarsr  8  s     !V==?8!1!1%!8 s3)V
'


C



#
#"",,QR0 $ 2Cy)9&*-  /,?!1!1,!?	rH   c                   t        d | j                  D              rt        t        j                  j
                  xr t        j                  |        t        | j                  |g      \  }}| j                  | j                  |z   |      }t        j                  j
                  xr t        j                  |       |S )Nc              3  P   K   | ]  }t        |t        j                           y wrB   rN   r   JaxprInputEffect)r   r  s     rF   r   z/convert_envvars_to_constvars.<locals>.<genexpr>J  s     LsC11	2L   $&r  )rH  r   NotImplementedErrorr   rL   rM   r   r  r7   r  r   r  )r   num_env_varsr  r  converted_jaxprs        rF   convert_envvars_to_constvarsr  I  s    LemmLL
8!1!1%!8|n=(FMMEOOh,F)/ " 1/B!1!1/!B	rH   c                p    t        |t              rt        |      n|}t        | t        |      |d      dd S )an	  Unzip a jaxpr in two by data dependence into 'known' and 'unknown' parts.

  That is, given a jaxpr and a sequence of booleans indicating which jaxpr
  inputs (i.e. invars) are considered unknown, produce two jaxprs, a list of
  booleans representing which of the original jaxpr's outputs are unknown (i.e.
  have a data dependence on an unknown input), and a list of abstract values
  representing residuals (part of the first jaxpr's output and the second
  jaxpr's input). The two jaxprs result from partitioning the original jaxpr's
  first-order primitive applications based on whether all the inputs to the
  application are known (in which case the application is represented in the
  'known' jaxpr and its result is considered known) or whether any inputs to the
  application are unknown (in which case the application is represented in the
  'unknown' jaxpr and its result is considered unknown). Higher-order primitives
  are recursively unzipped in two.

  The `instantiate` argument can be used to ensure some outputs are lifted into
  the 'unknown' jaxpr.

  For example, give an input jaxpr:

    { lambda ; a:f32[] b:f32[]. let
        c:f32[] = cos a
        d:f32[] = sin a
        e:f32[] = neg d
        f:f32[] = mul e b
      in (c, f) }

  then applying this function with `unknowns=[False, True]` and
  `instantiate=False` produces as an output triple:

    # jaxpr_known
    { lambda ; a:f32[]. let
       b:f32[] = cos a
       c:f32[] = sin a
       d:f32[] = neg c
     in (b, d) }

    # jaxpr_unknown
    { lambda ; a:f32[] b:f32[]. let c:f32[] = mul b a in (c,) }

    # out_unknowns
    [False, True]

  Notice in particular that the first output (jaxpr_known) contains all the
  primitive applications which do not have a data dependence on an unknown
  input. Also notice the input and output types: the input type of the first
  jaxpr produced represents the type of the known inputs of the original jaxpr,
  and the output type of the second jaxpr produced represents the type of the
  unknown outputs of the original jaxpr.

  In the above example, the output of jaxpr_known named `d` is a _residual_
  output, and corresponds to the input named `a` in jaxpr_unknown. In general,
  jaxpr_known will produce extra outputs (at the end of its output list)
  corresponding to intermediate values of the original jaxpr which must be
  passed to jaxpr_unknown (as leading inputs).
  FNr  rN   r  rQ   _partial_eval_jaxpr_nounits)r   unknownsr|  s      rF   partial_eval_jaxpr_nounitsr  T  s8    x '1d&Ck"+	$UE(O[%	PQTRT	UUrH   c                    t        |t              rt        |      n|}t        |t              rt        |      n|}t        | t        |      ||      S rB   r  )r   r  r|  rC  s       rF   partial_eval_jaxpr_nounits_fwdr    sB    
 '1d&Ck"+ d+c
#	$UE(O[#	NNrH   c                V    t        j                  t        j                          j                  j
                        g  fd}t         j                        D cg c]
  \  }}|r	| }}}t        t        j                  |j
                  j                               |      \  }}	}
\  \  }}}}t        j                  j                  r*t        j                  |       t        j                  |       t        ||
      }t        |d      }|||||fS c c}}w )Nr<  c                    t        |       }d t        j                        D        }D cg c]@  }|rt        j	                  t        |            nt        j                  t        |            B }}t        |d       t        |d       cxu rJ  J t        t               j                  j                        j                  |      \  }\  }}}\   t        |      }	|D 
cg c]  }
|
j                           }}
t              t        u rJsHt        |      }|D cg c]  }|t        |      n| |    }}t        |d       J d gt!        |      z  }nt              t"        u rrt              D cg c]
  \  }}|r	| }}}t        |      g }}|D cg c]9  }||j%                  t        |            n||   s|j%                  | |         n|; }}t'        j(                  ||      \  }}|D cg c]  }t+        j,                  |       }}j%                  ||	||f       |D 
cg c]#  }
|
j                         s|
j/                         % }}
g ||S c c}w c c}
w c c}w c c}}w c c}w c c}w c c}
w )Nc              3  ,   K   | ]  \  }}|s	|  y wrB   rC   )r   r   uks      rF   r   z;_partial_eval_jaxpr_nounits.<locals>.fun.<locals>.<genexpr>  s     K51bQKs   
)rV  r  r   rJ   r\   rW  rY   r   r   r   r   r  r   r`   rO   rh   r   rQ   r   _include_consts_in_fwdsr   r   r   rc   )known_vals_inknown_vals_in_unknown_avalsr  r\  jaxpr_unknown_r   r_  	residualsjaxpr_unknownr   out_unknowns
residuals_r   rA  ra  rb  known_vals_outcellr   rC  in_unknownsr|  r   s                     rF   r!  z(_partial_eval_jaxpr_nounits.<locals>.fun  s   -(NKC$DKMFQS@B <>
""4#67%%d>&:;< SH S%mT)BJJJJJ7T	8:u{{--{8<<HL<R 5N4T9i+N;M4=>D'>L>CyD	?j " ()y4
#mA6FF "i "*d#+++Vc$id	ce	"34?eaB?? $YI
  ! 78i	  j!12:>q'	  q!12 ! ! 0dINodI+45aq!5I5KK}i>?3<P4dnn&PNP(^(i((1S ?" @! 6Ps6   AI#&I("I-;
I2I2>I8<I=3J	JrC   )rI  rJ  r   jaxpr_as_funr   r   r  in_aval_qddsr?  r   r   rL   rM   r  r!   )r   r	  r|  rC  r!  r   r  known_avalsjaxpr_knownr   consts_knownr  r  rb  r   closed_jaxpr_knownclosed_jaxpr_unknownr  r   s   ````             @@rF   r  r    s     	ll4$$U+8N8NO!	$) ): !$E$6$6 DOuq"BO+O!7ll31<<#B#B#DE"+q, 5910<	4[!]#";=$]B7	1<D	PP Ps   *
D%5D%c                    t        d |D              r||fS t        t        d |D              dz         D cg c]  }t                }}t	        |      }|D cg c]  }|t        |      n||    }}t        |d       J t        g | |      D ci c]  \  }}t        |      | }	}}|D 
cg c]  }
|	j                  t        |
             }}
|D 
cg c]  }
t        |
      |	vs|
 }}
||fS c c}w c c}w c c}}w c c}
w c c}
w )Nc              3  $   K   | ]  }|d u  
 y wrB   rC   r   r   s     rF   r   z*_include_consts_in_fwds.<locals>.<genexpr>  s     !qd!r   c              3  &   K   | ]	  }||  y wrB   rC   r  s     rF   r   z*_include_consts_in_fwds.<locals>.<genexpr>  s     'Ia1='Is   rb   )	r   rangemaxrX  rV  rW  r  r  r   )r   r   r  r   dummysr  r   r  rE   idxsra  s              rF   r  r    s   !D!!?#C'I4'I$IA$MNOFHO&OI*EIJ19tJ&);J)J	j$		''	'();6);F);<	=tq!"Q%(	=$	=#,	-a$((2a5/	-$	-#9Qr!uD'8q9)9	y PJ	=	-9s#   C6C;D 2!DD,Dc                L    t        | |||||      ^ }}|rt        d      g |S )Nz<Cannot use `partial_eval_jaxpr_custom` with stateful jaxprs.)partial_eval_jaxpr_stateful
ValueError)r   r	  in_instensure_out_unknownsensure_out_instsaveableoutsnum_res_refs           rF   partial_eval_jaxpr_customr"    s:     3['#6S4
S
TT	$-rH   c           	        t        |      t        u r|ft        | j                        z  }t        |      t        u r|ft        | j                        z  }t        |      t        u r|ft        | j                        z  }|t
        }t        | t        |      t        |      t        |      t        |      |      \  }}}}	}
}||||	|
|fS rB   )rO   rh   r   r  r  everything_saveable!_partial_eval_jaxpr_custom_cachedrQ   )r   r	  r  r  r  r  r  jaxpr_stagedr  out_instnum_resr!  s               rF   r  r    s     
']dj3u||,,G	
$&.03u}}3EE	/d"&(3u}}+==O"H'
{#U7^U;N5O

 (, J+|\8Wk 
lL(G[	PPrH   c                      y)NTrC   r   r   s     rF   r   r         rH   c                  234 i 2t               4t               }d2fd}d2fd}d4fd}	dd}
g g }}t        |||| j                         t        t        |dd      | j                         | j
                  D ]m  }t        t        ||j                              \  }}t        j                  |j                        }|r |||||      \  }}}}}|xr |j                  |       |xr |j                  |       |D ]?  }t        |j                  t              r|j                  |       /4j                  |       A t        ||||j                          t#        |      r[t        |	||j                        }|j                  |j%                  |             t        t        |dd      |j                          E|j                  |       t'         ||j                  g|j                  D cg c]  }|j                   c}i |j(                        3 |
|j*                        st        3t,              r#t        t        |dd      |j                          t        3t.              rdd	lm}m} |j                   D cg c]D  }t7        |j                  j9                  t;        j<                  3j>                        
            F }}t;        j@                  |j                   ||tC        t;        j<                  3j>                        ftE        |j                         z  d|jF                  f      tI               tK        jL                         tO        d d            }|j                  |       t        t        |dd      |       tQ        3fd|j                   D              sJ 4j9                  |       t;        j@                  ||j                   |tC        t;        j<                  3jR                        ftE        |      z  d|jF                  f      tI               tK        jL                         tO        d d            }|j                  |       t        t        |dd      |j                          t        3tT              sJ t        |	||j                        }|j                  |j%                  |             t        t        |dd      |j                          p t        t        || j                               }tW        |d         tW        |d         }!} tQ        d 4D              sJ 4       tY        | j                   |!|      D ]  \  }}"}#|#s
 |	|"|        t        tZ        j\                  | |      } t        tZ        j\                  |!|      }!t_        || j                        \  }$}%t_        | | j                         \  }&}%|D cg c]  }||$v  }'}t_        |'tW        |            \  }(}%g |$|(})g |&4}*ta        | j                  |)|*|      }+| j%                  |)|*||+| jb                  je                               },tf        jh                  jj                  xr t;        jl                  |,       t_        || j                        \  }%}-t_        |!| j                         \  }%}.g 4|(|-}/ta        | j                  |/|.|      }0| j%                  |/|.||0| jb                  je                               }1tf        jh                  jj                  xr t;        jl                  |1       |,|1| |!tE        4      tE        |(      fS c c}w c c}w c c}w )Nc                2    t        |       t        u r|    S y)N)FTrO   r#   )rE   r   s    rF   readz/_partial_eval_jaxpr_custom_cached.<locals>.read  s    Aw#~VmrH   c                &    | |fdk7  sJ | |f|<   y )N)TFrC   )unkr  vr   s      rF   writez0_partial_eval_jaxpr_custom_cached.<locals>.write  s"    ;-'''4[CFrH   c                P    t        |      t        u r| sj                  |       |S rB   )rO   r#   r  )r  rE   r  s     rF   ensure_instantiatedz>_partial_eval_jaxpr_custom_cached.<locals>.ensure_instantiated  s!    Aw#~dmmAHrH   c                l    t         j                  t         j                  ft        fd| D              S )Nc              3  8   K   | ]  }t        |         y wrB   )rN   )r   enot_really_effectss     rF   r   zI_partial_eval_jaxpr_custom_cached.<locals>.has_effects.<locals>.<genexpr>  s     F:a!344Fs   )r   NamedAxisEffectInternalMutableArrayEffectrH  )r   r9  s    @rF   has_effectsz6_partial_eval_jaxpr_custom_cached.<locals>.has_effects  s+    ..0O0OPFgFFFrH   FTr  r   )device_put_pArrayCopySemantics)memory_spacerB   )devicessrcscopy_semanticsc              3     K   | ]:  }|j                   j                  t        j                  j                        k(   < y wrB   )r[   r@  r   mem_kind_to_spacer  )r   opolicys     rF   r   z4_partial_eval_jaxpr_custom_cached.<locals>.<genexpr>K  s7      ) 66&&$*@*@*LL )s   A Arb   c              3  >   K   | ]  }t        |      t        u   y wrB   r.  r   r2  s     rF   r   z4_partial_eval_jaxpr_custom_cached.<locals>.<genexpr>a  s     /T!W^/s   r  r  r  r   r   )rE   r%   rf   ztuple[bool, bool])r1  rh   r  rh   r2  r#   rf   None)r  rh   rE   r%   rf   r%   rg   )7r:   r@   r  r   r  r  r3   r   partial_eval_jaxpr_custom_rulesr   r   r   rN   r[   r.   r  r  rH  r   ensure_enumr   r   SaveableTypeOffloadablejax._src.dispatchr>  r?  r#   updater   rE  dstr&   r   r   ALWAYS_COPYr  r   new_source_infor+   r   r  RecomputeTyper  r  r   or_r9   r  r   r   r   rL   rM   r  )5r   r	  r  r  r  r  residual_refsr/  r3  r5  r<  
known_eqnsstaged_eqnsr   unks_ininst_inr   eqn1eqn2unks_outinst_outr   ra  inputsrE   r>  r?  r2  resvarsoffload_eqn
reload_eqnunzippedr  r'  r  ensure_inst	ins_knownr   
outs_knownref_res_is_inputnon_input_res_refsins_known_and_ref_resknown_outvarsknown_effectsr  
ins_stagedouts_stagedstaged_invarsstaged_effectsr&  r   rG  r  s5                                                     @@@rF   r%  r%    sT    ')#)|)#-<-

G k*	%gu||4	'%
%u7ZZ ;:cc$

34GW*..s}}=D,07GS,Q)dD(Hc
&z  &(I1C1CD1I !affk*


A

--
	
 eXx5	W&<fF34geT4(#++68
--F+.::6a1666F:=**F Gf	S[[	!Z%Eue,ckk:fk*FKK) qvv}}$2H2H2T}UV ) )mmKK,//

;=CKK@PP 2 > >@
 E#335D%(* 	+&ud+W5 )KK) ) 	) )!]]S[[,--fjj9;c'lJ0<<>
 E#335D%(*
 	:&ud+S[[9&-000('3::>3;;f;56ud+S[[9w;:x Cemm,-(,d8A;.?,	/Y/	/::	/!%--?K 1a{'a01RVV\+>?,RVVX?;(U\\:,)Q u}}=-*a.;<a9n<<()94;NOa;I;(:;+J++-$U__6K%2J@- "M}!!446  8+ 	>!1!1+!> %,,7-!Z!(EMM:.![@I@ 2@Z@-%eoo}&1;@. Kk!!446  8, 	?!1!1,!?
|\8S^
 
!
# #[ 7)Z =s   0]	A	]]c                      e Zd Zy)rU  Nrj   rk   rl   rC   rH   rF   rU  rU        rH   rU  c                      e Zd Zy)rN  Nrr  rC   rH   rF   rN  rN    rs  rH   rN  c                  "    e Zd ZU ded<   ded<   y)rO  
MemoryKindr  rR  Nru   rC   rH   rF   rO  rO    s    //rH   rO  c                    t        | t              r| rt        S t        S t        | t        t
        t        f      s2d|  dt        |        d}t        | t              r|dz  }t        |      | S )NzValue returned by a remat policy should be a bool or `ad_checkpoint.Recompute`, `ad_checkpoint.Saveable` or `ad_checkpoint.Offloadable(...)`. Got z	 of type .zKDid you return `Offloadable` instead of an instantiated `Offloadable(...)`?)	rN   rh   Saveable	RecomputerU  rN  rO  rO   r  )casemsgs     rF   rM  rM    ss    d8**	D=,D	E &	$t*Q0C $$	 % &c
C.	+rH   .z&dict[Primitive, PartialEvalCustomRule]rL  c                $    d|  d}t        |      )Nz-custom-policy remat rule not implemented for zA, open a feature request at https://github.com/jax-ml/jax/issues!)r  )namer  rZ  r[  r   r|  s         rF   .partial_eval_jaxpr_custom_rule_not_implementedr    s$     9 ?K 
K#C  rH   c                    |S rB   rC   )r   r[   s     rF   _default_res_aval_updaterr    s    	+rH   )res_avalr  c          	     |   |j                   |    } ||j                         5  t        |||dd|      \  }	}
}}}d d d        t        ||j                        \  }}t        |j                        \  }}t        ||j                        \  }}t        |j                        \  }}i |j                   | 	i}i |j                   | 
i} |||t        t        j                  |      |||      \  }}|
j                  d | D cg c]  }t         |||j                                }}t        |g |||j                  |t        j                  |	      |j                  |j                        }t        g ||||j                  |t        j                  |
      |j                  |j                        }t!        |j                        t!        |
j                        k(  sJ t#        |j                  |      D cg c]  \  }}t%        |      t        u r|s| }}}||||||z   fS # 1 sw Y   xY wc c}w c c}}w rz   )r   r"  r9   r  r  r   r   r   r#   r[   r"   r   r   eqn_effectsr  r  r   r  rO   )jaxpr_param_nameparams_updaterr  rZ  r[  r   r  r  r   r  r&  r^  r_  r(  rf  r   out_binders_knownrm  out_binders_stagedparams_knownparams_stagedr  r  	eqn_known
eqn_stagedrE   r  new_insts                               rF   call_partial_eval_custom_ruler    s9    **%
&%
3:: S!%'5%R ;Kx7S  4,)Q'#++>Q #**5-!Z(3;;?!>CJJ> 0+>,@SZZ@!1<@- .wBGGX.'<!, '--hw79 8L#((34 9) 91$1y13==,
{#S__cgg?) 	J!3S]]T%%l3S__	gg* 
Z	3|':':#;	;;	;"3::w7 .GAtaC  .( .	J(Hy4H	HH1S S9.s   H&#H3:H8&H0)r  c                  t        d |j                  D              }t        |j                  |    g |g |||      \  }}	}
}}}}||z   }t	        |
|j                        \  }}t	        ||j
                        \  }}t	        ||j
                        \  }}t	        ||j                        \  }}i |j                  | |i}i |j                  | |	i} |||t        t        j                  |
      |t        d |D              |||      \  }}t        |	j                  d | D cg c]  }t         |||             c}|g      \  }}t        ||      D cg c]
  \  }}|	| }}}t        |||      }t        g ||g |||j                   |t#        j$                  |      |j&                  |j(                        }t        g |||||j                   |t#        j$                  |	      |j&                  |j(                        }t+        |j
                        t+        |	j                        k(  sJ t+        |      t+        |      z   t+        |j,                  j
                        k(  sJ t+        |      t+        |      z   t+        |      z   t+        |	j,                  j
                        k(  sJ t+        |      t+        |      z   t+        |j,                  j                        k(  sJ t        |j
                  |      D cg c]  \  }}t/        |      t        u r|s| } }}g | ||}!|||
||!fS c c}w c c}}w c c}}w )Nc              3  <   K   | ]  }t        |t                y wrB   )rN   r$   rI  s     rF   r   z7closed_call_partial_eval_custom_rule.<locals>.<genexpr>  s     ?a:a)?r  c              3  $   K   | ]  }|d u  
 y wrB   rC   r  s     rF   r   z7closed_call_partial_eval_custom_rule.<locals>.<genexpr>   s     	%!t)	%r   )rQ   r  (_closed_jaxpr_partial_eval_custom_cachedr   r9   r  r   r   r   r   r7   r   r#   r  r>   r"   r   r   r  r  r  r   r   rO   )"r  r  r  rZ  r[  r   r  dropvarsr  r&  r^  r_  r!  num_res_valout_fwdr(  r  r   rf  rm  r  r  r  r2  res_val_bindersres_ref_bindersr   res_val_varsr  r  rE   r  r  new_varss"                                     rF   $closed_call_partial_eval_custom_ruler    s>    ?3;;??(.
**%
&'[w[(HV S+|Xxk7 +%''#++>Q4,)Q #**5-!Z(3;;?!>CJJ> 0+>,@SZZ@!1<@- .wBGGX.		%W	%%wm!M, &0%%hw/1 8L!$% 13>-&A"/? $'#@N41aAIQN/N7$5G,$	$O$&L(9&LO&L	mm\4#3#3K#@	oosww ) 44446H	mm]D$4$4\$B	oosww * 
Z	3|'<'<#=	==	=	Y#o.	.#k6G6G6N6N2O	OO	O	Z3/	/#l2C	Cs<K]K]KdKdGe	ee	e		#o"6	6#k>O>O>W>W:X	XX	X"3::w7 .GAtaC  .( .9x9,99(	J(H	<<'1N.s   $L7
L<#L<Mc           	     ~   t        | j                  ||dd|      \  }}}}}	}
t        |j                        |	z
  }t	        |j                  |g      \  }}t        ||      \  }}t        t        ||            D ci c]  \  }\  }}|st        |      | }}}}|D cg c]  }|j                  t        |             }}t        |dg|z  |D cg c]  }|d u  c}z         }t        j                  || j                        }t        j                  || j                        }|||||
|	|fS c c}}}w c c}w c c}w NFT)r  r   r   r  r7   r9   r  r  r  r   prune_jaxpr_outputsr   r!   r   )r   rZ  r[  r  r  jaxpr_known_jaxpr_staged_r^  r_  r  r!  num_out_primalsout_varsres_varsout_dropvars_knownr   r  r2  bidx_mapr  r   r  r&  s                           rF   r  r    sR    "%++w"': L,x;
 ,,-;/!,"6"68IJ(H(8<a'0X?Q1R'S  )!Va UAX ' )12AW[[A2'2 %TF_,7/KaT	/KKM,   u||<+!!->,	lHh[RY	YY2 0Ls   <D.!D5D:r   c                
    ||fS rB   rC   )r   r   ____________rE   ys          rF   r   r   4  s
    1a& rH   c                
    ||fS rB   rC   )r   r   r  r  r  ______rE   r  s           rF   r   r   7  s
    1a& rH   c           
        t        t        | j                  | j                              }| j                  D ]  }|j                  t
        v s|j                  |j                  D cg c]'  }t        |      t        u r|n|j                  ||      ) c}      }t        |j                     |      \  }}t        |j                  |      D ]  \  }}|	|j                  |   ||<     t        | j                        D 	ci c]  \  }}	|	|
 }
}}	| j                  D 	cg c]5  }	t        |	      t        u rd n|
j                  |j                  |	            7 c}	S c c}w c c}	}w c c}	w )Nr=  )r   r  r  r  r   forwarding_rulesr   rO   r   r   r  r  )r   r   r   r   fwd_idxr   v_origidxr  r2  r  s              rF   _jaxpr_forwardingr  :  s@   s5<<>?$ZZ )c
}}((KK), 5$% &*!W%7TXXa^ K  5K 6c#CMM237jgqS[['2 )+&#?C$v,)) ,5U\\+BC41a!Q$C$C==
" q'W$$$((488A;*?
? 
" " 5 D
"s   %,E
E!:E'c                ,    t        | t        |            S rB   )_prune_jaxpr_outputs_cachedrQ   r   used_outputss     rF   r  r  J  s    	$UE,,?	@@rH   c                   t        | j                  |      D cg c]
  \  }}|s	| }}}t        j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  |            }| j                  ||      }t        j                  j                  xr t        j                  |       |S c c}}w )N)r  r   )r  r  r   	DebugInfor   
traced_forfunc_src_infor  filter_result_pathsr   r   rL   rM   r  )r   r  r2  r  r  r  r   s          rF   _prune_jaxpr_outputsr  M  s    u}}l;A41aqQA'A!!5#3#3#A#A  **<8	:# mmGm<)<!1!1)!<	 Bs
   
CCc                ,    t        | t        |            S rB   )_prune_closed_jaxpr_outputsrQ   r  s     rF   prune_closed_jaxpr_outputsr  X  s     
%UE,,?	@@rH   )trace_context_in_keyc                V    t        t        | j                  |      | j                        S rB   )r!   r  r   r   r  s     rF   r  r  ]  s&     
)%++|D\\
# #rH   c                    t        |      t        u r|ft        | j                        z  }t	        | t        |      t        |            S )a  Runs dead-code elementation on a given jaxpr.

  Args:
    jaxpr: The jaxpr to DCE.
    used_outputs: A list of bools indicating which outputs are used.
    instantiate: A bool or a list of bools indicating which inputs should be
      considered used, regardless of whether they are actually used in a jaxpr.
      If a bool, the same value is used for all inputs.

  Returns:
    A tuple of ``(new_jaxpr, used_inputs)``.
  )rO   rh   r   r  
_dce_jaxprrQ   )r   r  r|  s      rF   	dce_jaxprr  e  s?     
+$.3u||#44K	E5.k0B	CCrH   c                    t        |       }t        |||      \  }}t        |t        | j                        g      \  }}t        |      rt        |t        |            }|||fS rB   )r   r  r7   r   r  r   r  )r   r  r|  jaxpr_r   used_inputs_used_constsused_inputss           rF   dce_jaxpr_constsr  y  sd     #5)&%flKH)\'s5??7K6LM+{+Is;7GHI	K	,,rH   c                    | j                   D ch c]/  }t        |t        j                        rt        |t              s|1 }}t        |      S c c}w rB   )r   rN   r   r:  r/   rh   )r   r8  r   s      rF   r<  r<    sJ    [[ 
-
1d6J6J(KQ
+  
-$ 
-	d
-s
   AAc                D   i dfddfd}g }t        || j                  |       | j                  d d d   D ]r  }t        |j                        }t        j                  |j                  t              } |||      \  }}	|	|j                  |	       t        ||j                  |       t t        | j                        }
t        t        j                  ||
      }
t        | j                  |
      D cg c]
  \  }}|s	| }}}t        | j                  |      D cg c]
  \  }}|s	| }}}|d d d   }t        | j                  |||      }t        j                   | j"                  j$                  | j"                  j&                  | j"                  j)                  |
      | j"                  j+                  |            }| j-                  |||||      }t.        j0                  j2                  xr t        j4                  |       ||
fS c c}}w c c}}w )Nc                (    j                  | d      S rz   )r   )r2  r   s    rF   r/  z_dce_jaxpr.<locals>.read  s    771erH   c                H    t        |       t        u r |       xs || <   y y rB   r.  )rE   r  r   r/  s     rF   r3  z_dce_jaxpr.<locals>.write  s$    Aw#~Aw|!c!f rH   r  rJ  )r2  r#   rf   rh   )rE   r%   r  rh   rf   rK  )r@   r  r  r   	dce_rulesr   r   _default_dce_ruler   r  r   rV  r  r  r  r   r  r   r  r  filter_arg_namesr  r   r   rL   rM   r  )r   r  r|  r3  new_eqnsr   	used_outsr   used_insnew_eqnr  r2  r  r  r  r  r  r  r   r   r/  s                      @@rF   r  r    s    # (	%-ZZ" )cD#++&I==(9:DY,HgoogE3::x() D%,,'+BFFK5+ellK8@$!QaA@&@u}}l;A41aqQA'A	$B$$$U__fgtL-!!5#3#3#A#A''4**<8	:# mm67$1c  C)<!1!1)!<	K	 AAs   <
HH'
H2Hc                    t        |       s&t        |      sdgt        |j                        z  d fS dgt        |j                        z  |fS r  )rH  r<  r   r  )r  r   s     rF   r  r    sF     
YC 07S_$d**
#cjj/	!3	&&rH   zdict[Primitive, DCERule]r  c           	        t        |       s&t        |      sdgt        |j                        z  d fS t	        |j
                  d   |       \  }}t        |j
                  |      }t        j                  |j                        }|r
 |||d      }t        |      st        |       s|j                  s|d fS t        t        |j                  |      D cg c]
  \  }}|s	| c}}t        |j                  |       D cg c]
  \  }}|s	| c}}|j                  ||j                  |j                  |j                        }||fS c c}}w c c}}w )NFr   r   r   )rH  r<  r   r  r  r   r   r   r   r   r   r"   r  r  r  r  )	r  r   r   r  r3  r   r2  usedr  s	            rF   dce_jaxpr_call_ruler    s   	\	;s#37S_$d**$SZZ%=|L)[CJJ95*%))#--8-z;:J	[	#l"3I<M<Mcjj+6?wq$$?ckk<8Awq$DAz9#4#4cooswwPG  	@As   
E
E
?
E
Ec                    | j                   | j                  }}t        ||      \  }}t        j                  ||      |fS rB   )r   r   r  r   r!   )r  r  r   r   r   r  s         rF   _cached_closed_call_dcer    s>     ,,%$UL9)[			)V	,k	99rH   c           	     0   t        |       s&t        |      sdgt        |j                        z  d fS |j                  d   }t        |t        |             \  }}t        j                  |      }t        |j                  |      }t        t        |j                  |      D cg c]
  \  }}|s	| c}}t        |j                  |       D cg c]
  \  }}|s	| c}}|j                  |||j                  |j                        }	||	fS c c}}w c c}}w )NFr   r   )rH  r<  r   r  r   r  rQ   r   r  r   r"   r  r  r   r  r  )
r  r   r  rL  r  r   r3  r2  r  r  s
             rF   dce_jaxpr_closed_call_ruler    s     
\	;s#37S_$d**::l#&5feL>QR,\*'CJJ<8*CJJ4=WQq=CKK6?WQ$q?	mmZ#//377D' 
g	 >?s   #
D
.D

DDc                6    t        | j                         d      S NrC   )r!   r   r  s    rF   r   r     s     
U]]_b	))rH   c                ,    t        | t        |            S rB   )_move_invars_rightrQ   r   to_moves     rF   move_invars_rightr    s    	E5>	22rH   c                   t        | j                  j                  t        |      g      \  }}t	        ||      \  }}g |||}t        g | j                  j                  |g | j                  j                  | j                  j                  | j                  j                        }| j                  j                  ||      }| j                  |      S )N)r  r   r  )	r7   r   r  r   r9   _renumber_effectsr  r   r   )	r   r  r  restleft_invarsright_invars
new_invarsnew_effsr   s	            rF   r  r    s    EKK..W?,&$,Wf=+|33|3d3*++
+33 2 23kk( kk!!X!F)	Y	''rH   c                ,    t        | t        |            S )zEReorder `invars` by moving those indicated in `to_move` to the front.)_move_binders_to_frontrQ   rL  r  s     rF   move_binders_to_frontr    s     
 eGn	==rH   c                   t        | j                        t        |      k(  sJ | j                  j                  | j                  j                  }}t        ||      }t        g ||g ||| j                  j                        }| j                  j                  j                  d }n3t        t        | j                  j                  j                  |            }| j                  j                  j                  |      }| j                  j                  ||||      }t        j                  || j                        S )Nr  )r  r  r   r   )r   r   r   r  r  _move_to_frontr  r   r   r  rQ   r  r   r   r!   r   )	r   r  r  r  r  r  new_arg_namesr  r   s	            rF   r  r    s    
U^^	G	,,	,kk++U[[-?-?V)fg.*	J!69!6v!68K8KM(
[[%%-M.)?)?)I)I7STM''-'@#kk!!*h3 " P)			)U\\	22rH   c           	     X   t        |       D ci c]  \  }}t        |      | }}}t        |      D ci c]  \  }}||t        |          }}}|D ch c]=  }t        |t        j                        r|j                  ||j                           n|? c}S c c}}w c c}}w c c}w )Ninput_index)r  r  rN   r   r  r   r  )r  old_varsr   r  r2  newvar_idxs
old_to_newr8  s           rF   r  r    s    &/&9:daA:+:2;H2EF$!Q;r!u%%F*FEI
K@AZ7334 ))
1== 9)
::;< 
K K ;F
Ks   BB!AB'c                    t        | |      D cg c]
  \  }}|s	| c}}t        | |      D cg c]
  \  }}|r	| c}}z   S c c}}w c c}}w rB   r  )lstr  eltmoves       rF   r  r    sI     #C 1
:93T3
: #C 1
>933
>? @
:
>s   
AA
AAc                J    t        | t        t        j                  |            S )zDReorder `invars` by moving those indicated in `to_move` to the back.)r  r   r   r   r  s     rF   move_binders_to_backr  "  s     
|S'-B	CCrH   c                ,    t        | t        |            S rB   )_move_outvars_to_backrQ   r  s     rF   move_outvars_to_backr  '  s    	ueGn	55rH   c                L   t        | j                  j                  |      D cg c]
  \  }}|r	| c}}t        | j                  j                  |      D cg c]
  \  }}|s	| c}}z   }| j                  | j                  j                  |            S c c}}w c c}}w )Nr  r  )r  r   r  r   )r   r  r8  mnew_outvarss        rF   r  r  *  s     #EKK$7$7 AK1!K #EKK$7$7 AK1!KL+	U[[000E	FF LKs   
BB
B $B c                  j    e Zd Zg dZ	 	 d	 	 	 	 	 	 	 ddZd Zd Zed        Zd Z	d Z
d	 Zd
 Zd Zy)DynamicJaxprTracer)r[   r   mutable_qddparent_debug_infoNc                j   t        |t        j                        r'|j                  J |j                  |j                  }}n|j
                  rJ d }|| _        || _        | j                  j                  j                  | _
        || _        || _        t        j                  |      | _        || _        y rB   )rN   r   AvalQDDqddr[   has_qddr   
_line_infoframer   r  r   MutableQuasiDynamicDatar	  r
  )r_   rj  r[   r   	line_infor
  r  s          rF   r|   zDynamicJaxprTracer.__init__4  s     $%XX!!!))TXXCdcDKDO{{((33DDIDH33C8DDKrH   c                "    d| j                    dS )Nz
JitTracer()r;  r^   s    rF   _short_reprzDynamicJaxprTracer._short_reprH  s    		{!$$rH   c                .    | j                   j                  S rB   )r	  cur_valr^   s    rF   r   zDynamicJaxprTracer.cur_qddK  s    ###rH   c                v    | j                   }|j                  r t        j                  || j                        S |S rB   )r[   r  r   AvalMutableQDDr	  r_   r[   s     rF   aval_mutable_qddz#DynamicJaxprTracer.aval_mutable_qddN  s0    99D||  t'7'788krH   c                
   | j                   }t        |t              r| j                   j                   S | j                  j                  j
                  j                  |      }|| S t        j                  |j                        S rB   )
r   rN   r   r   r  constvar_to_valr   r   rr  	canonical)r_   atommaybe_consts      rF   rr  zDynamicJaxprTracer.full_lowerV  sc    88D$ XX\\KK%%5599$?k		{4455rH   c                     yr  rC   r^   s    rF   	_contentszDynamicJaxprTracer._contentsa  s    rH   c                Z   | j                   j                  j                  |       \  }}| j                  }|yd|j                   d|j
                   d}|r	 |D cg c]  }|j                  |j                  |   nd! }}t        |      dk(  r	d|d    }n9t        |      d	k(  rd
|d    d|d    }n|^ }}	d
dj                  |       d|	 }|dt        |      dkD  rdnd d| dz  }d|z   S |r|d d D 
cg c]b  }
dt        j                  |
t        j                         t        j                  d             dt        j                  |
j                          d }}
|ddj                  |      z   z  }t        |      dkD  r|dz  }d|z   S c c}w # t        $ r Y yw xY wc c}
w )Nr  z.The error occurred while tracing the function z for z. r\   rb   zthe argument r      zthe arguments z and z, z, and zOThis concrete value was not available in Python because it depends on the valuesz of rx     z  operation T)print_shapesz
    from line zBThis value became a tracer due to JAX operations on these lines:

z

z/

(Additional originating lines are not shown.)
)r   r  find_progenitorsr  r  r  r  
IndexErrorr   joinr   pp_eqnJaxprPpContextJaxprPpSettingsr   	summarizer  )r_   	invar_posprogenitor_eqnsr  originr  r  arg_info_strr  lastr   mstss               rF   _origin_msgzDynamicJaxprTracer._origin_msgd  s   !%!2!2!C!CD!II


C
{>""#5(8<F') +.--*CcmmA&R )	 ) 
Y1	&y|n5y>Q'	!~U9Q<.It'		$'8tfE (/29~/Ar'J K#nA' (f &= 
 )!,.  S$"5"5"79M9M[_9`ab c/99#//JKM .d .   ++d+, -f	_		!EE&=/) .s+   F $F F <A'F(F 	F%$F%c                8    | j                   j                  |       S rB   )r   	get_constr^   s    rF   r9  zDynamicJaxprTracer.get_const  s    ;;  &&rH   c                    | j                   j                  }| j                  }t        |t              r|j
                  j                  |      nd }|| S t        |j                        S rB   )	r   r  r   rN   r#   r  r   r*   r  )r_   r  r   r   s       rF   r*   zDynamicJaxprTracer.get_referent  sS    KKE88D-7c-B%


#
#D
)C;4?L$??rH   NN)
rj  DynamicJaxprTracer[   z!core.AbstractValue | core.AvalQDDr   r%   r  z"source_info_util.SourceInfo | Noner
  zTracingEqn | None)rj   rk   rl   rv  r|   r  r   rw  r  rr  r#  r7  r9  r*   rC   rH   rF   r  r  1  ss    E)
 @D,0	6 = *	(%$  	6!F'@rH   r  c                    | j                   S rB   r;  rD   s    rF   r   r     s
    !&& rH   c                   t               }t               }t        t        j                  | |            D ci c]  \  }}||
 }}}t               }	|D ]  }
|
j
                  t        j                  v r$|
j                  \  }d ||<   |	j                  |       |
j                  D ]\  }t        |t        j                        r-|j                  t        |
j                        k\  rM t!        ddd d d d             }t#        d| d|
 d	t        j$                  | |||t               |             |
j                  |j                     }t!        |      t        j&                  u s||	v r|j)                  ||      x}|u r] t!        ddd
 d d d             }t#        d| d|d|
 d|
j                   d	t        j$                  | |||t               |       
      |j+                  |      }|j                  |       _  |S c c}}w )NFakerC   c                    | S rB   rC   self_s    rF   r   z$make_jaxpr_effects.<locals>.<lambda>       rH   c                     y rB   rC   r*  s     rF   r   z$make_jaxpr_effects.<locals>.<lambda>  r+  rH   c                     y rB   rC   r*  s     rF   r   z$make_jaxpr_effects.<locals>.<lambda>  r+  rH   )resolve_result_pathsassert_arg_namesassert_result_pathsz`JaxprInputEffect` z is invalid.
 Equation: z


 Jaxpr: c                    | S rB   rC   rA  s    rF   r   z$make_jaxpr_effects.<locals>.<lambda>  rC  rH   c                     y rB   rC   r*  s     rF   r   z$make_jaxpr_effects.<locals>.<lambda>  r+  rH   c                     y rB   rC   r*  s     rF   r   z$make_jaxpr_effects.<locals>.<lambda>  r+  rH   z4 does not have corresponding jaxpr input: eqn_invar=z.
 Equation: z

 Effects: r  )rX  r  r  r   chainr   r   _ref_allocating_primitivesr  r  r   rN   r  r  r   r  rO   r  r   r   r   r   )r  r  r  r  r]  r  r  r2  all_vars
mut_arraysr   outvarr  r  	eqn_invarr  s                   rF   r  r    s#   X(%-()V)DEFtq!adF(Fu* #c
}}777gfhvnnV{{ 	C11	2??c#**o-%VR:M6H9K"$ % '# #C5 )!U #IvwceSIJLM M
 JJs/		?dll*i:.E
#<<	8<<KI%VR:M6H9K"$ % '# %cU +9.7\ :  #u %"{{m ,::i$sKLNO O kkkk2=#H 
M Gs   Hc                  "    e Zd ZU ded<   ded<   y)	Constantsr	   r  originalNru   rC   rH   rF   rS  rS    s    
 .-rH   rS  c                      e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<   ded<   ddZddZd Z	 	 	 	 	 	 	 	 	 	 ddZd Zd Z	y)JaxprStackFramezCallable[[AbstractValue], Var]r  z0WeakValueDictionary[ConstId, DynamicJaxprTracer]constid_to_tracerzdict[Var, Constants]r  z@list[Union[ReferenceType[TracingEqn], Callable[[], TracingEqn]]]tracing_eqns	list[Var]r  r  r   core.DebugInfor   rh   is_highz.list[tuple[Var, core.MutableQuasiDynamicData]]mutable_qddsauto_dcec                    t        j                         | _        t               | _        i | _        g | _        g | _        t               | _        || _	        d| _
        g | _        || _        y rz   )r   r  r   rW  r  rX  r  r  r   r   r[  r\  r]  )r_   r   r]  s      rF   r|   zJaxprStackFrame.__init__  sW    ++-DK02DDDDK5DL DODLDDMrH   c                    t        t              sJ j                  s| j                  sfdn
t	              }| j
                  j                  |       y )Nc                      S rB   rC   )r   s   rF   r   z)JaxprStackFrame.add_eqn.<locals>.<lambda>  s     rH   )rN   
TracingEqnr   r]  r   rX  r   )r_   r   ra  s    ` rF   add_eqnzJaxprStackFrame.add_eqn  s>    c:&&&++T]]SAQrH   c                F   g }| j                   D ]  } |       }||j                  t        |j                  D cg c]  }|j                   c}|j
                  |j                  |j                  |j                  |j                  |j                                |S c c}w rB   )rX  r   r&   r2  r   r  r   r   r   r  r  )r_   r  tracing_eqnr8  r   s        rF   get_eqnszJaxprStackFrame.get_eqns  s    D(( N
-a	
H
kk(,,
'Q155
'
))Q[[!((AIIq}}aeeM NN K (s   Bc           	     p   | j                         }|D cg c]  }|j                   }}t        | j                  j	                         j                               \  }}	|	D 
cg c]  }
|
j                   }	}
t        ||	||      \  }}	t        || j                  ||      }| j                  D ]  \  }}|j                  |_         t        j                  || j                  |      }| j                  xs t!        d |D              }t#        || j                  |||||      }|t%        |	      fS c c}w c c}
w )Nc              3  H   K   | ]  }|j                   j                    y wrB   )r[   r[  rI  s     rF   r   z+JaxprStackFrame.to_jaxpr.<locals>.<genexpr>  s     !CQ!&&..!Cs    ")re  r   r3   r  copyr  r  _drop_unused_varsr  r  r\  r  	final_qddr   rL  r[  rH  r   r  )r_   rj  r   r   r  r  r   r  r  	constvalsr   r   r2  r  rN  r[  r   s                    rF   to_jaxprzJaxprStackFrame.to_jaxpr  s    ==?D)*quu*G*!$"6"6";";"="C"C"EFIy&/00I0,Y	4QIyigtDD ##  3KKak  xx	4;;8HllCc!C(!CCG)T[['4z7SE$y/!! +0s   D."D3c                    t        |t        j                        r'| j                  |j                  |j
                        S | j                  |      S )N)initial_qdd)rN   r   r  r  r[   r  r  s     rF   r  zJaxprStackFrame.newvar  s:    $%kk$))k::kk$rH   c           	     x   | j                         }|j                  }|rt        |t              ry|h}|d d d   D ]i  }t	        |j
                        |z  }|s|j                  |       |j                  |j                  D ch c]  }t        |      t        u s| c}       k t        | j                        D cg c]  \  }}||v s| }	}}|t	        | j                  j                               z  |D cg c]#  }t        fd|j                  D              s"|% }
}|	|
fS c c}w c c}}w c c}w )Nr;  r  c              3  j   K   | ]*  }t        |      t        u r|v nt        |      t        u  , y wrB   )rO   r#   r   )r   r2  r  s     rF   r   z3JaxprStackFrame.find_progenitors.<locals>.<genexpr>  s5      - q'S.Yd1g.@@-s   03)re  r   rN   r   r  r  difference_updaterQ  r  rO   r#   r  r  rh  rH  )r_   r   r  r  active_varsr   producedr2  r  invar_positions
const_eqnsr  s              @rF   r*  z JaxprStackFrame.find_progenitors
  s$   ==?D
**C*S'*%KDbDz FS[[!K/h	%%h/szzD!T!W^ADE	F
 &/t{{%;PTQqK?OqPOPc$"6"6";";"=>>I!% # -- *# J  J&& EPs$   D,
D,
 D1D1>#D7"D7N)r   rZ  r]  rh   )r   zcore.TracingEqn)
rj  r<  r   Sequence[Tracer]r   rZ  r  r-   rf   ztuple[Jaxpr, list[Any]])
rj   rk   rl   rv   r|   rb  re  rl  r  r*  rC   rH   rF   rV  rV    s    
((EE''PP
->>.
 
"$"#" !" 	"
 
!". 'rH   rV  zdict[Primitive, ConstFoldRule]const_fold_ruleszdict[Primitive, ForwardingRule]r  c                ~   dd|D ch c]  } |      D ]  }|  c}}|d d d   D ]^  }|j                   D cg c]  }|v r|nt        |j                         c}|_         j                  fd|j                  D               ` t        fdt        | |      D              \  } }| |fS c c}}w c c}w )Nc                D    t        | t              rg S | j                  }| gS rB   )rN   r   r[   )r   r[   s     rF   varsz_drop_unused_vars.<locals>.vars-  s!    $ i99D6MrH   r  c              3  <   K   | ]  } |      D ]  }|   y wrB   rC   )r   r   r2  rz  s      rF   r   z$_drop_unused_vars.<locals>.<genexpr>5  s!     =d$t*=Q==s   c              3  6   K   | ]  \  }}|v s||f  y wrB   rC   )r   r2  r   r  s      rF   r   z$_drop_unused_vars.<locals>.<genexpr>6  s&       E1c!t)q#h Es   	)r   r%   rf   rY  )r  r$   r[   rQ  r  r3   r  )	r  rk  r  r  r   r2  r   r  rz  s	          @@rF   ri  ri  *  s    
 #*>$4:>aA>A>$$B$Z >c@CL1T	1wqvv6LCKKK=cjj==>    E I6 E E)Y	I	 ?Ls
   B4"B:c                &     | j                   |i |S rB   )r   )r   	aval_qddsr   s      rF   _cached_abstract_evalr  ;  s    	 	 	 )	6v	66rH   c           
         |j                         D ]  \  }}	 t        |        y # t        $ r}t        d|  d| d|       |d }~ww xY w)NzlAs of JAX v0.7, parameters to jaxpr equations must have __hash__ and __eq__ methods. In a call to primitive z, the value of parameter z was not hashable: )r  hashr  )r   r   kr2  r8  s        rF   _verify_params_are_hashabler  @  sk    lln 7da7
1g7  7	22; =C*1#	/0 6777s   &	A	AA	c                  j    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   d Zed        Zy)ra  zlist[DynamicJaxprTracer]r2  rY  r  r'   r   r  r   r  r   r  r  r+   r  c                f    || _         || _        || _        || _        || _        || _        || _        y rB   )r2  r  r   r   r   r  r  )r_   r2  r  r   r   r   r  r  s           rF   r|   zTracingEqn.__init__Z  s4     DODLDNDKDL"DDHrH   c                    | j                   S rB   )r2  r^   s    rF   r  zTracingEqn.invarsf  s    ??rH   N)rj   rk   rl   rv   r|   rw  r  rC   rH   rF   ra  ra  P  sE    &&
**  rH   ra  c                      e Zd ZdZ	 	 dd fdZd ZddZddZddZ	 ddZ	ddZ
	 d	 dd	ZexZZdd
Zd ZddZd Zd Z	 ddZddZddZ	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 d dZ	 	 	 	 	 	 	 	 	 	 d!dZ	 	 	 	 d"dZ xZS )#r<  )r  r~   r   c                `    t         |           || _        t        ||      | _        || _        y rB   )r{   r|   r   rV  r  r   )r_   r   r   lowerr]  r   s        rF   r|   zDynamicJaxprTrace.__init__m  s,    	GD X6DJ$DrH   c                j    g | j                   _        i | j                   _        i | j                   _        y rB   )r  rX  rW  r  r^   s    rF   
invalidatezDynamicJaxprTrace.invalidatet  s*    
 !DJJ $&DJJ !#DJJrH   c                   t        |t              r|j                  | u r|S t        |d      r@t	        j
                  |       5  |j                         }d d d        | j                  ||      S | j                  ||      S # 1 sw Y   -xY w)Ndimension_as_value)	rN   r  r   hasattrr   r   r  r   r   r_   rE   r  s      rF   r   z!DynamicJaxprTrace.to_jaxpr_tracer  s}    !'(QXX-=h	(	)##D) 	%""$!	%##A{33~~a--		% 	%s   A??Bc                    |j                   }|j                  r t        j                  ||j                        }t        | ||||      S rB   )r[   r  r   r  rn  r  )r_   r  r  r
  r[   s        rF   var_to_tracerzDynamicJaxprTrace.var_to_tracer  s9    88D||\\$0ddD#{FCCrH   c                   | j                   j                  |      }t        | |||      }| j                   j                  j	                  |       | j                   j
                  j	                  ||j                  f       |S rB   )r  r  r  r  r   r\  r	  )r_   r[   r  r  r   s        rF   r   zDynamicJaxprTrace.new_arg  sf    
**

D
!CdC=FJJS!JJ""C););#<=MrH   c           	        |xs t        j                         }|xsO t        t        j                  j
                  t        j                  j
                  t        j                               }t        | j                  j                  |      }t        j                  j
                  r(t        d |D              sJ t        d |D              sJ t        |||||||      }	|D 
cg c]  }
| j                  |
||	       }}
|	|fS c c}
w )Nc              3  <   K   | ]  }t        |t                y wrB   )rN   r  r  s     rF   r   z-DynamicJaxprTrace.make_eqn.<locals>.<genexpr>  s     GqA12Gr  c              3  <   K   | ]  }t        |t                y wrB   )rN   r#   rI  s     rF   r   z-DynamicJaxprTrace.make_eqn.<locals>.<genexpr>  s     DqA$Dr  )r   rT  r+   r   r  rM   r  r   r  r   r  r  rL   r   ra  r  )r_   r2  r  r   r   r   r  r  r  r   r2  r   s               rF   make_eqnzDynamicJaxprTrace.make_eqn  s    C!1!A!A!CK
 1))//%%++--/1C $**##Y/G!!GJGGGGDGDDDD
Z)VWkSV
WCDKLq4%%ac:LKL Ms   #Dc           	     p    | j                  |||||||      \  }}	| j                  j                  |       |	S rB   )r  r  rb  )
r_   r2  r  r   r   r   r  r  r   r   s
             rF   emit_eqnzDynamicJaxprTrace.emit_eqn  s;    }}ZIvwXcehiCJJsrH   c                   | j                   j                  j                  t        |            }||t	        |      }|j
                  rct        j                  | j                  xs t        j                        5  t        j                  |t        j                  |            }d d d        | j                  |||      }|S # 1 sw Y   xY wrB   )r  rW  r   r  r   r  r   r   r   
eval_tracer  r   
_new_const)r_   r   r  r[   r   s        rF   r   zDynamicJaxprTrace.new_const  s     ZZ))--be4F~	{	##D$5$5$HI 	5dDLLO4$	5tQ4fM	5 	5s   ;*CCc           	        |}t        |      }t        |t        t        t        t
        t        j                  t        j                  f      rt        j                  |      }t        j                  |      rt        ||      }t        | |||      S | j                  j!                  |      }t        | |||      }|| j                  j"                  |<   t        |t        j$                        r1| j                  j&                  j)                  ||j*                  f       t-        ||      | j                  j.                  |<   t1        || j2                  ||       |S )N)r  rT  )r  rN   intfloatrh   complexnpgenericndarrayr   canonicalize_valuer   r   r   r  r  r  rW  r  r\  r   r	  rS  r  r   finalize_const)	r_   r[   r   r  orig_cid_cr   r  r   s	            rF   r  zDynamicJaxprTrace._new_const  s   Fa5D!c5$RZZHI

#
#A
&a1AtcdC==JJd#c!$c;?f+1djj""4(	D$,,	'

&&V-?-?'@A(1A(Odjj  %vt**C6mrH   c                P    | j                   j                  j                  |d        y rB   )r  r  pop)r_   r  constids      rF   r  z DynamicJaxprTrace.finalize_const  s    JJ""3-rH   c                    |j                   }t        |t              r|j                   S | j                  j                  j                  |      }||j                  }|S rB   )r   rN   r   r  r  r   r  )r_   r   r   rV   s       rF   r9  zDynamicJaxprTrace.get_const  sL    ::D$ XXojj((,,T2e		lrH   c                x    t        j                         }| j                  ||      j                  j                  S )Nr  )r   r   r   r	  r  r  s      rF   r   zDynamicJaxprTrace.cur_qdd  s2    "**,K{;GGOOOrH   c                   | j                   xj                   |j                  t        t        |      i |z  c_        t        j
                  j                  r3t        d |D              s!|j                  t        j                  ||      S t        j                         }t        | j                  |      }t        ||      }|t        v rt        |   | |g|i |S | j!                  ||||      S )Nc              3  <   K   | ]  }t        |t                y wrB   rN   r   r  s     rF   r   z6DynamicJaxprTrace.process_primitive.<locals>.<genexpr>       6^QRz!V7L6^r  r  )r  r[  r   r,   r   eager_constant_foldingrM   rH  r   r   r  r   r   r   r   custom_staging_rulesr   )r_   r   r   r   r  r   jaxpr_tracerss          rF   r   z#DynamicJaxprTrace.process_primitive  s    JJ+)++S-ALVLL$$**36^V]6^3^&&tHH"**,Kd22LO1M((!),T; 7 7/57 7))=&+7 7rH   c           	        ddl m} |D cg c]  }|j                   }}||u r|d   j                  t	               }	}nU|j
                  dk(  s|j                  r'|j                  |      r |j                  |i |\  }}	n	 t        |g|i |\  }}	t        |t        t        f      |j                  k7  rt        | d| d      |j                  s|gn|}|xs t!        j"                         }t%        ||||      }|3d }t'        ||      D cg c]  \  }}| j)                  |||       }}}n| j+                  |||||	|      \  }}t-        d	 |	D               }|9|r7|t.        v r/t/        |   |      \  }}t1        |      D ]  \  }}|	||   ||<    || j2                  j5                  |       |j                  r|S |j7                         S c c}w # t        $ r}
t        ||        d }
~
ww xY wc c}}w )
Nr   )call_hi_primitive_pr   
custom_linz<.abstract_eval() method should return a tuple or a list iff z.multiple_results.r  r[   r  c              3  P   K   | ]  }t        |t        j                           y wrB   r  )r   r8  s     rF   r   z>DynamicJaxprTrace.default_process_primitive.<locals>.<genexpr>  s     U1z!W-E-EFUr  )jax._src.hijaxr  r  out_avals_flatr  r~  is_effectfulr   r  	Exceptionr  rN   rQ   r  r   r  r   r   try_constant_foldingr  r   r  rH  r  r  r  rb  r  )r_   r   r   r   r  r  r   r~  r  r   r8  maybe_consts_outr   r   r[   r   no_input_effectsin_fwdout_idxin_idxs                       rF   r   z+DynamicJaxprTrace.default_process_primitive  s@   2-45##5I5
 ''v55sui
..L
(9#9#9&#A/	//EfEoi/	PIPP	4 )eT]+y/I/II) %009{:LN O O#,#=#=9I;!1!9!9!;K+Iw	R#c$'(8)$DF D ^^A;T^J Fk F w	9f'+ ' Fc; UPTUUU
+	=M0M$Y/4kfc&v. 1/'6!(+g
1 
jj#44;K+//:KKU 6  #Iv6Fs#   GG G9	G6$G11G6c                   t        j                         }t        | j                  |      }|j                  t        d |D              n|j                  }d |_        |J t        ||      }t        ||      \  }}	}
|j                  dd      rt        j                  ||
g|ddiS t        |      }t        |t        j                        rt        |      }t        ||      }t         j                  |      }|r  ||dgt#        |      z  t#        |
            }t        ||
      }| j%                  g |||	|||d   j&                  |      S )	Nr  c              3  2   K   | ]  }t        |        y wrB   )r   r  s     rF   r   z1DynamicJaxprTrace.process_call.<locals>.<genexpr>  s     5QXa[5s   inlineFpropagate_source_infor   Tr   )r   r   r   r   in_typerQ   r   _cached_trace_to_jaxprr   r   
eval_jaxprr   rN   r   r   r   r   r   r  r   )r_   r  r   r2  r   r  r   r  r   r  r   r   r3  r   r  s                  rF   r   zDynamicJaxprTrace.process_call  sU   "**,Kd22LO9:9Ju5*55II AI_j1J5aAE9fzz(E"__UF :Z :38: : (.I.$":":;i(if3J'++N;M dVc*o-E!$V.j0M==%-%*%y.J|,44+  O OrH   c           
     ^   t        j                         }t        | j                  |      }t	        ||      }|D cg c]  }|j
                   }}|d   |d   }
}	t        ||d         D cg c]   \  }}|t        j                  |
||      n|" }}}t        j                  |	|d   fg      5  t        |j                         |      \  }}}t        |||      \  }}t        j                  j                  |j                        }|rt!        d|        |d          }t        ||      D cg c]   \  }}|t        j"                  |
||      n|" }}}t	        ||      }dt%        |      z  |d   z   }t'        |||t)        |      	      }|d= t*        j-                  |      }|r  ||d
gt%        |      z  t%        |            }t        j.                  |j                  |	h      }| j1                  g |||||||      }d d d        |S c c}w c c}}w c c}}w # 1 sw Y   S xY w)Nr  r  r   r   global_axis_sizez2Ordered effects not supported for map primitives: r   rB   r  T)r   r   r   r   r   r[   r  r   r(   r  r?  r   _linearize_of_pmap_hackr   ordered_effectsr   r  r)   r   r   r   r   r   r	  r  )r_   r  r   r   r   r  r   r   r   r  r   r   in_axisreduced_in_avalsr   reduced_out_avalsr   r  r  out_axisr  r  new_in_axesr3  r   r   r   s                              rF   r  zDynamicJaxprTrace.process_map6  s   "**,Kd22LO/7+G '(1(H(!+.{0CyI +.hy8I*JL&Aw #. ((GQ?456 L L 
	 	 9f5G.H"I!J	K k)?



 "2*4&e-a?meV//99%--Ho	 ,,;+<> ? 	?)()+h &)):H%EG!a ) %%i1=/01 Gi G /62mc&k)F9,==kh#:5#ACj
%
&)--m<m	":vG/Dc&kR
++EMMI;GdMM
$M
$G
$i
D^i " kk+k. 9 )LGk. s+   H-%H0BH"1%HB1H"H""H,c                   t         j                  j                  rBt        d |D              s0|j	                  t
        j                  |g|t        |            S t        j                         }t        | j                  |      }t        ||      }|D cg c]  }|j                   c}D cg c]  }|j                          c}t        |      \  }	}
}t        j                   t#        |	      d      }t        t$        j&                  j(                        t*        fd              }t        ||      }| j-                  g |||
|t        ||t/        |      |      |	j0                  |      S c c}w c c}w )Nc              3  <   K   | ]  }t        |t                y wrB   r  r  s     rF   r   z<DynamicJaxprTrace.process_custom_jvp_call.<locals>.<genexpr>[  r  r  )r  r  rC   r<  c                     j                   D ]  }|xr |j                           t        |       \  }}t        | t	        |            \  }}g 
|}t        |j                         |      \  }}}	||	 |       fS rB   )storesresetr9   _jvp_jaxpr_zerosrQ   r?  r   )in_zerosrY  nz_tangent_avals
zero_avalsjvp_	out_zerosrZ  r   r   r   r   in_tangent_avalsr"  s             rF   jvp_jaxpr_thunkzBDynamicJaxprTrace.process_custom_jvp_call.<locals>.jvp_jaxpr_thunkf  s     ::6%u66%3H>N%O"
(hj8IJodI0H0/0i3D4K4K4M4=?eQ
J	++rH   )r   jvp_jaxpr_funrF  r  )r   r  rM   rH  r   r   r  r   r   r   r   r   r   r[   to_tangent_avalr?  r!   r   rI  rJ  r   rK  r  r   r   )r_   r   r!  r"  r   r  r  r   r   	fun_jaxprr  r   closed_fun_jaxprr  r  r   r  s      `           @@rF   r$  z)DynamicJaxprTrace.process_custom_jvp_callX  sc    $$**36^V]6^3^!!$//C3Gw3G"&n"EG G"**,Kd22LO/7+G '(1(H5=>))+>#9#x#H Iy&''(?	(JBOR\\cnn5,  6, 0M=="-"'"It(*F*	, 	  ! !# )>s   E=5Fc                   t         j                  j                  rDt        d |D              s2|j	                  t
        j                  ||g|t        |            S t        j                         }t        | j                  |      }	t        |	|      }|D 
cg c]W  }
|
j                  j                  r3t        j                  |
j                  t        j                   |
            n|
j                  Y c}
t#        |j%                               \  }}}t'        |      t        j(                  t+        |      d      }t        t,        j.                  j0                        t2        fd              }fd}t        |	|      }| j5                  g ||||t        |||||      |j6                  |      S c c}
w )	Nc              3  <   K   | ]  }t        |t                y wrB   r  r  s     rF   r   z<DynamicJaxprTrace.process_custom_vjp_call.<locals>.<genexpr>  r  r  r7  r  rC   r<  c                     j                   D ]  }|xr |j                           t        j                         |       }t	        |      \  }}}||fS rB   )r  r  r>  r   r?  )r@  rY  rA  r   r   r   rC  r   s         rF   fwd_jaxpr_from_zeroszGDynamicJaxprTrace.process_custom_vjp_call.<locals>.fwd_jaxpr_from_zeros  sT     ::6%u66S335u=d/h?eQF]rH   c                 Z            \  } }}|D cg c]  }||n|z    }}| ||fS c c}w rB   rC   )out_treer&  r  r   rF  r8  s       rF   
out_trees_z=DynamicJaxprTrace.process_custom_vjp_call.<locals>.out_trees_  sD    '0{$h*@JK1AJ6KjKx++ Ls   (rE  )r   r  rM   rH  r   r   r  r   r   r   r   r   r   r[   r  r  r   r?  r   r   r!   r   rI  rJ  r   rK  r  r   )r_   r   r!  rC  rG  r   r8  r  r  r   r   r  r  r   r  r  r  r  r   rF  s      `  `           @@rF   rM  z)DynamicJaxprTrace.process_custom_vjp_call{  s   
 $$**36^V]6^3^!!$//Cc3LG3L"&>"Z\ \"**,Kd22LO/7+G]deXYQVVT\\!_5QVVSeH#9#:P:P:RT\#] Iy&VJ''(?	(JBOR\\cnn5  6,
 0M=="-"'"It(1"
*		,
 	  ! !' fs   AGc               n   t        j                         }	t        | j                  |	      }
t	        |
|      }t        ||j                  g      \  }}|D cg c]  }|j                   }}g |D cg c]  }|j                   c}|t        ||      \  }}}t        j                  t        |      d      }t        j                  |t        ||f            \  }t        fd       }t	        |
|      }| j!                  g ||||t#        ||||||      |j$                  |	      S c c}w c c}w )Nr  rC   c                 n    j                   D ]  } | j                           t              \  }}}||fS rB   )r  r  r?  )rY  r   r   r   
in_avals_ttranspose_flats       rF   transpose_jaxpr_thunkzIDynamicJaxprTrace.process_custom_transpose.<locals>.transpose_jaxpr_thunk  s9    !((7%%++-7/
KeQF]rH   )r   r  r)  r&  lin_treer  )r   r   r   r   r   r7   r+  r[   r?  r   r!   r   r   flatten_fun_nokwargsr1   rK  r  r   r   )r_   r   r*  r   	transposer)  r  r&  r  r  r   tracers_restracers_linr   
in_avals_pr   r  call_constsclosed_call_jaxprin_tree2r  r  r  r  s                         @@rF   r4  z*DynamicJaxprTrace.process_custom_transpose  sK    #**,Kd22LO/7+G)'H4G4G3HIK")*Q!&&*J*=K0qAFF0=9=J)?j)Q&J	;((
+R1  (<<=(H!56 8NH  
 5M=="-"'"It)#8 8	3 	!!  ! !% +0s   D-2D2c                >    | j                   j                  | |||      S rB   )r  rl  )r_   r   r   r  s       rF   rl  zDynamicJaxprTrace.to_jaxpr  s    ::t[*kJJrH   )NFF)r   rZ  )r  r-   rB   r;  )r  r-   r[   zAbstractValue | None)r  r-   rf   r  )rf   r	   rN  )r!  rO  r"  rO  r  rh   )r   core.Primitiver!  rO  rC  rO  rG  rO  r8  z;Callable[[], tuple[PyTreeDef, PyTreeDef, list[int | None]]]r  rh   )r   r  r*  rO  r  rO  r  r0   r&  r0   r  r0   )r   rv  r   rZ  r  r-   )rj   rk   rl   rv  r|   r  r   r  r   r  r  r   pureliftr  r  r9  r   r   r   r   r  r$  rM  r4  rl  rP  rQ  s   @rF   r<  r<  j  s   .)JO%
$	.D 15 .2* $$.P7 -1-L^O8 D!!#0!!.2!!F&!#0&!#0&!7D&! *e&! /3	&!P$!%2$!*7$! *3	$!
 *3$!
 ?H$!LK)K8BKrH   r<  c                T    t        t        j                  | |      |      \  }}}|||fS rB   )r?  rI  annotate)r   r  r   r   r   s        rF   r  r    s-    22;;q'3JGT%6	&	  rH   r  c                b    t        ||      D cg c]  }|D ]  }|  }}} | |i |S c c}}w rB   r  )r   every_othersargskwargspairrE   args_s          rF   r>  r>    s>    T<0
?$
?Q1
?1
?%
?	
E	V	 @s   +c                2     i t                fd}|S )Nc                     j                  |       }|u r*t        j                  d       5   |  x}| <   d d d        |S |S # 1 sw Y   |S xY wrB   )r   r   r   )r  r   cellsfnr]  s     rF   memoizedz_memoize.<locals>.memoized  sX    
))D(
#C
h!!$' &I%eDk&J3J&Js   AA)rX  )r  r	  r  r]  s   ` @@rF   rK  rK    s    
%X( 
/rH   c                   t        |t        |      g      \  }}t        t        j                  |      }t        |||      } | g || }	t        t        |	      d      \  }
}|rJ |	d |
 |	|
d  }}|D cg c]  }t        |      t        j                  u  }}t        ||      \  }}|j                  |       g ||S c c}w )Nr%  )
r7   r   r   r   SymbolicZeror8   divmodrO   r9   rY  )r   rY  r  r  primal_tangent_avals
in_primalsnz_in_tangentsr  tangentsr   r  raggedout_primalsout_tangentsr   r  out_nz_tangentsr   s                     rF   r  r    s    )*>XP*nw++Z8.>>B(	!:!!#SXq!)!V!"1gs12w|+8DE1tAw'...E)E%i>/1++i	);	)	)) Fs   5"B?c                R   t         j                  j                  xr |j                  t	        |             t
        j                  j                  }t        ||      }t        j                  |      5  t        j                         5  t        j                         }|j                  t        |j                  |            }t        j                   |      5  |j#                         \  }} | |i |}	|j%                  |	      }t'        j(                  |	      }
~	~~d d d        t+        |t-        
             |
j                  t        |j.                  |            }|j                  d       }t1        |t-        |             |j2                  j5                  |t-        |      ||      \  }}~~ ~~~
d d d        d d d        t         j                  j                  xr t        j6                         t9              fS # 1 sw Y   xY w# 1 sw Y   \xY w# 1 sw Y   `xY w)N)r   r  c                    | j                   S rB   r;  )r   s    rF   r   z trace_to_jaxpr.<locals>.<lambda>	  s
    !&& rH   )r   rL   rM   rG  r   r   	trace_ctxrj  r<  rz  r   reset_name_stackr   r   r   r   r   	unflattenset_result_pathsr2   flatten_check_returned_jaxtypesr  r   _check_no_returned_refsr  rl  r  r!   )r!  r   r   r   rj  r  r2  r  r  
ans_pytreer  r   r  r   r   s                  rF   trace_to_jaxprr    s    	K!<!<S]!K%%,
J\
B% E" 1$4$E$E$G 1"**,KgemmMNJ				& #))+ldF''j..z:jZ(c
dF# Zc3'''%"7"7[QRK 01IJ[(9:KK(([0A:)46ME6sJS!1 1$ 	8!1!1%!8	UF	#Y	..!# #1 1 1 1s?   3HAHAHBH6HH
HH	HH&)keep_inputsr  r]  c                  t         j                  j                  xr$ | j                  j	                  t        |             |dgt        |      z  n|}t        j                  j                  }t        | j                  |||      }t        j                  |      5  t        j                         5  t        j                         }t        t        |j                   |      |      }t#        ||      D 	
cg c]
  \  }	}
|
s	|	 }}	}
t        j$                  |      5   | j&                  | }d d d        t)        | j                         t        t        |j*                  |      |      }t-        | j                  |       |j.                  j1                  ||| j                  |      \  }}~~ ~~~d d d        d d d        t         j                  j                  xr t        j2                         |j4                  D cg c]  }|j6                   c}fS c c}
}	w # 1 sw Y   xY w# 1 sw Y   {xY w# 1 sw Y   xY wc c}w )NT)r   r  r]  r  )r   rL   rM   r   rG  r   r   r  rj  r<  rz  r   r  r   r   r   r   r  r   r  r  r   r  r  rl  r  r  r[   )r!  r   r   r  r]  r   rj  r  r2  r   keepr  r   r   r   r2  s                   rF   r?  r?  	  s    	O!@!@X!O*5*=X&;+%%,
CNN"'(<% E" 1$4$E$E$G 1"**,KWU]]DhOJ#&z;#?H44!HJH				& *Cj)c*S^^S1ge33MsSKCNNK8KK((S^^)46ME6sJS1 1 	8!1!1%!8	/A/	77 I* *1 1 1 1 0s\   H81AH,6
H
H
H,H -BH,2H8IH, H)%H,,H5	1H88Ic                @   t        |      D ]  \  }}t        |        y # t        $ rt | r:t        | j	                         x}      |kD  r||   j                  d      x}rd| }nd}t        d| j                   d| j                   dt        |       | d      d w xY w)Nresultz at output component r  	function  traced for z returned a value of type z, which is not a valid JAX type)	r  r,   r  r   rF  removeprefixr  r  rO   )r  r   r  rE   pathsr   extras          rF   r  r  7	  s    $ 
Rda	
R R
#s7799e:Q>a%%h//1/'s+###$L0@ AAwiw&EGHMQRRs
    A=Bc                D   t         j                  j                  sy t        |      D ]u  \  }}|j                  }t        |t              s$| j                         j                  t        |            }||   xr d||    }|j                  j                  }|j                  |j                         }t        fd|D        d       }	|	rB|	j                  t         j"                  u sJ dt%        j&                  |	j(                         d}
nW|j*                  v rG| j-                  t        |j*                              |j*                  j/                           }d| d}
nd}
t1        d| j2                   d| j4                   d	|j7                          | d
|
 	       y )Nz at output tree path c              3  @   K   | ]  }|j                   v s|  y wrB   r  )r   r8  r2  s     rF   r   z*_check_no_returned_refs.<locals>.<genexpr>R	  s     4Q!))^!4s   z1

The returned mutable array was created on line rx  z;

The returned mutable array was passed in as the argument r  r%  r&  z, returned a mutable array reference of type z2, but mutable array references cannot be returned.)r   mutable_array_checksrM   r  r[   rN   r.   rF  safe_result_pathsr   r   r  r   re  rW  r   r   ref_pr   r0  r  r  safe_arg_namesindexr  r  r  	str_short)r  r   r  r   r   result_pathslocr  r  r   origin_infoarg_namer2  s               @rF   r  r  D	  s    
	$	$	*	*F$ Hda	A![!--/AA#kBRSlOI"7Q7H Ichhnne
%%a^^d4T4d;c	}}

***L*44S__EFaI%%c%,,&789K9KA9NO##+*A/ c''(S^^4D E//0{{}ocU C99DGH H)HrH   c                  *    e Zd ZU ded<   d Zd Zd Zy)TracerAsNamer	   r   c                8    t        j                  |      | _        y rB   )r   r*   r   )r_   r   s     rF   r|   zTracerAsName.__init__d	  s      (DHrH   c                V    t        |t              xr | j                  |j                  u S rB   )rN   r7  r   )r_   others     rF   __eq__zTracerAsName.__eq__f	  s!    e\*Dtxx599/DDrH   c                ,    t        | j                        S rB   )r  r   r^   s    rF   __hash__zTracerAsName.__hash__h	  s    dhh<rH   N)rj   rk   rl   rv   r|   r;  r=  rC   rH   rF   r7  r7  b	  s    
()ErH   r7  c                ,    |r| j                  |      S |S rB   )r   )rj  r|  r   s      rF   instantiate_const_atr?  n	  s    ""6**MrH   c           
         t        t         j                  |      |      }t        t	        g |j
                  |j                  g ||             fd}|j                  D ]F  }|j                  j                  s|n2|j                  |j                  |j                  j                  z         }t        t        ||      |j                        }	|j                  D 
cg c]  }
|
j                   }}
t        |j                  |	|j                  |      }|1t	        ||      D cg c]  \  }} j                  |||       }}}n? j!                  |	||j                  |j                  |j"                  ||j$                        }t'        j(                  |j                  |       I t        t        ||      |j                        S c c}
w c c}}w )Nr  c                ^    t        |t              rt        |j                  ||       S |   S rB   )rN   r   r  r[   )src_rE   r   rj  s     rF   inline_atomz,inline_jaxpr_into_trace.<locals>.inline_atom}	  s+    !Wqvvq$77VmrH   r   r  )r   r   r   r   r  r  r  r  r  r}   r   r  r[   r  r   r   r  r   r  r@   r  )rj  r  r   r   arg_tracersr  rC  r   rB  r2  r2  r  maybe_constsr   r[   r   r   s   `               @rF   inline_jaxpr_into_tracerF  t	  s    geoo3?H-'+	
+EOO
+ell
+
(M
(K
(*(+# ZZ 6c11CKK3>>COO4N4N#NKO 	W[$/<J!$-A-I-'z3::yYL$'i$@B D __QDt_D Bk B NN:y#--#&::s{{D#''KkCNNCKK56 
W[#&	66 .Bs   $G,Gc                    | t         v r?|D cg c]  }|j                          }}t        d |D              rt        |    |||      S y c c}w )Nc              3  $   K   | ]  }|d u 
 y wrB   rC   r   s     rF   r   z'try_constant_folding.<locals>.<genexpr>	  s     
,Q1D=
,r   )rw  r9  rH  )r   r   r   r  r   	consts_ins         rF   r  r  	  sN    ""(/010I0

,)
,,i(FIFF	 1s   A	c                    | j                   sXt        | j                        t        u r=t	        | j                  dd       r&| j                  j
                  \  }}t        |      g fS ||fS )N	_pmap_tag)
transformsrO   r   r?   getattrr   r   )r   r   r   r   s       rF   r  r  	  sT    
,,49(88acc;%ss{{HAu"5)2--	rH   c                L   | j                   D cg c]  }|j                         D ]  }|  }}}t        j                  t	        t
        |       | j                  j                  j                               }t        ||d      \  }}}t        j                  ||      S c c}}w )Nr<  T)r  )r  lo_tyrI  rJ  r   lower_traceabler   r   r   r?  r   r!   )hi_jaxprr[   rO  lo_avalsr   lo_jaxprr   	lo_constss           rF   lower_jaxprrU  	  s     ( 5 5P4::<P%ePeP(Pll7?H5&nn77JJLN!1!XTJ(Ay			(I	..	 Qs   B c                   t        |      }| j                  D cg c]  }|j                  s: |j                  t	        j
                  |t        |j                                      n9 |j                  t	        j
                  |t        |j                                       }}t        |d       x}J  t        j                  |       | }t        | j                  |      D cg c]*  \  }}|j                  s|j                  |      D ]  }| , }	}}}t        | j                  j                   |      D 
cg c]'  \  }
}|
j"                  j%                  |      D ]  }| ) }}}
}|	|z   S c c}w c c}}}w c c}}}
w rB   )rV  r  r  	raise_valr   islicer   rO  new_from_lovalrW  r   r
  r  final_aval_qdds
read_lovalr   r  r[   	lower_val)r   lo_argslo_args_r[   hi_argsproblemhi_outshi_arglo_valmut_outsr2  hi_vallo_outss                rF   rP  rP  	  s   ']( ++-  LL T^^RYYxTZZ\1BCD T  "))Hc$**,6G"HIJ -' - (D)
)'	22	2$De$g.'),U-B-BG)L 5 5vPTP\P\ OOF35  5f 5( 5%()<)<g%F 5 5	666++F35  5V 5' 5	G	-55s   BE1%E6:E6<,E=c                   | j                   D cg c]  }t        |      j                   }}t        || j                         \  }}t        || j                  j
                        \  }}g || j                  j                  }t        ||| j                  j                  | j                  j                        }| j                  j                  |||      }	| j                  |	|      |fS c c}w )N)r  r  r   )r   r   )r   r,   r  r9   r   r  r  r  r  r  r   )
r   r   r  rk  in_mutablesr  boxvarsr  r   r   s
             rF   convert_const_himutablesrj  	  s    %*\\	2&)

	2$	2)$=)[%dEKK,A,AB)W(G(ekk(((&y&%++2E2E${{//1'kk!!If*1 " 3)	Yy	9;	FF 
3s   C-c                :    t        d | j                  D              S )Nc              3  h   K   | ]*  }|j                   st        |j                                , y wrB   )r  r   rO  )r   r   s     rF   r   z!num_himuts_out.<locals>.<genexpr>	  s      HaiiS^Hs   22)r   rZ  r  s    rF   num_himuts_outrm  	  s    	HU%:%:H	HHrH   c           	     T   t        |      }t        | j                        D ]w  \  }}|j                  |j                  }t	        j
                  |t        |j                  j                  |                  } |j                  j                  |||   g|  y t        |d       J y rB   )rV  r  r  rj  r   rX  r   r[   	lo_ty_qddupdate_from_lovalrW  )r   r_  out_mutout_mut_r  r2  r  lo_valss           rF   apply_himutrt  	  s    '](% :da{{KKc		(C(8(8(=$>?gaffsGAJ99	:
 
h		%%	%rH   c                    t        |      }| D cg c]<  } |j                  t        j                  |t	        |j                                      > }}t        |d       J |S c c}w rB   )rV  rW  r   rX  r   rO  rW  )r   rf  lo_outs_r   ra  s        rF   raise_lo_outsrw  	  s\    '](HMN1[Q[["))Hc!'')n=>N'N	h		%%	%	. Os   AA#)rS  zlist[PartialVal]rf   z1tuple[list[bool], list[AbstractValue], list[Any]])
r   r   rY  zlu.Storer   Sequence[bool]r   zSequence[AbstractValue]r   r	   )r!  r   r   rZ  r9  )r!  rO  rS  Sequence[PartialVal]r|  bool | Sequence[bool]rf   z0tuple[Jaxpr, list[PartialVal], list[core.Value]])
r   r   rj  rx   r|  Sequence[bool] | boolr   rZ  r\  ry  )
r   r   r~   r   r   rZ  r|  rz  r\  ry  )
r   r   rj  rx   r|  r{  r\  ry  r   rZ  rB   )rj  rx   r2  ru  r   ru  r   r'   r   r  r   r  r  r  r  zJaxprEqnContext | Nonerf   rs   )r  zCallable[[JaxprTracer], Atom]rt   rs   rf   zcore.JaxprEqn)
r2  ru  r   ru  r   Sequence[Any]r   rZ  rf   z.tuple[Jaxpr, tuple[Any, ...], tuple[Any, ...]])r   r   r  tuple[bool, ...]rf   r   )r   r!   rf   ztuple[ClosedJaxpr, list[Any]])r   r   rf   r   )r   r   r  r  rf   r   )r   r   r  r  rf   r   )r   r!   r  rx  r|  rz  rf   z@tuple[ClosedJaxpr, ClosedJaxpr, list[bool], list[AbstractValue]])T)
r   r!   r  rx  r|  rz  rC  rz  rf   zRtuple[ClosedJaxpr, ClosedJaxpr, list[bool], list[AbstractValue], list[int | None]])r   r!   r	  rx  r|  rz  rC  rz  )r   r   r	  rx  r  rz  r  rz  r  rz  r  Callable[..., RematCases_]rf   z0tuple[Jaxpr, Jaxpr, list[bool], list[bool], int])r   r   r	  rx  r  rz  r  rz  r  rz  r  z!Callable[..., RematCases_] | Nonerf   5tuple[Jaxpr, Jaxpr, list[bool], list[bool], int, int])r   r   r	  r}  r  r}  r  r}  r  r}  r  r~  rf   r  )r{  zbool | RematCasesrf   
RematCases)r~  strr  r~  rZ  rx  r[  rx  r   r&   rf   PartialEvalCustomResult)r   r  r[   r    rf   r    )r  r  r  ParamsUpdaterr  r~  rZ  
list[bool]r[  r  r   r&   r  ResAvalUpdaterrf   Dtuple[JaxprEqn, JaxprEqn, Sequence[bool], Sequence[bool], list[Var]])r  r  r  ParamsUpdater2r  r~  rZ  r  r[  r  r   r&   r  r  rf   r  )r   r!   rZ  r}  r[  r}  r  r}  r  r   rf   z_tuple[ClosedJaxpr, ClosedJaxpr, Sequence[bool], Sequence[bool], int, int, Sequence[int | None]])r   r   rf   zlist[int | None])r   r   r  rx  rf   r   )r   r   r  r}  rf   r   )r   r!   r  rx  rf   r!   )r   r!   r  r}  rf   r!   )r   r   r  rx  r|  rz  rf   tuple[Jaxpr, list[bool]])r   r   r  rx  r|  rz  rf   z$tuple[Jaxpr, list[bool], list[bool]])r   r&   rf   rh   )r   r   r  r}  r|  r}  rf   r  )r  r  r   r&   rf   "tuple[list[bool], JaxprEqn | None])r  r  r   r&   rf   r  )r  r}  rf   z#tuple[core.ClosedJaxpr, list[bool]])r   r   rf   r!   )r   r!   r  rx  )r   r!   r  r}  )rL  r!   r  rx  rf   r!   )r   r!   r  r}  rf   r!   )r  r   r  rx  rf   r   )r   r!   r  rx  rf   r!   )r   core.ClosedJaxpr)rf   zeffects.Effects)rf   ztuple[list[Var], list[Any]])r   r  )r   r  r   r  rf   rK  )r!  r   r   r2   r   rZ  rf   ztuple[ClosedJaxpr, FlatTree])r!  rO  r   z&Sequence[AbstractValue | core.AvalQDD]r   zlist[bool] | Noner  rh   r]  rh   rf   z,tuple[Jaxpr, list[AbstractValue], list[Any]])r  rZ  r   zSequence[DynamicJaxprTracer]rf   rK  )rj  rx   r|  rh   )rj  r<  r  r-   r   r   r   r|  rD  r  rf   z	list[Any])r   rO  rf   ztuple[Jaxpr, list])rQ  r  )r   zJaxpr | ClosedJaxpr)
__future__r   collectionsr   collections.abcr   r   
contextlibdataclassesr   	functoolsr   	itertoolsr   operatorr   typingr	   r
   r   weakrefr   r   r   r   numpyr  jax._srcr   r   r   r   r   r   r   rI  r   r   r   jax._src.corer   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   jax._src.source_info_utilr-   jax._src.state.typesr.   r/   jax._src.tree_utilr0   r1   r2   jax._src.utilr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   
unsafe_mapr  
unsafe_ziprG   r  TracerIdAvalIdConstIdAttrKindPyTreerQ   rJ   rq   rx   r   transformation_with_aux2r   rc  r   rv   r   r   rg  JaxprTracerReciper   annotate_functionr}  transformation2r{  r  r  r   r  r   r   r   rs   r   r  r  r  r  r   r  r  r  r  r  r  r"  r  r$  r%  r  rv  rU  rz  rN  ry  rO  r  rh   RematCases_rM  r  r  PartialEvalCustomRulerL  r  r   r  r  r  nullcontextr  r  r  r  call_pclosed_call_pr  r  r  r  r  r  r  r  r<  r  DCERuler  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  pytype_aval_mappingsr  rS  rV  ConstFoldRulerw  ForwardingRuler  ri  r  r  ra  r<  cacher  r  r>  rK  r  r  r?  r  r  r7  ConstValr?  rF  r  r  rU  rP  rj  rm  rt  rw  rC   rH   rF   <module>r     s    # " .  !    ) ) E E        &  % %G G G G G G 1 8 A A6 6 6 6 CZCZ 	
	) )V $  n}% n`	8   &	
      &	
  " 8: 4 957 2 713 . 3"0 oy*gF *& *Z 
 */&	&3&&& 8& &  --- '- 	-
 #- - --	- - '	-
 #- -"-,A-)=- ,:-8 66	6 6 '	6
 #6 6: II	I I '	I
 #I I> Y
(j5'*?B/	Z 	$ 264 5 ( *	
 ) !< / ;I:E(E-:EU%#U%$U%  U% 	U%
 6U%n N N M M     =V=V"0=V&=V H=VD "&OO"0O&O 
O X	O /Q/Q%3/Q&/Q-B/Q /Qb
 # /	
 + ) 8QQQ #Q /	Q
 +Q 0Q =Q, , C#C#!C# C# *	C#
 &C# )C# =C# C#L 
  O	  >*  =,;<
J$%0  hn 5uXt^7L (S	!J K  c;$$J  KM !G L!
!3!>L!!"*!/F! (4.(4.(4."4.#tT;tTz*+ , 4S>=9=HI"/4A 2K

 
 	II+8I(I3=IHRI 
I !/I
 LID 8D>8D>8D>#D>3T4Ad
+, - 2K(=(=+9(=((=3=(=HR(= 
(= !/(= L	(=T ZZ!1Z<LZZ*2Z
/Z Z6 )<8:   , 0,@B   2 2 3
" A 00DE AA&4AA
 		7##&6## 8# 49D0D+D* ;@-"7->- % ,% ,%  % N DJ)dU8T>%::;< ='' (')' ')	# ( ? $ -	$++  :!D: :$F !;	$

 * *3 	( 	(>*>
 3 +3 3 K@D)D
6 G G]@ ]@~ 1A  , -)V
 T' T'n 	%T	
S$}"56	$uS$Y
 %$"7
78: 46 0 5J	$uS$Y
 %$"7
789 57 1 66" 7 7	7	7'5	7:>	7    2aK

 aKH ! 
!
 35 / 4 
	 * * /	// / "	/ /@ 

 &*8	848 #	8
 8 8 28 8@RH	H-H 
H<  		77#-76;77);7@I7B / / 	G 	GI&rH   