
    Vpf)                       U d dl mZ d dlZd dlmZmZmZ d dlZd dlm	Z	 d dl
mZm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mZmZmZmZmZ d dl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* d dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 e.e7cZ7Z8e/e9cZ9Z: ej;        d           G d d                      Z< ej;        d           G d d                      Z= ej;        d           G d d                      Z> G d d          Z? e?            Z@d ZAd ZB e(e>eAeB           d ZC ej;        d           G d d                      ZDdd#ZEd$ ZFdd+ZGdd/ZHdd0ZIdd=ZJeZKeZLeZMeZNeg e f         ZOeeeOeKeMgeLf         ZPeeeNeLeMgeKf         ZQeeNge*f         ZRddGZSi ZTdHeUdI<   ddMZVi ZWdNeUdO<   ddQZXi ZYdReUdS<   dd]ZZi Z[d^eUd_<   e?hZ\d`eUda<   ddcZ]ddfZ^ej_        dg             Z` ead          ZbdZc G dh die           Zd G dj dJe          ZeddnZfeedfddtZgejh        du             Ziejh        dv             Zjeefdd}Zkej_        d~             Zld Zmd Znd Zod Zpd ZqddZre6dd            ZsddZtd Zud Zvd Zwe6d             Zxej_        d             Zyej_        d             Zzejh        d             Z{d Z| G d d          Z} e}            Z~ej_        d             Zd Zejh        d             ZddZedeeeedeeedf         df         f         f         f         Zi ZdeUd<   i ZdeUd<   i ZdeUd<   d Zd Zd Zd Zd Zd Zd ZddZddZd Zd ZddZ G d de          Zd Zd Zeee<   dS )    )annotationsN)CallableIterableSequence)partial)AnyUnion)config)core)source_info_util)linear_util)ZeroinstantiateSymbolicZero"replace_rule_output_symbolic_zerosadd_jaxvalsadd_jaxvals_p)raise_to_shapedTraceTracerAxisName)partial_eval)tree_unflattentree_flattenregister_pytree_node)Array)unzip2unzip3safe_mapsafe_zip
split_listcanonicalize_axismoveaxisas_hashable_functioncurrymemoizeweakref_lru_cacheT)frozenc                  D    e Zd ZU ded<   ded<   ded<   dd	Zej        Zd
S )JumbleTycore.Varbinderzint | Tracer | core.Varlengthzcore.DShapedArrayelt_tyreturnstrc                P    dt          | j                   d| j         d| j         S )NVar:z => )idr,   r-   r.   selfs    ^/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/interpreters/batching.py__repr__zJumbleTy.__repr__6   s,    ADKAA4;AADKAAA    Nr/   r0   __name__
__module____qualname____annotations__r8   dataclassesreplace r9   r7   r*   r*   1   sT         !!!!B B B B'''r9   r*   c                  :    e Zd ZU ded<   ded<   d	dZej        ZdS )
IndexedAxisSizer+   idxzArray | core.Var | Tracerlengthsr/   r0   c                >    | j          dt          | j                   S )Nz.Var)rF   r4   rE   r5   s    r7   r8   zIndexedAxisSize.__repr__?   s     l..48...r9   Nr:   r;   rB   r9   r7   rD   rD   ;   sA         ---$$$$/ / / /'''r9   rD   c                  $    e Zd ZU ded<   ded<   dS )Jumbler*   avalr   dataN)r<   r=   r>   r?   rB   r9   r7   rI   rI   E   s"         ...+++++r9   rI   c                      e Zd ZdS )
JumbleAxisNr<   r=   r>   rB   r9   r7   rM   rM   K             r9   rM   c                    g fd| j         j        j        D             }| j         j                            t	          |                    }| j                             |          }| j        f|fS )Nc                    g | ]W}t          |          t          u r=                    |j                  p"|                    t                               n|XS )rF   )typerD   appendrF   rA   len.0drF   s     r7   
<listcomp>z#_jumble_flatten.<locals>.<listcomp>U   sg     2 2 2 q''_,, ~~ai((KAIIc'llI,K,K232 2 2r9   shaper.   )rJ   r.   r[   updatetuplerA   rK   )jumble	new_shaper.   rJ   rF   s       @r7   _jumble_flattenra   S   s    '2 2 2 2*02 2 2) ;$$5+;+;$<<&			F		+	+$
6;		%%r9   c                    |\  }fd| j         j        D             }| j                             t          |                    }|                     |          } t          | |          S )Nc                    g | ]>}t          |          t          u r$|                    |j        d z
                     n|?S )   rR   )rS   rD   rA   rF   rV   s     r7   rY   z%_jumble_unflatten.<locals>.<listcomp>]   s[     + + + q''_,, yyQ!7y88823+ + +r9   rZ   r\   )r.   r[   r]   r^   rA   rI   )rJ   xrK   r`   r.   rF   s        @r7   _jumble_unflattenrf   [   s~    -'4+ + + +)+ + +) ;E)$4$455&	V	$	$$	d		r9   c           	        t          j        dt          j        dt          j        d                              }|dk    rt
          t          |j                  }|d= |D ]\  }}t          ||          ||dz
  <   t          j	        t          |          |j        |j                  }t          t          || |          |          S )N rB   int32r   rd   )r   r2   ShapedArraynpdtypeNotImplementedErrorlistr[   rD   DShapedArrayr^   	weak_typerI   r*   )		axis_sizestacked_axisragged_axesre   r,   r[   ragged_axissegment_lensr.   s	            r7   _jumble_resultrv   e   s    8B(RXg->->??@@&Q

qw--%Ah#. A Ak<*6<@@E+a-U5\\17AK@@&	F33Q	7	77r9   c                  B    e Zd ZU ded<   ded<   ed             Zdd	Zd
S )
RaggedAxisintrr   ztuple[tuple[int, Any], ...]rs   c                B    t          | j        d         d                   S )Nr   rd   )rU   rs   r5   s    r7   sizezRaggedAxis.sizey   s     t"1%&&&r9   r6   dstr/   c                t      fdt          fd j        D                       }t          |          S )Nc                `    j         | k    r| k    r| dz   S j         | k     r| k    r| dz
  S | S Nrd   )rr   )axr|   r6   s    r7   	move_axisz/RaggedAxis.move_stacked_axis.<locals>.move_axis   sF    		R		B#IIAv		R		B#IIAvir9   c              3  8   K   | ]\  }} |          |fV  d S NrB   )rW   r   sizesr   s      r7   	<genexpr>z/RaggedAxis.move_stacked_axis.<locals>.<genexpr>   s4      NN	EiimmU+NNNNNNr9   )r^   rs   rx   )r6   r|   new_axesr   s   `` @r7   move_stacked_axiszRaggedAxis.move_stacked_axis   sZ          NNNNT=MNNNNNHc8$$$r9   N)r6   rx   r|   ry   r/   rx   )r<   r=   r>   r?   propertyr{   r   rB   r9   r7   rx   rx   q   s]          +***' ' 8'
	% 	% 	% 	% 	% 	%r9   rx   dimpermtuple[int, ...]r/   c                    g }t          |          D ]1\  }}| j        D ]$\  }}||k    r|                    ||f            n%2t          | j        |          S r   )	enumeraters   rT   _sorted_ragged_axisrr   )r   r   new_ragged_axesrE   old_idxr   r{   s          r7   transpose_ragged_axesr      sv    /oo  lc7O  D	BT{+++ 
 
S-	?	??r9   c           	     \    t          | t          t          |d                               S )Nc                    | d         S Nr   rB   )ps    r7   <lambda>z%_sorted_ragged_axis.<locals>.<lambda>   s
    !A$ r9   )key)rx   r^   sorted)rr   rs   s     r7   r   r      s)    	L%{(O(O(O"P"P	Q	QQr9   ndimry   rr   rs   "list[tuple[int, Array | core.Var]]int | RaggedAxisc                     |r, fd|D             }t          t          |           |          S t          |           S )Nc                :    g | ]\  }}t          |          |fS rB   )r"   )rW   r   szr   s      r7   rY   z#make_batch_axis.<locals>.<listcomp>   s-    MMMvr2#B--r2MMMr9   )r   r"   )r   rr   rs   	canonicals   `   r7   make_batch_axisr      sQ    
  1MMMMMMMI0tDDiPPP\4000r9   bdim
data_shape
core.Shapec           	         t          | t                    rxt          |          }t          j        dt          j        dt          j        d                              }| j        D ]\  }}t          ||          ||<   t          |          S |S )Nrh   rB   ri   )
isinstancerx   rn   r   r2   rj   rk   rl   rs   rD   r^   )r   r   resultr,   rt   ru   s         r7   bdim_as_shaper      s    j!! *FXb$*2rx/@/@AABBF%)%5 B B!\+FLAAf[==r9   c                p    d t          |          D             }t          t          |          | |          S )Nc                P    g | ]#\  }}t          |t                    ||j        f$S rB   )r   rD   rF   )rW   ir{   s      r7   rY   z!shape_as_bdim.<locals>.<listcomp>   sA     7 7 7wq$t_557!T\" 7 7 7r9   )r   r   rU   )rr   r   rs   s      r7   shape_as_bdimr      s?    7 7)J2G2G 7 7 7+	Z,	D	DDr9   flu.WrappedFun	orig_typecore.InputType | Nonerq   core.AxisSize	axis_namer   explicit_in_dims!Sequence[int | RaggedAxis | None]ru   Sequence[Array]c           	        || S t          |          t          d |D                       k    sJ  G d d          fd|D             fd|D             }d |D             }t          |t                    r |j                  n|}t          ||          D ]K\  }	}
t          |
t                    rt          |                    t          j
        |||
