
    Vpf                       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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mZmZmZm Z m!Z! d dlm"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: e5Z;e4Z<d Z=didZ>	 	 djdkdZ?ej@        d              ZAej@        d!             ZBejC        d"             ZDd# ZEdld$ZFd% ZGd& ZHd' ZIdmd*ZJdnd,ZK G d- d.          ZLd/ ZM eeLd0 d1            d2 ZNejC        d3             ZO G d4 d5e(          ZP G d6 d7e)          ZQd8 ZRi ZSd9eTd:<   i ZUd9eTd;<   i ZVd9eTd<<   i ZWd9eTd=<   i ZXd9eTd><   d? ZYd@ ZZdA Z[dB Z\dC Z]dD Z^dE Z_dF Z`dG ZadH ZbdI ZcdJ ZddK ZedL Zf e\e#dM            dN ZgejC        dO             ZhdP Zi e	eie+          eWej+        <   dQ ZjejeWejk        <   ejC        dR             ZldS ZmdodYZne9dZ             ZoejC        d[             Zpdnd\Zqd] Zrd^ Zs ej,        d_          Ztd`eTda<   etu                    db            det_v        dc Zwetx                    ew           dd ZyeyeWet<    G de dfez          Z{ G dg dhez          Z|dS )p    )annotations)CallableSequenceN)partial)Any)config)linear_util)partial_eval)tree_flattentree_unflattenregister_pytree_nodePartial)core)source_info_util)add_jaxvalsreplace_internal_symbolic_zeroszeros_like_jaxval"replace_rule_output_symbolic_zerosZerozeros_like_aval)zeros_like_padd_jaxvals_p)flatten_funflatten_fun_nokwargs)TraceTracerget_avalcall_p	PrimitiveLiteralraise_to_shaped)dtypefloat0)unzip2safe_mapsafe_zip
split_list	wrap_nameas_hashable_functionweakref_lru_cachepartition_listc                    | S N xs    X/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/interpreters/ad.pyidentityr2   /   s        flu.WrappedFun	orig_type2tuple[tuple[core.AbstractValue, bool], ...] | Noneexplicit_nonzeros
list[bool]returnc                    || S t          |          t          d |D                       k    sJ d |D             }d t          ||          D             }t          j        | g ||R           S )Nc              3      K   | ]	\  }}|V  
d S r-   r.   ).0_explicits      r1   	<genexpr>z%_update_annotation.<locals>.<genexpr>9   s&      &M&MKAxx&M&M&M&M&M&Mr3   c                    g | ]	\  }}||
S r.   r.   )r=   avalr?   s      r1   
<listcomp>z&_update_annotation.<locals>.<listcomp><   s!    EEE^T8HEDEEEr3   c                D    g | ]\  }}||                                 d fS )T)at_least_vspace)r=   nzrB   s      r1   rC   z&_update_annotation.<locals>.<listcomp>=   sH     M M M2tM$$&&- M M Mr3   )lensumzipluannotate)r4   r6   r8   explicit_avals	tan_typess        r1   _update_annotationrN   1   s    
 H			3&M&M9&M&M&M#M#M	M	M	M	M FEyEEE.M M"#4nEEM M M)	Q0)0i00	1	11r3   FTfunr   c                    |st          t          |           ||          S t          |           \  } }t          | ||          |fS r-   )jvpfunjvp_subtracejvp_subtrace_aux)rO   has_auxinstantiatetransform_stackauxs        r1   jvprX   A   sL    	 :,s##[/BBB$$HC#{O44c99r3   c              #    K   d |D             }|rt          j        d          nt          j                    }t	          j        t                    5 }|5  |||fi fV \  }}~d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          |           t          u r| gt          |          z  } d t          ||           D             }||fV  d S )Nc                    g | ]E}t          |t                    s,t          |          t          k    rt          j        |          n|FS r.   )
isinstancer   r"   r#   
from_valuer=   ts     r1   rC   zjvpfun.<locals>.<listcomp>L   s]     ? ? ?01 )31d(;(; ,((f$$ oa   *+? ? ?r3   rX   c                :    g | ]\  }}|rt          |          n|S r.   )instantiate_zeros)r=   r^   insts      r1   rC   zjvpfun.<locals>.<listcomp>U   s;     5 5 5'!T$5#A&&&A 5 5 5r3   )r   transform_name_stack
contextlibnullcontextr   new_mainJVPTracetypeboolrG   rI   )rU   rV   primalstangentsctxmainout_primalsout_tangentss           r1   rQ   rQ   J   s     ? ?5=? ? ?(9H 
'		.u	5	5	5$&& }X $  '+Wh&?&C C CK                              
+$-#l"3"33K5 5{335 5 5,\!!!!!!s6   BA."B.A2	2B5A2	6BB	B	c              #    K   t          | t          j                              t          |          t          |          z   D ]^}t	          |t
                    rG|j        j        j        k    rt          j        |d| d           |j        j        j        k     sJ _fdt          ||          D             }|i fV }t          j        |          }t          d |D                       V  d S )NzTracer from a higher level: z
 in trace c                h    g | ].\  }}t          |          t          urt          ||          n|/S r.   )rg   r   	JVPTracer)r=   r0   r^   traces      r1   rC   z jvp_subtrace.<locals>.<listcomp>b   sN     4 4 4Aq +/q''*=*=	%A&&&1 4 4 4r3   c                *    g | ]}|j         |j        fS r.   primaltangent)r=   
out_tracers     r1   rC   z jvp_subtrace.<locals>.<listcomp>f   s3     / / / "J$67 / / /r3   )rf   r   cur_sublevellistr[   r   _tracelevelescaped_tracer_errorrI   map
full_raiser$   )rl   ri   rj   r0   
in_tracersansout_tracersrr   s          @r1   rR   rR   Y   s=     
4*,,
-
-%==4>>) * *a!V *	
5;	&	&'BaBB5BBD D 	DX^ek))))4 4 4 4224 4 4*"n#E$c**+ / /"-/ / / 	0 	0 0 0 0 0 0r3   c              #    
K   t          | t          j                              
t          |          t          |          z   D ].}t	          |t
                    r|j        j        
j        k     sJ /t          t          t          
          ||          i fV \  }}t          
