
    ukiK                    p   U d dl mZ d dlmZmZ d dlZd dlZd dlZd dlm	Z	 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 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# d dlm$Z$ d dl%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ eZAeZBe9ZCe8ZDd ZE	 	 	 	 	 	 	 	 dydZF	 	 dz	 d{dZGej                  d|d       ZIej                  	 	 	 	 d}d       ZKej                  d~d       ZLej                  d        ZM	 	 d	 	 	 	 	 	 	 	 	 ddZNe= ej                         	 	 	 	 	 	 	 	 	 	 dd              ZPd  ZQddd!dd"ZRdd#ZS G d$ d%      ZTd& ZU eeTd' d(        d) ZV	 	 	 	 	 	 	 	 	 	 	 	 dd*ZWd+ ZX G d, d-      ZY G d. d/eY      ZZ G d0 d1eY      Z[d2 Z\ G d3 d4eY      Z]i Z^d5e_d6<   d7 Z`d8 Zad9 Zbdd:Zcdd;Zdej                  d<        Ze G d= d>e*      Zfd? Zg G d@ dAe+      ZhdB Zii Zjd5e_dC<   i Zkd5e_dD<   i Zld5e_dE<    G dF dGe*      Zme=dH        ZndI Zo	 	 ddKZp	 	 	 	 	 	 	 	 ddLZq G dM dNe+      Zri Zsd5e_dO<   i Ztd5e_dP<   i Zud5e_dQ<   dR ZvdS ZwdT ZxdU ZydV ZzdW Z{dX Z|dY Z}dZ Z~d[ Zd\ Zd] Zd^ Zd_ Z eye$d`        da Zej                  db        Zdc Z e	ee-      e^ejZ                  <   dd Zee^ej                  <   ej                  de        Z	 	 ddfZ	 	 	 	 ddgZe=	 	 	 	 ddh       Zej                  di        ZddjZ	 	 	 	 ddkZdl Z ej\                  dm      ZdJe_dn<   ej%                  do        de_        dp Zej+                  e       	 	 ddqZeete<   	 	 	 	 ddrZeej0                  e<    G ds dte      Z G du dve      Zi Zd5e_dw<   ddxZy)    )annotations)CallableSequenceN)partial)Any)api_util)config)linear_util)partial_eval)tree_flattentree_unflattenregister_pytree_node	PyTreeDef)mesh)core)source_info_util)add_jaxvalsreplace_internal_symbolic_zeros"replace_rule_output_symbolic_zerosZerozeros_like_avalSymbolicZero)add_jaxvals_p)flatten_funflatten_fun_nokwargs
debug_info)TraceTracerget_avalcall_p	PrimitiveLiteraltypeof)dtypefloat0)AbstractRef)
unzip2safe_mapsafe_zip
split_list	wrap_nameas_hashable_functionweakref_lru_cachepartition_list
subs_list2foreachc                    | S N xs    S/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/interpreters/ad.pyidentityr7   2   s        c                    || S t        ||      D cg c]  \  }}|s	|j                          }}}t        j                  | g ||      S c c}}w r2   )zipto_tangent_avalluannotate)f	orig_typenonzerosnzaval	tan_typess         r6   _update_annotationrD   4   s[    
 H69(I6NU("dRTt##%U)U	Q0)0i0	11 Vs
   
AAFTc                l    |st        t        |       ||      S t        |       \  } }t        | ||      |fS r2   )jvpfunjvp_subtracejvp_subtrace_aux)funhas_auxinstantiatetransform_stackauxs        r6   jvprN   >   s;    	,s#[/BB$HC#{O4c99r8   c                N   t        j                         }|D cg c]^  }t        |t              sJt        t	        |      t         j
                        r't        |      t        k(  rt        j                  |      n|` }}|rt        j                  d      nt        j                         }|5   | |||      \  }}	d d d        t        |      t        u r|gt        	      z  }t!        	|      D 
cg c]  \  }}
|
rt#        |      n| }	}}
|	fS c c}w # 1 sw Y   ]xY wc c}
}w )NrN   )r   TraceTag
isinstancer   r#   ShapedArrayr$   r%   from_primal_valuer   transform_name_stack
contextlibnullcontexttypeboollenr:   instantiate_zeros)r>   rK   rL   primalstangentstagtctxout_primalsout_tangentsinsts              r6   rF   rF   F   s   # 6>?01 0:!T/BVAY(8(89(f$ $$Q'*+, ?( ? :I		.	.u	5$$& 
 : !#w 9K:	+$-#l"33K{35'!T$#A&A5 5, 5	l	""?
: :5s   A#D+D0D!Dc                (   t        j                         }t        j                         5 }t	        j
                  |d      }	||	_        t        ||	|      }
t        ||      D cg c]=  \  }}|r4t        |
||	j                  t        |      j                         |            n|? }}}t        j                  |
d      5   | | }t        t        |
j                   |            \  }}~
~~d d d        d d d        t#        d D              }t#        d t        ||      D              }t        t%        	j&                  |      |      }|	j)                  | |j*                         |      \  }}|D cg c]7  }t-        |t        j.                        xr t1        |j2                  dd       |u 9 }}t	        j4                  |t#        |            }t7        ||      \  }}t        t        |      }t9        |      D ci c]  \  }}t;        |      | }}}|D cg c]  }|j=                  t;        |             }}t9              D ci c]  \  }}t;        |      | }}}|D cg c]  }|j=                  t;        |             }}t        |||      D cg c]  \  }}}|
|| }}}}|j?                  ||||||f       g ||S c c}}w # 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}}w c c}w c c}}w c c}w c c}}}w )	NTauto_dcer]   check_leaksc              3  >   K   | ]  }t        |      t        u  y wr2   rW   r   .0r^   s     r6   	<genexpr>z%linearize_subtrace.<locals>.<genexpr>i   s     <!$q'%<   c              3  ,   K   | ]  \  }}|s	|  y wr2   r3   )rl   r^   rA   s      r6   rm   z%linearize_subtrace.<locals>.<genexpr>j   s     GUQBqG   
source_infor]   ) r   currentr   take_current_tracepeDynamicJaxprTracer]   LinearizeTracer:   LinearizeTracernew_argr   r;   set_current_tracer'   mapto_primal_tangent_pairtupler   to_jaxpr_tracerto_jaxprwith_unknown_namesrQ   DynamicJaxprTracergetattr_tracemove_envvarsr.   	enumerateidgetstore) _f_store_tagnzs_inr   r[   paramsrr   parent_tracetangent_tracelinearize_traceprA   tracersansr`   ra   nzs_outjaxprconstsc	which_envresenvresidual_avalsiid_maprin_fwdout_fwdf1f2s                                    r6   linearize_subtracer   V   s   
 !((*+  (L((dCMM$\=dKO
  0	2 1b  ,44Xa[5P5P5R5@ BC  2G 2
 
		T	B (Lc"(_-S-SUX)Y"Zk<
3(( <|<<'Gc,&@GG,W]::TVbc,((7Tz7T7T7VXcd-%AGI<= 1b334 7%.$67 I) I
//%y!1
2%Iv.(#sx%.!*7!34ABqE1H4&49<=AfjjA/=&=!*;!78ABqE1H8&8:=>Qvzz"Q%0>'>VW5SSyq"b
S#S,,VWEF	#		72
( (( ("I 5=8>Ssf   <K%%AK'K%+K,K%4<K2>K7!K=L)!LL)L,LK%K"	K%%K/c           
     l   t        j                         5 }t        ||      }t        ||      D cg c]  \  }}t	        |||       }}}t        j
                  |      5   | | }	d d d        t        t        |j                  	            }
d d d        |
S c c}}w # 1 sw Y   8xY w# 1 sw Y   
S xY wr2   )	r   rt   JVPTracer:   maybe_jvp_tracerrz   r'   r{   r|   )r>   r]   r[   r\   r   tracer5   r^   
in_tracersr   outs              r6   rG   rG   }   s      9L\3'E!'846a #5!Q/ 6J 6				& zNc
U1137
8C9 
*6 	9 
*s4   B)BB) B&'B)B)B&	"B))B3c           
         t        j                         5 }t        ||      }t        j                  |      5   | t	        t        t        |      ||       \  }}d d d        t        t	        |j                              \  }	}
D cg c]8  }t        |t              r$|j                  j                  |u r|j                  n|: }}d d d        |j                         	
fS # 1 sw Y   xY wc c}w # 1 sw Y   /xY wr2   )r   rt   r   rz   r{   r   r   r'   r|   rQ   	JVPTracerr   r]   primalr   )r>   r   r]   r[   r\   r   r   r   rM   r`   ra   r5   aux_primalss                r6   rH   rH      s      (L\3'E				& PS!1597HMOhc3P &s5+G+G'M NK#&(  *!Y7AHHLLC<O188 (K (( ++k	l	""P P(( (s.   "C4"C#.C4=C/C4#C,	(C44C=c                0   t        |      t        u r9|ft        | j                        t        | j                  j
                        z   z  }t        |      t        | j                        t        | j                  j
                        z   k(  sJ t        |      t        u r#|ft        | j                  j                        z  }t        |      t        | j                  j                        k(  sJ t        | t        |      t        |      t        |            S r2   )	rW   rX   rY   r   r   invarsoutvars_linearize_jaxprr}   )r   r@   rK   
allow_fwdss       r6   linearize_jaxprr      s     
*#ell"3c%++:L:L6M"MNJ	ZS.U[[5G5G1HH	II	I	+$.3u{{':':#;;K	[	S!4!45	55	5	%x%2D
+
- -r8   c           
     d    | j                   j                  }t        j                  j                  xr |j                  t        |             t        j                  |      t        j                  |d       t               }|j                   _
         fd}t        j                         }t        | j                  |      D 	cg c]  \  }}	 ||||	|       }
}}	|
D cg c]  }|j                   }}t!        j"                  |d      5  t!        j$                  | j                   | j&                  g|
 }t)        t+        |j,                  |            \  }}t        ||      D cg c]  \  }}|rt/        |      n| }}}~~~~