|	                     Lfd|D             }t          t          |                    }||z
  }d |D             }d	 t          g ||R           D             fd
|D             }t          j        | g ||R           S )Nc              3      K   | ]	\  }}|V  
d S r   rB   )rW   _explicits      r7   r   z%_update_annotation.<locals>.<genexpr>   s&      %L%L;1hh%L%L%L%L%L%Lr9   c                      e Zd Zd ZdS ) _update_annotation.<locals>.Namec                    || _         d S r   a)r6   r   s     r7   __init__z)_update_annotation.<locals>.Name.__init__   s    A4666r9   Nr<   r=   r>   r   rB   r9   r7   Namer      s        %%%%%r9   r   c                ,    g | ]\  }} |          S rB   rB   )rW   r   r   r   s      r7   rY   z&_update_annotation.<locals>.<listcomp>   s%    
*
*
*tq!4477
*
*
*r9   c                    g | ]X\  }}|t          |          t          j        u r4|                    t	          fd |j        D                                 n|YS )c              3  l   K   | ].}t          |          t          j        u r|j                 n|V  /d S r   )rS   peDBIdxval)rW   rX   namess     r7   r   z0_update_annotation.<locals>.<listcomp>.<genexpr>   sS        2  2$% 15Q280C0Cae  2  2  2  2  2  2r9   rZ   rS   r   ro   r]   r^   r[   )rW   r   er   s      r7   rY   z&_update_annotation.<locals>.<listcomp>   s     N N N6:a1N1gg*** 88%  2  2  2  2)* 2  2  2 2 28 3 3 301N N Nr9   c                Z    g | ](}t          j        t          j        |                    )S rB   )r   r   get_aval)rW   ss     r7   rY   z&_update_annotation.<locals>.<listcomp>   s-    LLL!t#DM!$4$455LLLr9   c                    h | ]:}t          |          t          j        u r|j        D ]}t          |          u |;S rB   )rS   r   ro   r[   )rW   r   rX   r   s      r7   	<setcomp>z%_update_annotation.<locals>.<setcomp>   sT     4 4 4QtAww$2C'C'C (D'C477d?? #2???r9   c                     g | ]}|j         d fS Fr   )rW   ns     r7   rY   z&_update_annotation.<locals>.<listcomp>   s    000U|000r9   c                >    i | ]\  }}|t          j        |          S rB   )r   r   )rW   r   r   s      r7   
<dictcomp>z&_update_annotation.<locals>.<dictcomp>   s&    OOOAa!OOOr9   c                    g | ]U}t          |          t          j        u r4|                    t	          fd |j        D                                 n|dfVS )c              3  D   K   | ]}                     ||          V  d S r   )get)rW   rX   name_maps     r7   r   z0_update_annotation.<locals>.<listcomp>.<genexpr>   s1      $I$IAX\\!Q%7%7$I$I$I$I$I$Ir9   rZ   Tr   )rW   r   r   s     r7   rY   z&_update_annotation.<locals>.<listcomp>   s|     R R RBC477d/// u$I$I$I$I$I$I$IIIJJJ56> R R Rr9   )rU   sumr   r   rJ   ziprx   rm   rT   r   unmapped_avalsetmapr   luannotate)r   r   rq   r   r   ru   avals	new_avalsr   r   rX   	mentioned
expl_names
impl_names	impl_part	expl_partr   r   r   s                   @@@r7   _update_annotationr      s!    q			#%L%L)%L%L%L"L"L	L	L	L	L& & & & & & & &
*
*
*
*	
*
*
*%N N N N>GN N N% ML|LLL)))V<<KttIN)"%)** @ @da!Z   @t)"iA>>????4 4 4 4) 4 4 4)3tY''((*:%*00Z000)OO3MZ3M*3M3M)N)NOOO(R R R RGPR R R)	Q0)0i00	1	11r9   tracer   get_idxGetIdxre   	VmappablespecMapSpecEltc                   t                               t          |                    }|r" |t          t          | |          |||          S t          |          t
          u r|t          urt          d          d t          |j	        j
        j                  D             \  \  }}t          |j        j        d|dz   |j        fg          }t!          | |j        |          S t#          |t$                    s|X|o.t'          |t)          t+          j        |                              }|#t!          | ||t-          j                              n|S J )Nz3jumble input without using jumble_axis in_axes specc              3  P   K   | ]!\  }}t          |          t          u ||fV  "d S r   )rS   rD   )rW   r   r   s      r7   r   zto_elt.<locals>.<genexpr>   sG       1 1QHH// R////1 1r9   r   rd   )to_elt_handlersr   rS   r   to_eltrI   jumble_axis	TypeErrorr   rJ   r.   r[   r   rK   r   rF   BatchTracerr   ry   r"   rU   rk   r   current)r   r   re   r   handlerrX   ias
batch_axiss           r7   r   r      sL   Q((' 7765'22GQEEEAww&;KLLL1 1'(;<<1 1 1IHQ !a1Q32D1EFFJuafj111$ =%dC,<,<==D q$(8(@(B(BCCC%&( Lr9   zdict[type, ToEltHandler]r   
BatchTraceAxisSizer   c                    t                               t          |                    }|r fd} |||||          S                      |          }|j        |j        }	}t          |	          t          u r4|t          urt          d          t          ||	j
        |	j        |          S 	 t           j        ||j        ||j                  S # t          $ r t          |j        |          d w xY w)Nc                *    t          | ||          S r   )from_elt)rq   eltaxisr   r   s      r7   _contzfrom_elt.<locals>._cont  s    eY3555r9   z5ragged output without using jumble_axis out_axes spec)from_elt_handlersr   rS   
full_raiser   	batch_dimrx   r   r   rv   rr   rs   	matchaxisr   SpecMatchError)
r   rq   r   re   r   r   r   x_r   r   s
   ` `       r7   r   r     s   !!$q''**' .6 6 6 6 6 675)Q---"fblt#	$ZZ:;MNNN)T%68H#NNN<u	2<rvNNN < < <1blD11t;<s   .!C "C2zdict[type, FromEltHandler]r  r   c                    t                               t          |                     }|r ||           S t          j                            dt          |                     S )Nri   )make_iota_handlersr   rS   jaxlaxiotary   )rq   r   s     r7   	make_iotar    sO    ""4	??33' 1797<<Y000r9   zdict[type, MakeIotaHandler]r  	data_typerS   	spec_typeaxis_size_typer   r   r   r  Callable | Nonec                    ||ft           | <   t                              |           |t          | <   |t          | <   |r|t
          |<   d S d S r   )
vmappables
spec_typesaddr   r  r  )r  r  r  r   r   r  s         r7   register_vmappabler    sV     %n5*Y..%/)!)I>Y">222>>r9   zdict[type, tuple[type, type]]r  z	set[type]r  Nonec                    t                               |           \  }}t                              |           t          | = t
          | = |t          v r
t          |= d S d S r   )r  popr  remover   r  r  )r  r  r  s      r7   unregister_vmappabler  )  s^    (nnY77)^Ii 	")))>*** *)r9   r   boolc                Z    t          |           t          u pt          |           t          v S r   )rS   rI   r  )re   s    r7   is_vmappabler  1  s#    	aF		3d1gg33r9   c              '  l   K   t          | |          \  }}||fV }t          |t                    V  d S )N)is_leaf)r   r   r  )in_tree	args_flatpy_args	py_kwargsanss        r7   flatten_fun_for_vmapr%  4  sI      %gy99'9y   #S,////////r9   c                  P    e Zd Zg dZ	 dddZed             Zd	 Zd
 Zd Z	d Z
dS )r   r   r  source_infoNr  NotMapped | int | RaggedAxisr(  "source_info_util.SourceInfo | Nonec                ^   t           j        j        rt          |          t          t
          t          fv sJ t          |          t
          u rDt          t          j	        |                    }d|cxk    rt          |j                  k     sn J || _        || _        || _        || _        d S r   )r
   enable_checksvaluerS   	NotMappedry   rx   r   r   r   rU   r[   _tracer   r  r(  )r6   r   r   r  r(  rJ   s         r7   r   zBatchTracer.__init__D  s    ! 0)__C <<<<<	iC		t}S1122I////DJ//////DKDHDN"Dr9   c                   t          t          j        | j                            }| j        t
          u r|S t          | j                  t          u r+t          j        |j	        | j                 | j        |          S t          | j                  t          u rt          j        |j	        | j        j                 | j        j        |          }t          |j	                  }| j        j        D ]5\  }}t          | j        |d          }| j        j        |k     r|dz  }|||<   6t          j        t#          |          |j        |j                  S d S )Nr   rd   )r[   rl   rp   )r   r   r   r   r  
not_mappedrS   ry   mapped_avalr[   rx   rr   rn   rs   r   r/  ro   r^   rl   rp   )r6   rJ   new_avalr[   rt   segment_lengthssize_tracers          r7   rJ   zBatchTracer.avalP  s8   4=2233D~##k	dn			$	$dj8$.$OOO	dn			+	+!
4>./1LdT Th8>""e*..*D ) )
&+!$+BB>&44