j        |          }t          d |D                       \  }}
fd|D             }	||f|	fV  d S )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z#jvp_subtrace_aux.<locals>.<genexpr>q   s+      $P$Pqah	%:$P$P$P$P$P$Pr3   c                    g | ]G}t          |t                    r.|j        j        j        k    rt	          j        |j                  n|HS r.   )r[   rq   rz   r{   r   
full_lowerru   )r=   r0   rr   s     r1   rC   z$jvp_subtrace_aux.<locals>.<listcomp>r   s`     & & & q),,125;1N1N ***& & &r3   )rf   r   rx   ry   r[   r   rz   r{   r}   r   rq   r~   r$   )rl   ri   rj   r0   r   rW   ans_tracersrm   rn   aux_primalsrr   s             @r1   rS   rS   i   s     
4*,,
-
-%==4>>) * *a!V *X^ek))))wy%00'8DDbHHH(#sE$c**+$$P$PK$P$P$PPP+|& & & &!$& & &+ 
l#[000000r3   c                   |                     dd          }|st          |           }nt          | d          \  }}t          d |D                       t          d |D                       z   }t          ||fi f          \  }}t	          ||          \  }	}
t          j        |	|          \  }}}t           |
            |          \  }}t          d |D                       sJ d |D             }|s||||fS |||| |            fS )	NrT   FT)rT   c              3  T   K   | ]#}t           j                            |          V  $d S r-   )pe
PartialValknownr=   ps     r1   r@   zlinearize.<locals>.<genexpr>   s2      <<qBM''**<<<<<<r3   c              3     K   | ]B}t           j                            t          |                                                    V  Cd S r-   )r   r   unknownr   rE   r   s     r1   r@   zlinearize.<locals>.<genexpr>   sX       ( ( m++HQKK,G,G,I,IJJ ( ( ( ( ( (r3   c              3  >   K   | ]}|                                 V  d S r-   is_known)r=   out_primal_pvals     r1   r@   zlinearize.<locals>.<genexpr>   s.      QQO_%%''QQQQQQr3   c                6    g | ]}|                                 S r.   )	get_known)r=   pvals     r1   rC   zlinearize.<locals>.<listcomp>   s"    GGGT((GGGr3   )	poprX   tupler   r   r   trace_to_jaxpr_nounitsr   all)	traceableri   kwargsrT   rQ   rW   in_pvalsr>   in_treejvpfun_flatout_treejaxpr	out_pvalsconstsout_primals_pvalsout_tangents_pvalsout_primals_constss                    r1   	linearizer   x   sZ   JJy%(('	 /^^FFi...KFC<<G<<<<< ( (&( ( ( ( ((( gw/455*!W%fg66+x6{HMM%F*8Y*O*O''	QQ?PQQQ	Q	QQQQGG5FGGG	 H15&@@15&##%%GGr3   c                    |st          | g|R  \  }}}}nt          | g|R ddi\  }}}}}d }t          t          |||          |          }	|s||	fS ||	|fS )NrT   Tc                    t          d t          ||           D                       }d |j        D             }t          |d|||          }t	          t
          |          S )Nc              3  H   K   | ]\  }}|                                 |V  d S r-   r   )r=   ctr   s      r1   r@   z+vjp.<locals>.unbound_vjp.<locals>.<genexpr>   s3      JJxr4$--//JJJJJJJr3   c                6    g | ]}t          |j                  S r.   )UndefinedPrimalrB   r=   vs     r1   rC   z,vjp.<locals>.unbound_vjp.<locals>.<listcomp>   s"    @@@a/!&))@@@r3   T)r   rI   invarsbackward_passr}   r`   )pvalsr   r   cts
dummy_argsarg_ctss         r1   unbound_vjpzvjp.<locals>.unbound_vjp   sa    
JJ3sE??JJJ
J
JC@@5<@@@JE4SAAG '***r3   )r   r   r   )
r   ri   rT   rm   r   r   r   rW   r   vjp_s
             r1   vjpr      s    	 Z(1)(Fg(F(F(F%Kvv-6y-Y7-Y-Y-YTX-Y-Y*Kvs+ + + '+ue44f
=
=$	 "c!!r3   c                D    | \  }}|\  }}|d |fd |ffS |\  }}||f||ffS r-   r.   )r   rB   constconst_1const_2aval_1aval_2s          r1   unpair_pvalr      sK    +$'7	\'?T7O++NFFGvw///r3   c                T    t          |          t          k    rt          |           S |S r-   )r"   r#   r   rt   s     r1   replace_float0sr      s&    
7^^vV$$$Nr3   c                    t          j        t          |                     t          k    r.t	          t          |                                                     S |S r-   )r   primal_dtype_to_tangent_dtyper"   r#   r   r   rE   rt   s     r1   recast_to_float0r      sE    	'f66&@@  0022333Nr3   r   
core.Jaxprc                   t          d |D                       r| j        st          d | j                  S fd}fd}fd}fd}i t          || j        |           t          || j        |           i |rt          j        d          nt          j                    }	|	5  t          t          |d          | j
        |           | j        d d d	         D ]}
t          ||
j                  }|
j        j        rt          ||
j
                  }nt          ||
j
                  \  }t          j                    |
j        j        z   }t          j        |
j        j        |
          5  |
j        j        5  |
j        j        s|
j        j        r\d |
j
        D             }t/          |