d d d        D cg c]  }t1        |      t2        u }}t        ||      D 	cg c]  \  }	}|	r j5                  ||       }}	} j7                  ||j9                         |      \  }} j;                          t=        ||      \  }}t        j>                  t        j@                  |            }g | j&                  |}tC        t        ||            D ci c]  \  }\  }}|stE        |      | }}}}|D cg c]  }|jG                  tE        |             }}t        ||      D cg c]
  \  }}|	| }}}~g |}t+        tI        j4                  |      |      }j7                  ||j9                         |      \  }}j;                          t=        ||      \  }}t!        jJ                  ||      }t        |      }|||||fS c c}	}w c c}w c c}}w # 1 sw Y   xY wc c}w c c}}	w c c}}}w c c}w c c}}w )NTrd   c                    j                  ||      }|j                         }|rj                  ||      n
t        |      }t        | ||      S r2   )ry   r;   r   rx   )	r   primal_avalrA   rr   r   tangent_avaltangentprimal_tracer   s	          r6   ry   z!_linearize_jaxpr.<locals>.new_arg   sM    !!+{;F..0LBDm##L+>$|J\G5&'22r8   rg   rq   )&r   r   r	   enable_checksvalueassert_arg_namesrY   ru   rv   rw   r]   r   rs   r:   in_aval_qddsr   r   rz   
eval_jaxprr   r'   r{   r|   rZ   rW   r   r~   r   r   
invalidate_dce_constsclose_jaxprconvert_constvars_jaxprr   r   r   r   ClosedJaxpr)!r   r@   rK   r   dbg	lin_tracery   rr   arA   r   r^   
in_primalsr   r`   ra   rb   r   tangent_jaxprtangent_consts
fwd_inputsr   r5   r   r   fwdsr>   primals_and_residualsprimal_jaxprprimal_constsnum_residuals_outr   r   s!                                  @@r6   r   r      s~    	#D!5!5c(m!D%%c*,&&sT:-\=9)mm-3 !((*+ 2 2H=?!R Y2{3 ?' ?")*Q***iT: )
//%++u||
>g
>C &s9+K+KS'Q RK#&|[#AC4 -1%a(a7 CL C3) +77QT!WD 7'7!$Wl!;Cr1r  //;? C, C"/"8"8C**,k#;-"-m^"L-..!;!;M!JK-++
+*$-c*j.I$JPP5AaaBqE!GP&P%3	4&**RU
	4$	4"%nd";I$!QqyAI.I 8;77gl&B&BP[\35 , 5 5S335!,  +L- H,!!,>,.)	('4	FFO?*
C) ) 8C Q	4IsU   M7'M=AN0N	NNN;N 	N !N'
N,N,NNc           	        t        j                  | dgt        | j                        z  dgt        | j                        z  dgt        | j
                        z  z         \  } }}| t        ||      D cg c]
  \  }}|s	| c}}fS c c}}w )NTF)ru   dce_jaxpr_constsrY   r   	constvarsr   r:   )r   r   used_consts_r   useds         r6   r   r      s    --dVc%--((gEOO$$vELL0A'AAC%a 
#fk":Cwq$dC	CCCs   4
B?B)rJ   r]   c          
        | j                   j                         }t        j                         5 }t	        j
                         }t        j                  |d      }|D 	cg c]+  }	|j                  t        |	      j                         |      - }
}	|
D cg c]^  }t        |t              sJt        t        |      t        j                        r't        |      t         k(  rt        j"                  |      n|` }
}t%        |||      }|j&                  |_        t)        ||
      D 	cg c]  \  }	}t+        ||	|       }}	}|D cg c]  }|j-                          }}t        j.                  |      5  t	        j0                  d      5  |r` | j2                  | \  }}|D cg c]B  }t        |t*              r.|j4                  j&                  |j&                  u r|j6                  n|D }}n | j2                  | }d }t9        t;        |j<                  |            \  }}~~~d d d        d d d        d d d        D cg c]  }t?        |      t        u }}t)        ||      D cg c]
  \  }}|s	| }}}t;        tA        jB                        |      }|jE                  |||      \  }}|jG                          tH        jJ                  jL                  xr t        jN                  |       t        jP                  |dgtS        |jT                        z  dgtS        |jV                        z  dgtS        |jX                        z  z         \  }}}t)        ||      D cg c]
  \  }}|s	| }}}t)        ||      D cg c]k  \  }}|r2t        jZ                  j]                  t        j                  |            n1t        jZ                  j_                  ta        |jb                              m }}}|r|||fS |||fS c c}	w c c}w c c}}	w c c}w 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 c c}}w c c}}w c c}}w )NTrd   rf   rN   rq   F)2r   r   r   rt   r   rs   ru   rv   ry   r   r;   rQ   r   r#   rR   r$   r%   rS   rw   r]   r:   rx   
full_lowerrz   rT   call_wrappedr   r   r'   r{   r|   rW   r   r~   r   r   r	   r   r   check_jaxprr   rY   r   r   r   
PartialValunknownknownr   rB   )	traceabler[   kwargsrJ   r]   r   r   rr   r   r   r\   r^   r   r   r   rM   r5   r   r`   ra   out_nzsrA   out_nz_tangentsr   r   r   r   r   r   out_tangents_pvalss                                 r6   direct_linearizer      s   //1#  (L"**,K((t<M[bcVW%%hqk&A&A&C[QcHc 8@A23 2<At1Dvay$*:*:;!H& &&q),-. AH A %\=cJO'++MBEgxBXY$!Q15YGY'./!q||~/G/

 
 
1 (

/
/
6(	)9))73S (+, #$ %Q888<<?+>+>> xx  , ,
 %i$$g."(_-S-SUX)Y"Zk<
3( ((0 +77QT!WD 7'7$'g$>E51b"QE/E = =,79:IK/((#{K-%8!1!1%!8--dVc%--((gEOO$$vELL0A'AAC%a !5>'!TA>&> &)w%?A!Ar DF--dmmA.>?++OAFF,CDE A A *E6;FF*E699M dA
 Z/
,	( ( ( (( (0 8E ?As   0P;0PP;A#P80P;(P?P;PP;4P.
P!#AP
*9P!#P.+P;?Q(
Q3Q$
Q/QA0QP;P!!P+&P..P8	3P;;Qc                B   |j                  dd      }t        j                  j                  rt	        | |||      S |st        |       }nt        | d      \  }}t        d |D              t        d |D              z   }t        ||fi f      \  }}t        ||      \  }	}
t        j                  |	|      \  }}}t         |
       |      \  }}t        d |D              rt        d      |D cg c]  }|j                          }}|s||||fS ||||        fS c c}w )	NrJ   F)rJ   Tc              3  Z   K   | ]#  }t         j                  j                  |       % y wr2   )ru   r   r   rl   r   s     r6   rm   zlinearize.<locals>.<genexpr>  s     <qBMM''*<s   )+c              3     K   | ]:  }t         j                  j                  t        |      j	                                < y wr2   )ru   r   r   r   r;   r   s     r6   rm   zlinearize.<locals>.<genexpr>   s4      ( mm++HQK,G,G,IJ (s   A Ac              3  >   K   | ]  }|j                            y wr2   )is_known)rl   out_primal_pvals     r6   rm   zlinearize.<locals>.<genexpr>&  s     QO_%%'	'Qrn   zLinearization failed to produce known values for all output primals. This is typically caused by attempting to differentiate a function using an operation that does not support reverse-mode autodiff.)popr	   use_direct_linearizer   r   rN   r}   r   r   ru   trace_to_jaxpr_nounitsr   any
ValueError	get_known)r   r[   r   rJ   rF   rM   in_pvalsr   in_treejvpfun_flatout_treer   	out_pvalsr   out_primals_pvalsr   pvalout_primals_constss                     r6   	linearizer     s@   JJy%('  &&IwHH	^Fi.KFC<G<< (&( ((( gw/45*!W%fg6+x66{HM%F*8Y*O''Q?PQQ
	JK K 6GGT(GG	15&@@15&#%GG	 Hs   /Dc                      e Zd ZdgZd Zd Zy)UndefinedPrimalrB   c                    || _         y r2   rB   )selfrB   s     r6   __init__zUndefinedPrimal.__init__4  s	    DIr8   c                "    d| j                    dS )NzUndefinedPrimal()r   r   s    r6   __repr__zUndefinedPrimal.__repr__6  s    dii[**r8   N)__name__
__module____qualname__	__slots__r   r  r3   r8   r6   r   r   2  s    h)+r8   r   c                $    t        |       t        u S r2   )rW   r   r4   s    r6   is_undefined_primalr  9  s    	aO	##r8   c                    d| j                   fS )Nr3   r   )zs    r6   <lambda>r  =  s    AFF| r8   c                    t        |       S r2   )r   )rB   r   s     r6   r  r  >  s    _T%: r8   c                n    	 t         |    S # t        $ r }t        dj                  |             |d }~ww xY w)NzJTranspose rule (for reverse-mode differentiation) for '{}' not implemented)primitive_transposesKeyErrorNotImplementedErrorformat)r   errs     r6   get_primitive_transposer  @  s@    .""	 .
	 &)%*-..s    	4/4c                   t        d |D              r| j                  sy t        t        g | j                  | j
                  g ||            d	fdg }| j                  D ]  }|j                  j                  r|j                  \  }|j                  |       |j                  t        j                  u r#t        |j                  j                        |<   x|j                  t        j                   u rt#        |j                        |<   |j                  t        j$                  u rt        |j                        |<   J t'        fd|j
                  D              r<|j                  D ]  }t#        |j                        |<    |j                  |       >|j                  j)                  |j*                        \  }}	|j,                  j.                  5  t1        |j2                        5   |j                  j4                  g |t7        |j
                        i |	}