+(kU5\\)-9 9 9 9 
,	+r9   c                T    | j         t          u rt          j        | j                  S | S r   )r  r1  r   
full_lowerr   r5   s    r7   r7  zBatchTracer.full_lowerc  s&    ~##_TX&&&kr9   c                l    | j         dS dt          |            dt          j        | j                    S )Nrh   z!
This BatchTracer with object id z was created on line:
  )r(  r4   r   	summarizer5   s    r7   _origin_msgzBatchTracer._origin_msgi  sM    RBD B B#-d.>??B B Cr9   c                &    d| j         fd| j        fgS )Nr   r  r   r  r5   s    r7   	_contentszBatchTracer._contentso  s    DHT^<==r9   c                |    | j         t          | j                   t          u rt          j        | j                  S | S r   )r  rS   ry   r   get_referentr   r5   s    r7   r?  zBatchTracer.get_referentr  s6    ~dn!5!5!<!<tx(((kr9   r   )r  r)  r(  r*  )r<   r=   r>   	__slots__r   r   rJ   r7  r:  r=  r?  rB   r9   r7   r   r   A  s        111) BF
# 
# 
# 
# 
# 9 9 89$  C C C> > >    r9   r   c                       e Zd Zdd fd
Zd Zd Zd Zd Zd ZddZ	d Z
d Zd ZddZd Zd Zd Zd Zd Zd Z xZS )r   N)spmd_axis_namec               P     t                      j        |  || _        || _        d S r   )superr   r   rB  )r6   r   rB  args	__class__s       r7   r   zBatchTrace.__init__z  s,    EGGdDN(Dr9   c                R    t          | |t          t          j                              S r   r   r1  r   r   r6   r   s     r7   purezBatchTrace.pure       tS*.>.F.H.HIIIr9   c                R    t          | |t          t          j                              S r   rH  rI  s     r7   liftzBatchTrace.lift  rK  r9   c                \    t          | |j        |j        t          j                              S r   )r   r   r  r   r   rI  s     r7   subliftzBatchTrace.sublift  s$    tSWcm5E5M5O5OPPPr9   c                B   |t           v rt           |         S | j        @|t          v r7t          t          |         | j        |j        |j        |j        j                  S |t          v r| 	                    ||          S d}t          |                    |                    )Nz&Batching rule for '{}' not implemented)primitive_batchersrB  spmd_axis_primitive_batchersr   r{   name
main_trace
trace_typeaxis_primitive_batchersget_axis_primitive_batcherrm   format)r6   	primitiveframemsgs       r7   get_primitive_batcherz BatchTrace.get_primitive_batcher  s    &&&	**			(Y:V-V-V1)<(%*ej%02 2 2 
-	-	-,,Y>>>
2C
cjj33
4
44r9   c                d    t          t          |         |j        |j        |j        j                  S r   )r   rV  r{   rS  rT  rU  )r6   rY  rZ  s      r7   rW  z%BatchTrace.get_axis_primitive_batcher  s-    *95
EJ 0 ;= = =r9   r/   core.AxisEnvFramec                   t          d |D                       r1d t          ||          D             }t          j        |          \  }nd }| j        t          j        u r$|J t          j        | j        || j                  S t          j        | j        | j                  }|||j	        k    sJ ||j	        f            |j
        | j        u sJ |S )Nc              3  (   K   | ]}|t           uV  d S r   r1  rW   rX   s     r7   r   z'BatchTrace.get_frame.<locals>.<genexpr>  s'      
-
-11J
-
-
-
-
-
-r9   c              3     K   | ]:\  }}|t           ut          |          t          u r|j        |         n|j        V  ;d S r   )r1  rS   ry   r[   r{   rW   re   rX   s      r7   r   z'BatchTrace.get_frame.<locals>.<genexpr>  sZ       C C1aaz.A.A "!WW^^qwqzz.A.A.A.AC Cr9   )anyr   r   dedup_referentsr   no_axis_nameAxisEnvFramemain
axis_framer{   rT  )r6   valsdimsr   rq   rZ  s         r7   	get_framezBatchTrace.get_frame  s    

-
-
-
-
--- C CtT??C C Ce'..jiii~***"""t~y$)DDDODNDI66E	UZ 7 7 7)UZ9P 7 7 7ty((((Lr9   c                    t           j        j        r |j        d |D             i | t	          d |D                       \  }}|t
          v }t          j        ||          }|rOt           j	        |          r: 
                    ||          }                     ||          }	 |	||fi |\  }
}n_t          d |D                       r |j        |i |S  
                    ||          }                     ||          } |||fi |\  }
}t          j                    |j        r fdt%          |
|          D             S t'           |
|          S )Nc              3  $   K   | ]}|j         V  d S r   )rJ   rW   ts     r7   r   z/BatchTrace.process_primitive.<locals>.<genexpr>  s$      881888888r9   c              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z/BatchTrace.process_primitive.<locals>.<genexpr>  +      DDqquak2DDDDDDr9   c              3  (   K   | ]}|t           u V  d S r   ra  rW   r   s     r7   r   z/BatchTrace.process_primitive.<locals>.<genexpr>  s'      44DTZ444444r9   c                :    g | ]\  }}t          ||          S rB   r   )rW   re   rX   r6   srcs      r7   rY   z0BatchTrace.process_primitive.<locals>.<listcomp>  s+    MMMtq!k$1c**MMMr9   )r
   dynamic_shapesr-  abstract_evalr   rV  r   used_axis_names_main_trace_for_axis_namesri  rm  rW  allbindr\  r   r   multiple_resultsr   r   )r6   rY  tracersparamsvals_indims_inis_axis_primitive
used_namesrZ  batcher_primitiveval_outdim_outbatched_primitiverx  s   `            @r7   process_primitivezBatchTrace.process_primitive  s   " Di88888CFCCCDDGDDDDDGW!%<<%i88J 	G7	:NN 	GnnWg..e99)UKK**7GFFvFFgww	44G444	4	4 GY^W////nnWg..e44YFF**7GFFvFFgw

"
$
$C! 6MMMMMs7G7L7LMMMMw555r9   c                    |j         sJ t          ||                    d|j                            }t	          d |D                       \  }}t          d |D                       r |j        |g|R i |S d t          ||          D             }t          j	        |          \  }t          |          \  }	}t          | j        t          |                    \  }
}t          |
|j        | j        ||	          }
 |j        |
g|	|R i |}t#          | |                      \  }}t%          j                     fdt          ||          D             S )NrS  )rS  c              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z*BatchTrace.process_call.<locals>.<genexpr>  +      >>,>>>>>>r9   c              3  (   K   | ]}|t           u V  d S r   ra  ru  s     r7   r   z*BatchTrace.process_call.<locals>.<genexpr>  s'      
/
/$4:
/
/
/
/
/
/r9   c              3     K   | ]G\  }}|t           ut          |          t          u r|j        |         nt	          |j                  V  Hd S r   )r1  rS   ry   r[   rU   r4  rd  s      r7   r   z*BatchTrace.process_call.<locals>.<genexpr>  sc       A AAAZ,?,?  77c>>QWQZZs13D/E/E,?,?,?,?A Ar9   c                :    g | ]\  }}t          ||          S rB   rw  rW   vrX   r6   rx  s      r7   rY   z+BatchTrace.process_call.<locals>.<listcomp>  +    MMMTQKaC((MMMr9   )r  dictr   r<   r   r}  r~  r   r   rf  indirectify_ragged_axesbatch_subtraceri  r^   r   in_typer   resolve_ragged_axesr   r   )r6   call_primitiver   r  r  rk  rl  r   rq   ru   f_dims_outvals_outrx  s   `            @r7   process_callzBatchTrace.process_call  s   ****&vzz&!*==>>>F>>g>>>>>JD$

/
/$
/
/
/// 5 ^ 4T444V444A AT4A A AE%e,,JI066L$!!TYd<<LB	
AIy$.$
F 
FB"~"2FFtFFFvFFH,XxxzzBBHh