j                  }|                    d          } t5          |
j                  |||||          }nR|
j        t6          v r!t7          |
j                 |g|R i |
j        }n# t5          |
j                  |g|R i |
j        }|t8          u rd |
j        D             n|}t          t          ||
j                  |
j        |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   	 d d d            n# 1 swxY w Y   t          || j                  }|S )Nc              3  B   K   | ]}t          |          t          u V  d S r-   rg   r   )r=   r   s     r1   r@   z backward_pass.<locals>.<genexpr>   s-      22bbT	222222r3   c                *    t          | j                  S r-   r   rB   )r   s    r1   <lambda>zbackward_pass.<locals>.<lambda>   s    af r3   c                    |t           usJ | |j        f            |t          |          t          u rd S t          |          t           u rd S |v rt	          |         |          n||<   d S r-   )r   rB   rg   r    add_tangents)primr   r   ct_envs      r1   write_cotangentz&backward_pass.<locals>.write_cotangent   sv    T>>>D!&>>>>	zT!WW''fBxx4 f/0F{{VAY+++F1IIIr3   c                x                         | t          | j                                                            S r-   )r   r   rB   rE   )r   r   s    r1   read_cotangentz%backward_pass.<locals>.read_cotangent   s-    ::aaf446677888r3   c                4   t          |           t          u r| j        S | j        }t          |          t          j        u r6fd|j        D             }|                    t          |                    }	                    | t          |                    S )Nc                Z    g | ]'}t          |          t          j        u r|         n|(S r.   )rg   r   Var)r=   d
primal_envs     r1   rC   z6backward_pass.<locals>.read_primal.<locals>.<listcomp>   s3    NNN$q''TX"5"5A1NNNr3   shape)rg   r    valrB   r   DShapedArrayr   updater   getr   )r   ar   r   s      r1   read_primalz"backward_pass.<locals>.read_primal   s    Aww'Ul
&a	aD%	%	%NNNNagNNNHH5<<H((^^Aq11222r3   c                4    t          |          s|| <   d S d S r-   is_undefined_primal)r   r   r   s     r1   write_primalz#backward_pass.<locals>.write_primal   s*    s## jmmm r3   	transposeoutvars)
name_stackc                    g | ]	}|j         
S r.   rB   r   s     r1   rC   z!backward_pass.<locals>.<listcomp>   s    666Q!&666r3   
call_jaxprc                6    g | ]}t          |j                  S r.   r   r   s     r1   rC   z!backward_pass.<locals>.<listcomp>   s     444A4<<444r3   )r   effectsr}   r   	constvarsr   rb   rc   rd   r   r   eqns	primitivemultiple_resultscurrent_name_stacksource_infor   user_context	tracebackrk   managercall_primitivemap_primitivedictparamsr   get_primitive_transposereducing_transposesr   )r   rV   r   
primals_incotangents_inr   r   r   r   rk   eqninvalscts_inr   cts_in_avalsr   r   cts_outcotangents_outr   r   s                      @@r1   r   r      se   22M22222 55= 5%%u|444	C 	C 	C 	C 	C 9 9 9 9 93 3 3 3 3      "*lEOV,,, lEL*---&?N 
'		.{	;	;	;$&& 
 J J++U]MJJJz$$B$ J J;
++f		' 3^S[11nck22#6883?;UUj(
/
#
< < < J J=@W_J J=' 	-3=+F 	-66#+666,
##&zz,//*:+CM::j&&,@ @'']111'6-- - -!$- -'' ;+CM::-- - -!$- -'8?4444444WGOS]33SZIII!J J J J J J J J J J J J J J J J J J J J J J J J J J J J J JJJ J J J J J J J J J J J J J J6 ~u|44.	s\   (CK.J*;DJ	J*JJ*JJ*K*J..K1J.2KKKcore.ClosedJaxprc                <    t          | j        || j        ||          S r-   )r   r   r   )r   rV   r   r   s       r1   closed_backward_passr    s#    	u{OU\!=
2 
2 2r3   c                       e Zd ZdgZd Zd ZdS )r   rB   c                    || _         d S r-   r   )selfrB   s     r1   __init__zUndefinedPrimal.__init__  s    DIIIr3   c                    d| j          dS )NzUndefinedPrimal()r   r
  s    r1   __repr__zUndefinedPrimal.__repr__  s    *di****r3   N)__name__
__module____qualname__	__slots__r  r  r.   r3   r1   r   r     s9        h)  + + + + +r3   r   c                .    t          |           t          u S r-   )rg   r   r/   s    r1   r   r     s    	aO	##r3   c                    d| j         fS )Nr.   r   )zs    r1   r   r     s    AF| r3   c                     t          |           S r-   )r   )rB   r>   s     r1   r   r     s    _T%:%: r3   c                    	 t           |          S # t          $ r(}t          d                    |                     |d }~ww xY w)NzJTranspose rule (for reverse-mode differentiation) for '{}' not implemented)primitive_transposesKeyErrorNotImplementedErrorformat)r   errs     r1   r   r     sV    .""	 . . .
	 &))% %*-..s    
A#<Ac               /  @   K   | |fV x}\  }}|d |D             fV  d S )Nc                :    g | ]}t          |          t          uS r.   r   r=   rs     r1   rC   z+nonzero_tangent_outputs.<locals>.<listcomp>%  #    <<<!$q''%<<<r3   r.   )argsr   resultsr>   tangents_outs        r1   nonzero_tangent_outputsr&  "  sE      &*Fl 2 22'Q<<|<<<<<<<<<r3   c                  ^    e Zd Zd Zd Zd Zd Zd Zd ZeZ	eZ
d Zd Zd	 Zd
 Zd Zd ZdS )rf   c                    t          t          |                                                    }t          | ||          S r-   r   r   rE   rq   r
  r   tangent_zeros      r1   purezJVPTrace.pure*  3    557788LT3---r3   c                    t          t          |                                                    }t          | ||          S r-   r)  r*  s      r1   liftzJVPTrace.lift.  r-  r3   c                8    t          | |j        |j                  S r-   )rq   ru   rv   )r
  r   s     r1   subliftzJVPTrace.sublift2  s    T3:s{333r3   c                     t          d |D                       \  }}t                              |          }|sd| d}t          |           |||fi |\  }}	|j        r fdt          ||	          D             S t           ||	          S )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z-JVPTrace.process_primitive.<locals>.<genexpr>6  +      $L$Lqah	%:$L$L$L$L$L$Lr3   zDifferentiation rule for 'z' not implementedc                8    g | ]\  }}t          ||          S r.   rq   )r=   r0   r^   r
  s      r1   rC   z.JVPTrace.process_primitive.<locals>.<listcomp>=  s)    MMM1ia##MMMr3   )r$   primitive_jvpsr   r  r   rI   rq   )
r
  r   tracersr   r   tangents_inrX   msg