d d d        d d d        |j                  j8                  r
n
g}
t;        j<                  |j                  |
        |rt?        j@                  d      ntC        jD                         }t        t7        | j                        |      D ]'  \  }}tG        |tH              s|jK                  |       ) |5  |d d d   D ]l  }|j,                  j.                  5  t1        |j2                        5  |j                  j                  rejM                  |j                  d         jO                         } |j
                  d         }tG        |tH              r|jK                  |       n|j                  D cg c]!  }jM                  |      jO                         # }}|j                  j8                  s|\  }|j                  tP        v r?tP        |j                     } ||gt7        |j
                        i |j*                   ntS        |j                        }t7        |j
                        }d }|j                  jT                  s|j                  jV                  r`|j                  D cg c]  }|j                   }}t        |j*                        }	|	jM                  d      } ||	|t7        ||      ||      }n  ||gt7        ||      i |j*                  }t        ||      D ]'  \  }}tG        |tH              s|jK                  |       ) d d d        d d d        o 	 d d d        y # 1 sw Y   KxY w# 1 sw Y   PxY wc c}w c c}w # 1 sw Y   BxY w# 1 sw Y   xY w# 1 sw Y   y xY w)
Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   )rl   cts     r6   rm   z!backward_pass3.<locals>.<genexpr>M  s     2bbT	2rn   c                F    t        | t              r| j                  S |    S r2   )rQ   r"   val)r5   r   s    r6   readzbackward_pass3.<locals>.readS  s    q'*1556A6r8   c              3  J   K   | ]  }t         |      t                y wr2   )rQ   	GradAccum)rl   r5   r  s     r6   rm   z!backward_pass3.<locals>.<genexpr>c  s     @ZQ+@s    #	transposer   c                P    t        | t              rt        | j                        S | S r2   )rQ   r  r   rB   r4   s    r6   r  z backward_pass3.<locals>.<lambda>  s    jI6N?1662 TU r8   
call_jaxpr)r5   z	core.AtomreturnzArray | GradAccum),alleffectsdictr:   r   r   eqns	primitiveref_primitiver   appendr   ref_pRefAccumrB   
inner_avalfreeze_pValAccumaccum_grad_in_ref_pr   get_bind_paramsr   r_   manager_name_stack_ctxrr   bindr{   multiple_resultsr0   
setdefaultr   rT   rU   rV   rQ   r  accumr   freezefancy_transposesr  call_primitivemap_primitive)r   rL   r   
primals_incotangents_inlin_eqnseqnvsubfunsr   r   r_   accr  cts_inruler[   upcts_in_avalsr  cts_outr5   r   r  s                         @@r6   backward_pass3rE  I  s    	2M225==
3885<<8--*-/ 0#7 (ZZ 0c
}}"";;baooc	$**	$!&&++,A==DMM)!&&!A==D444!&&!Au	@SZZ@	@{{ "!!&&!A"ooc55cjjAogv77?? MOCOO< M cmm  L'LCcjj,ALVLM M==11Cuccnnckk3/+0. @O		.	.{	;$$& Su}}-}= gc2#y!	iim  "~ 77?? OCOO< ==&&wws{{1~&--/"SZZ]##Y'IIbM14=ACGGAJ%%'=&=//GF]]..#CMM2D>#dCJJ/>3::>*3==9D$

+GUB}}++s}}/J/J.1kk:aff:l:CJJ'f!::l3jVZR1A6<XgVEc"g&6E#**EgWg. 2Ay)3   M M M M& > ;'    s   %V;6U:1V7#V7V*0B
V	:&V CV	5VBV	
V	V*%V7:V?VV	
V	V'#V**V4/V77W c                    t        j                         | j                  z   }t        j                  | j                  |      S )N)
name_stack)r   current_name_stackrG  user_context	traceback)src_infostacks     r6   r0  r0    s4    

-
-
/(2E2E
E%		&	&x'9'9e	LLr8   c                  (    e Zd ZU ded<   ddZddZy)r  core.AbstractValuerB   c                    J r2   r3   r   r5   s     r6   r4  zGradAccum.accum      5r8   c                    J r2   r3   r  s    r6   r5  zGradAccum.freeze  rQ  r8   N)r   None)r   Array | Zero)r  r  r  __annotations__r4  r5  r3   r8   r6   r  r    s    r8   r  c                  <    e Zd ZU ded<   ded<   d
dZd Zd Zd	 Zy)r)  rN  rB   zAbstractRef | NonerefNc                     || _         || _        y r2   )rB   rW  )r   rB   rW  s      r6   r   zRefAccum.__init__  s    DIDHr8   c                    |t         usJ t        |t               s|y | j                  t        j                  |      | _        y t        | |       | j                  j                  |       y r2   )r   rQ   rW  r   new_refct_check	addupdaterP  s     r6   r4  zRefAccum.accum  sT    D==!TaixxadhtQ
hhr8   c                    | j                   t        | j                        S t        j                  | j                         S r2   )rW  r   rB   r   r5  r  s    r6   r5  zRefAccum.freeze  s-    xx$))_[[""r8   c                x    | j                   -t        j                  t        | j                              | _         | S r2   )rW  r   rZ  r   rB   r  s    r6   rb   zRefAccum.inst  s*    xxodii89dhKr8   r2   )r  r  r  rU  r   r4  r5  rb   r3   r8   r6   r)  r)    s"    #r8   r)  c                  6    e Zd ZU ded<   ded<   d	dZd Zd Zy)
r,  rN  rB   rT  r  Nc                F    || _         |t        |      | _        y || _        y r2   )rB   r   r  )r   rB   r  s      r6   r   zValAccum.__init__  s    DI [tDzDHcDHr8   c                X    |(t        | |       t        | j                  |      | _        y y r2   )r[  add_tangentsr  rP  s     r6   r4  zValAccum.accum  s(    }tQdhh*dh r8   c                    | j                   S r2   )r  r  s    r6   r5  zValAccum.freeze  s    88Or8   r2   )r  r  r  rU  r   r4  r5  r3   r8   r6   r,  r,    s    2+
r8   r,  c           	     H   t        |      t        u r|j                  n
t        |      }| j                  j	                         }t        j                  ||d      sHt        d| j                  j                          d|j                          d|j                                y )NT)only_shape_shd_checkz)Input primal JAX type to VJP function is z'. Hence the expected cotangent type is z	 but got )	rW   r   rB   r#   to_cotangent_avalr   	typematchr   	str_short)r   r  ct_avalct_aval_expecteds       r6   r[  r[    s    Bx4'BGGVBZ'[[224	!1	M KK!!#$ %.88:; <!!#$	&' ' 
Nr8   c                      e Zd Zd Zd Zd Zy)	NullAccumc                     y r2   r3   r  s    r6   r   zNullAccum.__init__      r8   c                     y r2   r3   rP  s     r6   r4  zNullAccum.accum  s    fr8   c                    J r2   r3   r  s    r6   r5  zNullAccum.freeze  s    L5r8   N)r  r  r  r   r4  r5  r3   r8   r6   rl  rl    s     r8   rl  zdict[core.Primitive, Callable]r6  c                   g g }}| D ]  }t        |t              r"|j                  t        |j                  f       5t        |t              rK|j                  t        |j                  f       |j                  |j                         j                         |j                  d t        |      f       |j                  |        |t        |      fS r2   )	rQ   r,  r'  rB   r)  rb   rW  r#   r}   )argsresultspecsr5   s       r6   project_accumsru    s    b%& a!XllHaff%&	Ax	 llHaff%&mmAFFHLL!llD&)$%mmA 
u	r8   c           	     ,   g t        |      }}| D ]s  \  }}|t        u r|j                  t        |             )|t        u r%|j                  t        |t	        |                   V||j                  t	        |             sJ  t	        |d       J |S r2   )iterr,  r'  r)  next)rt  rs  rr  result_krB   s         r6   unproject_accumsr{    s    d6l$ gaH}
kk(4.!	
h
kk(4g/0	

kk$w- U 
gt		$$	$	+r8   c                P    t        | t              r| j                  S t        |       S r2   )rQ   r  rB   r#   r4   s    r6   accum_typeofr}    s    966M!9r8   c                    |D cg c])  }t        |t              rt        |j                        n|+ }}t	        | ||||       |D cg c]$  }t        |t              r|j                         nd & c}S c c}w c c}w r2   )rQ   r   r,  rB   rE  r5  )r   rL   r   r9  r@  r5   s         r6   backward_passr     s    #% %/q/$B I %* %VD
 #1h/!((*T
9 
 %
s   .A4)A9c                H    t        | j                  || j                  ||      S r2   )r  r   r   )r   rL   r9  r:  s       r6   closed_backward_passr    s"    	u{{OU\\!=
2 2r8   c                     | |i |x}\  }}|j                  |D cg c]  }t        |      t        u c}       |S c c}w r2   )r   rW   r   )r>   r   rr  r   resultsr   tangents_outr   s           r6   nonzero_tangent_outputsr    sE     !4 26 22'Q++L9qtAwd"9:	. :s   >c                  L     e Zd Z fdZd Zd Zd Zd ZeZd Z	d Z
d Z xZS )	r   c                L    t         |           || _        || _        d| _        y NF)superr   r]   r   requires_low)r   r   r]   	__class__s      r6   r   zJVPTrace.__init__  s%    	GDH$DDr8   c                    t        |t              r:|j                  j                  | j                  u r|j                  |j
                  fS t        j                  |      }||fS r2   )rQ   r   r   r]   r   r   r   rS   r   r  tangent_zeros      r6   r|   zJVPTrace.to_primal_tangent_pair  sM    #y!cjjnn&@jj#++&&++C0l<  r8   c           	     P   t        t        | j                  |            \  }}t        d |D              rA|t        j
                  ur/t        d |D              s|j                  | j                  ||      S t        j                  |      }|sd| d}t        |      t	        j                  | j                        5   |||fi |\  }}	d d d        |j                  r*t        	      D 
cg c]  \  }
}t        | |
|       c}}
S t        | 	      S # 1 sw Y   LxY wc c}}
w )Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   rk   s     r6   rm   z-JVPTrace.process_primitive.<locals>.<genexpr>$       1DGtO1rn   c              3  N   K   | ]  }t        t        |      t                y wr2   rQ   r#   r&   rl   r5   s     r6   rm   z-JVPTrace.process_primitive.<locals>.<genexpr>&       Gq
6!9k2G   #%Differentiation rule for '' not implemented)r'   r{   r|   r!  r   r(  r   bind_with_tracer   primitive_jvpsr   r  rz   r2  r:   r   )r   r%  r   r   r9  tangents_inrN   msg
primal_outtangent_outr5   r^   s               r6   process_primitivezJVPTrace.process_primitive"  s   $S)D)Dg%NOJ1[11#GJGG&&t'8'8*fMM


Y
'C(3DEc$$			 1 1	2 G #J Fv Fj+G !!7::{7STtq!tQ*TTdJ<<G G Us   =D.D"Dc                    | j                  |      \  }}t        j                  | j                        5  t        j                  |      cd d d        S # 1 sw Y   y xY wr2   r|   r   rz   r   cur_qddr   r5   r   r   s       r6   r  zJVPTrace.cur_qdd4  J    &&q)DAq			 1 1	2 \\!_     AAc           	     F   |j                   sJ t        t        | j                  |            \  }}|D cg c]  }t	        |      t
        u }}|D cg c]  }t	        |      t
        ur|nd  }}t        ||f      \  }	}
t        || j                        }t        |      \  }t        |t        j                        rS|d   }t        ||      D cg c]
  \  }}|s	| }}}|d   t              fd       }t        |g |||      }t!        ||
      \  }}t"        j%                  |      }|r	 |||      n|}t'        |j)                         |j*                  |      ft-        |	      z   }|j/                  | j0                  ||      }t3         |       |      \  }}t        ||      D cg c]  \  }}|t        j4                  |      n|  }}}t        ||      D cg c]  \  }}t7        | ||       c}}S c c}w c c}w c c}}w c c}}w c c}}w )Nin_axesout_axes_thunkclosurec                 L            } g | d t        |               D        S )Nc              3  ,   K   | ]  \  }}|s	|  y wr2   r3   rl   axrA   s      r6   rm   zDJVPTrace.process_call.<locals>.new_out_axes_thunk.<locals>.<genexpr>J  s     N&"b22Nrp   )r:   )out_axr  which_nz_outs    r6   new_out_axes_thunkz1JVPTrace.process_call.<locals>.new_out_axes_thunkG  s*    !OONC,GNOOr8   r  r  )r2  r'   r{   r|   rW   r   r   rG   r]   r  rQ   r   MapPrimitiver:   r,   r#  r   call_param_updatersr   rD   r   in_typer}   r  r   r   rS   r   )r   r7  r>   r   r   r[   r\   r^   which_nzrr  r   f_jvpr  r  rA   tangent_in_axesr  r   update_params
new_paramsfun_and_argsrs  r  r  r   r  r  s                            @@r6   process_callzJVPTrace.process_call9  s   ****s4#>#>HIGX<DEqT!WD(EHE<DEqT!WD(d2EHE '8!45MD'DHH%E1%8E<.$"3"34y!g*-gx*@GBBGoG./n N3P 4P F$@g$@$@#57fw/OE8'++N;M4Avx0vJ&u'?'?'A199hWY\abf\ggL++D,=,=|ZXF,XZ@J":{;=q! 12	4))!,q@ =K =58[5QRTQT1a(RR3 FE H =Rs#   HH
H H7#H,Hc               F   t        t        | j                  |            \  }}t        d |D              r,|j	                  | j
                  ||g|t        |            S t        j                  | j
                        5  |st        t        |      }nt        t        |      } |j                  t        |      t        |      z    }d d d        t        t        |      dz  g      \  }	}
t        t        |
      }
t        t!        t"        |       |	|
      S # 1 sw Y   PxY w)Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   rk   s     r6   rm   z3JVPTrace.process_custom_jvp_call.<locals>.<genexpr>^       
0q47d?
0rn   symbolic_zeros   )r'   r{   r|   r!  r  r   r#  r   rz   rZ   r   r   r}   r*   rY   r   r   r   )r   primrI   r  r   r  r9  r  outsprimals_outr  s              r6   process_custom_jvp_callz JVPTrace.process_custom_jvp_call\  s
   $S)D)Dg%NOJ

0K
00!!$"3"3c55N:5N"&n"EG G			 1 1	2 K+[99;GU%
"3eK6H"HJdK !+4#d)q.1A BK9<HLw'.\JJK Ks    ADD c           
        t        t        | j                  |            \  }}	t        d |	D              r.|j	                  | j
                  |||g|t        ||            S t        ||	      D 
cg c]  \  }
}|
t        |      t        uf }}
}|D cg c]  }|D ]  }|  }}}t        j                  | j
                        5   |j                  | }d d d         |       \  }}}|j                  t        d |D              z
  }t        |g      \  }}t!        |      }|D cg c]  }|t#        |      n||    }}t#        |d       J |D cg c]%  }t        j$                  |      j'                         ' }}|	D cg c]  }t        |      t        u  }}t        ||	      D cg c]
  \  }}|r	| }}}t        j                  | j
                        5  t)        j*                  g |||j                  ||||d}d d d        t        t-        t.        |       |      S c c}}
w c c}}w # 1 sw Y   bxY wc c}w c c}w c c}w c c}}w # 1 sw Y   RxY w)Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   rk   s     r6   rm   z3JVPTrace.process_custom_vjp_call.<locals>.<genexpr>o  r  rn   	out_treesr  c              3  $   K   | ]  }|d u 
 y wr2   r3   rl   r>   s     r6   rm   z3JVPTrace.process_custom_vjp_call.<locals>.<genexpr>y       +NaATM+N   num_resbwd	out_avalsr  in_zeros)r'   r{   r|   r!  r  r   r#  r:   rW   r   r   rz   r   
num_leavessumr*   rw  rx  r   r;   custom_lin_pr1  r   r   )r   r  rI   fwdr  r   r  r  r9  r  r   r^   fwd_inpairr5   res_and_primals_outr   res_tree
input_fwdsnum_res_outres_outr  res_out_r>   r   	avals_outr  r
  nz_tangents_inr  s                                 r6   process_custom_vjp_callz JVPTrace.process_custom_vjp_calll  se   $S)D)Dg%NOJ

0K
00!!$"3"3#&S">:">"&>"Z\ \ 47z;3OP41aq$q'%&PFP"1DD1qa1a1F1			 1 1	2 6,C,,f56 (kAx%%+N:+N(NNK%&9K=IG[G}HCM
NaQY4>JqM9
NC
N$'''=HIq!113III)45AQ45H5$'+$>HDAqaaHNH			 1 1	2 Q!&& QQQ)1)<)<#nxQlQ w'.\JJ' Q16 6 O J5HQ QsB   2H-H3	H9*I*II0
I;I!)I9II$c                   t        t        | j                  |            \  }}t        ||d   j                  g      \  }}t        ||d   j                  g      \  }	}
t        d |	D              rt        d      t        j                  | j                        5   |j                  |g|i |}t        t        |
      }
 |j                  |g||
i |}d d d        t        t        t        |             S # 1 sw Y   $xY w)Nr  c              3  >   K   | ]  }t        |      t        u  y wr2   rj   rk   s     r6   rm   z4JVPTrace.process_custom_transpose.<locals>.<genexpr>  s     
2147$
2rn   zCJVP of custom transpose with respect to non-symbolic-zero residuals)r'   r{   r|   r*   r  r   r  r   rz   r   r1  rZ   r   r   )r   r  callr   r   ps_ints_in	res_ps_in	lin_ps_in	res_ts_in	lin_ts_inps_outts_outs                r6   process_custom_transposez!JVPTrace.process_custom_transpose  s   #d997CDLE5%efZ.@.K.K-LMIy%efZ.@.K.K-LMIy$ 
2	
22MO O 
		 1 1	2 Atyy000f'3ityy@	@I@@fA
 w'.??A As   ?C;;D)r  r  r  r   r|   r  r  r  process_mapr  r  r  __classcell__r  s   @r6   r   r     s7    !=$
SB +K K8@r8   r   c                    t        |      t        u s5t        t        |      t        j
                        rt        |      t        k(  r|S t        | ||      S r2   )	rW   r   rQ   r#   r   rR   r$   r%   r   )r   r   r   s      r6   r   r     sB    
7mt$"2"23
.F
"MUFG,,r8   c                  N    e Zd ZddgZd Zd Zed        Zd Zd Z	d Z
d	 Zd
 Zy)r   r   r   c                z    t         j                  j                  rt        ||       || _        || _        || _        y r2   r	   r   r   _primal_tangent_shapes_matchr   r   r   r   r   r   r   s       r6   r   zJVPTracer.__init__  0    !!"673DKDKDLr8   c                b    d } || j                          || j                        }}d|d|dS )Nc                X    t        | t              r| j                         S t        |       S r2   rQ   r   _short_reprstrr4   s    r6   r  z'JVPTracer._short_repr.<locals>.<lambda>      jF&;1==? Q r8   zJVPTracer(primal=z
, tangent=r   )r   r   r   ppr   r   s       r6   r  zJVPTracer._short_repr  s6    	GBor$,,'7GF{+WL22r8   c                ,    t        | j                        S r2   r   r   r  s    r6   rB   zJVPTracer.aval      DKK  r8   c                @    t        j                  | j                        S r2   r   r  r   r  s    r6   r  zJVPTracer.cur_qdd      <<$$r8   c                z    t        | j                        t        u rt        j                  | j
                        S | S r2   rW   r   r   r   r   r   r  s    r6   r   zJVPTracer.full_lower  +    DLLT!__T[[))kr8   c                @    t        j                  | j                        S r2   r   to_concrete_valuer   r  s    r6   r  zJVPTracer.to_concrete_value      !!$++..r8   c                @    t        j                  | j                        S r2   r   get_referentr   r  s    r6   r  zJVPTracer.get_referent      T[[))r8   c                6    | j                   j                         S r2   )r   
type_stater  s    r6   r  zJVPTracer.type_state  s    ;;!!##r8   N)r  r  r  r  r   r  propertyrB   r  r   r  r  r  r3   r8   r6   r   r     sC    #)3
 ! !%/*$r8   r   c                F   t        |      t        urt        |       j                         }t        |      j                         }t	        |t
        j                        sy t        j                  |j                  |j                        sJ |j                  |j                  f       t        j                  |j                        }||j                  k(  sJ ||j                  f       |j                  j                  j                  s|j                  j                  j                  sx|j                  j                  j                  s |j                  j                  j                  r7|j                  |j                  k(  sJ |j                  |j                  f       y y y y y r2   )rW   r   r   strip_weak_typerQ   r   rR   definitely_equal_shapeshapeprimal_dtype_to_tangent_dtyper$   shardingr   empty_any_axis_explicit)r   r   r   r   expected_tangent_dtypes        r6   r  r    sh   	']$6"224KG$446Lk4#3#34&&{'8'8,:L:LM /<--P/ /M!??@Q@QR!\%7%77 4 2 2:4 47  %%++!!&&,,				"	"	5	5				#	#	6	6!!\%:%:: 7


 5 5=7 7: 
7 - , r8   r  call_linearize_param_updaterscall_transpose_param_updatersc                  h     e Zd Zd	 fd	Zd Zd Zd Zd Z	 	 	 	 d
dZ	 	 	 	 	 	 ddZ	ddZ
e
Z xZS )rw   c                    t         |           |t        j                         n|| _        || _        || _        t        t        j                               | _
        d| _        y r  )r  r   r   rP   r]   r   r   rY   r   rH  _name_stack_prefix_lenr  )r   r   r   r]   r  s       r6   r   zLinearizeTrace.__init__  sP    	G"%+t}}3DH$D&D"%&6&I&I&K"LDDr8   c                D    t        j                         | j                  d  S r2   )r   rH  r"  r  s    r6   _name_stack_suffixz!LinearizeTrace._name_stack_suffix  s    ..01L1L1MNNr8   c                    t        |t              r:|j                  j                  | j                  u r|j                  |j
                  fS t        j                  |      }||fS r2   )rQ   rx   r   r]   r   r   r   rS   r  s      r6   r|   z%LinearizeTrace.to_primal_tangent_pair  sM    #'CJJNNdhh,Fjj#++&&++C0l<  r8   c                   t        t        | j                  |            \  }}|D cg c]  }t        |      t        u }}t        d |D              rA|t        j                  ur/t        d |D              s|j                  | j                  ||      S t        t        |      }t        j                  ||      }	t        j                  | j                        5   |	|g|i |\  }
}}}d d d        t        j                  | j                         5  t#        j$                  | j'                               5   g| }d d d        d d d        |j(                  r/t+        
      D cg c]  \  }}}t-        | |||       c}}}S t-        | 
      S c c}w # 1 sw Y   xY w# 1 sw Y   kxY w# 1 sw Y   oxY wc c}}}w )Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   rk   s     r6   rm   z3LinearizeTrace.process_primitive.<locals>.<genexpr>  r  rn   c              3  N   K   | ]  }t        t        |      t                y wr2   r  r  s     r6   rm   z3LinearizeTrace.process_primitive.<locals>.<genexpr>  r  r  )r'   r{   r|   rW   r   r!  r   r(  r   r  r   r   fallback_linearize_ruleprimitive_linearizationsr   rz   r   r   set_name_stackr$  r2  r:   maybe_linearize_tracer)r   r%  rr  r   r9  r  r^   tangent_nzsfallbacklinr  tangent_nzs_out	residuals
linearizedr  r5   rA   s                    r6   r  z LinearizeTrace.process_primitive  s   $S)D)Dd%KLJ0;<147$&<K<1[11#GJGG&&t'8'8*fMM.	:H
"
&
&y(
;C			 1 1	2 .;>
<."<.&,<.8j/9j. 
 
 !3!3
4 8

)
)$*A*A*C
D8y7;7k8 8 !!!*o{KM M!R %T1b!4 M M $D*o{SS# =. .8 8 8 8Ms;   FF$F66
F* F6-GF'*F3	/F66F?c                    | j                  |      \  }}t        j                  | j                        5  t        j                  |      cd d d        S # 1 sw Y   y xY wr2   r  r  s       r6   r  zLinearizeTrace.cur_qdd  r  r  c                  t        t        | j                  |            \  }}t        d |D              r,|j	                  | j
                  |g|t        |            S t        t        j                  j                        fd       }t        j                  | j
                        5  | }	|D 
cg c]  }
t        |
      t        u }}
t        |d|||	|i       \  }}}}d d d        t        j                  | j                         5   g| }d d d        t        t"              }t%        |      D 
cg c]  \  }}}
t'        | |||
       c}
}}S c c}
w # 1 sw Y   ~xY w# 1 sw Y   YxY wc c}
}}w )Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   rk   s     r6   rm   z9LinearizeTrace.process_custom_jvp_call.<locals>.<genexpr>  r  rn   r  r   c                l     j                   g | | }t        |t        |      dz  g      \  }}||fS )Nr  )r   r*   rY   )r[   r\   r  r  r  r  s        r6   _f_jvpz6LinearizeTrace.process_custom_jvp_call.<locals>._f_jvp#  sD    U4484d",TCIN3C"Dk<,&&r8   T)r'   r{   r|   r!  r  r   r#  r   r<   	wrap_initr   r   rz   rW   r   linearize_from_jvpr   r   r:   r,  )r   r  rI   r  r   r  r9  r  r8  rZ   r^   nonzeros_inr  r0  r1  r2  r  r5   rA   s      `               r6   r  z&LinearizeTrace.process_custom_jvp_call  s    %S)D)Dg%NOJ

