
    Vpfޑ                       U d 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	Z	ddl
mZmZmZ ddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 e0e7cZ7Z8e1e9cZ9Z:ej;        Z;dddzd#Z<ej=         G d$ d%                      Z> G d& d'e          Z?i Z@d(eAd)<   d{d,ZBd|d0ZCd}d3ZDd~d5ZEdd7ZF eBe(          dd;            ZGd< ZHd=d>d?ZId@ ZJdA ZKdB ZLdC ZM eBe)          ddD            ZNdE ZO eBe*          ddF            ZPdG ZQe3dH             ZR eBejS                  ddK            ZT ejU        dL          ZVdeV_W        ddOZXeVY                    eX           ddPZZeV[                    eZ            ej\        eV ej]        eZ                     ddSZ^eV_                    e^           ddVZ`e`eja        eV<   dW ZbddYZcdd\ZdddaZeeeejf        eV<   ddhZgegejh        eV<   ddjZiddkZjejejk        eV<    eBeV          ddl            ZlddrZme3ds             Zn edt          ZoddxZpddyZqdS )z(Module for discharging state primitives.    )annotations)CallableSequenceN)partial)AnyProtocolTypeVar)api_util)ad_util)config)core)linear_util)source_info_util)	tree_util)ad)mlir)partial_eval)lax)slicing)indexing)AbstractRef	RefEffect)get_pswap_paddupdate_p)hoist_consts_to_refs)Array)safe_mapsafe_zip
split_listweakref_lru_cachepartition_listmerge_lists
split_dictT)should_dischargejaxpr
core.JaxprconstsSequence[Any]r%   bool | Sequence[bool]returntuple[core.Jaxpr, list[Any]]c               *   t          |t                    r|gt          | j                  z  }d t	          | j        |          D             }t          j        t          t          | ||                    }t          j
        ||          \  }}}\   ||fS )z<Converts a jaxpr that takes in `Ref`s into one that doesn't.c                r    g | ]4\  }}t          |j        t                    r|r|j        j        n|j        5S  )