primal_outtangent_outs
   `         r1   process_primitivezJVPTrace.process_primitive5  s    $$L$LG$L$L$LLLJ


Y
'
'C %EEEEc$$$!c*kDDVDDJ! 6MMMMJ0L0LMMMMtZ555r3   c                L    |j         sJ t          d |D                       \  }}d |D             }d |D             }t          ||f          \  }}	t          | j                  }
t          |
          \  }
t          |t          j                  r]|d         }d t          ||          D             }|d         t                    fd            }t          |g ||R |	          }t          |
|	          \  }
}t                              |          }|r |||          n|} |j        t!          |
|j        |          g|R i |}t%           |            |          \  }}d
 t          ||          D             } fdt          ||          D             S )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z(JVPTrace.process_call.<locals>.<genexpr>C  s+      FF!)4FFFFFFr3   c                :    g | ]}t          |          t          uS r.   r   r]   s     r1   rC   z)JVPTrace.process_call.<locals>.<listcomp>D  s#    EEEqT!WWD(EEEr3   c                B    g | ]}t          |          t          ur|nd S r-   r   r]   s     r1   rC   z)JVPTrace.process_call.<locals>.<listcomp>E  s,    EEEqT!WWD((dEEEr3   in_axesc                    g | ]	\  }}||
S r.   r.   r=   axrF   s      r1   rC   z)JVPTrace.process_call.<locals>.<listcomp>K  s!    GGGBBGGGGr3   out_axes_thunkclosurec                 f                 } g | d t          |                        D             R S )Nc              3  $   K   | ]\  }}||V  d S r-   r.   rD  s      r1   r@   zDJVPTrace.process_call.<locals>.new_out_axes_thunk.<locals>.<genexpr>R  s+      NN&"b2N2NNNNNNr3   rI   )out_axrF  which_nz_outs    r1   new_out_axes_thunkz1JVPTrace.process_call.<locals>.new_out_axes_thunkO  sB    !!OONNC,G,GNNNOOOr3   )rB  rF  c                x    g | ]7\  }}|.t          t          |                                                    n|8S r-   r   r   rE   r=   r   r^   s      r1   rC   z)JVPTrace.process_call.<locals>.<listcomp>[  sO     = = =q! ;<)43355666 = = =r3   c                8    g | ]\  }}t          ||          S r.   r6  )r=   r   r^   r
  s      r1   rC   z)JVPTrace.process_call.<locals>.<listcomp>]  s)    KKKdaIdAq!!KKKr3   )r   r$   r   rR   rl   r&  r[   r   MapPrimitiverI   r)   r   r   call_param_updatersr   bindrN   in_typer   )r
  r   r4   r8  r   ri   rj   which_nzr#  r   f_jvprB  tangent_in_axesrN  r   update_params
new_paramsresultr;  r<  rF  rM  s   `                   @@r1   process_callzJVPTrace.process_callA  s(   ****FFgFFFFFGXEEHEEEHEEHEEEH '8!455MD'DI&&E1%88E<.$"344 7y!gGG#gx*@*@GGGo./n N333P P P P P 43P F$@g$@$@$@#57 7 7fw//OE8'++N;;M4AMvx000vJ ^ !3E19h!O!O 6"&6 6 6*46 6F,XXZZ@@J= =":{;;= = =KKKKKc*k.J.JKKKKr3   c                   	
 t          d |D                       \  }}t          ||f          \  }d |D             
~~| j        		fd}|j        r	
fd}||f}||fS )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z-JVPTrace.post_process_call.<locals>.<genexpr>`  s+      JJ!)4JJJJJJr3   c                :    g | ]}t          |          t          uS r.   r   r]   s     r1   rC   z.JVPTrace.post_process_call.<locals>.<listcomp>b  s#    9991477$&999r3   c                    t          |           \  }}t          t          j                              }t	          t          t          |          ||          S r-   )r   rf   r   rx   r}   r   rq   )r0   ri   rj   rr   rl   treedefs       r1   todoz(JVPTrace.post_process_call.<locals>.todoe  sK    (!44gxtT.0011eE**GX>>>r3   c                B    g | d t          |           D             R S )Nc              3  $   K   | ]\  }}||V  d S r-   r.   rD  s      r1   r@   zIJVPTrace.post_process_call.<locals>.out_axes_transform.<locals>.<genexpr>k  s+      OOFBBOROOOOOOr3   rK  )out_axestangents_nzs    r1   out_axes_transformz6JVPTrace.post_process_call.<locals>.out_axes_transformj  s/    PPOOc(K.H.HOOOPPPr3   )r$   r   rl   r   )r
  r   r   r   ri   rj   outrc  rh  rl   rg  rb  s            @@@r1   post_process_callzJVPTrace.post_process_call_  s    JJkJJJJJGX( 344LC99999K9D? ? ? ? ? ? # (Q Q Q Q Q&'d9r3   c                  t          d |D                       \  }}t          t          j        |          }|s,t          t          |          }t          t
          ||          }nt          t          |          } |j        t          j	        ||           }t          |t          |          dz  g          \  }	}
t          t          |
          }
t          t          |	|
          }
t          t          t          |           |	|
          S )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z3JVPTrace.process_custom_jvp_call.<locals>.<genexpr>v  r4  r3      )r$   r}   r   r   r`   r   r   call_wrappeditchainr'   rG   r   r   r   rq   )r
  r>   __rX  r8  symbolic_zerosr   r9  outsprimals_outr%  s              r1   process_custom_jvp_callz JVPTrace.process_custom_jvp_callu  s    $$L$LG$L$L$LLLJT_j11J F);77k[AAkk7EEk5rx
K@@AD *4#d))q.1A B BK9<HHL'lCCLwy$''lCCCr3   c                    t                      r-   )CustomJVPExceptionr
  r   r>   s      r1   post_process_custom_jvp_callz%JVPTrace.post_process_custom_jvp_call      


r3   c                6   t          d |D                       \  }}	d t          ||	          D             }
d |
D             }
 |j        |
 } |            \  }}t          ||j        g          \  }}d |D             }t          t          |	          }	t          j        g ||	R |j        |||d}t          t          j
        j        j        j        j        ||          }t          t          ||          }t          t          t          |           ||          S )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z3JVPTrace.process_custom_vjp_call.<locals>.<genexpr>  r4  r3   c                h    g | ]/\  }}t          j        |          t          |          t          uf0S r.   )r   r   rg   r   rQ  s      r1   rC   z4JVPTrace.process_custom_vjp_call.<locals>.<listcomp>  sF     8 8 8!Q q!!477$#67 8 8 8r3   c                    g | ]	}|D ]}|