0K
00!!$"3"3c55N:5N"&n"EG G R\\e&6&67' 8'
 
		 1 1	2 ,,2=>QT!WD(>k><N
$^5F
b=9k?Iz 
		 2 2	3 9	8K8l99<HL_lKM M2q #4B2 M M ? 9 9Ms0   .E#6EE#
E/ E;E##E,/E8c           
        t        t        | j                  |            \  }}	t        d |	D              r.|j	                  | j
                  |||g|t        ||            S t        ||	      D 
cg c]  \  }
}|
t        |      t        uf }}
}|D cg c]  }|D ]  }|  }}}t        j                  | j
                        5   |j                  | }d d d         |       \  }}}|j                  t        d |D              z
  }t        |g      \  }}t!        |      }|D cg c]  }|t#        |      n||    }}t#        |d       J |D cg c]%  }t        j$                  |      j'                         ' }}|	D cg c]  }t        |      t        u  }}t        ||	      D cg c]
  \  }}|r	| }}}t        j                  | j(                        5  t+        j,                  g |||j                  ||||d}d d d        D cg c]  }t        |      t        u }}t        t/        t0        |       |||      S c c}}
w c c}}w # 1 sw Y   xY wc c}w c c}w c c}w c c}}w # 1 sw Y   qxY wc c}w )Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   rk   s     r6   rm   z9LinearizeTrace.process_custom_vjp_call.<locals>.<genexpr>;  r  rn   r  c              3  $   K   | ]  }|d u 
 y wr2   r3   r  s     r6   rm   z9LinearizeTrace.process_custom_vjp_call.<locals>.<genexpr>E  r  r  r  )r'   r{   r|   r!  r  r   r#  r:   rW   r   r   rz   r   r  r  r*   rw  rx  r   r;   r   r  r1  r   r,  ) r   r  rI   r  r  r   r  r  r9  r  r   r^   r  r  r5   fwd_in_flatr  r   r  r  r  r  r  r  r>   r   r  r  r
  r  r  r0  s                                    r6   r  z&LinearizeTrace.process_custom_vjp_call6  s    %S)D)Dg%NOJ