"
$
$CMMMMMS85L5LMMMMr9   c                f    t          d |D                       \  }| j        fd}||fS )Nc              3  >   K   | ]}|j         |j        |j        fV  d S r   r'  rp  s     r7   r   z/BatchTrace.post_process_call.<locals>.<genexpr>  C       4 4"#  !uak1=A 4 4 4 4 4 4r9   c                v                                     }t          t          t          |          |           S r   with_cur_sublevelr   r   r   rk  r   rl  ri  srcss     r7   todoz*BatchTrace.post_process_call.<locals>.todo  2    $$&&ee,,dD$???r9   r   ri  )	r6   r  out_tracersr  rk  r  rl  ri  r  s	         @@@r7   post_process_callzBatchTrace.post_process_call  t     4 4'24 4 4 4 4D$9D@ @ @ @ @ @ @ :r9   r   r   c                .    t          d |D                       \  }}t          d |D                       r |j        |g|R i |S t          d t	          ||          D                       dk    sJ d t          fdt	          ||d                   D                       }t          fdt	          ||d                   D                       }t          | j        |          \  }|d	         t          
          fd            }	t          |||	          }
 |j        |g|R i |
}fdt	                                              D             }t          j                     fdt	          ||          D             S )Nc              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z)BatchTrace.process_map.<locals>.<genexpr>  r  r9   c              3  (   K   | ]}|t           u V  d S r   ra  )rW   r   s     r7   r   z)BatchTrace.process_map.<locals>.<genexpr>  s'      
-
-3*
-
-
-
-
-
-r9   c                @    h | ]\  }}|t           u|j        |         S rB   r1  r[   rd  s      r7   r   z)BatchTrace.process_map.<locals>.<setcomp>  ,    PPPAAZ<O<O!'!*<O<O<Or9   rd   c                    | d uo|t           uS r   ra  in_out_axisrX   s     r7   both_mappedz+BatchTrace.process_map.<locals>.both_mapped  s    $&>1J+>>r9   c              3  P   K   | ] \  }} ||          r||k    r|d z   n|V  !dS rd   NrB   rW   rX   in_axisr  s      r7   r   z)BatchTrace.process_map.<locals>.<genexpr>  s\       8 8Aw #{7A..L1<<!W8 8 8 8 8 8r9   in_axesc              3  P   K   | ] \  }} ||          r||k     r|d z
  n|V  !dS r  rB   r  s      r7   r   z)BatchTrace.process_map.<locals>.<genexpr>  s\       8 8Aw Wa((?Wq[[Aa8 8 8 8 8 8r9   out_axes_thunk)closurec                 v    t           fdt                                              D                       S )Nc              3  P   K   | ] \  }} ||          r||k     r|d z   n|V  !dS r  rB   rW   out_axisrX   r  s      r7   r   zEBatchTrace.process_map.<locals>.new_out_axes_thunk.<locals>.<genexpr>  se       K K$1 &1[1%=%=\!h,,X\\T\ K K K K K Kr9   r^   r   )r  r  r  s   r7   new_out_axes_thunkz2BatchTrace.process_map.<locals>.new_out_axes_thunk  s]     K K K K(+NN,<,<hhjj(I(IK K K K K 	Kr9   )r  r  c                H    g | ]\  }} ||          r||k    r|d z   n|S rd   rB   )rW   rX   r  r  s      r7   rY   z*BatchTrace.process_map.<locals>.<listcomp>  sT     I I I"q( (K!44MQ1q55A I I Ir9   c                :    g | ]\  }}t          ||          S rB   rw  r  s      r7   rY   z*BatchTrace.process_map.<locals>.<listcomp>  s+    PPPtq!k$1c**PPPr9   )r   r}  r~  rU   r   r^   r  ri  r$   r  r   r   )r6   map_primitiver   r  r  rk  rl  new_in_axesnew_dimsr  
new_paramsr  	dims_out_r  r  r  rx  s   `            @@@@r7   process_mapzBatchTrace.process_map  sO   >>g>>>>>JD$

-
-
-
-
--- %Q]3D333F333PPT4PPPQQUVVVVV? ? ? 8 8 8 8dF9$5668 8 8 8 8k  8 8 8 8dF9$5668 8 8 8 8h #1di::ka./n N333K K K K K K 43K DVWWWj##A;;;;
;;hI I I I&)((**nn6F6F&G&GI I Ii$&&cPPPPPs8Y7O7OPPPPr9   c                   	
 t          d |D                       \  }
| j        	d 	
fd}|j        r
fd}||f}||fS )Nc              3  >   K   | ]}|j         |j        |j        fV  d S r   r'  rp  s     r7   r   z.BatchTrace.post_process_map.<locals>.<genexpr>  r  r9   c                    | d uo|t           uS r   ra  r  s     r7   r  z0BatchTrace.post_process_map.<locals>.both_mapped  s    $<*)<<r9   c                                                     fdt          |  d                               D             S )Nc           
     l    g | ]0\  }}}}t          | ||          r||k    r|d z   n||          1S r  rw  )rW   r  rX   oar   r  r   s        r7   rY   z=BatchTrace.post_process_map.<locals>.todo.<locals>.<listcomp>	  sh     T T T!QA %[[Q-?-?$RB!GGAEEQRTUVV T T Tr9   r  )r  r   )rk  r   r  rl  ri  r  r  s    @r7   r  z)BatchTrace.post_process_map.<locals>.todo  sk    $$&&eT T T T T!$T41I8H1I1K1KT!R!RT T T Tr9   c                V    t          fdt          |           D                       S )Nc              3  P   K   | ] \  }} ||          r||k     r|d z   n|V  !dS r  rB   r  s      r7   r   zJBatchTrace.post_process_map.<locals>.out_axes_transform.<locals>.<genexpr>  s]       = =$1 &1[1%=%=\!h,,X\\T\ = = = = = =r9   r  )out_axesr  rl  s    r7   out_axes_transformz7BatchTrace.post_process_map.<locals>.out_axes_transform  sE     = = = =(+Hd(;(;= = = = = 	=r9   )r   ri  r  )r6   r  r  r  rk  r  r  r  rl  ri  r  s      `   @@@@r7   post_process_mapzBatchTrace.post_process_map  s     4 4'24 4 4 4 4D$9D= = =T T T T T T T T T # (= = = = = = &'d:r9   c                   t          d |D                       \  }}t          | j        |          \  }}t          | j        |          \  }}	 |j        ||g|R d|i}
t          j        ||	          \  }}|s=||d t          |          dz           dz  k    sJ |d t          |          dz           }t          j	                     fdt          |
|          D             S )Nc              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z5BatchTrace.process_custom_jvp_call.<locals>.<genexpr>  rs  r9   symbolic_zeros   c                :    g | ]\  }}t          ||          S rB   rw  r  s      r7   rY   z6BatchTrace.process_custom_jvp_call.<locals>.<listcomp>  r  r9   )r   r  ri  batch_custom_jvp_subtracer~  r   merge_linear_auxrU   r   r   r   )r6   primfunjvpr  r  in_valsin_dims	out_dims1	out_dims2out_valsfstout_dimsrx  s   `            @r7   process_custom_jvp_callz"BatchTrace.process_custom_jvp_call  s   DDGDDDDDGW#CG<<NC.sDIwGGNCtycKGKKKNKKH'	9==MC /"53x==A#5"56:::::-3x==A--.h

"
$
$CMMMMMS85L5LMMMMr9   c                j    t          d |D                       \  }| j        fd}||fS )Nc              3  >   K   | ]}|j         |j        |j        fV  d S r   r'  rp  s     r7   r   z:BatchTrace.post_process_custom_jvp_call.<locals>.<genexpr>  r  r9   c                ^                                    }rrd t          |                    t          |           d          }}||k    sJ d t          |                    }t          t          t          |          | ||          S t          t          t          |          |           S r   )r  rU   r   r   r   )	rk  r   primal_dimstangent_dimsprimal_srcsrl  jvp_was_runri  r  s	        r7   r  z5BatchTrace.post_process_custom_jvp_call.<locals>.todo"  s    $$&&e	 B$(#d))$4d3t99::6F\l****:CII:&7;..k;OOO7;..dDAAAr9   r  )r6   r  r  rk  r  rl  ri  r  s     `  @@@r7   post_process_custom_jvp_callz'BatchTrace.post_process_custom_jvp_call  s{     4 4'24 4 4 4 4D$9DB B B B B B B B :r9   c          	     L    t          d |D                       \  }}	d t          ||	          D             \  }
d |	D             }t          | j        |	          \  }}t          | j        |          \  }}t	          | j        |
||	 j        j         j                  } |j        |||g|R ||d}t          j
        ||          \  }}|s& |            \  }}t          ||j        g          \  }}t          j                     fdt          ||          D             S )Nc              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z5BatchTrace.process_custom_vjp_call.<locals>.<genexpr>/  rs  r9   c                @    h | ]\  }}|t           u|j        |         S rB   r  rd  s      r7   r   z5BatchTrace.process_custom_vjp_call.<locals>.<setcomp>0  s6     * * *Aj(( '!*(((r9   c                *    g | ]}|t           fD ]}|S rB   ra  )rW   in_dimrX   s      r7   rY   z6BatchTrace.process_custom_vjp_call.<locals>.<listcomp>2  s*    IIIVZ4HIIq1IIIIr9   )	out_treesr  c                :    g | ]\  }}t          ||          S rB   rw  r  s      r7   rY   z6BatchTrace.process_custom_vjp_call.<locals>.<listcomp>?  r  r9   )r   r   r  ri  batch_custom_vjp_bwdr   rU  rB  r~  r   r  r!   
num_leavesr   r   )r6   r  r  fwdbwdr  r  r  r  r  rq   fwd_in_dimsr  r  r  r  r  r   res_treerx  s   `                  @r7   process_custom_vjp_callz"BatchTrace.process_custom_vjp_call-  sj   DDGDDDDDGW* *Wg)>)> * * *JIII7IIIK#CG<<NC#CK@@NC
sDNI('493G#24 4C tyc3 8 8 8I(68 8 8H'	9==MC @IKKkax(*=)>??ka

"
$
$CMMMMMS85L5LMMMMr9   c                f    t          d |D                       \  }| j        fd}||fS )Nc              3  >   K   | ]}|j         |j        |j        fV  d S r   r'  rp  s     r7   r   z:BatchTrace.post_process_custom_vjp_call.<locals>.<genexpr>B  r  r9   c                v                                     }t          t          t          |          |           S r   r  r  s     r7   r  z5BatchTrace.post_process_custom_vjp_call.<locals>.todoE  r  r9   r  )r6   r  r   rk  r  rl  ri  r  s        @@@r7   post_process_custom_vjp_callz'BatchTrace.post_process_custom_vjp_callA  r  r9   c                \    t          d |D                       \  }}d t          |          D             \   j         j        j        c j         |            \  }}|j        }t          |g          \  }t          ||g          \  }fd}	 fd}
||	|
fS )Nc              3  >   K   | ]}|j         |j        |j        fV  d S r   r'  rp  s     r7   r   z>BatchTrace.post_process_custom_vjp_call_fwd.<locals>.<genexpr>K  r  r9   c                @    h | ]\  }}|t           u|j        |         S rB   r  rd  s      r7   r   z>BatchTrace.post_process_custom_vjp_call_fwd.<locals>.<setcomp>M  r  r9   c                v                                     }t          t          t          |          |           S r   r  )rk  r   ri  r  r  s     r7   r  z9BatchTrace.post_process_custom_vjp_call_fwd.<locals>.todoT  s2    $$&&ee,,dKMMMr9   c           	     8    t          | dj                  S )Nr   )r  rB  )r  r   rq   rl  r6   rU  s    r7   bwd_transformzBBatchTrace.post_process_custom_vjp_call_fwd.<locals>.bwd_transformW  s*    !#y)T7",d.AC C Cr9   )r   r   ri  rU  r   r  r!   )r6   r  r  rk  r  r   r  num_resres_dimsr  r	  r   rq   rl  ri  r  r  rU  s   `          @@@@@@@r7    post_process_custom_vjp_call_fwdz+BatchTrace.post_process_custom_vjp_call_fwdJ  s$    4 4'24 4 4 4 4D$PPT4PPPJIy$)"6D*I)++KAx!G&tgY77Hkwi00NA{N N N N N N NC C C C C C C C C }$$r9   )r/   r^  )r   r   )r<   r=   r>   r   rJ  rM  rO  r\  rW  rm  r  r  r  r  r  r  r  r  r  r  __classcell__)rF  s   @r7   r   r   x  sV       8< ) ) ) ) ) ) )
J J JJ J JQ Q Q
5 
5 
5= = =   6 6 6,N N N$  'Q 'Q 'Q 'QR  "
N 
N 
N  N N N(  % % % % % % %r9   rT  core.MainTraceIterable[AxisName]c                :     t           fd|D                       S )Nc              3  N   K   | ]}t          j        |          j        u V   d S r   )r   rj  rT  )rW   r   rT  s     r7   r   z-_main_trace_for_axis_names.<locals>.<genexpr>b  s5      LLQZ4?1--88LLLLLLr9   )re  )rT  r   s   ` r7   r|  r|  \  s(     
LLLL)LLL	L	LLr9   r  	main_typetype[BatchTrace]rB  tuple[AxisName, ...] | Nonec                L    t          | ||          }t          ||||||          S r   )_batch_inner_batch_outer)r  r   rq   r  out_dim_destsr  rB  r   s           r7   batchr  f  s4    
 3	=11!	aIw	$
& 
& &r9   c              '  <  K   t          j        || |          5 }t          j        | ||          5  t          j        d          5  ||g|R 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   d d d            n# 1 swxY w Y   |V  d S )Nr   rB  vmap)r   new_mainextend_axis_envr   transform_name_stack)r   rq   r  r  rB  r  ri  outss           r7   r  r  o  s{      }9^E E E HL		iD	9	9  088 3 3G.g..2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3
                             	*****sX   BA6AA6A""A6%A"&A6*B6A:	:B=A:	>BBBc              '     	K   t          |          r
 |            n|}|                                	t           	fd          }t          t	          t
          	|          ||          }|i fV }t          |          r
 |            n|}t          t	          t          	           t          t          |                    ||          }|V  d S )Nc                 d    t          t                     dt          j                              S r   )r   r  r   r   )rq   r   s   r7   r   z_batch_inner.<locals>.<lambda>~  s-    E9Y+?+?$4$<$>$>@ @ r9   )	callabler  r&   r   r   r   r   rangerU   )
rq   r  ri  r  r  rE   
in_tracersr   r  r   s
   `        @r7   r  r  z  s      !'**7GGIII'

 
 