S r.   r.   )r=   pairr0   s      r1   rC   z4JVPTrace.process_custom_vjp_call.<locals>.<listcomp>  s%    111DD11qa1111r3   c                P    g | ]#}t          t          j        |                    $S r.   )r!   r   r   r=   r0   s     r1   rC   z4JVPTrace.process_custom_vjp_call.<locals>.<listcomp>  s*    HHHqq!1!122HHHr3   )num_resbwd	out_avalsrr  )r$   rI   rn  r'   
num_leavesr}   r`   custom_lin_prU  jax_srclaxtie_pr   r   rq   )r
  r>   rq  fwdr  r8  	out_treesrr  r   r9  fwd_inres_and_primals_outres_treeresrt  	avals_outr%  s                    r1   process_custom_vjp_callz JVPTrace.process_custom_vjp_call  sG   $$L$LG$L$L$LLLJ8 8j+668 8 8F11F111F*#*F3)++KAx!"58K7LMMCHHKHHHI'55K$ <	<< <$,$7SN< < <L sx|'-2KNNL'lCCLwy$''lCCCr3   c                    t                      r-   )CustomVJPExceptionrx  s      r1   post_process_custom_vjp_callz%JVPTrace.post_process_custom_vjp_call  rz  r3   c                   t          d |D                       \  }}t          ||d         j        g          \  }}t          ||d         j        g          \  }	}
t          d |	D                       rt	          d           |j        |g|R i |}t          t          |
          }
 |j        |g||
R i |}t          t          t          |           ||          S )Nc              3  2   K   | ]}|j         |j        fV  d S r-   rt   r]   s     r1   r@   z4JVPTrace.process_custom_transpose.<locals>.<genexpr>  s+      AAA18QY/AAAAAAr3   r  c              3  B   K   | ]}t          |          t          uV  d S r-   r   r]   s     r1   r@   z4JVPTrace.process_custom_transpose.<locals>.<genexpr>  s-      
2
21477$
2
2
2
2
2
2r3   zCJVP of custom transpose with respect to non-symbolic-zero residuals)
r$   r'   r  anyr  rU  r}   r`   r   rq   )r
  r   callr8  r   ps_ints_in	res_ps_in	lin_ps_in	res_ts_in	lin_ts_inps_outts_outs                r1   process_custom_transposez!JVPTrace.process_custom_transpose  s   AAAAAAALE5%efZ.@.K-LMMIy%efZ.@.K-LMMIy$ 
2
2	
2
2
222 OMO O O TYt.e...v..F%y11ITYt>i>)>>>v>>Fwy$''888r3   c                    t          |          t          u t          |          t          u }}||k    r||fS |r|s|t          |          fS |r|st          |          |fS t          ||f          r-   )rg   r   r   	TypeError)r
  xtytxzyzs        r1   joinzJVPTrace.join  s    "XXtBxx4/B	RxxVm	  B  "2&&&&	  B  r""B&&r2hr3   N)r  r  r  r,  r/  r1  r=  r]  rj  process_mappost_process_mapru  ry  r  r  r  r  r.   r3   r1   rf   rf   (  s        . . .. . .4 4 4
6 
6 
6L L L<  & +&D D D  D D D&  9 9 9@	  	  	  	  	 r3   rf   c                  8    e Zd ZddgZd Zed             Zd ZdS )rq   ru   rv   c                r    t           j        j        rt          ||           || _        || _        || _        d S r-   )r   enable_checksvalue_primal_tangent_shapes_matchrz   ru   rv   )r
  rr   ru   rv   s       r1   r  zJVPTracer.__init__  s9    ! 4"67333DKDKDLLLr3   c                *    t          | j                  S r-   )r   ru   r  s    r1   rB   zJVPTracer.aval  s     DK   r3   c                n    t          | j                  t          u rt          j        | j                  S | S r-   )rg   rv   r   r   r   ru   r  s    r1   r   zJVPTracer.full_lower  s.    DLT!!_T[)))kr3   N)r  r  r  r  r  propertyrB   r   r.   r3   r1   rq   rq     sW        #)   ! ! 8!    r3   rq   c                Z   t          |          t          urt          t          |           d          }t          t          |          d          }t	          j        |j        |j                  sJ t	          j        |j                  }||j        k    sJ ||j        f            d S d S )NF)	weak_type)	rg   r   r!   r   r   definitely_equal_shaper   r   r"   )ru   rv   primal_avaltangent_avalexpected_tangent_dtypes        r1   r  r    s    	']]$!(6"2"2eDDDK"8G#4#4FFFL&{'8,:LMMMMM!?@QRR!\%7777:PR^Rd9e777 
 87r3   zdict[core.Primitive, Callable]rT  call_transpose_param_updatersr7  r  r   c                z    t          t          |           t          | <   t          t          |          t          | <   d S r-   )r   
