
    Vpf(                       d dl mZ d dl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 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZm Z m!Z!m"Z"  ej#        e$            ej#        e$           ej%        e&cZ&Z'ej(        e)cZ)Z*ej+         G d d                      Z, G d d          Z-d Z.d Z/d Z0d Z1d Z2d+d Z3d! Z4d" Z5d# Z6d$ Z7 e
j8        d%          Z9d&e9_:        e9;                    e4           e9<                    e6           e5ej=        e9<   e7ej>        e9<    ej?        e9            ej@        e9 ejA        e4d&'                     d( ZBd) ZCd* ZDdS ),    )annotations)CallableN)lax)api)core)custom_api_util)linear_util)source_info_util)traceback_util)	tree_util)util)flatten_fun_nokwargs)ad)batching
not_mapped)mlir)partial_eval)xla)tree_flattentree_maptree_structuretree_unflattentreedef_tuplec                  b    e Zd ZU ded<   ded<   d
dZej        ZddZe	j
        d             Zd	S )custom_vmapr   funzCallable | None	vmap_rulec                L    t          j        | |           || _        d | _        d S N)	functoolsupdate_wrapperr   r   )selfr   s     X/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/jax/_src/custom_batching.py__init__zcustom_vmap.__init__6   s'    T3'''DHDNNN    returnc                    || _         |S r    )r   )r#   r   s     r$   def_vmapzcustom_vmap.def_vmap=   s    DNr&   c                >   |rJ t          |          \  }}t          t          j        | j                  |          \  }}d |D             }t          j        | j        ||dd          }t          j        |||          \  }	}
}\   t          j	        t          j
        |	          d          }t          t          |          |f          }| j        J t          j        g ||R |t!          | j                  | |            d}t#           |            |          S )Nc                Z    g | ](}t          j        t          j        |                    )S  )r   raise_to_shapedget_aval).0xs     r$   
<listcomp>z(custom_vmap.__call__.<locals>.<listcomp>F   s-    JJJ1$T]1%5%566JJJr&   Fr   r,   callrulein_treeout_tree)r   r   lu	wrap_initr   pe
debug_infotrace_to_jaxpr_dynamicr   ClosedJaxprconvert_constvars_jaxprr   r   r   custom_vmap_pbind
ClosedRuler   )r#   argskwargs	args_flatr5   flat_funr6   in_avalsdebugjaxpr_constsclosed_callout_flats                 r$   __call__zcustom_vmap.__call__A   s1   %d++Iw-bl48.D.DgNNHhJJ	JJJHM$(GXumLLE4XxOOE1fb"2#=e#D#DbIIK^F33W=>>G>%%%! 76 7I 7 7'2'1$.'A'A*1+38::	7 7 7H
 ((**h///r&   N)r   r   )r   r   r'   r   )__name__
__module____qualname____annotations__r%   r   forward_attr__getattr__r)   r   api_boundaryrL   r,   r&   r$   r   r   1   s|         ---   
  ,+    0 0 0 0 0r&   r   c                       e Zd Zd Zd Zd ZdS )r@   c                >    t          j        | |           || _        d S r    )r!   r"   r4   )r#   r4   s     r$   r%   zClosedRule.__init__Y   s     T4(((DIIIr&   c                    |\  }}|\  }}t          t          j        |                    r