"
"% @ @ @ @ @ 	A 	A#765#..AA*2~		$%-m%<%<O--///--5)44eCII6F6F}& &(.....r9   f_flatin_axes_flattuple[int | None, ...]out_axes_flat	tile_size
int | Nonec           
         t           dd            ddt          j        fd            } |t          | ||                    S )Nr   r+  c                    || S t          | j                  }|||         |z  g|||dz   <   |                     |          S r   rn   r[   reshape)argr   r*  r[   s       r7   	tile_axiszvtile.<locals>.tile_axis  sK    |jOOE#U4[I%=>E$tAv+;;ur9   c                    || S t          | j                  }||         ||dz            z  g|||dz   <   |                     |          S )Nrd   r  r.  )outr   r[   s      r7   untile_axiszvtile.<locals>.untile_axis  sQ    |jOOE+d1f56E$tAv+;;ur9   c               7     K   d t          |           D             }pt          |d           }|
J d            t           |          |           i fV }t          |          V  d S )Nc              3  :   K   | ]\  }}||j         |         V  d S r   rZ   )rW   re   r   s      r7   r   z.vtile.<locals>._map_to_tile.<locals>.<genexpr>  s,      WWDAqQWQZWWr9   zNo mapped arguments?)r*  )r    nextr   )	r!  r   
tile_size_outputs_flatr'  r)  r1  r*  r4  s	       r7   _map_to_tilezvtile.<locals>._map_to_tile  s      WWHY$E$EWWWE/d5$//J!!#9!!!YY<<<iVVXZZZZL
k<
7
777777r9   )r  )r   r+  )r%   r   transformationr  )	r&  r'  r)  r*  r   r  r:  r1  r4  s	    ```   @@r7   vtiler<    s     	   	5    8 8 8 8 8 8 8 8 8 
eiL-9V V V 
W 
W Wr9   c              '  p  	K   |                                  	t          |          r
 |            n|}t          ||          \  }}	fdt          ||          D             }|i fV }t	          	j        |          }t          d |D                       \  }}t          |          \  }}g ||R |fV  d S )Nc           	     d    g | ],\  }}|#t          ||t          j                              n|-S r   )r   r   r   )rW   re   r   r   s      r7   rY   z"batch_subtrace.<locals>.<listcomp>  sU     O O O.4a3? E1c+;+C+E+EFFF()O O Or9   c              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z!batch_subtrace.<locals>.<genexpr>  +      HHqquak2HHHHHHr9   )r  r#  r  r   r   r  r   r  )
ri  r  r  r%  r   r  r  r  ru   r   s
            @r7   r  r    s      

 
 