isinstanceavalr   
inner_aval.0vds      X/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/state/discharge.py
<listcomp>z#discharge_state.<locals>.<listcomp>@   sZ     K K K"a AFK0056af6K K K    )r0   boolleninvarsziplu	wrap_initr   _eval_jaxpr_discharge_statepetrace_to_jaxpr_dynamic)r&   r(   r%   in_avals
eval_jaxpr	new_jaxpr_
new_constss           r7   discharge_staterH   :   s      $'' >()C,=,==K K&)%,8H&I&IK K K( |G$?$4f> > ? ?*"$";J"Q"Q)QR	J	r9   c                  *    e Zd ZU ded<   ddZddZdS )Environmentzdict[core.Var, Any]envr5   	core.Atomr+   r   c                    t          |          t          j        u r|j        S t	          |t          j                  sJ | j        |         S N)typer   Literalvalr0   VarrK   )selfr5   s     r7   readzEnvironment.readL   s@    Aww$,Ula"""""8A;r9   core.VarrQ   Nonec                    || j         |<   d S rN   )rK   )rS   r5   rQ   s      r7   writezEnvironment.writeR   s    DHQKKKr9   N)r5   rL   r+   r   )r5   rU   rQ   r   r+   rV   )__name__
__module____qualname____annotations__rT   rX   r/   r9   r7   rJ   rJ   H   sJ                 r9   rJ   c                      e Zd Zdd	Zd
S )DischargeRulerC   Sequence[core.AbstractValue]	out_avalsargsr   paramsr+   *tuple[Sequence[Any | None], Sequence[Any]]c                    d S rN   r/   )rS   rC   r`   ra   rb   s        r7   __call__zDischargeRule.__call__W   s	     Cr9   N)
rC   r_   r`   r_   ra   r   rb   r   r+   rc   )rY   rZ   r[   re   r/   r9   r7   r^   r^   U   s(             r9   r^   z#dict[core.Primitive, DischargeRule]_discharge_rulesprimcore.Primitivec                     d fd}|S )Nfr^   c                    | t           <   d S rN   )rf   )rj   rg   s    r7   registerz)register_discharge_rule.<locals>.register_   s    Tr9   )rj   r^   r/   )rg   rl   s   ` r7   register_discharge_rulerm   ^   s&         	/r9   Sequence[bool]ra   r   c                D   t          i           }t          |j        | j        |           t          |j        | j        |           d t          | j        |          D             | j        D ]}|j        t          j	        u rQ|j        |j
        c\  }\  }|                    |          }                    t          |j                             n=t          fd|j        D                       st          j        |j        v r|j        t$          vrt'          d|j                   t          |j        |j                  }	d |j        D             }
d |j
        D             }t%          |j                 |
|g|	R i |j        \  }}t          ||j                  D ]\  }}||                    ||           nQ|j                            |j                  \  }} |j        j        g |t          |j        |j                  R i |}|j        j        rt          |j        |j
        |           |                    |j
        d         |           t          |j        | j
                  }t          |j        fd| j        D                       }||z   S )Nc                t    h | ]5\  }}|t          |j        t                    !t          |j                  6S r/   )r0   r1   r   idr3   s      r7   	<setcomp>z._eval_jaxpr_discharge_state.<locals>.<setcomp>m   sT     A A AdaA *16; ? ?Ar!&zz A A Ar9   c              3  D   K   | ]}t          |j                  v V  d S rN   rq   r1   r4   r5   refs_to_discharges     r7   	<genexpr>z._eval_jaxpr_discharge_state.<locals>.<genexpr>u   s1      BB!bjj--BBBBBBr9   z3No state discharge rule implemented for primitive: c                    g | ]	}|j         
S r/   r1   r4   r5   s     r7   r8   z/_eval_jaxpr_discharge_state.<locals>.<listcomp>{   s    ---Q!&---r9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z/_eval_jaxpr_discharge_state.<locals>.<listcomp>|   s    ///a16///r9   r   c                @    g | ]}t          |j                  v |S r/   rt   ru   s     r7   r8   z/_eval_jaxpr_discharge_state.<locals>.<listcomp>   s,    LLLqBqvJJ:K,K,K,K,K,Kr9   )rJ   maprX   	constvarsr<   r=   eqns	primitiver   mutable_array_poutvarsrT   addrq   r1   anyinternal_mutable_array_effecteffectsrf   NotImplementedErrorrb   get_bind_paramsbindmultiple_results)r&   r%   r(   ra   rK   eqninvaroutvaransinvalsrC   r`   
new_invals	new_invalsubfunsbind_paramsout_valsref_valsrv   s                     @r7   r@   r@   c   s    	B#ci&))) cit$$$A Ac%,@P.Q.Q A A A Z % %c
},,,*ckguxHHUOOcBv{OO,,,,
BBBBszBBB
B
B ..#+==	.	.	.! #*-#* #* + + 	+38SZ((f--#*---h//3;///i(7
I6 &6 6 6*-*6 6oj#!*cj99 & &
)U 
))E9
%
%
%& !]::3:FFg{CM . .#ch
*C*C . . .!,. .c
}% %	#)S[#&&&&	iiA$$$$ 5=))(	hLLLLELLLLN N(	H	r9   indexerindexing.NDIndexerc                    t          | j        | j                  D ]W\  }}t          |t          j                  s dS t          |j        t                    s dS |j        r dS |j        |k    r dS XdS )NFT)	r=   shapeindicesr0   r   Slicestartintsize)r   sidxs      r7   _is_trivial_indexerr      s    GM7?33  fac8>** UUci%% UU
y UU
x1}}UU 	r9   tuple[int | Array, ...]c                   t          j        |           \  }}}|                                 }| j        |t	                    d          }t          fdt          t	          |                    D                       }t          |          }g }t          | j	        |          D ]\  }	}
|
st          |	t           j                  sJ t          j        t          j        d          |t!          |                    |	j        z   }|                    |           t          d |D                       }t!          |d           J t          t'          |||                    S )Nc              3  <   K   | ]}|t                    z   V  d S rN   )r;   )r4   iint_indexer_shapes     r7   rw   z,_convert_to_array_indexer.<locals>.<genexpr>   sB        %&a#
 
       r9   int32c              3  @   K   | ]}t          j        |d           V  dS ))N)r   expand_dims)r4   r   s     r7   rw   z,_convert_to_array_indexer.<locals>.<genexpr>   s?        *-#/#u
%
%     r9   )r   unpack_ndindexerget_indexer_shaper   r;   tuplerangeiterr=   r   r0   r   r   broadcasted_iotanpdtypenextr   appendr#   )r   is_integer_indexerrF   integer_indexertotal_shapeslice_shape
slice_dimsslice_dim_iterslice_indexerr   is_int_indexslice_indicesr   s               @r7   _convert_to_array_indexerr      s    (( )a ))+++/C 122334+    */K0@0@*A*A    * 
##.!-w0BCC 
 
c< 	X^,,,,,*
(7

[$~*>*> 
)m =)))  1@    o 	 
nd	#	#	+	+	+	{-}oNN	O	OOr9   Otuple[tuple[Array | int, ...], tuple[Array | int, ...], tuple[int, ...]] | Nonec                   t          d | j        D                       sd S | j        D ]6}t          |t          j                  r|j        dk    rt          d          7d t          fd| j        D                       }t          d | j        D                       }t          d t          | j                  D                       }|||fS )Nc              3  t   K   | ]3}t          |t          j                  pt          j        |           V  4d S rN   )r0   r   r   r   r   r4   r   s     r7   rw   z2_maybe_convert_to_dynamic_slice.<locals>.<genexpr>   sQ       ' ' 8>**="(1++o ' ' ' ' ' 'r9      zUnimplemented stride support.c                P    t          j        | t          j        d                    S )Nr   )r   convert_element_typer   r   )xs    r7   <lambda>z1_maybe_convert_to_dynamic_slice.<locals>.<lambda>   s    33Arx7H7HII r9   c              3     K   | ]9}t          |t          j                  r |j                  n
 |          V  :d S rN   )r0   r   r   r   )r4   r   _convert_i32s     r7   rw   z2_maybe_convert_to_dynamic_slice.<locals>.<genexpr>   sd           *!X^<< ll17<??     r9   c              3  \   K   | ]'}t          |t          j                  r|j        nd V  (dS )r   N)r0   r   r   r   r   s     r7   rw   z2_maybe_convert_to_dynamic_slice.<locals>.<genexpr>   sJ        9:
1hn--4aff1     r9   c              3  T   K   | ]#\  }}t          |t          j                  |V  $d S rN   )r0   r   r   )r4   r   r   s      r7   rw   z2_maybe_convert_to_dynamic_slice.<locals>.<genexpr>   sL        
!SX^,,     r9   )	allr   r0   r   r   strider   r   	enumerate)r   r   startssizessqueeze_dimsr   s        @r7   _maybe_convert_to_dynamic_slicer      s0    
 ' 'o' ' ' 
' 
' 4? A Aa!X^$$ AA ?@@@II,    $+O    &   >Eo    %   go..    ,
 
	$$r9   rC   r_   r`   c               V    ~ ~t          |||          }dt          |          dz   z  |fS )NrN   r   )_get_discharger;   )rC   r`   r   treer   ys         r7   _get_discharge_ruler      s4    
 	QT""!	CHHqL	!1	$$r9   c                L    | d          t          j        dd          g|R          S Nr   r   )r   array)r   r   s     r7   _prepend_gatherr      s(    	
4"(1g&&111	22r9   Fr   c                   |r0| d          j         dg|R                              |          d         S | d          j         dg|R                              |          d         S )Nr   )atr   set)r   r   rQ   r   s       r7   _prepend_scatterr      sd     	 1T7:qm7mm$((--a00	
4QMMM	"	&	&s	+	+A	..r9   c                (   | }|D ]}t          |          r|t          |          x}r2|\  }}}t          j        |||          }t	          j        ||          }Xt          |          }|d          t          j        dd          g|R          }|S r   )	r   r   lax_slicingdynamic_slicer   squeezer   r   r   )	r   indexersresultr   maybe_slicer   r   r   r   s	            r7   index_arrayr      s    & > >g7##  6g>>>{ >$/!fe\

#FFE
:
:a{1l++ff)'22gd|RXa11<G<<=ff	-r9   c                   | }|}|D ]}t          |          rt          |          x}r_|\  }}}	t          j        |||          }
t	          j        ||	          }t          j        |||          }t	          j        |
|	          }|}t          |          }t          ||          }
t          |||          }|
}||fS rN   )r   r   r   r   r   r   dynamic_update_slicer   r   r   r   )r   r   rQ   r   
result_valr   r   r   r   r   
result_oldr   s               r7   index_swap_arrayr     s    &*  g7##  6g>>>{ $/!fe\,VVUCCj?:|<<j

*6:v
F
Fa{:|44fjj)'22g"6733j#FGZ@@jff		r9   c                L    t          j        ||          }t          | |          S rN   )r   tree_unflattenr   )r   r   r   r   s       r7   r   r     s$    %dC00(	Q	!	!!r9   c                    t          |           t          fd|D                       }t          d           J |S )Nc              3  X   K   | ]$}|rt                    nt          d           V  %d S rN   )r   slice)r4   bidx_s     r7   rw   z_indexer.<locals>.<genexpr>#  s8      IIq2$t***uT{{IIIIIIr9   )r   r   r   )r   indexed_dimsr   r   s      @r7   _indexerr   !  sK    	c$IIIILIIIII'	dD			!	!	!	.r9   c               b    ~ ~t          ||||          \  }}|d fdt          |          z  z   |fS NrN   )_swap_discharger;   )rC   r`   r   rQ   r   r   zx_news           r7   _swap_discharge_ruler   '  s?    
 	QS$//(!U
3s88+	+Q	..r9   c                N    t          j        ||          }t          | ||          S rN   )r   r   r   )r   rQ   r   r   r   s        r7   r   r   0  s&    %dC00(	!Xs	+	++r9   c               \    ~ ~t          ||||          }|d fdt          |          z  z   g fS r   )_addupdate_discharger;   )rC   r`   r   rQ   r   r   r   s          r7   _addupdate_discharge_ruler   4  s;    
 	QS$//#
twS)	)2	--r9   c                   t          j        ||          }t          |          dk    rt          d          |d         }t	          |          r| |z   S t          |          x}rL|\  }}}	t          j        | ||          }
t          j	        ||	          }t          j
        | |
|z   |          }|S t          |          }t          | ||d          S )Nr   z!Only single indexer is supported.r   Tr   )r   r   r;   r   r   r   r   r   r   r   r   r   r   )r   rQ   r   r   r   r   r   r   r   r   x_oldr   s               r7   r   r   =  s    %dC00(]]Q
A
B
BBQK'!! s7N 4G<<<[ "-FE<%a77E
/#|
,
,C(ECK@@AH%g..'	!Wct	4	4	44r9   c                    | j         | j        }}t          |j                  }t	          ||          \  }}t          j        ||          }t          j        t          j	        |                    }|||fS rN   )
r&   r(   r;   r   rH   r   ClosedJaxprr>   r?   jaxpr_as_fun)closed_jaxprr&   r(   num_outsdischarged_jaxprdischarged_constsdischarged_closed_jaxprfuns           r7   _cached_closed_jaxpr_discharger  P  ss    $l&9%((7v(F(F%% ,-=?PQQ
T&'>??@@#	 (C	//r9   
call_jaxprcore.ClosedJaxprc               &   t          |          \  }}}t          j        j        |g|R d|i}t	          ||g          \  }}	t          |	          t          fd| D                       }
t                      }t          |          |u sJ |
|fS )Nr  c              3  d   K   | ]*}t          |t                    rt                    nd V  +d S rN   )r0   r   r   )r4   r1   ref_vals_iters     r7   rw   z._closed_call_discharge_rule.<locals>.<genexpr>b  sV       5 5#' -7t[,I,I T-(((5 5 5 5 5 5r9   )	r  r   closed_call_pr   r    r   r   objectr   )rC   rF   r  ra   r
  r  r  out_and_ref_valsr   r   r   sentinelr  s               @r7   _closed_call_discharge_ruler  Y  s     ,J*+U+U(8S',S Q4 Q Q Q8OQ Q!"2XJ??(Hx..- 5 5 5 5+35 5 5 5 5*XX(	mX	&	&(	2	2	2	2	X	r9   	run_statewhich_lineartuple[bool, ...]c                   t           j        j        r]t          j        |            t          | j                  t          |          k    sJ t          |          t          |          k    sJ t          j        j        t          g|R | |dS Nr&   r  )
r   enable_checksvaluer   check_jaxprr;   r<   	Primitiver   run_state_p)r&   r  ra   s      r7   _run_state_bindr"  m  s     *Uu|D		))))|D		))))		[ 
84 
8 
8u*6
8 
8 
8 8r9   c                P    ~t          | d          \  }}t          j        ||g|R  S )Nr/   )rH   r   rD   )r&   r  ra   r  r(   s        r7   _run_state_implr$  w  s5    ,UB77F	)6	9D	9	9	99r9   avalscore.AbstractValuec                f    ~d t          |          D             fd| j        D             }||fS )Nc                B    h | ]\  }}t          |t                    |S r/   r0   r   )r4   r   r1   s      r7   rr   z+_run_state_abstract_eval.<locals>.<setcomp>  s+    OOO'!TD+1N1NOAOOOr9   c                z    h | ]7}t          |t                    r	|j        v st          |t                    5|8S r/   )r0   r   input_index)r4   eis_refs     r7   rr   z+_run_state_abstract_eval.<locals>.<setcomp>  sT     7 7 7A$Q	22778}7N7N'955 8O 7N7N7Nr9   )r   r   )r&   r  r%  nonlocal_effectsr-  s       @r7   _run_state_abstract_evalr/    s\    
 POYu--OOO&7 7 7 7 7 7 7 
 	  r9   primalstangentsc               d   d |D             }t          |d          \  }}t          t          |                    D ]R}t          j        t          j        ||          ||          \  }}||k    r n+t          t          j	        ||          }St          d          ~~~d t          ||          D             }d |D             }t          j        t          j        |          |g           \  }	}|	j        |	j        }}
t!          |
          }g dt          |          z  |dt          |          z  R }t#          j        g || |R ||d	}t'          |t          |          t          |           g          \  }}}~t)          |          fd
t          ||          D             }||fS )Nc                D    g | ]}t          |t          j                   S r/   )r0   r   Zeror4   ts     r7   r8   z"_run_state_jvp.<locals>.<listcomp>  s'    HHH!*Q555HHHr9   r/   )instantiateInvalid fixpointc                D    g | ]\  }}|rt          j        |          n|S r/   )r   instantiate_zeros)r4   r6  insts      r7   r8   z"_run_state_jvp.<locals>.<listcomp>  sA     > > >!T *.4b"1%%%1 > > >r9   c                H    g | ]}t          |          t          j        u| S r/   )rO   r   r4  r5  s     r7   r8   z"_run_state_jvp.<locals>.<listcomp>  s*    AAAAT!WWGL%@%@a%@%@%@r9   F)Tr  c                v    g | ]5\  }}|rt                    nt          j                            |          6S r/   )r   r   r4  
from_value)r4   pnzout_tangents_iters      r7   r8   z"_run_state_jvp.<locals>.<listcomp>  sV     C C Ca .0O$()))W\5L5LQ5O5O C C Cr9   )rH   r   r;   r   	jvp_jaxprr   r  r}   operatoror_	Exceptionr=   rA   close_jaxprr&   r(   r   r!  r   r    r   )r0  r1  r&   r  nonzero_tangentsr  body_constsrF   out_nonzero_tangentsclosed_jvp_jaxpr
jvp_jaxpr_
jvp_constsrC  jvp_which_linearout
out_constsout_primalsout_tangentsrB  s                     @r7   _run_state_jvprS    s4   HHxHHH"1%"<"<K%&&'' ( (a l);77&68 8 8A ///e8<)9;OPP
&
'
''%9> > +;<<> > >(AAAAA(R^E%:%:%5r; ;A+13C3Jj*":..)[x#j//1[L[7SQY]]CZ[[ 	8* 	8w 	8 	8 	8&6	8 	8 	8#*4S3z??;>w<<;I +J +J'*k<<((C C C C";0@AAC C C,	l	""r9   c                     dS )NTr/   )rF   __s     r7   r   r     s    D r9   )tuple[core.Jaxpr, list[core.ShapedArray]]c                      j         r
J d            d  j        D             t          j         fd            }d  j        D             }t          j        |g |          \   }}\   |rJ  d |D             fS )NzJaxpr shouldn't have constvars.c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z._convert_outputs_to_writes.<locals>.<listcomp>  s    +++af+++r9   c                     t          | t                    g          \  }}t          j        dg|R  }t	          ||          D ]
\  }}||d<   g S )Nr/   .)r    r;   r   rD   r=   )refs	orig_refsresidual_refsresidual_valsres_refres_valrC   r&   s         r7   rD   z._convert_outputs_to_writes.<locals>.eval_jaxpr  sh      *$X@@I}OE2:	:::M}==  gcllIr9   c                x    g | ]7}t          |j        t                    st          |j                  n|j        8S r/   )r0   r1   r   rz   s     r7   r8   z._convert_outputs_to_writes.<locals>.<listcomp>  sM     7 7 7#$ /9.M.M ;qv&&&7 7 7r9   c                `    g | ]+}t          j        |j        j        |j        j                  ,S r/   )r   ShapedArrayr2   r   r   r4   as     r7   r8   z._convert_outputs_to_writes.<locals>.<listcomp>  s?     ) ) ) !!,"4al6HII ) ) )r9   )r~   r<   r>   r?   r   rA   rB   )r&   rD   res_ref_avalsrF   r(   rC   s   `    @r7   _convert_outputs_to_writesrf    s    _??????++el+++(<     <7 7(-7 7 7-2-H-}-/ /%FB	 ) )') ) ) 
) )r9   num_resr   c                     j         r
J d            t          j         fd            }t          d j        D              g          \  }}d |D             }t          j        |g ||          \  }\   \   S )NzJaxpr should not have constvarsc                 t    t          | g          \  }}d |D             }t          j        dg||R  \   g S )Nc                    g | ]
}|d          S ).r/   )r4   rs     r7   r8   z@_convert_inputs_to_reads.<locals>.eval_jaxpr.<locals>.<listcomp>  s    333QsV333r9   r/   )r    r   rD   )rZ  r\  r[  r]  r&   rg  s       r7   rD   z,_convert_inputs_to_reads.<locals>.eval_jaxpr  sO    )$	::M933]333M		?]	?Y	?	?	?BIr9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z,_convert_inputs_to_reads.<locals>.<listcomp>  s    ///Q!&///r9   c                Z    g | ](}t          |t                    st          |          n|)S r/   r)  )r4   r1   s     r7   r8   z,_convert_inputs_to_reads.<locals>.<listcomp>  sG     3 3 3  -7t[,I,I ;t$$$3 3 3r9   )r~   r>   r?   r    r<   rA   rB   )rg  r&   rD   res_val_avalsorig_ref_avalsre  rF   s   ``     r7   _convert_inputs_to_readsrp    s    _??????<     < //%,///';;  -3 3$13 3 3-.3M3N35 5%B	,r9   tracepe.JaxprTracetracerspe.JaxprTracerc          	         t          |          }|t          |j                  k    sJ d |D             }t          |d          \  }}t          j        |          }t          |          D ]o}	dgt          |          z  |z   }
t          j        ||
|
|dt                    \  }	}	}}}	}	t          |          }||k    r n+t          t          j        ||          }pt          d          ~t           fdt          ||          D                       }t          j        |||g g t                    \  }}}	}	}}||z   }t          |j                  |z
  }t          d |j        D             |g          \  }	}d |D             }t!          |          \  }}t#          ||          \  }}	t#          ||          \  }}	d	 |D             }g ||}t          t$          j        |          }g ||}g |d
|z  R }t)          j        |||d}t          |t          |          g          \  }} t           j        |           } t          | |g          \  }!}"t/          t          |          |          }#t#          ||          \  }	}$t#          ||          \  }	}%d
|z  t          |%          z   }&g |"|!|$}' fd|'D             }(t1          j                    t           j                  d          })t1          j                                        |)          }*t          |'          t          |(          k    sJ t          |'          t          |#j                  k    sJ t;          |#|&          }+t)          j        d |'D             i |+\  }	},t          j        |'|(t(          |+|,|*          }-|(D ]	}.|-|._         
t          |(|g          \  }	}/tC          |||/          S )Nc                B    g | ]}|j                                          S r/   )pvalis_knownr5  s     r7   r8   z+_run_state_partial_eval.<locals>.<listcomp>  s'    8881QV__&&&888r9   r/   Fr8  c              3  P   K   | ] \  }}|r                     |          n|V  !d S rN   )instantiate_const)r4   r6  ukrq  s      r7   rw   z*_run_state_partial_eval.<locals>.<genexpr>  sS       : :a 139%))!,,, : : : : : :r9   )in_instensure_out_unknownsensure_out_instsaveablec                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z+_run_state_partial_eval.<locals>.<listcomp>  s    111!qv111r9   c                    g | ]	}|j         
S r/   r2   rc  s     r7   r8   z+_run_state_partial_eval.<locals>.<listcomp>	  s    333q|333r9   c                @    g | ]}|j                                         S r/   )rw  	get_knownr5  s     r7   r8   z+_run_state_partial_eval.<locals>.<listcomp>  s&    :::q  "":::r9   r=  r  c                    g | ]:}t          j        t           j                            |j                  d           ;S rN   )rA   JaxprTracer
PartialValunknownr1   )r4   r6  rq  s     r7   r8   z+_run_state_partial_eval.<locals>.<listcomp>)  sI       
 	nUBM11!&994@@  r9   )
name_stackc                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z+_run_state_partial_eval.<locals>.<listcomp>2  s    .N.N.N!qv.N.N.Nr9   )"r;   r<   rH   rA   convert_constvars_jaxprr   partial_eval_jaxpr_stateful_save_everythinglistr}   rD  rE  rF  r   r=   r    rf  r"   r   zeros_like_avalr!  r   new_instantiated_constrp  r   current_name_stackr  currentreplacedictabstract_evalnew_eqn_recipereciper#   )0rq  r&   r  rs  
num_inputsin_unknownsdischarged_jaxpr_r	  r  rF   jaxpr_in_unknownsout_unknownsout_instjaxpr_known_resoutjaxpr_unknown_resin_num_res_outnum_res_refrg  
num_invarsre  	res_avalsjaxpr_knownnew_res_avalsknown_tracersknown_which_linear
known_valsall_res_avals	empty_resjaxpr_known_argsjaxpr_known_which_linearout_flatknown_outputs	residualsref_res
nonref_resjaxpr_unknownunknown_tracersuk_which_linearunknown_which_linearunknown_inputsres_ref_unknown_outputsr  source	uk_paramseqn_effectsr   r6  unknown_outputss0   `                                               r7   _run_state_partial_evalr    s   7||*	s5<((	(	(	(	(88888+ *9)C)C&&/0ABB ( (a#&7"8"88;F)+)G+->
u.*0 *0&Aq,!Q %%L{""ehlK>>KK
&
'
'' : : : :"7K88: : : : :' 	&uk;9;R.>	@ 	@ 	@ K*Aq+{ +%'%,--;*11)0111J<A A!]33]333)9:LMM+}#K99-(lCCa::M:::*.I..-')=99).z.I.G1GHw4FGG/{+CE E E('3}3E3E2FGG-%.	::)"9{m<<': +3}+=+=+?A A-%k7;;!_%k<@@!_!G+eO.D.DD<Z<'<O<.       244S9I5J5J5K5KL*#%%---DD&	^		$; < <	<	<	<	<	^		M$8 9 9	9	9	9	95IJJJ),.N.N~.N.N.N :/8: :.![
.*A%y%v	/ 	/# #22asAHH!"9G9EE!_	[-	A	AAr9   r  Callable[..., pe.RematCases_]r  r|  r   core.JaxprEqnc           
       -. t          |          s|d |dgt          |          z  g fS t          |j        ddg          \  }}t          |j                  }t          |d          \  }}|                    |j        |j        z   g           }t          |          t          |          }}||}
}	t          |          D ]k}dgt          |          z  |z   }t          j        ||||||           \  }}}	}
}}t          |	          }	|	|k    r n1t          t          j        ||	          }l|dk    rt          d          ~	d	 t!          |j        ||
          D             }t          j        |||g g |           \  }}}}}}||z   -t#          |          \  }}t          t$          |          }t'          ||j                  \  }}t'          ||j                  \  }}t+          j                    }t/          d
 |j        D             t          |          g          \  }}t          ||          }t          ||          }t          |g ||          }t'          ||          \  }}g |d-z  R }g |||}t1          ||          } t3          j        d |D             i | \  }}!t          j        |g ||t2          | |!|j                  }"t;          t          |          |          }#t'          ||          \  }}$g dg-z  |$R }%t1          |#|%          .g ||}&t'          ||j                  \  }}g |&|}'t3          j        d |'D             i .\  }}(t'          ||j                  \  }}-rt<          j        -.fd            })t          j         |)d |'D                       \  }*}\   \   t          j        |'|t*          j!        t1          t          j"        |*                    |(|j                  }+t          |'          t          |*j                  k    sJ t          |          t          |*j                  k    sJ n#t          j        ||t2          .|(|j                  }+g |||},|"|+|||,fS )NFr&   r  r/   )r<   r~   )r  r|  r}  r~  r  r   r8  c                X    g | ]'\  }}}t          |          t          j        u !|#|%|(S r/   )rO   r   rR   )r4   r   alreadyr;  s       r7   r8   z2_run_state_partial_eval_custom.<locals>.<listcomp>`  sE     ? ? ?$AwaDH$$$g$ $$$r9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z2_run_state_partial_eval_custom.<locals>.<listcomp>{  s     K K KA K K Kr9   r=  r  c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z2_run_state_partial_eval_custom.<locals>.<listcomp>  s    ---1---r9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z2_run_state_partial_eval_custom.<locals>.<listcomp>  s    ***1***r9   c                 :    t          j        | i }|d          S rN   )r!  r   )ra   rO  rg  staged_paramss     r7   stagedz._run_state_partial_eval_custom.<locals>.staged  s&    d4m44c]r9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z2_run_state_partial_eval_custom.<locals>.<listcomp>  s    +++A+++r9   )r  )#r   r;   r$   rb   r<   rH   r  r~   r  r   rA   r  r}   rD  rE  rF  r=   rf  r   r"   r   r   gensymr    r  r!  r  new_jaxpr_eqnsource_inforp  r>   r?   rB   r  rG  )/r  r  r|  r   r&   r  r  r  r	  r  r  rF   r  new_instr  jaxpr_staged_resin_r  r  r  r  known_invarsstaged_invarsknown_outvarsstaged_outvarsnewvarre  nonref_resvarsref_resvarsknown_out_resvarsr  r  known_and_res_invarsknown_paramsknown_effects	eqn_knownjaxpr_stagedstaged_which_linearwhich_linear_unknownrejiggered_resvarsres_staged_invarsstaged_effectsr  staged_call_jaxpr
eqn_stagednew_varsrg  r  s/                                                @@r7   _run_state_partial_eval_customr  <  s   
 
[		 BkE7S-=-=#=rAA"3:/HII%3:* )8r(B(B%%%--'*:*AA .   k**DMMw+', ; ;a#&7"8"88;F)+)G%!'#* * *&Aq,!Q %%L{""ehlK>>KKA~~Y'9:::? ?CJ(J(J ? ? ?( 	&ukR	+ 	+ J)1ak +%' 66HII+y +y))) .{CJ G G,"0ck"J"J-;==& K K1C1J K K K!$\!2!2 35 5!]vy)).FM**+&">M">I">??(lCCaG1GHw4FGGG<G+GGK6NOOO, .--,---?1=? ?!]3CC1BC*L,co? ?)
 *#i..:MNN,)+|DD!CE7W,C/BCC\8LMMM-66+6#K<<!];*;];!/**)***=.;= =!^$[#+>>!^ C\     \ $&#<V++*+++$- $- q"b!"3"0"&"4"&".AR2S2S"T"T"T"0#/	C CJ
  !!S):)A%B%BBBBB~#&7&?"@"@@@@@@!-"0"-"/"0#/	C CJ
 8x7.7;7(	J[(	BBr9   tuple[core.Jaxpr, Any]c                      fd}t          j        t          j        |          d  j        D                       \  }}}\   ||fS )Nc            	        t          j        g g t                    ^}}}}}t                    }t	          j                  |z
  }t          |           \  }}d |j        D             }	t          |	|g          \  }}
d |
D             }
g |
d |j        D             }t          t          j        |          }t          |          \  }}t          j        g ||R |dt	          |          t	          |          z   z  d}|t	          |          d          }t          ||g          \  }}t          j        |g           \  }}t          |t	          |          g          \  }}t          ||g          \  }}t          ||          \  }}t          ||          \  }}g ||}t          |           \  }}t          ||          \  }}t          j        |ddg ||R d           g S )	N)r|  r~  r}  r  c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z3_transpose_jaxpr.<locals>.trans.<locals>.<listcomp>  s    999!qv999r9   c                    g | ]	}|j         
S r/   r  rc  s     r7   r8   z3_transpose_jaxpr.<locals>.trans.<locals>.<listcomp>  s    111!111r9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z3_transpose_jaxpr.<locals>.trans.<locals>.<listcomp>  s    BBB!qvBBBr9   r=  r  Fr/   )rA   r  r  sumr;   r<   r"   r    r   r}   r   r  rf  r!  r   	dce_jaxprbackward_pass)ra   
res_jaxpr_tangent_jaxpr_rF   r  r  num_unknown	num_knownres_argsres_jaxpr_avalsr  	all_avalsr  	res_jaxprresref_res_nonref_res_tangent_jaxprused_inputsused_resused_ctsused_nonref_resused_ref_resr  r  primals_argstangent_argsct_argsr&   r  s                               r7   transz_transpose_jaxpr.<locals>.trans  s?    	&ulL79;=0@	B 	B 	B =JK l##KEL!!K/I t44KHa99z'8999Oo	{;;LAy11y111IC)CBBz/ABBBCIB&	22I-j99LIq

 UH Uy U U	(0CMMC	NN4R(SU U UC
c(mmnn
C&s[M::Hk "$nb!A!AM;#K#c((<<Hh$.x+$G$G!O\"?K@@MAzh77JAw*Z*'*L$\488OA|,77JAw]E2/H/H/H/H"MMMIr9   c                    g | ]	}|j         
S r/   ry   rz   s     r7   r8   z$_transpose_jaxpr.<locals>.<listcomp>  s    999qAF999r9   )rA   rB   r>   r?   r<   )r&   r  r  jaxpr_transrF   r(   s   ``    r7   _transpose_jaxprr    sk    $ $ $ $ $ $J  "8l599EL999 ;  ;+q&"	f	r9   c                  t          |          sJ g }t          ||           D ]0\  }}t          |          t          j        u r*t          j        |          s|                    |           Kt          |          t          j        u rAt          j        |          r-|                    t          j        |j	                             t          |          t          j        ur*t          j        |          s|                    |           t          |          t          j        ur)t          j        |          r|                    |           2t          ||          \  }}t          |          }	g dgt          |          z  |R }t          j        g ||R |	|d}
t          |
t          |          g          \  }}d t          ||          D             }|S )NFr  c                D    g | ]\  }}t          j        |          r|nd S rN   )r   is_undefined_primal)r4   r   cts      r7   r8   z(_run_state_transpose.<locals>.<listcomp>  s@     / / /B )!,,6RR$ / / /r9   )r   r=   rO   r   r4  r   r  r   r  r1   r  r   r;   r!  r   r    )in_ctsr&   r  ra   transpose_argsr   r  jaxpr_transpose_r(   jaxpr_transposeconst_all_outsrF   all_outsct_outss                 r7   _run_state_transposer    s    
\		.4      ea	b	%	%b.DQ.G.G	%A	b	%	%b.DQ.G.G	%G3AF;;<<<<	b	%	%b.DQ.G.G	%B	b	%	%b.DQ.G.G	%B-e\BBF()9::/8E7S[[(8<88,# ?V ?n ? ?*91=? ? ?. >CKK=99+!X/ /dH--/ / /'	.r9   c                   ~t          j        |||d}g }t          | |          D ]1\  }}|                    t	          |t
                    r|nd            2||fS r  )r!  r   r=   r   r0   r   )	rC   r`   r&   r  ra   r   r   r1   out_vals	            r7   _run_state_discharge_ruler     sw    
 t5|LLL(*8X.. J JmdGD+!>!>HggDIIII	X	r9   r  r   in_tree	PyTreeDef'tuple[core.Jaxpr, list[Any], PyTreeDef]c                >    t          | |t          |                    S rN   )_initial_style_jaxprr   )r  r  rC   s      r7   initial_style_jaxprr    s     
c7E(OO	<	<<r9   c                    t          j        t          j        |           t	          j        |f                    \  }}t          j        |||dd          }t          j        |||          \  }}}\   || |            fS )NFr  )	r
   flatten_fun_nokwargsr>   r?   r   treedef_tuplerA   
debug_inforB   )	r  r  rC   fun_out_tree_thunkdebugr&   rF   r(   s	            r7   r  r    s~    !6r|C7H7Hwj))+ +$
-g~uk
J
J%245II%FB	((	((r9   Trj   Callable[..., None]Callable[[T], T]c                      fd}|S )Nc                   t          j        |           \  }}d |D             }t          |t          t          |                    \  }}}t          |          }dt          |          t          |          z   z  }t          j        g ||R ||d}	t          |	t          |          g          \  }}
|
                    |
          S )Nc                Z    g | ](}t          j        t          j        |                    )S r/   r   raise_to_shapedget_avalr4   args     r7   r8   z.run_state.<locals>.wrapped.<locals>.<listcomp>  -    KKK#T!$-"4"455KKKr9   r=  r  )r   tree_flattenr  r}   r   r   r;   r!  r   r    	unflatten)ra   	flat_argsr  r%  jaxpr_r(   rF   r&   r  out_const_flatr  rj   s              r7   wrappedzrun_state.<locals>.wrapped  s    "/55IwKKKKKE+AwK8O8OPPFFA ((Es6{{S^^;<L % Av A	 A A3?A A AN^c&kk];;KAxX&&&r9   r/   rj   r2  s   ` r7   r  r    #    	' 	' 	' 	' 	' 
.r9   c                      fd}|S )Nc                t   t          j        |           \  }}d |D             }t          |t          t          |                    \  }}}t          |          }t          |d          \  }}	t          j        ||	g|| R  }
t          |
t          |          g          \  }}|                    |          S )Nc                Z    g | ](}t          j        t          j        |                    )S r/   r'  r*  s     r7   r8   z8run_state_reference.<locals>.wrapped.<locals>.<listcomp>*  r,  r9   r/   )r   r-  r  r}   r   r   rH   r   rD   r    r;   r.  )ra   r/  r  r%  r0  r(   rF   r&   r  r	  r1  r  rj   s               r7   r2  z$run_state_reference.<locals>.wrapped(  s    "/55IwKKKKKE+AwK8O8OPPFFA ((E*9%*D*D''_%57H 5&,5/35 5 5N^c&kk];;KAxX&&&r9   r/   r3  s   ` r7   run_state_referencer8  '  r4  r9   )r&   r'   r(   r)   r%   r*   r+   r,   )rg   rh   )r&   r'   r%   rn   r(   r)   ra   r   )r   r   )r   r   r+   r   )r   r   r+   r   )rC   r_   r`   r_   )rC   r_   r  r  )ra   r   r&   r'   r  r  )r%  r&  r&   r'   r  r  )r0  r)   r1  r)   r&   r'   r  r  )r&   r'   r+   rV  )rg  r   r&   r'   r+   r'   )rq  rr  rs  rt  r&   r'   r  r  )r  r  r  rn   r|  rn   r   r  )r&   r'   r  rn   r+   r  )r&   r'   r  r  )
rC   r_   r`   r_   ra   r   r&   r'   r  rn   )r  r   r  r  rC   r_   r+   r  )rj   r"  r+   r#  )rj   r"  )r__doc__
__future__r   collections.abcr   r   dataclasses	functoolsr   rD  typingr   r   r	   numpyr   jax._srcr
   r   r   r   r   r>   r   r   jax._src.interpretersr   r   r   rA   jax._src.laxr   r   r   jax._src.stater   jax._src.state.typesr   r   jax._src.state.primitivesr   r   r   jax._src.state.utilsr   jax._src.typingr   jax._src.utilr   r   r    r!   r"   r#   r$   r}   
unsafe_mapr=   
unsafe_zipr  rH   	dataclassrJ   r^   rf   r\   rm   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r!  r   r"  def_custom_bindr$  def_implregister_lowering	lower_funr/  def_effectful_abstract_evalrS  primitive_jvpsr  rf  rp  r  custom_partial_eval_rulesr  partial_eval_jaxpr_custom_rulesr  r  primitive_transposesr  r  r  r!  r  r8  r/   r9   r7   <module>rU     s   / . . " " " " " " . . . . . . . .            ) ) ) ) ) ) ) ) ) )                             & & & & & & % % % % % %       $ $ $ $ $ $ & & & & & & 4 4 4 4 4 4       / / / / / / # # # # # # 7 7 7 7 7 7 7 7 @ @ @ @ @ @ @ @ @ @ 5 5 5 5 5 5 ! ! ! ! ! !D D D D D D D D D D D D D D D D D D
 CZCZ	 ?C      
 
 
 
 
 
 
 
    H    9;  : : : :   
0 0 0 0d
 
 
 
P P P P:% % % %> % % %  %3 3 3 .3 / / / / /  &  ." " "     / / / ! /, , , %%. . . &%.5 5 5& 0 0 0 +,,   -,  dn[))# 8 8 8 8   O , , ,: : : :
   _ % % %  {NDN?$C$C D D D! ! ! !  ' '(@ A A A# # # #> "0 + (( ) ) ) ),   $aB aB aB aBD -D [ )qC qC qC qCd 3Q "; /) ) ) )V" " " "F (<  $%%	 	 	 &%	= = = =
 ) ) ) GCLL        r9   