0K
00!!$"3"3#&S">:">"&>"Z\ \ 47z;3OP41aq$q'%&PFP!'66A1616K6			 1 1	2 ;,C,,k:; (kAx%%+N:+N(NNK%&9K=IG[G}HCM
NaQY4>JqM9
NC
N$'''=HIq!113III)45AQ45H5$'+$>HDAqaaHNH			 2 2	3 Q!&& QQQ)1)<)<#nxQlQ 5AAqtAwd*AOAw-t4k?T`aa) Q6; ; OI5HQ Q BsH   2II	I*I%*I*I/0
I4;I4!)I:JI":Jc                  &'()* |j                   sJ t        t        | j                  |            \  }}t	        d |D              }t        || j                  ||j                        \  }'t        |t        j                        r(|d   *t        *      '*fd       }	t        ||	      }
n|}
|j                  | j                  |g||
      } '       \  }}&}}}t        d t!        ||      D              }|d | }||d  }t#        |||||      }t        |t        j                        r|d   } |d          }t        t$        |      }t!        ||      D cg c]  \  }}|||   n|||   nd }}}g |d	 t'        t)        |            D        d
 t!        ||      D        }g d t!        ||      D        (t        (      (fd       }	t        |||	      }t*        j-                  |      }t)        |      t)        |      z   }|r
 ||||      n|}t)        |      )t        |t        j                        r7t        )&f      &)fd       }t        |t        j                        |_        nt1        &)      }t!        ||      D  cg c]
  \  }} | s	| }!}} |j                  | j2                  t5        j6                  |&j                        g|||!|      }"t9        |"      }#t!        ||      D  $cg c]'  \  } }$| rt;        |#      nt=        j>                  |$      ) }%} }$t        tA        tB        |       |||%      S c c}}w c c} }w c c}$} w )Nc              3  >   K   | ]  }t        |      t        u  y wr2   rj   rk   s     r6   rm   z.LinearizeTrace.process_call.<locals>.<genexpr>X  s     9147$&9rn   r  r  c                             \  } } } } }}t        d t        ||      D              }        }g d t        |      D        |S )Nc              3  6   K   | ]  \  }}|d u xr |d u   y wr2   r3   rl   r   r   s      r6   rm   zJLinearizeTrace.process_call.<locals>.new_out_axes_thunk.<locals>.<genexpr>`  s$     WB"*3t3W   c              3      K   | ]  }d   ywr   Nr3   rl   r   s     r6   rm   zJLinearizeTrace.process_call.<locals>.new_out_axes_thunk.<locals>.<genexpr>b  s     0!0   )r  r:   range)r   r   r   r  out_axeslinearize_outs_thunkr  s        r6   r  z7LinearizeTrace.process_call.<locals>.new_out_axes_thunk]  sR    &:&<#1aFGW#fgBVWW!#<0U;/0<8<<r8   )r  c              3  6   K   | ]  \  }}|d u xr |d u   y wr2   r3   rD  s      r6   rm   z.LinearizeTrace.process_call.<locals>.<genexpr>j  s$     SFBbDj/R4Z/SrE  r  r   c              3      K   | ]  }d   y wr2   r3   rH  s     r6   rm   z.LinearizeTrace.process_call.<locals>.<genexpr>v  s     &Et&ErI  c              3  ,   K   | ]  \  }}|s	|  y wr2   r3   r  s      r6   rm   z.LinearizeTrace.process_call.<locals>.<genexpr>w  s     Cfb"rCrp   c              3  ,   K   | ]  \  }}|s	|  y wr2   r3   r  s      r6   rm   z.LinearizeTrace.process_call.<locals>.<genexpr>x  s     Fvr22Frp   c                      S r2   r3   )new_out_axess   r6   r  z7LinearizeTrace.process_call.<locals>.new_out_axes_thunk{  s	    r8   r  c                 F    | d  }| d  }t        j                  |g| S r2   r   r   rr  r   nz_tangents	lin_jaxprnum_residualss      r6   	f_tangentz.LinearizeTrace.process_call.<locals>.f_tangent  s1    n}%=>*y&?;??r8   r6  )"r2  r'   r{   r|   r}   r   r]   r   rQ   r   r  r,   r#  r  r   r  r:   r/   r   rJ  rY   r  r   	_pmap_tag_get_f_tangentr   r<   r9  rw  rx  r   rS   r   r,  )+r   r7  r>   r   r   r[   r\   r   f_primalr  primal_paramsall_primal_resultsr   r   r   r   r   r  non_fwd_resr  r1  r  rK  r   r   residual_axesnew_in_axesr  num_new_argsr  rY  r^   rA   r  nz_tangents_outnz_tangents_out_iterr   r  rW  rL  rR  rX  r  s+                                         @@@@@r6   r  zLinearizeTrace.process_callU  s   ****s4#>#>HIGX999F%7	488VQ\\&+"H".$"3"34./nN3= 4=
 62DEmm'77H/w/@?S?U<NGYVWSc&'>RSSK$\k2K$[\2K67G[+NI.$"3"34y!g)()+h8Y/n (+67';=#R ')nwr{')~x| =m =Em E&EU3s8_&E ECGV(<CEkHFXw)?FHl L1 2FK@RSf155nEMy>CH,L"  f=(. 'M
 .$"3"34]I$>?@ @@ '~t7H7HIi M:i'*8V'<CGQaCNC$44	iI,@,@	A 	,
	,	,*	,-79O  0&)';&?A"F 35D-.$:P:PQW:XX AL Aw-t4k7LYYQ=@ DAs   M
M!M,Mr2   )rI   lu.WrappedFunr  re  r  rX   )r  re  r  z;Callable[[], tuple[PyTreeDef, PyTreeDef, list[int | None]]]r  rX   )r>   re  )r  r  r  r   r$  r|   r  r  r  r  r  r  r  r  s   @r6   rw   rw     sh    O!T*
M%2M.2M6b#0b)db /3b>FZV +r8   rw   c                      fd}|S )Nc                 F    | d  }| d  }t        j                  |g| S r2   rT  rU  s      r6   r   z_get_f_tangent.<locals>._f  s1    .=!F}~&K??9f;{;;r8   r3   )rW  rX  r   s   `` r6   r[  r[    s    < 
)r8   c                p    |r t        |      t        usJ t        | ||      S t        |      t        u sJ |S r2   )rW   r   rx   )r   r   
is_nonzeror   s       r6   r,  r,    s=    G}$$$5&'22=D   Mr8   core.Primitivec           	         t         j                  |       }|sd|  d}t        |      t        d|||      }t	        t        j                  ||      | j                  |dd||      S )Nr  r  linearize_prim_jvpr6  F)r  r   r  r   r:  r<   r9  r2  )_prim	_nonzerosr[   r   rN   r  	debug_jvps          r6   r)  r)    sn    5!#	&ug->
?C
c
""-sGVD)	BLLC!22Iue#V
- -r8   c                   ! t        j                         }t        j                         5 }t	        j
                  ||t        j                               }	|D 
cg c]  }
t        |
      j                          }}
t        |      D cg c]9  \  }}|xr0 t        |t        j                        xr |j                  t        k(   ; c}}fd}rt        }nt        }t        j                   |	      5  t        |      D cg c]=  \  }}|r.|	j#                  t        j$                  j'                  |            n ||      ? }}} | j(                  t+        |      t+        |      fi |\  }}d d d        sg}g}D 
cg c]+  }
|	j-                  |
      j.                  j1                         - }}
t3        d |D              rt5        d      D cg c]1  }t7        |      |uxr  |	j-                  |      j9                          3 c} |D 
cg c]  }
t        |
      j                          c}
!t        |       D cg c]  \  }}|r|	j-                  |       }}}t              D cg c]
  \  }}|s	| }}}t	        j:                  |||	j<                  | j>                  jA                               \  }}t	        jB                  dgtE        jF                        z  dgtE        jH                        z  dgtE        jJ                        z  z         \  }}t        ||      D cg c]
  \  }}|s	| }}} !fd}d d d        r fS \  } \  }||fS c c}
w c c}}w c c}}w # 1 sw Y   xY wc c}
w c c}w c c}
w c c}}w c c}}w c c}}w # 1 sw Y   ^xY w)Nc                N    rt        |       S rt        |       S t        |       S r2   )r   r   r   )rB   instantiate_input_zerosuser_facing_symbolic_zeross    r6   	make_zeroz%linearize_from_jvp.<locals>.make_zero  s)    	 t$$%D!!Dzr8   c              3  $   K   | ]  }|d u  
 y wr2   r3   r   s     r6   rm   z%linearize_from_jvp.<locals>.<genexpr>  s     
*19
*r  zLinearization failed to produce known values for all output primals. This is typically caused by attempting to differentiate a function uses an operation that does not support reverse-mode autodiff.TFc                   t        |      D cg c]
  \  }}|s	| }}}t        j                  
| g| }t        |      }t              D cg c]  \  }}|rt	        |      n
t        |       }}}r|S |\  }	|	S c c}}w c c}}w r2   )r:   r   r   rw  rx  r   )r1  r\   r^   rA   r  rc  rd  rB   all_out_tangentsout_tangentr   r2  r@   r   out_tangent_avalss             r6   r2  z&linearize_from_jvp.<locals>.linearized  s    ),Xx)@Ggq"BGnGyJ>Jo!/2,/0A7,KM(tR 9;$34T
J M M	' HMs   
BB"B	)&r   rH  r   rt   ru   
JaxprTracerP   r   r;   r:   rQ   rR   r$   r%   r   r   rz   ry   r   r   r   r}   r~   r   r   r   r   rW   r   tracers_to_jaxpreffect_handlesr   r   r   rY   r   r   r   )"rN   r2  r@   rs  rr  r[   r   rH  r   r   r   tangent_avalsr   rA   rt  	zero_typetangent_argsr`   ra   r^   r   out_nz_tracersr   
out_constsr   r   r   r   r2  
out_primalout_nzr   r   ry  s"    ````                          @@@r6   r:  r:    s   
 (::<  >LMM,(:DMMOLE<CDqXa[002DMD !9;Ar RJq$*:*:;Q6@QRR ;H "ii				& 9#&}h#?A!R BDemmBMM$9$9!$<=STU Al A"2#"2"2
.%-#917#9k<9  Mk"^lFQR5((+00::<RKR

*k
**KL L %& Awi'S0E0Ea0H0Q0Q0S,SS &G@KL1!446L%(w%?G!1b2 ++A. GN G!$\8!<C2!CJC..NE$8$8))+-E:q //vEMM**	#eoo&&$#ell2C)CCEE; $'{J#?Ha4!HJH
 
i>@ Z77KJGFvz:55G E;"A9 9 S&LGC Ie> >s   .N8 M9>N8>M>.N8;N
AN
,N
9N80N=#N8 6NN8 N!=N8N&,N8>
N,	N,B3N8 
N2N2N89N8N

N	)N88Oc                  H    e Zd ZddgZd Zd Zed        Zd Zd Z	d Z
d	 Zy
)rx   r   r   c                z    t         j                  j                  rt        ||       || _        || _        || _        y r2   r  r  s       r6   r   zLinearizeTracer.__init__  r  r8   c                    d } || j                         t        | j                        j                  d      }}d|d|dS )Nc                X    t        | t              r| j                         S t        |       S r2   r  r4   s    r6   r  z-LinearizeTracer._short_repr.<locals>.<lambda>  r  r8   TzGradTracer(primal=z, typeof(tangent)=r   )r   r#   r   rh  r  s       r6   r  zLinearizeTracer._short_repr  sB    	GBovdll';'E'Ed'KGF #5g[BBr8   c                ,    t        | j                        S r2   r  r  s    r6   rB   zLinearizeTracer.aval  r  r8   c                z    t        | j                        t        u rt        j                  | j
                        S | S r2   r  r  s    r6   r   zLinearizeTracer.full_lower  r	  r8   c                @    t        j                  | j                        S r2   r  r  s    r6   r  z!LinearizeTracer.to_concrete_value%  r  r8   c                @    t        j                  | j                        S r2   r  r  s    r6   r  zLinearizeTracer.get_referent(  r  r8   c                @    t        j                  | j                        S r2   r  r  s    r6   r  zLinearizeTracer.cur_qdd+  r  r8   N)r  r  r  r  r   r  r  rB   r   r  r  r  r3   r8   r6   rx   rx     s?    #)C
 ! !/*%r8   rx   r  r  r*  c                `    t        t        |       t        | <   t        t        |      t        | <   y r2   )r   
linear_jvpr  linear_transposer  r%  transpose_rules     r6   	deflinearr  5  s&    %j)<.$+,<n$My!r8   c                    | j                   |i |}t        d |D              r?| j                  r|t        t        j
                  |      fS |t	        j
                  |      fS t        t        |      }| | j                   |i |fS )Nc              3  >   K   | ]  }t        |      t        u   y wr2   rj   )rl   r   s     r6   rm   zlinear_jvp.<locals>.<genexpr>;  s     77g$	7rn   )r1  r!  r2  r{   r   rS   rZ   )r%  r[   r\   r   val_outs        r6   r  r  9  s    INNG.v.'7h77!!c$00':::D**7333$h/HNINNH7777r8   c                    t        |      t        u rC|D cg c]7  }t        |t              r#t        |j                  j                               nd 9 c}S  | |fi |S c c}w r2   rW   r   rQ   r   rB   r;   r  	cotangentrr  r   r5   s        r6   r  r  C  sc    	)_#% /9O.LD'')* % % ).v..%s   <Ac                `    t        t        |       t        | <   t        t        |      t        | <   y r2   )r   r  r  linear_transpose2r  r  s     r6   
deflinear2r  K  s&    %j)<.$+,=~$Ny!r8   c                    t        |      t        u rC|D cg c]7  }t        |t              r#t        |j                  j                               nd 9 c}S  | |g|i |S c c}w r2   r  r  s        r6   r  r  O  sh    	)_#% /9O.LD'')* % % )5d5f55%s   <A!c                t    t        | t              sJ | j                  rJ t        t        ||       t
        | <   y r2   )rQ   r!   r2  r   standard_jvpr  r%  jvpruless     r6   defjvpr  W  s4    	Iy	))	)'''	'%lHiH.r8   c           	         |j                   |i |}t        | |      D cg c]$  \  }}|t        |      t        ur ||g|i |& }}}|t	        j
                  t        |t        j                  |            fS c c}}w r2   )r1  r:   rW   r   	functoolsreducerb  rS   )	r  r%  r[   r\   r   r  rA  r^   r  s	            r6   r  r  ]  s    INNG.v.'=@8=T ?'$%$q'*= q-7-f- ?, ?	)""<t?U?UV]?^_	__?s   )A>c                t    t        | t              sJ | j                  rJ t        t        ||       t
        | <   y r2   )rQ   r!   r2  r   standard_jvp2r  r  s     r6   defjvp2r  c  s4    	Iy	))	)'''	'%mXyI.r8   c                     |j                   i fdt        | |      D        }t        |      }t        j                  t
        |t        j                              fS )Nc              3  d   K   | ]'  \  }}| t        |      t        ur ||gi  ) y wr2   rj   )rl   rA  r^   r   r[   r  s      r6   rm   z standard_jvp2.<locals>.<genexpr>j  s>      ?74%$q'*= q'6G6v6 ?s   -0)r1  r:   listr  r  rb  r   rS   )r  r%  r[   r\   r   r  r  s     ` ` @r6   r  r  h  s^    INNG.v.'?c(T\F] ?,l#,	)""<t?U?UV]?^_	__r8   c                f    t        |       t        u r|S t        |      t        u r| S t        | |      S r2   )rW   r   r   )r5   ys     r6   rb  rb  o  s/    	!W_HAw$Hq!r8   c                     t         t              sJ  fd} fd}t         ||       t        t        ||      t
         <   y )Nc                ,     j                   | |fi |S r2   r1  gr5   r  r   r  s       r6   r  zdefbilinear.<locals>.<lambda>y      idii1&?&? r8   c                ,     j                   || fi |S r2   r  r  s       r6   r  zdefbilinear.<locals>.<lambda>z  r  r8   )rQ   r!   r  r   bilinear_transposer  )r  lhs_rulerhs_rulelhs_jvprhs_jvps   `    r6   defbilinearr  w  s>    	D)	$$	$?'?'w &'98XNtr8   c                &   t        |      t        |      z  sJ t        |      r7t        |      t        u rt        |j                        d fS  | |||fi |}|d fS t        |      t        u rd t        |j                        fS  ||||fi |}d |fS r2   )r  rW   r   rB   )r  r  r  r5   r  r   r   s          r6   r  r  ~  s    	Q	"5a"8	88	8I$!&&\4Y1//c$YI$4<Y1//c3Yr8   c                V    t        | t              sJ t        t        |       t        | <   y r2   )rQ   r!   r   zero_jvpr  )r%  s    r6   defjvp_zeror    s#    	Iy	))	)%h	:.r8   c                T     | j                   |i |}|t        j                  |      fS r2   )r1  r   rS   )r%  r[   r\   r   r   s        r6   r  r    s-    inng((!	
D""1%	%%r8   c                
    | | fS r2   r3   )r^   rr  s     r6   r  r    s
    Aq6 r8   c                :   t        |       t        u r}t        | j                  d      rRt	        j
                  | j                  j                  j                        5  t        | j                        cd d d        S t        | j                        S | S # 1 sw Y    xY w)Nr  )	rW   r   hasattrrB   mesh_libuse_abstract_meshr  r   r   )r   s    r6   rZ   rZ     sv    	']dw||Z( %%gll&;&;&@&@A -w||,- -7<<((	.- -s   BBc                B   t        ||      \  }}t        ||      D cg c]  \  }}|t        j                  |      n|  }}} | ||      \  }}	|	D cg c]  }t	        |      t        u rd n| }	}t        ||	f      \  }
}|j                  |       |
S c c}}w c c}w r2   )r   r:   r   rS   rW   r   r   )r>   r   r   primals_and_tangentsr[   r\   r   r^   r  r  out_flatr   s               r6   r   r     s    $W.BC'8gx02!Q ,-9d$$Q'!; 2( 22+|:FGQ$q'T/$q0G,G#[,$?@(H++h	/2 Hs   #BBc          
     v   j                   rt        t        |      \  }t        ||f      \  }d t	        t
        j                  j                  j                               fd       }t        j                  |       }|rC |||D 	cg c]  }	t        |	t               c}	|D 	cg c]  }	t        |	      t        u c}	      } | j                  |g|i |}
t!        |t#        j$                  |
            D ]'  \  }	}t        |	t&              s|	j)                  |       ) y c c}	w c c}	w )Nc                      y r2   r3   r3   r8   r6   r  z&call_transpose_fancy.<locals>.<lambda>  rn  r8   r6  c                     t        	|       \  }}t        |      }t        dd||       |D cg c]$  }t        |t              r|j                         nd & }}t        |      \  }_        |S c c}w )NFr3   )r   r{  rE  rQ   r,  r5  r   r   )
	flat_argsprimals_ctrefsctsrr  r5   rD  r  cellrt  treedefs
         r6   
transposedz(call_transpose_fancy.<locals>.transposed  ss    ()<NCE>2D:ub$4HLM1Z84qxxz$>MGM)'2GT]N Ns   )A0)r   r  ru  r   r   r<   r9  r   r   r  r   rQ   r  rW   r   r1  r:   r   r   r,  r4  )r%  r  r  rr  r   r  r  r  r  r5   r  r  r  rt  r  s     `         @@@r6   call_transpose_fancyr    s   !44(..%#^S$9:)W	$
2<<J$9$9$L$L$NO P 033I>-6d#KJq)$<#K9<=ADG4/=?F Y^^J==f=(4x@A ,ea!X,	 $L=s   D1
1D6c                   |j                   |j                  }}t        j                  |      }t	        t
        j                  | g||d|i| y )Nr  )r   r   ru   r   r  r   closed_call_p)r  r  rr  r   jaxpr_r   s         r6   _closed_call_transposer    sW    ##Z%6%6&&%%f-&t))2 4 4 4"(4,24r8   c                     | |i |}|j                  |D cg c]  }t        |t        t        d       f         c}       |S c c}w r2   )r   rQ   r   rW   )r>   r   rr  r   r  r   s         r6   nonzero_outputsr    sF    tv'++gF:a$T
!344FG	. Gs   #Ac                   t        |d         D cg c]E  \  }}t        |      t        ur|n,t        t        j                  d   ||j
                              G }}}t        d||f      \  }}	t        j                  t        j                  t        |j                        |d      }
t        |
      \  }
t        |
|	      \  }
}d   d   c}g t        |      D cg c]  \  }}t        |      s| c}}t        ||      D cg c]  \  }}t        |      t        ur| c}}}t!        d |D              rt#        d      t%        d	 |D              sJ |       t'        t)        d
 |D              f      fd       }t+        t-        dd         ||      }|d= t.        j1                  |       }|r5 ||t3        t        |      |D cg c]  }t        |      t        u c}      }	  | j4                  |
g|i |}tC         |             }tE              tE        |      k(  sJ fdfdt        |      D        }t)        |      S c c}}w c c}}w c c}}w c c}w # t6        j8                  $ rU}t;        d       	 t        |dd||      }t7        j<                  |       n# t>        t@        f$ r}|d d }~ww xY wY d }~d }~ww xY w)Nr  	axis_sizer3   r6  FrK  c              3  $   K   | ]  }|d u  
 y wr2   r3   rl   out_axiss     r6   rm   z map_transpose.<locals>.<genexpr>  s     3hT	3r  zaautodiff of pmap functions with out_axes=None is not supported. Consider using shard_map instead.c              3  $   K   | ]  }|d u 
 y wr2   r3   r  s     r6   rm   z map_transpose.<locals>.<genexpr>  s     ;hXT!;r  c              3  >   K   | ]  }t        |      t        u   y wr2   rj   )rl   r   s     r6   rm   z map_transpose.<locals>.<genexpr>  s     /LAQ4/Lrn   r  c                 F    t        d t                       D              S )Nc              3  4   K   | ]  \  }}|s	|xs d   ywrG  r3   )rl   axisrA   s      r6   rm   z8map_transpose.<locals>.out_axes_thunk.<locals>.<genexpr>  s     LxtRLs   
)r}   r:   )r  
nz_arg_ctss   r6   r  z%map_transpose.<locals>.out_axes_thunk  s    L3w
+ELLLr8   r  name)r  r  r  zqInvalid nan value encountered in the backward pass of a jax.jit function. Calling the de-optimized backward pass.c                f    || S t        t        j                  d   || j                              S )Nr  )r   r   unmapped_avalrB   )zeroin_axisr   s     r6   
unmap_zeroz!map_transpose.<locals>.unmap_zero  s6    OD O##F;$7$))LMOr8   c              3     K   | ]8  \  }}t        |      t        u r	 ||      n|||n|j                  d       : y w)Nr   )rW   r   r  )rl   arg_ctr  r  s      r6   rm   z map_transpose.<locals>.<genexpr>  sM      ; ! -1LD,@Z(*fnVZZ] ;s   >A)#r:   rW   r   r   mapped_avalrB   r   r<   hashable_partialr9  r  r   r  r   r  r   r   r  r!  r,   r}   r#  r+   r  r   r{   r1  r   InternalFloatingPointErrorprint_raise_no_nan_in_deoptimizedFloatingPointErrorZeroDivisionErrorr   rY   )r%  r   r  rr  r  r   r5   r  all_argsin_tree_defrI   r   rK  r  ra  r  r  r  r  ee2arg_ctsr  r  r  s    `                    @@@r6   map_transposer    s    4	!23
5a Awo-!
$**6++>AFFK
LM 
5$ 
5 'D"~6(K
BLLj3356@%	I##C(/#z&sK8-#xY'
);'8,s7D'9 2GD!-a0  2 ,'*8R'8 +GD!1gT)  +,+ 	3(33
	,- - 
;(;	;EXE	; %/L/L*L MNM OMF;v!G'H*/33I>-z3/BD+I=?@Qt 3@BJ/y~~c;H;
;H 8:x0' 
WW	%%	%O; %($9;' 
wu
52+$  A 
	,	, 
/	 > ?/

E2tR
8a ++A.  12 D
 /
/sT   A
I"'I(I.I4=I9 9K!KJ='K=KKKKK!c                    t        |      t        u r|ft        | j                        z  }t	        | t        |      t        |            S r2   )rW   rX   rY   r  
_jvp_jaxprr}   )r   r@   rK   s      r6   	jvp_jaxprr    s>     
+$.3u#77K	E5?E+,>	??r8   c                R   t        | j                        t        |      k(  sJ t        j                  t	        j
                  |       | j                  j                  j                               }t        t        ||d      |      \  }}t        | j                  |      D cg c]  \  }}|r|j                          }}}t        t        j                   | j                  |            }	t#        j$                  ||	      \  }
}}t	        j&                  |
|       |       fS c c}}w )Nr6  F)rK   rL   )rY   in_avalsr<   r9  r   jaxpr_as_funr   r   r   f_jvp_traceablerN   r:   r   r;   r  itchainru   trace_to_jaxpr_dynamicr   )r   r@   rK   r>   r  out_nonzerosrB   rA   r}  avals_in	jaxpr_outr  literals_outs                r6   r  r    s    
U^^	H	--	-ll4$$U+#kk44GGIK!'	!e<hH% $'u'9'98#DLtR '') L- L"((5--}=>(')'@'@X($)Y			)\	2LN	BBLs   $D#c                   t        |      }t        |d |       }t        ||d        }t        ||      D cg c]'  \  }}|rt	        |      nt        j                  |      ) }	}} | ||	      \  }
}|D cg c]  }t        |      t
        u }}|D cg c]  }t        |      t
        us| }}|j                  |       t        |
      |z   S c c}}w c c}w c c}w r2   )	rY   r  rw  r:   rx  r   rS   rW   r   )r>   r   r@   primals_and_nztangentsnum_primalsr[   nonzero_tangentsr   rA   r\   r  r  r^   r  nonzero_tangents_outs                  r6   r  r  ,  s    H+'56'0>?w13!R )+d#$0F0Fq0II 3( 32+|/;<!$q'%<,<%1IT!WD5H!II++l	k	1	113 =Is   ,C6CC+Cc                   t        ||| j                  j                        }t        ||| j                  j                        }| j                  j                  j
                  d }n4t        t        ||| j                  j                  j
                              }| j                  j                  j                  d }n4t        t        ||| j                  j                  j                              }| j                  j                  j                  ||      }	| j                  j                  }
t        j                  g |
|g |
| j                  j                  | j                  j                        }t        j                  |
||| j                  j                  ||	      }t        j                   || j"                        S )N)	arg_namesresult_paths)_permr   r   r   r   r  r}   r  _replacer   ru   _renumber_effectsr"  r   Jaxprr$  r   r   )r   r9  r  r  r  
new_invarsnew_outvarsnew_arg_namesnew_result_pathsnew_debug_infor   new_effects	new_jaxprs                r6   rearrange_bindersr  9  sq   Zekk.@.@A*k<1D1DE+
[[%%-M%
K % 6 6 @ @B CM
[[((0U;#(;;#9#9#F#FH I;;))22,< 3 >.kk##)$$	J!B9!Bu{{/A/A!Bkk+ jjJU[[=M=M$n6)			)U\\	22r8   c                    t        |       }|d | ||d  }}t        || d d       }t        ||d d       }t        ||      S )Nr  )r  r*   _interleave)primal_countstangent_countslstnr[   r\   primal_groupstangent_groupss           r6   r  r  P  sT    	-!"1gs12w8'WmCR&89-hs(;<.	]N	33r8   c                    t        |       t        |      k(  sJ t        | |      D cg c]  }|D ]  }|D ]  }|   c}}}S c c}}}w r2   )rY   r:   )xsysr  lr  s        r6   r  r  X  sM    	RCG		B	=	=T	=1	=a!	=!	=!	==	=s   A
custom_linr  c                    | S r2   r3   )r  r   __s      r6   r  r  ^  s    9 r8   c                     t        d      )NzAcan't apply forward-mode autodiff (jvp) to a custom_vjp function.)	TypeError)r   r(  s     r6   raise_custom_vjp_error_on_jvpr+  a  s      	 r8   c                   t        ||g      \  }}|rt        t        |       } nt        t        |       }  |j                  g ||  }	t        t
        |	      }	t        ||	      \  }
}d g|z  |
z   S r2   )r*   r{   r   rZ   r   r   r.   )rD  r  r  r  r  r  invalsr   r   r@  	nz_cts_ins              r6   _custom_lin_transposer/  f  s|     fwi(&#q17;G#W-G3+S+7+&16:&&1,)Q
'	I	%%r8   c                    t        | j                        }|j                  d       |j                  d      j                  j                  |d<   t        j                  | j                  |      ||      S )Nr  r  )r   )r#  r   r   r   	func_namer   _pp_eqnreplace)r<  contextsettingsr   s       r6   _custom_lin_pp_ruler6  t  sX    

&**[**U#..88&-	ckkk0'8	DDr8   c                       e Zd Z fdZ xZS )CustomJVPExceptionc                (    d}t         |   |       y )Na_  Detected differentiation of a custom_jvp function with respect to a closed-over value. That isn't supported because the custom JVP rule only specifies how to differentiate the custom_jvp function with respect to explicit input parameters. Try passing the closed-over value into the custom_jvp function as an argument, and adapting the custom_jvp rule.r  r   r   r  r  s     r6   r   zCustomJVPException.__init__~  s    +C 
GSr8   r  r  r  r   r  r  s   @r6   r8  r8  }       r8   r8  c                       e Zd Z fdZ xZS )CustomVJPExceptionc                (    d}t         |   |       y )Nal  Detected differentiation of a custom_vjp function with respect to a closed-over value. That isn't supported because the custom VJP rule only specifies how to differentiate the custom_vjp function with respect to explicit input parameters. Try passing the closed-over value into the custom_vjp function as an argument, and adapting the custom_vjp fwd and bwd rules.r:  r;  s     r6   r   zCustomVJPException.__init__  s    8C 
GSr8   r<  r  s   @r6   r?  r?    r=  r8   r?  reducing_transposesc           
        t        |t        j                        r|j                  |j                  }}nd}t        |||f      \  }}t        j                  t        j                  t        |j                        |d      }	t        |	|      \  }	}
t        j                  |       }|r5 ||t        t        |      |D cg c]  }t!        |      t"        u c}      } | j$                  |	g|i |}t'         |
       |      S c c}w )Nr3   r6  F)rQ   r   r   r   r   r   r<   r  r9  r  r   r   r  r   r{   r  rW   r   r1  r   )r%  r   r  rr  r  r   r   r  
in_treedefrI   r   r  r5   r  s                 r6   call_transposerD    s    
D,,-#)):+<+<JF%vtR&89(J
ll=Z-B-BC%	# 'sJ7-#x/33I>-63':D#A9;<ADG4/<>FY^^C5(5f5(	
H	-- =s   =D)r>   re  r?   z%tuple[core.AbstractValue, ...] | Noner@   z
list[bool]r   re  )FTT)rI   re  r   r   )r>   r   )
r   r   r   zlu.Storer   core.TraceTagr   Sequence[bool]r   zcore.DebugInfo)r>   r   r]   rE  )FT)
r   core.ClosedJaxprr@   rF  rK   bool | Sequence[bool]r   rH  r   Ttuple[core.ClosedJaxpr, int, Sequence[bool], Sequence[int | None], core.ClosedJaxpr])
r   rG  r@   tuple[bool, ...]rK   rJ  r   rJ  r   rI  )r   re  )r   
core.JaxprrL   rX   r   Sequence[Array]r9  z!Sequence[Array | Ref | GradAccum]r:  rL  r   rS  )rL   rX   )r   rG  )rm  rj  rn  rF  )
rN   re  r2  rX   r@   rF  rs  rX   rr  rX   )r%  rj  r  rK  )r   rG  r@   rF  rK   rH  r   z#tuple[core.ClosedJaxpr, list[bool]])r   rG  r@   rF  rK   rF  )r  Sequence[int]r  rM  r  Sequence[Any]r   rN  )r  re  )r<  zcore.JaxprEqnr4  zcore.JaxprPpContextr5  zcore.JaxprPpSettingsr   zcore.pp.Doc)r  rK  )
__future__r   collections.abcr   r   rU   r  	itertoolsr  r   typingr   jax._srcr   r	   r
   r<   jax._src.interpretersr   ru   jax._src.tree_utilr   r   r   r   r   r  r   r   jax._src.ad_utilr   r   r   r   r   r   r   jax._src.api_utilr   r   r   jax._src.corer   r   r   r    r!   r"   r#   jax._src.dtypesr$   r%   jax._src.state.typesr&   jax._src.utilr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   ArrayRefr:   r{   r7   rD   rN   transformation2rF   transformation_with_aux2r   rG   rH   r   reset_name_stackr   r   r   r   r   r  r  rE  r0  r  r)  r,  r[  rl  r6  rU  ru  r{  r}  r  r  r  r   r   r   r  r  r  r  rw   r[  r,  r)  r:  rx   r  r  r*  r  r  r  r  r  r  r  r  r  rb  r  r  r  r  rZ   r   r  r  r  r  r  r  r  r  r  r  r  r  def_abstract_evalr2  r+  def_implr/  r6  pp_eqn_rules	Exceptionr8  r?  rA  rD  r3   r8   r6   <module>re     s   # .        & 4A A %  %M M + K K# # # ) ,@ @ @ 		 2242 2 	2 8<: : # # $-$#1$ $L   	# 	# */(,	--- '- &	-
 Z- """$;G;G;G ";G !	;G
 Z;G % ;GzD #,:\H8+ +$ _+:<.GG(,GG)JG #G (,GRM y :y  
'!	 !
 46 0 52  R@u R@h-#$ #$J7$ 79 3 8@B = B@B = BsU sl  	-'5	-K6)-K6!/K6 48K6 SWK6Z %f  %J 35/ 479 4 9=? 9 ?N8/O6I`J
`O;& =1 2  ,. !((<f E  4
 (> ## $  >(>B@0@6@ C'C6DC C 
2 
23.44!.4>
  .t~~l;n ;   D E $    3 4&,& &; \ "E"6E;FE #6  , 	 		 	 79 3 8.r8   