"
"%!'**7GGIII'('::'7O O O O8;GW8M8MO O O*2~		$E$d+++HHKHHHHH(H28<<,","""H,,,,,,r9   c                    t          d | D                       sg | fS t          j                    dfdfd| D             }d                                 D             }||fS )	Nc              3  B   K   | ]}t          |          t          u V  d S r   )rS   rx   rb  s     r7   r   z*indirectify_ragged_axes.<locals>.<genexpr>  s-      11qT!WW
"111111r9   rX   rx   r/   c           
     F   g }| j         D ]u\  }}                    t          t          j        |                    |t          j        t                              f          \  }}|                    ||f           vt          | j
        t          |                    S r   )rs   
setdefaultr4   r   r?  r   r   rU   rT   rx   rr   r^   )rX   r   rt   r4  r   dbidxaxis_maps         r7   canonicalize_segment_lengthsz=indirectify_ragged_axes.<locals>.canonicalize_segment_lengths  s    O() 3 3$_$$
T//
0
0BHS]]33
46 6ha k512222aneO&<&<===r9   c                T    g | ]$}t          |t                    r |          n|%S rB   r   rx   rW   rX   rG  s     r7   rY   z+indirectify_ragged_axes.<locals>.<listcomp>  O     A A A67Az**2**1---01A A Ar9   c                    g | ]\  }}|S rB   rB   )rW   r   r   s      r7   rY   z+indirectify_ragged_axes.<locals>.<listcomp>  s    2221!222r9   rX   rx   r/   rx   )re  collectionsOrderedDictvalues)rl  r  ru   rF  rG  s      @@r7   r  r    s    	11D111	1	1 t8O1<1H1J1J(> > > > > >A A A A;?A A A(22 1 1222,	x	r9   c                6    dfdfd| D             }|S )NrX   rx   r/   c                    g }| j         D ]N\  }}t          t          j        |                    }t	          |          }|                    ||f           Ot          | j        t          |                    S r   )	rs   r4   r   r?  _locate_valuerT   rx   rr   r^   )rX   r   rt   r4  r   r-  r  r  s         r7   rG  zTindirectify_ragged_axes_against_inputs_outputs.<locals>.canonicalize_segment_lengths  s}    O() 3 3$_t 1122cC(33ek512222aneO&<&<===r9   c                T    g | ]$}t          |t                    r |          n|%S rB   rI  rJ  s     r7   rY   zBindirectify_ragged_axes_against_inputs_outputs.<locals>.<listcomp>  rK  r9   rM  rB   )rl  r  r  r  rG  s    `` @r7   .indirectify_ragged_axes_against_inputs_outputsrU    s\    > > > > > > >A A A A;?A A A(	/r9   c                   t          |          D ].\  }}| t          |          k    rt          j        |          c S /t          |          D ].\  }}| t          |          k    rt          j        |          c S /J d            )NFzCould not find segment lengths)r   r4   r   InDBIdxOutDBIdx)r   r  r  ix	candidates        r7   rS  rS    s     ))  mb)
bmmZ^^  **  mb)
bmm[__ 00000r9   c                x     d |D              fd|D             }fdt                     D               |fS )Nc                `    h | ]+}t          |t                    |j        D ]\  }}|j        ,S rB   )r   rx   rs   r   )rW   rX   r   lengths_idxs       r7   r   z&resolve_ragged_axes.<locals>.<setcomp>  sU     
1 
1 
1a:a+D+D 
1"#-
1 
1q+ / 
1 
1 
1 
1r9   c           	         g | ]L}t          |t                    r3t          |j        t          fd |j        D                                 n|MS )c              3  <   K   | ]\  }}||j                  fV  d S r   )r   )rW   rt   r]  rk  s      r7   r   z1resolve_ragged_axes.<locals>.<listcomp>.<genexpr>  sO       J J7{K (ko)>? J J J J J Jr9   r   rx   rr   r^   rs   )rW   rX   rk  s     r7   rY   z'resolve_ragged_axes.<locals>.<listcomp>       
= 
= 
= 34Z:&&.*Q^ J J J J;<=J J J J JK K K -.
= 
= 
=r9   c                "    g | ]\  }}|v	|S rB   rB   )rW   r   re   idxss      r7   rY   z'resolve_ragged_axes.<locals>.<listcomp>  s"    	9	9	911D==!===r9   )r   )rk  rl  rc  s   ` @r7   r  r    sv    
1 
14 
1 
1 
1$
= 
= 
= 
= 8<
= 
= 
=$ 
:	9	9	9	$	9	9	9$	tr9   c                4      fdfd|D             }|S )Nc                    t          | t          j                  r| j                 S t          | t          j                  sJ | j                 S r   )r   r   rW  r   rX  )rE   r  r  s    r7   fetchz9resolve_ragged_axes_against_inputs_outputs.<locals>.fetch  sI    #rz"" SWR[)))))cgr9   c           	         g | ]L}t          |t                    r3t          |j        t          fd |j        D                                 n|MS )c              3  8   K   | ]\  }}| |          fV  d S r   rB   )rW   rt   r]  rf  s      r7   r   zHresolve_ragged_axes_against_inputs_outputs.<locals>.<listcomp>.<genexpr>  sR       J J7{K ({););< J J J J J Jr9   r`  )rW   rX   rf  s     r7   rY   z>resolve_ragged_axes_against_inputs_outputs.<locals>.<listcomp>  ra  r9   rB   )r  r  rl  rf  s   `` @r7   *resolve_ragged_axes_against_inputs_outputsri    sT         
= 
= 
= 
= 8<
= 
= 
=$ 
+r9   closed_jaxprcore.ClosedJaxprr  (tuple[int | NotMapped | RaggedAxis, ...]Atuple[core.ClosedJaxpr, tuple[int | NotMapped | RaggedAxis, ...]]c                D    t          | |t          |          |||          S r   )_batch_jaxpr2r^   )rj  rq   r  r   rB  r  s         r7   batch_jaxpr2rp    s)     
|Yg	%y
2 
2 2r9   4tuple[core.ClosedJaxpr, tuple[int | NotMapped, ...]]c                    t          j        t          j                             }t	          |          \  }}t          ||||          }t           fdt          | j                  D                       \  }}	fdt          |	|          D             }
t          j        ||
          \  }}}\   t          j        ||           |            fS )Nc                t    g | ]4\  }}t          |t                    rt          j        ||          n||f5S rB   )r   rx   handle_raggedin_avals)rW   r   rJ   rj  s      r7   rY   z!_batch_jaxpr2.<locals>.<listcomp>  sY     < < < #t 
C	$	$6mL)3555+.+< < <r9   c                Z    g | ]'\  }}|t           urt          j        ||          n|(S rB   r1  r   r   rW   rJ   br   rq   s      r7   rY   z!_batch_jaxpr2.<locals>.<listcomp>  sQ     > > >4 :%% !)Y4@@@+/> > >r9   )r   	wrap_initr   jaxpr_as_fun_batch_jaxpr_inner_batch_jaxpr_outerr   r   ru  
unsafe_zipr   trace_to_jaxpr_dynamicClosedJaxpr)rj  rq   r  r   rB  r  r   r  in_axes2avals_in	avals_in2	jaxpr_outr   constss   `` `          r7   ro  ro  
  s    	l4$\2233!"1i00+!XI~y'"$ $! < < < < 7L$9::< < < = =(H> > > > >(8<<> > >)  6q)DD)Q		)V	,	,hhjj	88r9   ru  list[core.AbstractValue]rJ   core.ShapedArraytuple[int, core.ShapedArray]c                    t          |j                  }|j        D ]+\  }}| |j                 j        j        |||j        |k     z
  <   ,|                    t          |                    }|j        |fS )NrZ   )	rn   r[   rs   r   rl   boundrr   r]   r^   )ru  r   rJ   r`   r   dbir3  s          r7   rt  rt  !  sx    4:) J Jfa,4SW,=,C,IIa3#a'())[[uY//[00(		8	##r9   c           	         t          |t                    rt          |          n|}t          | |t          |          ||||          S r   )r   rn   r^   _batch_jaxpr)rj  rq   
in_batchedr   r   rB  r  insts           r7   batch_jaxprr  )  sL    )+t<<	M{			+$	lIuZ/@/@$
< 
< <r9   c           	     N   t          |t                    s7t          |t          t          f          rt	          d |D                       sJ t          |t                    r|gt          | j                  z  }d |D             }d |D             }t          | ||||||          S )Nc              3  @   K   | ]}t          |t                    V  d S r   )r   r  rW   ry  s     r7   r   z_batch_jaxpr.<locals>.<genexpr>3  s,      77ajD!!777777r9   c                $    g | ]}|rd nt           S r   ra  r  s     r7   rY   z _batch_jaxpr.<locals>.<listcomp>6  s!    888!#QQ888r9   c                $    g | ]}|rd nt           S r  )zero_if_mapped)rW   r  s     r7   rY   z _batch_jaxpr.<locals>.<listcomp>7  s!    IIIT011.IIIr9   )r   r  rn   r^   r}  rU   	out_avalsbatch_jaxpr_axes)	rj  rq   r  r   r   rB  r  r  out_axes_dests	            r7   r  r  /  s    
[$
'
' 9
[4-
0
09
77;777
7
79 9 9 T"" >-#l&<"="==K88Z888'II[III-	,	7M#^Y
@ 
@ @r9   c           	     `    t          | |t          |          t          |          |||          S r   )_batch_jaxpr_axesr^   )rj  rq   r  r  r   rB  r  s          r7   r  r  ;  s2    	<E'NN //N$
& 
& &r9   c                   t          j        t          j        |                     }t	          |          \  }}t          |||          \  }}	t          ||||          }fdt          | j        |          D             }
t          j
        ||
          \  }}}\   t          j        ||           |	            fS )Nc                Z    g | ]'\  }}|t           urt          j        ||          n|(S rB   rw  rx  s      r7   rY   z%_batch_jaxpr_axes.<locals>.<listcomp>I  sV     S S S#D! DEJCVCVd Iq$???S S Sr9   )r   rz  r   r{  r|  _match_axes_jaxprr}  r~  ru  r   r  r  )rj  rq   r  r  r   rB  r  r   r  out_batchedr  r  r   r  s    `  `         r7   r  r  A  s     	l4$\2233!"1i00+!X$Q	=(KK.![I~y'"$ $!S S S S S'1,2G'Q'QS S S(6q(CC)Q		)V	,	,kkmm	;;r9   c              '  .  K   |                                 t          ||          \  }}fdt          ||          D             }|i fV }t          j        |          }t          d |D                       \  }}	t          |	||          }
||
fV  d S )Nc                @    g | ]\  }}|t          ||          n|S r   rw  )rW   r   r   r   s      r7   rY   z&_batch_jaxpr_inner.<locals>.<listcomp>R  sB     7 7 7C 14E3,,,S 7 7 7r9   c              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z%_batch_jaxpr_inner.<locals>.<genexpr>V  r@  r9   )r  r  r   r   r  r   rU  )rq   ri  r  r  r   r%  r   r  r  r  new_out_axesr   s              @r7   r|  r|  N  s      

 
 
"
"%"7G44*!W7 7 7 7 #GW 5 57 7 7*2~		$E$d+++HHKHHHHH(H?# #,,r9   c              '  x  K   |                                 }||g|R i fV } |            }d t          ||          D             }t          |          t          |          k    r|\  }|gt          |          z  }t          t	          t
          |j        |           |||          }d |D             }	||	fV  d S )Nc                D    g | ]\  }}|t           u r|t          u rd ndn|S r   )r  r1  )rW   rx  r|   s      r7   rY   z%_match_axes_jaxpr.<locals>.<listcomp>a  sR     H H HsC ^++  :--DD1114H H Hr9   c                    g | ]}|d uS r   rB   )rW   r|   s     r7   rY   z%_match_axes_jaxpr.<locals>.<listcomp>i  s    :::SD:::r9   )r  r~  rU   r   r   r  r   )
rq   r  r  ri  r  r  r   r  out_axis_destr  s
             r7   r  r  [  s       
 
 
"
"%',G,,b000(XZZ(H H#-h#F#FH H H- 	3x==(("NM"Oc(mm3MEOY??=(4 4(::M:::++r9   c              '    K   |d t          ||          D             \  }t          |          r
 |            n|}d t          ||          D             }t          j        || |          5 }t          j        | ||          5  ||g|R 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   |V  d S )Nc                @    h | ]\  }}|t           u|j        |         S rB   r  rd  s      r7   r   z%_batch_jaxpr_outer.<locals>.<setcomp>p  s,    VVVA!:BUBU!'!*BUBUBUr9   c                    g | ]>\  }}t          |t                    r"t          |t          j        |                    n|?S rB   )r   ry   r"   rk   r   )rW   re   r   s      r7   rY   z&_batch_jaxpr_outer.<locals>.<listcomp>r  s\     @ @ @B 3=R2E2E r271::...@ @ @r9   r  )r   r#  r~  r   r  r  )r   rB  rq   r  r  r  ri  r  s           r7   r}  r}  l  s      VVWg)>)>VVVJI!'**7GGIII'@ @",Wg">">@ @ @'}Y)$24 4 4 7;		iD	9	9  g000"444h
                            
 	.....s6   -B4BB4B!	!B4$B!	%B44B8;B8c                B    | |k    r| S | t           u r|S |t           u r| S | S r   ra  )re   ys     r7   _merge_bdimsr  {  s1    !VVHJHJHHr9   c                      e Zd ZdS )ZeroIfMappedNrN   rB   r9   r7   r  r    rO   r9   r  c              '    K   d t          ||dz            D             \  |                                 fdt          ||dz            D             }|i fV }d |D             }t          j        |          }t	          d |D                       \  }}t          |t          |          dz  g          \  }}	t          |t          |          dz  g          \  }
}t          t          |
|          }t          t          t          j
                  |
||          }t          t          t          j
                  |||	          }	||	z   |dz  fV  d S )Nc                @    h | ]\  }}|t           u|j        |         S rB   r  rd  s      r7   r   z,batch_custom_jvp_subtrace.<locals>.<setcomp>  s6     # # #$!Qz!! 71:!!!r9   r  c           	         g | ]X\  }}||nNt          |          t          u r(t          t          j        ||j                            nt          ||          YS r   )rS   r   r   r2  rJ   r   )rW   r   r   r{   r   s      r7   rY   z-batch_custom_jvp_subtrace.<locals>.<listcomp>  sv     ; ; ; C {99,, T-dCBBCCC2=eS#2N2N; ; ;r9   c                F    g | ]}t          t          |                    S rB   )r   r   rW   re   s     r7   rY   z-batch_custom_jvp_subtrace.<locals>.<listcomp>  s)    	K	K	K+8;;
<
<	K	K	Kr9   c              3  2   K   | ]}|j         |j        fV  d S r   r<  rp  s     r7   r   z,batch_custom_jvp_subtrace.<locals>.<genexpr>  r@  r9   )r   r  r   r  r   r!   rU   r  r   r  r   )ri  r  r  r%  r   r  r  r  out_primalsout_tangentsout_primal_bdsout_tangent_bdsr{   r   s               @@r7   r  r    s     # ##gw{";"; # # #%$

 
 
"
"%; ; ; ; ; !$GWq[ 9 9; ; ;* 2~		$ 
L	Kd	K	K	K$E$d+++HHKHHHHH(H(CMMQ4F3GHH+|$.x#h--1:L9M$N$N!./~??(WY>>#X= =+WY>>$h> >,l"HqL000000r9   c                *      fd}|S )Nc                 P   t                    r
             n}fdt          | |          D             } d t          | |          D             }t          t          j                            \  }}t          ||
          }t          ||	          } |j        |  S )Nc           	         g | ]E\  }}t          |          t          u r(t          t          j        ||j                            n|FS rB   )rS   r   r   r2  rJ   )rW   re   r   rq   s      r7   rY   z9batch_custom_vjp_bwd.<locals>.new_bwd.<locals>.<listcomp>  s_     / / /3 Aww,&& ))S!&AABBB,-/ / /r9   c                H    g | ]\  }}t          |          t          u rd n| S r   )rS   r   rd  s      r7   rY   z9batch_custom_vjp_bwd.<locals>.new_bwd.<locals>.<listcomp>  s@     1 1 1Aq Q<//Q 1 1 1r9   )r#  r   r  r   rz  r  _match_axes_and_sumcall_wrapped)rE  in_dims_bwd_out_dims_thunkr   rq   r  r  r  r  rB  s       r7   new_bwdz%batch_custom_vjp_bwd.<locals>.new_bwd  s    $W--:wwyyy7H/ / / /dH--/ / /D1 1h//1 1 1H)",s*;*;<<D.iHi&( (DtY	>,. .D4d##r9   rB   )r  r   rq   r  r  r  rB  r  s   ``````` r7   r  r    sG    $ $ $ $ $ $ $ $ $ $ $ 
.r9   c           	   '  |   K   |i fV }t          t          t          || |d           |            ||          V  d S )NT	sum_match)r   r   _matchaxis_symbolic_zeros)rq   r   r  r  r  r  s         r7   r  r    sp       B;(G-y)Y"$ $ $%3^%5%5}h	P 	P P P P P Pr9   Fc                R   t          |t          t          f          r||k    r|S t          |          t          |          cxk    rt          k    rBn n?t          j        |||j                  }t          t          j        ||||                    S |t          u r2|t          ur)t          t          j        ||||j                            S |t          u r*|r(t          t          j        |||j                            S t          | |||f          t          | |||||          S )Nr  )r   r   r   rS   ry   r   r2  rJ   r   r1  
ValueErrorr  )r   r   rS  rx  r|   re   r  rJ   s           r7   r  r    s$    D,'(( F
czzh	cd3ii	&	&	&	&3	&	&	&	&	&b#qv..d$$RsD99:::	
		s*44$$RsAF;;<<<	
		y	$"2sAF33444	1c3/000YCa9EEEEr9   .z"dict[core.Primitive, BatchingRule]rQ  zdict[core.Primitive, Callable]rV  rR  c                @    t          t          |           t          | <   d S r   )r   vectorized_batcherrQ  r  s    r7   defvectorizedr    s    $%7>>Tr9   c                    t          fddd          D                       s
J              | j        |i |d         fS )Nc              3  0   K   | ]}d          |k    V  dS )r   NrB   )rW   bd
batch_dimss     r7   r   z%vectorized_batcher.<locals>.<genexpr>  s,      ::RZ]b ::::::r9   rd   r   )r}  r~  )r  batched_argsr  r  s     ` r7   r  r    s\    	:::::abb>:::	:	:FFJFFF	L	+F	+	+Z]	::r9   c                @    t          t          |           t          | <   d S r   )r   broadcast_batcherrQ  r  s    r7   defbroadcastingr    s    $%6==Tr9   c                *   t          |          dk    sJ t          d t          ||          D                       \  t          fdt          ||          D                       r- | j        |i |}| j        r|ft          |          z  fn|fS d t          ||          D             }t          d |D                       fdt          ||          D             } | j        |i |}| j        r|dt          |          z  fn|dfS )	a[  Process a primitive with built-in broadcasting.

  Args:
    args: the possibly-batched arguments
    dims: list or tuple of the same length as `args`, where each
      entry indicates the batching state of the corresponding entry to `args`:
      either an int indicating the batch dimension, or else `not_mapped`
      indicating no batching.
  rd   c              3  @   K   | ]\  }}|t           u|j        |fV  d S r   r  rd  s      r7   r   z$broadcast_batcher.<locals>.<genexpr>  sB       , ,TQ
** WaL****, ,r9   c              3     K   | ];\  }}t          j        |          t          j        |j                  o|k    V  <d S r   )rk   r   r   definitely_equal_shaper[   )rW   re   rX   r   r[   s      r7   r   z$broadcast_batcher.<locals>.<genexpr>  s_       	4 	4Q

	4	$UAG	4	4	Ac 	4 	4 	4 	4 	4 	4r9   c                b    g | ],\  }}t          j        |          rt          ||d           n|-S r  )rk   r   bdim_at_frontrd  s      r7   rY   z%broadcast_batcher.<locals>.<listcomp>  sJ     ) ) )1 ')gajj7M!Q"""a ) ) )r9   c              3  >   K   | ]}t          j        |          V  d S r   )rk   r   r  s     r7   r   z$broadcast_batcher.<locals>.<genexpr>  s*      ((arwqzz((((((r9   c                8    g | ]\  }}t          ||          S rB   )_handle_scalar_broadcasting)rW   re   rX   r   s      r7   rY   z%broadcast_batcher.<locals>.<listcomp>  s*    PPP1'a33PPPr9   r  r   )rU   r7  r   r}  r~  r  max)r  rE  rl  r  r3  r   r   r[   s        @@@r7   r  r    sv    
TQ , ,St__ , , , , ,*% 	4 	4 	4 	4 	4t__	4 	4 	4 4 4 I $)T
$V
$
$C'+'<LC##c(("##3*L
) )D$) ) )D((4(((((DPPPPD$PPPD
$)T
$V
$
$C%)%:HCC!!aHr9   c           
         |t           u s| t          j        |          k    r|S t          j                            |t          t          t          j        |          |                               S r   )r1  rk   r   r	  r
  expand_dimsr^   r$  )ndre   rX   s      r7   r  r    sT    *__bgajj((H7q%bgajj"(=(=">">???r9   c                B    t          t          | |          t          | <   d S r   )r   reducer_batcherrQ  )r  idents     r7   
defreducerr    s    $_dEBBTr9   c           
        fd}|\  |\  }t          |t                    rt          t          j        t          j        ||          |t          j        |d                              } |||          }d|v rt          |j                  } | j	        fd|i||fS t          |t                    r|