linear_jvpr7  linear_transposer  r   transpose_rules     r1   	deflinearr    s2    %j)<<.$+,<n$M$My!!!r3   c                    | j         |i |}t          d |D                       r9| j        r|t          t          j        |          fS |t	          j        |          fS t          t          |          }| | j         |i |fS )Nc              3  B   K   | ]}t          |          t          u V  d S r-   r   )r=   rv   s     r1   r@   zlinear_jvp.<locals>.<genexpr>  s-      777g$	777777r3   )rU  r   r   r}   r   r\   r`   )r   ri   rj   r   val_outs        r1   r  r    s    ING.v..'77h77777 8! 4c$/73333DOG,,,,$h//HNINH77777r3   c                N    t          |          t          u rt          n | |fi |S r-   r   r  	cotangentr#  r   s       r1   r  r     s.    iD((nnY.Q.Q&.Q.QQr3   c                z    t          t          |           t          | <   t          t          |          t          | <   d S r-   )r   r  r7  linear_transpose2r  r  s     r1   
deflinear2r    s2    %j)<<.$+,=~$N$Ny!!!r3   c                T    t          |          t          u rt          n | |g|R i |S r-   r   r  s       r1   r  r    s7    iD((nnY.X.X.X.XQW.X.XXr3   c                    t          | t                    sJ | j        rJ t          t          ||           t
          | <   d S r-   )r[   r   r   r   standard_jvpr7  r   jvpruless     r1   defjvpr    sC    	Iy	)	))))''''%lHiHH.r3   c                     |j         i }fdt          | |          D             }|t          j        t          |t          j        |                    fS )Nc                ^    g | ])\  }}|t          |          t          u ||gR i *S r-   r   )r=   ruler^   r   ri   s      r1   rC   z standard_jvp.<locals>.<listcomp>  sV     ? ? ?'$%$q''*=*= $q-7---f--*=*=*=r3   )rU  rI   	functoolsreducer   r   r\   )r  r   ri   rj   r   r  r%  s     ` `  r1   r  r    st    ING.v..'? ? ? ? ?S8=T=T ? ? ?,	)"<tw?W?WXX	XXr3   c                    t          | t                    sJ | j        rJ t          t          ||           t
          | <   d S r-   )r[   r   r   r   standard_jvp2r7  r  s     r1   defjvp2r    sC    	Iy	)	))))''''%mXyII.r3   c                     |j         i fdt          | |          D             }t          |          }t          j        t
          |t          j                            fS )Nc              3  h   K   | ],\  }}|t          |          t          u ||gR i V  -d S r-   r   )r=   r  r^   r   ri   r  s      r1   r@   z standard_jvp2.<locals>.<genexpr>  sd       ? ?74%$q''*=*= $q'6G666v66*=*=*=*=? ?r3   )rU  rI   ry   r  r  r   r   r\   )r  r   ri   rj   r   r%  r  s     ` ` @r1   r  r    s    ING.v..'? ? ? ? ? ?c(T\F]F] ? ? ?,l##,	)"<tw?W?WXX	XXr3   c                    t          |           t          u r|S t          |          t          u r| S t          | |          S r-   )rg   r   r   )r0   ys     r1   r   r   $  s:    	!WW__HAww$Hq!r3   c                     t           t                    sJ  fd} fd}t           ||           t          t          ||          t
           <   d S )Nc                "     j         | |fi |S r-   rU  gr0   r  r   r   s       r1   r   zdefbilinear.<locals>.<lambda>.      idi1&?&?&?&? r3   c                "     j         || fi |S r-   r  r  s       r1   r   zdefbilinear.<locals>.<lambda>/  r  r3   )r[   r   r  r   bilinear_transposer  )r   lhs_rulerhs_rulelhs_jvprhs_jvps   `    r1   defbilinearr  ,  se    	D)	$	$$$$????'????'w   &'98XNNtr3   c                   t          |          t          |          z  sJ t          |          t          u rt          S t          |          r | |||fi |}|t          u rt          n|d fS  ||||fi |}|t          u rt          nd |fS r-   )r   rg   r   )r  r  r  r0   r  r   ri  s          r1   r  r  3  s    	Q		"5a"8"8	8888	)__K 0
(9a
-
-f
-
-C$;;44S$K/
(9a
-
-f
-
-C$;;44T3K/r3   c                n    t          | t                    sJ t          t          |           t          | <   d S r-   )r[   r   r   zero_jvpr7  )r   s    r1   defjvp_zeror  ?  s2    	Iy	)	))))%h	::.r3   c                H     | j         |i |}|t          j        |          fS r-   )rU  r   r\   )r   ri   rj   r   r!  s        r1   r  r  C  s-    ing(((!	
DOA	r3   c                
    | | fS r-   r.   )r^   r#  s     r1   r   r   G  s
    Aq6 r3   c                Z    t          |           t          u rt          | j                  n| S r-   )rg   r   r   rB   )rv   s    r1   r`   r`   J  s'    *.w--4*?*?	&	&	&WLr3   c              '     K   t          | |          \  }}d t          ||          D             }||fi fV \  }}d |D             }t          ||f          \  }}||fV  d S )Nc                x    g | ]7\  }}|.t          t          |                                                    n|8S r-   rP  rQ  s      r1   rC   ztraceable.<locals>.<listcomp>P  sO     2 2 2!Q 67Yd8A;;..00111A 2 2 2r3   c                B    g | ]}t          |          t          u rd n|S r-   r   r]   s     r1   rC   ztraceable.<locals>.<listcomp>S  s*    GGGQ$q''T//$$qGGGr3   )r   rI   r   )r   primals_and_tangentsri   rj   rt  r%  out_flatr   s           r1   r   r   M  s      $W.BCC'82 2gx002 2 2(%,h$7$;;;+|GG,GGG,#[,$?@@(H(r3   c                   t          |t          j                  r|j        |j        }}nd}t          |||f          \  }}t          j        t          j        t                    |d          }	t          |	|          \  }	}
t                              |           }|r* ||t          t          |          d |D                       }t          j        j        rxd |D             }t%          ||j                  \  }}g ||j        }d t+          |          D             fd|D             }t          j        |	t/          |                    }	 | j        |	g|R i |}t3           |
            |          S )Nr.   Fc                :    g | ]}t          |          t          uS r.   r   r  s     r1   rC   z"call_transpose.<locals>.<listcomp>c  s#    <<<ADGG4/<<<r3   c                ,    g | ]}t          |          S r.   r   r  s     r1   rC   z"call_transpose.<locals>.<listcomp>f  s!    666A$Q''666r3   c                >    i | ]\  }}|t          j        |          S r.   )r   DBIdx)r=   ir   s      r1   
<dictcomp>z"call_transpose.<locals>.<dictcomp>i  s&    DDDdaDJqMMDDDr3   c                    g | ]i}t          |j                  t          j        u r>|j                            t          fd |j        j        D                                 n|j        dfjS )c              3  D   K   | ]}                     ||          V  d S r-   )r   )r=   r   	dbidx_maps     r1   r@   z,call_transpose.<locals>.<listcomp>.<genexpr>j  s1      )T)T!)--1*=*=)T)T)T)T)T)Tr3   r   T)rg   rB   r   r   r   r   r   )r=   r   r  s     r1   rC   z"call_transpose.<locals>.<listcomp>j  s     ] ] ]LM4<<4#444 E)T)T)T)Tqv|)T)T)T$T$TUUU:;&$H ] ] ]r3   )r[   r   ClosedJaxprr   r   r   rJ   hashable_partial	wrap_initr   r   r  r   r}   r   r   dynamic_shapesr  r+   r   r   	enumeraterK   r   rU  r   )r   r   r   r#  r   r>   r   all_argsin_tree_defrO   r   rZ  	which_lin
res_invars
new_invarsrV  r  r  s                    @r1   call_transposer
  X  s   