J |            t          | j        |||          S r    )anyr   tree_leaves	call_ruler4   )r#   	axis_sizeall_in_batchedall_argsrH   rA   consts_batched
in_batcheds           r$   rL   zClosedRule.__call__]   sR    GAt!/NJ9(8899II>IIITY	:t<<<r&   c                *    t          | j                  S r    )strr4   )r#   s    r$   __str__zClosedRule.__str__c   s    ty>>r&   N)rM   rN   rO   r%   rL   ra   r,   r&   r$   r@   r@   X   sA          = = =    r&   r@   c                P    t          |           t          u r| nt          |           S r    )typelist)xss    r$   ensure_listrf   f   s"    Bxx4T"XX-r&   c                $    t          | dd          S )NrM   z<unnamed rule>)getattr)r4   s    r$   	rule_nameri   i   s    	z#3	4	44r&   c                0     | |t          |          g|R  S r    )rf   )r4   rZ   r^   rA   s       r$   rY   rY   l   s$    	iZ00	84	8	8	88r&   c                    ||k    r%t          dt          |            d| d|           ||k    r%t          dt          |            d| d|           d S )NzZstructure of output value and output batching specification returned by custom vmap rule (z) do not match.
Output values: z
Batching spec: z2structure of output returned by custom vmap rule (zL) does not match that of original custom-vmapped function.
Original output: z
Rule output: )
ValueErrorri   )r4   original_out_treer6   out_batched_trees       r$   check_vmap_rule_treesro   o   s    !!!
	- )$	- 	-"	- 	- +	- 	-. . .
 """
	#Yt__ 	# 	#-	# 	# !	# 	#$ $ $ #"r&   c                D    |t           u r| S t          j        | |d          S Nr   )r   r   moveaxis)r0   bdims     r$   maybe_bdim_at_frontrt   ~   s&    	ZH=D!$$$r&   flu.WrappedFunc                   t          j        |           \  } }t          j        | |||t           j        d           }  | j        | }| |            fS r    )r   batch_subtrace_batch_outer
BatchTracecall_wrapped)ru   in_axes	axis_namerZ   rA   out_axesoutss          r$   vmap_unrestrictedr      sW    '**+!XAy)W$/7 7!		$	xxzz	r&   c                6    ~~~ t          j        |           | S r    )r   jaxpr_as_fun)r3   r4   r5   r6   rA   s        r$   custom_vmap_implr      s!    
GX	 	4	 	 $	''r&   c               v   ~d t          | |          D             \  }t          t          | |          } d |D             }t          ||           }t          ||          }	t	          |||	|          \  }
}t          |
          \  }}t          |          \  }}t          ||||           d |D             }||fS )Nc                2    h | ]\  }}||j         |         S r    )shape)r/   r0   ds      r$   	<setcomp>z'custom_vmap_batching.<locals>.<setcomp>   s#    MMMtq!q}
}}}r&   c                     g | ]}|t           uS r,   r   r/   r   s     r$   r1   z(custom_vmap_batching.<locals>.<listcomp>   s    777QQj(777r&   c                $    g | ]}|rd nt           S )r   r   )r/   bs     r$   r1   z(custom_vmap_batching.<locals>.<listcomp>   s!    DDDa)11zDDDr&   )zipmaprt   r   rY   r   ro   )rC   dimsr3   r4   r5   r6   rZ   flat_in_batchedrA   r^   outout_batched	flat_outstree1flat_out_batchedtree2flat_out_dimss                    r$   custom_vmap_batchingr      s    
MMs9d';';MMM*)%y$77)77$777/		+	+$g77*tY
DAA#{!#&&)U(55Ehu555DD3CDDD-	M	!!r&   c                    | j         S r    )	out_avals)r3   rE   rH   s      r$   custom_vmap_abstract_evalr      s
    	r&   c                  fd}t          t          j        |          }t          j        |dgt	          |           z  d          \  }}t          ||f          }	t          f          }
t          j        g | |R |||	|
d}t	          |          dz  dk    sJ t	          |                      t          j	        |t	          |          dz  g          \  }}||fS )Nc                    ! |\  }}t          t          j        ||          t          d ||          }t          d ||          }t          j                     t          ||f          \  }}	t          ||fd           \  }
}|	|k    sJ ~  "#fd!!fd}t          t          j        |          |	          \  }}t          |g|R |
t          j
         d\  }}t          t          |          d          \  }}|rJ |d |         ||d          }}|d |         ||d          }}t          t          ||          }d	 |D             }t          t          ||          }d
 |D             }t           |            g ||          \  }}t           |            g ||          \  }}t          t          j         j        |          }t          t          j         j        |          }||f||ffS )Nc                    | r|sdnd S rq   r,   pbtbs     r$   <lambda>z;custom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.<lambda>       B/Kr/Kqqt r&   c                    |r| sdnd S rq   r,   r   s     r$   r   z;custom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.<lambda>   r   r&   c                
    | d u S r    r,   )r0   s    r$   r   z;custom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.<lambda>   s
    !t) r&   )is_leafc                     t          |           \  }}t          t          |          t          |                                         |           |S r    )rY   ro   r   store)primalsr   r   rZ   mutually_batchedout_mutually_batchedr6   r4   s      r$   to_jvpz9custom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.to_jvp   sc    "44DgNNc;
.--~k/J/JL L L  ---jr&   c                0    t          j        | |          S r    )r   jvp)r   tangentsr   s     r$   to_vmap_over_extra_batched_dimszRcustom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.to_vmap_over_extra_batched_dims   s    WVWh///r&   )r|   r}   rZ      c                     g | ]}|t           uS r,   r   r   s     r$   r1   z=custom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.<listcomp>        N N N*!4 N N Nr&   c                     g | ]}|t           uS r,   r   r   s     r$   r1   z=custom_vmap_jvp.<locals>.jvp_of_rule_rule.<locals>.<listcomp>   r   r&   )r   operatorand_r7   Storer   r   r8   r   r   no_axis_namedivmodlenr   rt   r   or_val)$rZ   r^   r   r   in_batched_psin_batched_tsextra_batched_psextra_batched_ts
flat_ps_ts
tree_ps_tsflat_extra_batched_ps_tstree_ps_ts2r   $to_vmap_over_extra_batched_dims_flat	out_tree2flat_out_ps_tsflat_out_axesnraggedflat_out_psflat_out_tsflat_out_axes_pflat_out_axes_tflat_out_extra_batched_psflat_out_extra_batched_tsout_psout_tsout_extra_batched_psout_extra_batched_tsout_batched_psout_batched_tsr   r   r   r6   r4   s$   `                              @@@r$   jvp_of_rule_rulez)custom_vmap_jvp.<locals>.jvp_of_rule_rule   s   #- M=}mLL K K -}> > K K -}> > 8::)7H*=>>J
,8	+,##-% -% -%)k $$$$        0 0 0 0 0 7K
4557 73() %6,%:/9%: %:(#y%: %: %:!NM
 s>**A..IAv-bqb1>!""3EK'4RaR'8-:K_O);HHK N No N N N);HHK N No N N N#	1{1[13 3NFF1?	M0M3LM2O 2O.. *.0DF FN*.0DF FN Fnn===r&   Tr2   r   r   )
r   r   instantiate_zeros	jvp_jaxprr   r   r>   r?   r   
split_list)r   r   r3   r4   r5   r6   r   jvp_callrH   jvp_in_treejvp_out_treer   out_primalsout_tangentss      ` `        r$   custom_vmap_jvpr      s   ;> ;> ;> ;> ;> ;>z %x00(TD6CLL#8$??+(Aw011+(344,		 
2
2
2 
2*L
2 
2 
2$ 
TQ!			SYY			"odSYY!^4DEE+|	l	""r&   custom_vmap_callT)multiple_resultsc                R    t          d | |          }t          d | |          }||fS )Nc                    | r|nd S r    r,   lr0   s     r$   r   ztree_split.<locals>.<lambda>  s    1.aa$ r&   c                    | rd n|S r    r,   r   s     r$   r   ztree_split.<locals>.<lambda>  s    a.ddQ r&   r   )masktreelhsrhss       r$   
tree_splitr     s5    ..d;;#..d;;#	c/r&   c                (    t          d | ||          S )Nc                    | r|n|S r    r,   )r   x_lx_rs      r$   r   ztree_merge.<locals>.<lambda>
  s    Q&7ccC r&   r   )r   lhs_treerhs_trees      r$   
tree_merger   	  s!    	77(
, 
, ,r&   c                J     t                       j         fd            } S )Nc                    ~ fd}t          t          |                    \  }t          j        ||          }t	          d |          }||fS )Nc                0    t          |           } | S r    )r   )mapped_argsrA   
bcast_argsru   r^   s     r$   to_mapz-sequential_vmap.<locals>.rule.<locals>.to_map  s    
K<<dQXor&   c                    dS )NTr,   )rH   s    r$   r   z/sequential_vmap.<locals>.rule.<locals>.<lambda>  s    T r&   )r   rd   r   r   r   )	rZ   r^   rA   r   r   r   r   r   ru   s	    `     @r$   r4   zsequential_vmap.<locals>.rule  st           )T$ZZ@@K
'&+
&
&C>>3//Kr&   )r   r)   )ru   r4   s   ` r$   sequential_vmapr     s:    !nn!:
 
 
 
 :
 
(r&   )ru   rv   )E
__future__r   collections.abcr   r!   r   jaxr   jax._srcr   r   r   r	   r7   r
   r   r   r   jax._src.api_utilr   jax._src.interpretersr   r   jax._src.interpreters.batchingr   r   r   r9   r   jax._src.tree_utilr   r   r   r   r   register_exclusion__file__safe_mapr   
unsafe_mapsafe_zipr   
unsafe_zipregister_custom_decorator_typer   r@   rf   ri   rY   ro   rt   r   r   r   r   r   	Primitiver>   r   def_impldef_abstract_evalprimitive_batchersprimitive_jvps register_initial_style_primitiveregister_lowering	lower_funr   r   r   r,   r&   r$   <module>r     s   # " " " " " $ $ $ $ $ $                        $ $ $ $ $ $ & & & & & & % % % % % % # # # # # #             2 2 2 2 2 2 $ $ $ $ $ $ * * * * * * 5 5 5 5 5 5 & & & & & & 4 4 4 4 4 4 % % % % % %? ? ? ? ? ? ? ? ? ? ? ? ? ? $  #H - - - ! !( + + + -Z-Z /0 0 0 0 0 0 0 0/0L       . . .5 5 59 9 9$ $ $% % %   ( ( (
" " "   H# H# H#V 122!%    ' ( ( (    9 : : :-A M *#2 -   $ $] 3 3 3  }ndnt'- '- '- . . .  
, , ,    r&   