J d            t          t          j        t          j        ||j                  |t          j        |d                              } |||j                  }g }	g }
|j        D ]B\  }}||v r|	                    ||f           !|
                     |||          |f           Ct          |t          |j        t          |	                               | j	        fd|i|}|t          j        ||
          fS J )Nc           	         t          t          t          j        t          j        j                  |                                         |                    S r   )ry   rn   rk   deletearanger   index)axesr   operands     r7   r  z!reducer_batcher.<locals>.out_axis  s?    tBIbi55t<<==CCDIIJJJr9   rd   input_shape)r  r  z5TODO Ragged batching a reduction requires an identity)r   ry   r^   rk   wherelessr  r  r[   r~  rx   rr   rs   rT   mask_ragged_axesr   r   )r  r  r  r  r  r  r  r   bdim_outaxes_to_maskragged_axes_outrt   r4  r   r  s                 @r7   r  r    s   K K K K K('
%$c "'$--tRVD!__EEFFDxd##HF666f49W2242622H<<$
## U"'$(9::D"&q//RRSSDxd/00H LO(,(8 O O$_			[/:;;;;{ ; ;_MNNNN
4#4eL6I6IJJL LGTYw44T4V44F?7<?KKKKLr9   r  	axis_specc                r    |j         D ].\  }}t          |j        ||ff          }t          | ||          } /| S r   )rs   rx   rr   _mask_one_ragged_axis)r  r  r  rt   r4  this_axis_specs         r7   r  r  &  sV     '0&; D D"k?+!? AC CN#GUNCCGG	.r9   c                   t          |j                  dk    s
J d            |j        d         \  }} || j                  }t          j                            d| j        |          }t          j                            |d          }t          j                            || j        |j	        g          }||k     }	t          j        
                    |	| t          j                            || j                            S )Nrd   z#Mask just one ragged axis at a timer   ri   )rU   rs   rl   r	  r
  broadcasted_iotar[   convert_element_typebroadcast_in_dimrr   select	broadcast)