D,-- #):+<JJF&b'9::(K
BL77UKK#&sK88-#x/33I>>- >]63':D#A#A<<<<<> >F  +66666I"9j.?@@MJ3:3
 23JDDi
.C.CDDDI] ] ] ]Q[] ] ]G
+c5>>
*
*CY^C5(555f55(	

H	-	--r3   c                    |j         |j        }}t          j        |          }t	          t
          j        | |g ||R ||          S r-   )r   r   r   convert_constvars_jaxprr
  r   closed_call_p)r   r   r#  r   r  jaxpr_r   s          r1   _closed_call_transposer  r  sO    ;&&%f--&	*FF<Lf<Lt<L<LL
* 
* *r3   c               /  6   K   | |fV }|d |D             fV  d S )Nc                :    g | ]}t          |          t          uS r.   r   r   s     r1   rC   z#nonzero_outputs.<locals>.<listcomp>}  s#    777!$q''%777r3   r.   )r#  r   r$  s      r1   nonzero_outputsr  z  s;      ,'77w777777777r3   c                >   t          d||f          \  }}t          j        t          j        t                    |d          }t          |          \  }t          ||          \  }}	d         d         c}
g d t          |          D             d t          |
|          D             R }t          d |
D                       rt          d          t          d	 |
D                       s
J |
            t          t          d
 |D                       f          fd            }t          t          d         d          ||          }|d= t                              |           }|r* ||t#          t$          |          d |D                       } | j        |g|R i |}t)           |	            |          }t+                    t+          |          k    sJ fdfdt          |          D             }t          |          S )Nr.   FrB  rf  c                6    g | ]\  }}t          |          |S r.   r   r=   axisr0   s      r1   rC   z!map_transpose.<locals>.<listcomp>  s8     2 2 2GD!-a0024 2 2 2r3   c                D    g | ]\  }}t          |          t          u|S r.   r   r  s      r1   rC   z!map_transpose.<locals>.<listcomp>  s6     + + +GD!1ggT)) )))r3   c              3     K   | ]}|d u V  	d S r-   r.   r=   out_axiss     r1   r@   z map_transpose.<locals>.<genexpr>  s'      33hT	333333r3   zaautodiff of pmap functions with out_axes=None is not supported. Consider using shard_map instead.c              3     K   | ]}|d uV  	d S r-   r.   r  s     r1   r@   z map_transpose.<locals>.<genexpr>  s'      ;;hXT!;;;;;;r3   c              3  B   K   | ]}t          |          t          u V  d S r-   r   )r=   cs     r1   r@   z map_transpose.<locals>.<genexpr>  s,      /L/LAQ4/L/L/L/L/L/Lr3   rG  c                 b    t          d t                                  D                       S )Nc              3  (   K   | ]\  }}||pd V  dS )r   Nr.   )r=   r  rF   s      r1   r@   z8map_transpose.<locals>.out_axes_thunk.<locals>.<genexpr>  s/      LLxtRLLLLLLLr3   )r   rI   )rB  
nz_arg_ctss   r1   rF  z%map_transpose.<locals>.out_axes_thunk  s0    LL3w

+E+ELLLLLLr3   namer   )r!  rB  rF  c                :    g | ]}t          |          t          uS r.   r   r  s     r1   rC   z!map_transpose.<locals>.<listcomp>  s#    @@@Qt 3@@@r3   c                v    || n4t          t          j        d         d         || j                            S )N	axis_size	axis_name)r   r   unmapped_avalrB   )zeroin_axisr   s     r1   
unmap_zeroz!map_transpose.<locals>.unmap_zero  s<    ODD#F;$79LgW[W`aabbdr3   c              3     K   | ]B\  }}t          |          t          u r ||          n||n|                    d          V  Cd S )Nr   )rg   r   rH   )r=   arg_ctr(  r)  s      r1   r@   z map_transpose.<locals>.<genexpr>  ss       ; ; ! -1LLD,@,@ZZ(((*VVZZ]]; ; ; ; ; ;r3   )r   rJ   r  r  r   r  r   rI   r  r  r   r)   r   r   r(   r  r   r}   r   rU  r   rG   )r   r   r   r#  r   r>   r  r  rO   r   rf  new_in_axesrF  r[  rZ  r  r   rB  r   r)  s    `               @@@r1   map_transposer-    s   &D"~66(K
BL77UKK##C((/#z&sK88-#xY'
);'8, 2 2s7D'9'9 2 2 2 ,+ +s8R'8'8 + + +, ,+ 	33(33333 -
	,- - - 
;;(;;;	;	;EEXEEE %/L/L/L/L/L*L*L MNNNM M M M M ONMF6&>;!G!G'H H H*/33I>>- Bz3/BD+I+I@@R@@@B BJY^C9(999j99(88::x00' 
WW	%	%	%	%d d d d d; ; ; ; %($9$9; ; ;' 
wr3   nonzerosSequence[bool]rU   bool | Sequence[bool]#tuple[core.ClosedJaxpr, list[bool]]c                    t          |          t          u r|ft          | j                  z  }t	          | t          |          t          |                    S r-   )rg   rh   rG   r  
_jvp_jaxprr   )r   r.  rU   s      r1   	jvp_jaxprr4    sM     
+$.3u#7#77K	E5??E+,>,>	?	??r3   c                   t          | j                  t          |          k    sJ t          j        t	          j        |                     }t          t          ||d          |          \  }}d t          | j        |          D             }t          t          j        | j        |                    }t          j        ||          \  }}	}
\   t	          j        ||
           |            fS )NF)rU   rV   c                    g | ]	\  }}||