r  r  r  rt   r4  r-  	positionsrF   limitsmasks
             r7   r  r  /  s    	Y"	#	#q	(	(	(*O	(	(	(!*!6q!9+
%

%g&&w{KK) G(('BB'7##w}y568 8&	V	$	gsw'8'8'N'N	O	OOr9   c                $   t          || j                  }t          |t                    rt	          | ||          |fS t          |t
                    r-t	          | |j        |          }||                    |          fS t          d|           )Nz"Unrecognized batch dimension type )	r"   r   r   ry   r#   rx   rr   r   r   )r  r   r|   r   s       r7   r   r   =  s    #w|,,#c AGT3'',,$
## Agt0#66F4))#....
???
@
@@r9   c           	     4   t          t          j        |                     }|                    ||           t	          t          j        t          j        t          |                    |                    }t          j	        
                    | ||          S r   )rn   rk   r[   insertr^   r  r  rU   r	  r
  r  )re   r   r   r[   broadcast_dimss        r7   r  r  I  sn    
rx{{

%,,tR29SZZ#8#8$??@@.		!	!!UN	;	;;r9   c                   |t           k    rt          |||          }|j                            |j        dd                    }t          t          j        dt          j        dt          j
        d                              |j        d         |          }t          ||          S 	 t          j        |          }n6# t          $ r)}	t          d|dt          |           d	          |	d }	~	ww xY w||k    r|S t          |          t          |          cxk    rt          k    rn nt!          |||          S |t"          u r=|t"          ur4t%          ||t'          |t          j        |          dz                       S |t"          u r|r|                    |          S t-          | t          j                  s#| t          j        urt3          d
| d|           t5          d d d           )Nrd   rZ   rh   rB   ri   r   zOutput from batched function z with type z is not a valid JAX typez"vmap has mapped output (axis_name=z) but out_axes is )r   r  rJ   r]   r[   r*   r   r2   rj   rk   rl   rI   r   r   rS   ry   r#   r1  r  r"   r   r   r   _TempAxisNamerg  r  r  )
r   r   rx  r|   re   r  r.   rJ   r   r   s
             r7   r  r  O  s   Kab!!AV]]]--FDHR!1"bhw6G6G!H!HIIGAJ( (D$??AaAA	 A A A
 9A 9 9Aww9 9 9 : :?@AA 	CZZHCyyDII$$$$$$$$$AsC   
jS
22Q-c271::>BBCCC
jY55::y$"455 -***U)UUPSUUVVV4t,,,s   *B? ?
C2	$C--C2c                      e Zd Zd ZdS )r  c                0    || _         || _        || _        d S r   )leaf_idxrx  r|   )r6   r  rx  r|   s       r7   r   zSpecMatchError.__init__k  s    DMDHDHHHr9   Nr   rB   r9   r7   r  r  j  s#            r9   r  c                X    |t           u rt          | |d          S t          | |d          S r   )r1  r  r#   )re   r   r{   s      r7   r  r  p  s1    	ZQa   AtQr9   c                h   |\  }}| \  }}||k    rt          ||          |fS |t          u r.t          ||j        |         |          }t          ||          |fS |t          u r.t          ||j        |         |          }t          ||          |fS t	          |||          }t          ||          |fS r   )r   r1  r  r[   r#   )r  r  bdxbdyre   r  s         r7   add_batchedr  w  s    (#s	$!QCZZq!c!!
j!QWS\3''Aq!c!!
j!QWS\3''Aq!c!!CAq!c!!r9   )r   rx   r   r   r/   rx   )r   ry   rr   ry   rs   r   r/   r   )r   r   r   r   r/   r   )rr   ry   r   r   r/   r   )r   r   r   r   rq   r   r   r   r   r   ru   r   r/   r   )
r   r   r   r   re   r   r   r   r/   r   )r   r   rq   r   r   ry   re   r   r   r   r/   r   )rq   r   r/   r   )r  rS   r  rS   r  rS   r   r   r   r   r  r  )r  rS   r/   r  )re   r   r/   r  )rT  r  r   r  r/   r  )
r  r   r   r   r  r  rB  r  r/   r   )r&  r   r'  r(  r)  r(  r*  r+  r   r   r  r  )rj  rk  rq   r   r  rl  r   r   rB  r   r  r  r/   rm  )rj  rk  rq   r   r  rl  r   r   rB  r   r  r  r/   rq  )ru  r  r   rx   rJ   r  r/   r  r   )r  r   r  rx   r/   r   )
__future__r   rN  collections.abcr   r   r   r@   	functoolsr   typingr   r	   numpyrk   r	  jax._srcr
   r   r   r   r   jax._src.ad_utilr   r   r   r   r   r   jax._src.corer   r   r   r   jax._src.interpretersr   r   jax._src.tree_utilr   r   r   jax._src.typingr   jax._src.utilr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r   
unsafe_mapr   r~  	dataclassr*   rD   rI   rM   r   ra   rf   rv   rx   r   r   r   r   r   r   r   r   r   r   r   ToEltHandlerFromEltHandlerMakeIotaHandlerr   r   r?   r   r  r  r  r  r  r  r  r  transformation_with_auxr%  rS   r.  r1  r   r   r|  r  r;  r  r  r<  r  r  rU  rS  r  ri  rp  ro  rt  r  r  r  r  r|  r  r}  r  r  r  r  r  r  r  r^   ry   BatchingRulerQ  rV  rR  r  r  r  r  r  r  r  r  r  r   r  r  	Exceptionr  r  r  rB   r9   r7   <module>r%     sG
   # " " " " " "     8 8 8 8 8 8 8 8 8 8                       



             % % % % % % & & & & & &: : : : : : : : : : : : : : : : C B B B B B B B B B B B 4 4 4 4 4 46 6 6 6 6 6 6 6 6 6 ! ! ! ! ! !> > > > > > > > > > > > > > > > > > > > > > > > > >
 CZCZ d###              $#  d###              $#  d###       $#
        jll& & &    V_.? @ @ @	8 	8 	8 d###% % % % % % % $#%0@ @ @ @R R R	1 	1 	1 	1	 	 	 	E E E E+2 +2 +2 +2^ 		
	"f*	69g>CD8XsG<iGHH:u,-   & -/ . . . .< < < <& 13  2 2 2 21 1 1 1 35  4 4 4 4? ? ? ? -/
 . . . .#
 $ $ $ $+ + + +4 4 4 4 0 0 0 DJJ	
5 5 5 5 5& 5 5 5nb% b% b% b% b% b% b% b%HM M M M AK8<& & & & &    
 
 
$ )3W W W W WD 
- 
- 
-     "
 
 
1 1 1    &2 2 2 2  9 9 9 9,$ $ $ $< < <
@ 
@ 
@& & & 
< 
< 
< 
 
 
                  1 1 1.  " P P PF F F F* 	#uS$eCI&6&; <<=
=>? ;=  < < < <:<  < < < <?A  A A A A? ? ?; ; ;> > >I I I:@ @ @C C C  >   P P P PA A A< < <- - - -6    Y        " " " %0 = ! ! !r9   