S r.   r.   )r=   rB   rF   s      r1   rC   z_jvp_jaxpr.<locals>.<listcomp>  s!    LLLHD"L4LLLr3   )rG   in_avalsrJ   r  r   jaxpr_as_funf_jvp_traceablerX   rI   ry   ro  rp  r   trace_to_jaxpr_dynamicr   )r   r.  rU   r4   rX  out_nonzerostangent_avalsavals_in	jaxpr_outr  literals_outs              r1   r3  r3    s    	U^		H	-	-	-	-l4$U++,,!'A;X](^(^(^(02 2%LLENH(E(ELLL-"(5>=99::(+-+DUH+U+U()Yb		)\	2	2LLNN	BBr3   c              '  0  	K   t          |           }t          |d |                   }t          ||d                    		fdt          ||           D             }||fi fV \  }}d |D             }d |D             }t          |          |z   |fV  d S )Nc                `    g | ]*\  }}|rt                    nt          j        |          +S r.   )nextr   r\   )r=   r   rF   nonzero_tangentss      r1   rC   z#f_jvp_traceable.<locals>.<listcomp>  sJ     3 3 3!R )+Bd#$$$0B0B 3 3 3r3   c                :    g | ]}t          |          t          uS r.   r   r]   s     r1   rC   z#f_jvp_traceable.<locals>.<listcomp>  r"  r3   c                >    g | ]}t          |          t          u|S r.   r   r]   s     r1   rC   z#f_jvp_traceable.<locals>.<listcomp>  s(    IIIT!WWD5H5H!5H5H5Hr3   )rG   ry   iterrI   )
r.  primals_and_nztangentsnum_primalsri   rj   rt  r%  r;  nonzero_tangents_outrC  s
            @r1   r9  r9    s      H+'566'0>??3 3 3 3w113 3 3(%,h$7$;;;+|<<|<<<,II\III[00,>>>>>>r3   c                   t          ||| j        j                  }t          ||| j        j                  }t	          j        | j        j        ||| j        j        | j        j                  }t	          j	        || j
                  S r-   )_permr   r   r   r   Jaxprr   r   r   r   r   )r   r   r9  rt  r%  r	  new_outvars	new_jaxprs           r1   rearrange_bindersrO    sq    Zek.@AA*k<1DEE+j.#[%+2B,. .) 
	)U\	2	22r3   c                    t          |           }|d |         ||d          }}t          || d d                   }t          ||d d                   }t          ||          S )Nr   )rH   r'   _interleave)primal_countstangent_countslstnri   rj   primal_groupstangent_groupss           r1   rK  rK    sh    	-!"1"gs122w8'WmCRC&899-hss(;<<.	]N	3	33r3   c                z    t          |           t          |          k    sJ d t          | |          D             S )Nc                &    g | ]}|D ]	}|D ]}|
S r.   r.   )r=   r  les       r1   rC   z_interleave.<locals>.<listcomp>  s2    	=	=	=T	=	=1	=	=a!	=	=	=	=	=r3   )rG   rI   )xsyss     r1   rQ  rQ    s;    	RCGG					=	=B	=	=	==r3   
custom_linzcore.Primitiver  c                    | S r-   r.   )r  r>   rq  s      r1   r   r     s    9 r3   c                      t          d          )NzAcan't apply forward-mode autodiff (jvp) to a custom_vjp function.)r  )r>   rq  s     r1   raise_custom_vjp_error_on_jvpra    s      	 	 r3   c                   t          ||g          \  }}|rt          t          |           } nt          t          |           }  |g || R  }t          t          |          }d g|z  t          |          z   S r-   )r'   r}   r   r`   r   ry   )	r  r  r  r  rr  r   r  r>   r  s	            r1   _custom_lin_transposerc    s    fwi((&#q .17;;GG#W--G3g&16::&
'	DLL	((r3   c                       e Zd Z fdZ xZS )rw  c                N    d}t                                          |           d S )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.superr  r
  r:  	__class__s     r1   r  zCustomJVPException.__init__  s*    +C 
GGSr3   r  r  r  r  __classcell__ri  s   @r1   rw  rw    8                r3   rw  c                       e Zd Z fdZ xZS )r  c                N    d}t                                          |           d S )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.rf  rh  s     r1   r  zCustomVJPException.__init__  s*    8C 
GGSr3   rj  rl  s   @r1   r  r    rm  r3   r  )r4   r5   r6   r7   r8   r9   r:   r5   )FTT)rO   r5   r:   r   )F)r   r   )r   r  )r   r  r.  r/  rU   r0  r:   r1  )}
__future__r   collections.abcr   r   rc   r  	itertoolsro  r   typingr   r  jax._srcr   r	   rJ   jax._src.interpretersr
   r   jax.tree_utilr   r   r   r   r   r   jax._src.ad_utilr   r   r   r   r   r   r   r   jax._src.api_utilr   r   jax._src.corer   r   r   r   r   r    r!   jax._src.dtypesr"   r#   jax._src.utilr$   r%   r&   r'   r(   r)   r*   r+   rI   r}   r2   rN   rX   transformationrQ   rR   transformation_with_auxrS   r   r   r   r   r   r   r  r   r   r   r&  rf   rq   r  rT  __annotations__r  r7  r  r   r  r  r  r  r  r  r  r  r  r   r  r  r  r  r`   r   r
  r  r  r  r-  r4  r3  r9  rO  rK  rQ  r  def_abstract_evalr   ra  def_implrc  	Exceptionrw  r  r.   r3   r1   <module>r     s   # " " " " " " . . . . . . . .                         



       & & & & & & 4 4 4 4 4 4: : : : : : : : : : : :       % % % % % %? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 9 8 8 8 8 8 8 8 ? ? ? ? ? ? ? ?, , , , , , , , , , , , , , , , , , ) ) ) ) ) ) ) )+ + + + + + + + + + + + + + + + + + + +
    2 2 2 2  8<: : : : : " " " 0 0 0 1 1 1H H H*" " " "(0 0 0    K K K KZ2 2 2 2+ + + + + + + +$ $ $  _++::< < <. . . = = =
]  ]  ]  ]  ] u ]  ]  ] @       *f f f 79  8 8 8 8@B  B B B B
 35 4 4 4 479  9 9 9 968  8 8 8 8N N N8 8 8R R RO O OY Y YI I IY Y YJ J J
Y Y Y  O O O	0 	0 	0; ; ;   
=11 2 2 2M M M   . . .. %,GNF$C$C T[ !* * *
 ,B T' ( 8 8 8) ) )X@ @ @ @ C C C 	? 	? 	?3 3 3 34 4 4> > >
  .t~l;; ; ; ; ;   DD E E E $      3 4 4 4	) 	) 	) &; \ "	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	r3   