
    vhi                       U d dl mZ d dlZd dlmZ d dlZd dlZd dlmZ d dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z* d dl+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z= d dl>Z?d Z@d!ZAd"ZB ej                  eD       e*j                  ZFeFj                  ZHe*j                  ZIe*j                  ZJej                  eLcZLZMej                  eOcZOZP e
j                  eR      ZSd#ZTd$ ZU ej                         dSd%       ZWd& ZXeZY G d' d(ej                        Z[ e[       Z\d(e]d)<   ej                  d*        Z_ G d+ d,      Z`e`ZadTd-ZbdUd.Zc ed       Zed/e]d0<   ej                  dVd1       Zgej                  	 	 	 	 dWd2       ZhdVd3ZidXd4ZjdYd5ZkdZd6Zld[d7Zmd\d8Znd]d9Zod^d:Zpd_d;Zq G d< d=ej                        Zsd> Ztd`d?Zudad@Zv ej                         dA        Zw ej                  dBC       G dD dE             ZydF Zz	 	 	 	 	 	 dbdGZ{	 	 	 	 	 	 dcdHZ| ej                  dI      Z~dBe~_        e~j                  e|       dJ Ze~j                  e       dK Z eej                  e~      ej
                  e~<   eej                  e~<   dL Zeej                  e~<   dM Z e j                  e~edNO        e j                  e~edPO       dQ Z e j                  e~e       dR Zee!j                  e~<   y)d    )annotationsN)Sequence)partial)Any)api)array)	basearray)config)core)dtypes)lib)pjit)traceback_util)util)
xla_bridge)array_types)ad)batching)mlir)pxla)xla)InternalFloatingPointError)DeviceLocalLayoutFormat)
xla_client)AbstractMeshMesh)record_scalarrecord_event_duration_secsrecord_event_time_span)PartitionSpec)Sharding)NamedShardingSingleDeviceShardingTransferToMemoryKindGSPMDShardingis_single_device_sharding)
SourceInfoz&/jax/core/compile/jaxpr_trace_durationz//jax/core/compile/jaxpr_to_mlir_module_durationz*/jax/core/compile/backend_compile_durationFc                    t        | fi |}t        j                  j                  d      }	  || }t        j                  j                  |       |S # t        j                  j                  |       w xY w)zEImpl rule that compiles and runs a single primitive 'prim' using XLA.F)xla_primitive_callabler   jax_jit#swap_thread_local_state_disable_jit)primargsparamsfunprevoutss         L/opt/face_recognition/venv/lib/python3.12/site-packages/jax/_src/dispatch.pyapply_primitiver4   T   sb    t.v.# 
	8	8	?$::DKK33D9	+ KK33D9s   A !A4c                     t        j                  d        fd} j                  |_         j                  |_        d|_        t        j                  |      S )N!xla_primitive_callable_cache_missc                 ~    t        j                  d      5   j                  | i cd d d        S # 1 sw Y   y xY wNF)r
   eager_constant_foldingbind)r.   r/   r-   s    r3   prim_funz(xla_primitive_callable.<locals>.prim_func   s9    		&	&u	- (TYY''( ( (s   3<T)r   
test_eventname__name____qualname___apply_primitiver   jit)r-   r/   r;   s   `` r3   r*   r*   `   sF    //56( ii())("(		    c                B    | j                  t        t        |              y N)def_implr   r4   )r-   s    r3   simple_implrF   l   s    --./rB   c                  \    e Zd ZU dZded<   ded<   d Z	 	 	 	 	 	 ddZddZdd	Zd
 Z	d Z
y)RuntimeTokenSetzJSee docstring for effects.py module for the calling convention for tokens.zdict[core.Effect, core.Token]current_tokenszdict[Device, RuntimeToken]output_runtime_tokensc                     i | _         i | _        y rD   rI   rJ   selfs    r3   __init__zRuntimeTokenSet.__init__|       D!#DrB   c           	        | j                   j                  |t        j                  dt        j                              }t        |t        j                        r3t        j                  |t        t        |d      t        d                  S t        j                  |      }t        j                  t        j                   |gd gd g|g      d         }|| j                   |<   |S )Nr   x)rI   getnpzerosbool_
isinstancer   Tokenr   
device_putr#   r   r!   r&   get_replicatedr   
shard_args)rN   effdevicestokssharded_toks         r3   get_token_inputzRuntimeTokenSet.get_token_input   s     


!
!#rxx288'<
=C#tzz"
 ^^
}T'3/s1CDF F
 	$$W-A**T__aS4&4&3%HKLK*DrB   c                "    || j                   |<   y rD   )rI   )rN   r\   tokens      r3   set_token_resultz RuntimeTokenSet.set_token_result   s    $DrB   c                "    || j                   |<   y rD   )rJ   )rN   devicerc   s      r3   set_output_runtime_tokenz(RuntimeTokenSet.set_output_runtime_token   s     */Dv&rB   c                     i | _         i | _        y rD   rL   rM   s    r3   clearzRuntimeTokenSet.clear   rP   rB   c                    | j                   j                         D ]  }|j                           | j                  j                         D ]  }|j                           | j	                          y rD   )rI   valuesblock_until_readyrJ   ri   )rN   rc   s     r3   rl   z!RuntimeTokenSet.block_until_ready   s_    $$++-   ++224   JJLrB   N)r\   core.Effectr]   zlist[Device]return
core.Token)r\   rm   rc   ro   )rf   Devicerc   RuntimeToken)r>   
__module__r?   __doc____annotations__rO   ra   rd   rg   ri   rl    rB   r3   rH   rH   q   sK    R 0/ 43$'3(%/$rB   rH   runtime_tokensc                 ,    t         j                          y rD   )rv   rl   ru   rB   r3   wait_for_tokensrx      s    ""$rB   c                  *    e Zd Zg dZdddZd Zd Zy)LogElapsedTimeContextManager)fmtfun_nameevent
start_timeNc                .    || _         || _        || _        y rD   )r{   r|   r}   )rN   r{   r|   r}   s       r3   rO   z%LogElapsedTimeContextManager.__init__   s    DHDMDJrB   c                    t        j                          | _        | j                  -t        | j                  | j                  | j                         y y )Nr|   )timer~   r}   r   r|   rM   s    r3   	__enter__z&LogElapsedTimeContextManager.__enter__   s9    iikDOzz
**doo rB   c                $   t         ry t        j                         }|| j                  z
  }t        j                  j
                  rt        j                  nt        j                  }t        j                  |      r;t        j                  || j                  j                  | j                  |             | j                  Pt!        | j                  || j                         t#        | j                  | j                  || j                         y y )N)r|   elapsed_timer   )_on_exitr   r~   r
   log_compilesvalueloggingWARNINGDEBUGloggerisEnabledForlogr{   formatr|   r}   r   r    )rN   exc_type	exc_value	tracebackend_timer   log_prioritys          r3   __exit__z%LogElapsedTimeContextManager.__exit__   s    yy{Hdoo-L&,&9&9&?&?7??W]]L<(jjtxx==|  /  = >zz 
**lT]] 
**doox$--	 rB   rD   )r{   strr|   r   r}   z
str | None)r>   rr   r?   	__slots__rO   r   r   ru   rB   r3   rz   rz      s    8)
rB   rz   c                    |dk(  r| dkD  S y)Ntpui  Fru   )num_argsplatforms     r3   should_tuple_argsr      s     d?rB   c                    | j                   D ]  }||j                  j                  v s y t        j                  |       D ]  }t        ||      s y y)zCWhether there is a primitive given by user anywhere inside a Jaxpr.TF)eqns	primitiver=   r   	subjaxprsjaxpr_has_primitive)jaxpr	prim_nameeqnsubjaxprs       r3   r   r      sV    ZZ cCMM&&& ..' h8Y/ 
rB   zset[core.Primitive]%prim_requires_devices_during_loweringc                    | j                   D ]  }|j                  t        v s y t        j                  |       D ]  }t        |      s y y)NTF)r   r   r   r   r    jaxpr_has_prim_requiring_devices)r   r   r   s      r3   r   r      sO    ZZ c
}}== ..' h'1 
rB   c                   ddl m} g }| j                  D ]0  }|j                  t        j
                  u rx|j                  d   }t        |t              rt        |j                  t              rZt        |j                  |j                  j                        |j                  |f       |j                  t        j                  u rzt        |j                  |j                  j                        |j!                  fd|j                  d   D               |j!                  fd|j                  d   D               .|j                  |j"                  u r|j                  d   t        t              rgt        |j                  |j                  j                        |j!                  fd	g |j                  d
   |j                  d   D               |j                  t$        u st        |j                  |j                  j                        |j!                  fd|j                  d   D               3 t'        j(                  |       D ]  }|j!                  t+        |              |S )Nr   )	shard_mapshardingc              3  &   K   | ]  }|f 
 y wrD   ru   ).0isource_infos     r3   	<genexpr>z-get_intermediate_shardings.<locals>.<genexpr>  s     Fa![!F   in_shardingsc              3  &   K   | ]  }|f 
 y wrD   ru   )r   or   s     r3   r   z-get_intermediate_shardings.<locals>.<genexpr>  s     Ga![!Gr   out_shardingsmeshc              3  :   K   | ]  }t        |      f  y wrD   )r#   )r   specr   r   s     r3   r   z-get_intermediate_shardings.<locals>.<genexpr>  s'      R  d+[9 Rs   in_specs	out_specsc              3  ^   K   | ]$  }t        |t              r|j                  |f & y wrD   )rW   r"   memory_kind)r   r_   r   s     r3   r   z-get_intermediate_shardings.<locals>.<genexpr>  s2      Kaq(+0I [! Ks   *-r]   )jax._srcr   r   r   r   sharding_constraint_pr/   rW   r#   r   r   r(   r   r=   appendpjit_pextendshard_map_pdevice_put_pr   r   get_intermediate_shardings)r   r   outr   r_   r   r   r   s         @@r3   r   r      s    !
#ZZ Kc
}}222
**Z
 a	A}	%*QVV\*Js0B0BCk	jj![!"	$++	%s0B0BCk	jjF3::n+EFF	jjG3::o+FGG	)//	/ZZd	D,	's0B0BCk	jj RPszz*5P

;8OPR R	,	&s0B0BCk	jj K3::i+@ K K)K, ..' 5hJJ)(345	*rB   c           	         t        d | j                  D              xs: t        d t        j                  | gt	        j
                  |             D              S )Nc              3     K   | ]W  }t        |j                  t        j                        r1t	        |j                  j
                        t        j                  u  Y y wrD   )rW   avalr   UnshapedArraytypedtypebint)r   vs     r3   r   z"jaxpr_has_bints.<locals>.<genexpr>  sA      9!AFFD$6$67 166<< DII- 9s   AAc              3     K   | ]p  }|j                   D ]_  }|j                  D ]N  }t        |j                  t        j
                        r(|j                  j                  D ]  }t        |        P a r y wrD   )r   outvarsrW   r   r   DShapedArrayshape_is_bint_axis_size)r   jer   ds        r3   r   z"jaxpr_has_bints.<locals>.<genexpr>  s      NvvNqyyN"#AFFD$5$56N <= !# N# N# N# Ns   A6A8)anyinvars	itertoolschainr   r   r   s    r3   jaxpr_has_bintsr     sT    
 9u|| 9 9 N
 N wu0EFN NOrB   c                |   t        | t        j                        r3| j                  rJ t	        | j
                        t        j                  u S t        | t        j                        rUt        | j                  t        j                        xr/ t	        | j                  j
                        t        j                  u S yr8   )
rW   r   DArrayr   r   r   r   Varr   r   )r   s    r3   r   r     s{    4;;ww;=DII%%!TXXqvvt001 ,$))+-	rB   c                    t        | t        j                        s1t        j                  |       st	        d|  dt        |        d      y y )N
Argument '
' of type z is not a valid JAX type.)rW   r   Tracervalid_jaxtype	TypeErrorr   )args    r3   	check_argr   )  sM    
S$++
&$*<*<S*A
jZS	{ ;    ! ! +B
&rB   c                L    t        t        t        | j                        d      S )zThe number of replicas needed for a jaxpr.

  For a eqn, multiply the `axis_size` with the `jaxpr_replicas` of the
  subjaxprs. For a list of eqns, take the maximum number of replicas.
     default)max
unsafe_map_eqn_replicasr   r   s    r3   jaxpr_replicasr   /  s     
Zuzz2A	>>rB   c                    | j                   j                  d      }|r(| j                   j                  dd      t        |      z  S | j                  t        j
                  v rt        | j                         S y)N
call_jaxpr	axis_sizer   )r/   rS   r   r   r   initial_style_primitives!_initial_style_primitive_replicas)r   r   s     r3   r   r   9  sZ    zz~~l+*::>>+q)N:,FFF
}}444,SZZ88rB   c                h    t        t        j                  t        |       j	                         d      S )Nr   r   )r   r   traverse_jaxpr_paramsr   rk   )r/   s    r3   r   r   B  s*    	T''?FFH
 rB   c                 n    t         j                  j                  xs t         j                  j                  S rD   )r
   
debug_infsr   
debug_nansru   rB   r3   needs_check_specialr   F  s%    				 	 	;F$5$5$;$;;rB   c                V    t               r|D ]  }t        | |j                  |        y y rD   )r   _check_specialr   )r=   bufsbufs      r3   check_specialr   I  s,     +T399c*+ rB   c                   t        j                  |t        j                        rt        j
                  j                  rGt        j                  t        j                  t        j                  |                  rt        | d      t        j                  j                  rHt        j                  t        j                  t        j                  |                  rt        | d      y y y )Nnaninf)r   
issubdtyperT   inexactr
   r   r   r   isnanasarrayr   r   isinf)r=   r   r   s      r3   r   r   N  s    ubjj)266"((2::c?*C#D&tU33266"((2::c?*C#D&tU33 $E *rB   c                  r    e Zd Z ej                         Z ej                         Z ej                         Zy)CopySemanticsN)r>   rr   r?   enumautoALIASCOPYDONATEru   rB   r3   r  r  U  s)    
$))+%	$499;&rB   r  c                    | S rD   ru   )rR   s    r3   _identity_fnr  Z  s    	
(rB   c           	     D   | j                          | j                  }t        |t              sJ |t        j
                  k(  rdnd }|j                  |j                  k(  r" t        j                  t        ||      |       S |j                  rd }n@ t        j                  |j                  j                  t        g      |j                        }t        |j                   j"                  j%                  |j                   j&                        |j                   j(                        }t        ||j*                  |j,                  |d nt/        |j1                                     }t3        | |t        j4                        } t        j                  t        ||      |      S )Nr   r   donate_argnums)otypes)r   _logical_device_ids)_check_if_deletedr   rW   r#   r  r  _device_assignmentr   rA   r  is_fully_replicatedrT   	vectorizeindexintr   r   r]   reshape
axis_sizes
axis_namesr   r   tupletolist_reorder_shardsr  )	rR   target_shardingcopyinp_shardingr  permute_ordernew_meshnew_snew_xs	            r3   _different_device_order_reshardr(  ]  sh   ,	L-	00	0 4 441$.$$(J(JJ2377<"02235 5 %%M0BLL!C!C!I!I*-00<0O0OQM""**<+<+<+G+GH""$( !!/J/J#0#84!-"6"6"89<% !UM$7$7
8%
/_-
//4
6 6rB   c                b    t        j                  |g      d   }t        j                  | ||      S )zGReorders array shards to match the order indicated by the new sharding.r   )r   to_xc_copy_semanticsxcreorder_shards)rR   r&  copy_semanticsxc_copy_semanticss       r3   r   r   x  s1    //0@A!D			1e%6	77rB   c                   t        j                         }t        j                         dk(  sb|j                  dvsT|j                  dk(  r|j                  j                  d      r*|j                  dk(  r|j                  j                  d      sy|j                  j                  |j                  j                  k7  ry|j                  |       |j                  |       k7  ry|j                  j                  |j                  j                  k7  S )z<Returns True if src->dst is a supported cross-host transfer.r   >   gpur   r0  cudar   zTFRT TPUF)
r   get_backendprocess_countr   platform_version
startswith_internal_device_listdevice_kind_to_xla_hlo_shardingprocess_indices)ndimsrc_shardingdst_shardingbackends       r3   !_is_supported_cross_host_transferr>  ~  s     ""$'
  A%)9)9)O


e
#G,D,D,O,OPV,W


e
#G,D,D,O,OPZ,[((44((445''-''-. 
,
,
<
<

,
,
<
<= >rB   T)frozenc                  J    e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   d Zy)_DeferredShardArgzDeferred call to `pxla.shard_args`.

  Per-array impls return this object instead of a result array to indicate a
  deferred `shard_args` call. `_batched_device_put_impl` then batches all
  `_DeferredShardArg` objects into a single `shard_args` call.
  r   rR   r"   r_   zcore.AbstractValuer   bool	committedr  r-  c                x     t        j                  | j                  | j                  | j                        |      S rD   )r   global_aval_to_result_handlerr   r_   rC  )rN   shard_arg_results     r3   result_handlerz _DeferredShardArg.result_handler  s4    +4--		4664>>++;= =rB   N)r>   rr   r?   rs   rt   rG  ru   rB   r3   rA  rA    s)     	&+/=rB   rA  c                D
   ddl m} t        |t              r|}t	        | dd       |k(  r"t	        | dd      r|t
        j                  k(  r| S |j                  sht        | t        j                        rN| j                  sB|j                  | j                  j                  k(  rt        |t              sJ t        | ||      S |j                  rt        | t        j                        r| j                  rt|j                  dkD  re|j                  | j                  j                  k7  rB|j                  | j                  j                  k(  rt        |t              sJ t        | ||      S t        | t        j                        ri| j                  r]t!        | j"                  | j                  |      r<t%        j&                  | g|j                  g|gt)        j*                  |g            d   S |j                  st        | t        j                        r| j                  s|j                  | j                  j                  k7  r| j                  j,                  D cg c]  }|j.                   }}| j                  j,                  d   j0                  j3                         }|j,                  D cg c]  }|j.                   }	}|j,                  d   j0                  j3                         }
t5        d| d| d	|	 d|
 d
	      t        | t        j                        r| j                  r,t7        |       t8        v st7        |       t:        j<                  v rnt?        j@                         tC        |j                  jD                        k(  r+|jG                  | t7        |        dt7        |        d       tI        | ||d|      S t5        d| d      tI        | ||d|      S t        | t        j                        r| j                  st5        d| jK                                |8|t
        j                  k(  r| S tI        | | j                  || jL                  |      S tO        | j                        rx|| j                  j,                  d   n|}|t
        jP                  k(  r%t%        jR                  |tU        |      | g|gdd      S t)        jR                  |tU        |      | g|g      S tU        |t)        jV                         n|      }tI        | |||d u|      S c c}w c c}w )Nr   )multihost_utilsr   
_committedFr   zFor a cross-host reshard in multi-controller JAX, input and target sharding should have the same set of devices. Got input's device set ids: z on platform z' and target sharding's device set ids: z.

There is experimental support for cross-host transfers with different device sets, when input/output shardings have the same indices and layouts, in the TFRT TPU runtime only.zc passed to device_put is not the same on each process. Make sure you are passing the same value of z on each process.)fail_messageTzjdevice_put's second argument must be a Device or a Sharding which represents addressable devices, but got zF. Please pass device or Sharding which represents addressable devices.zZdevice_put's first argument must be a fully addressable array, but got value with devices ),jax.experimentalrI  rW   r"   getattrr  r  is_fully_addressabler   	ArrayImpl
device_setr   r(  num_devicesr6  rJ  r>  r:  r+  +batched_copy_array_to_devices_with_shardingr   r*  r  idr   upper
ValueErrorr   r   r   python_scalar_dtypesr   r3  lenr9  assert_equalrA  r]   rC  r'   r  batched_device_putr$   get_default_device)rR   r   rf   r"  rI  r_   r   inp_idsinp_plat
target_idstarget_platshs               r3   _device_put_sharding_implr`    s{   .!A:t$)gau.MM'''h""1eoo&q/E/E	

---8$$$,Q488	:a#A	1==1#4	1::#C#CC	

---8$$$,Q488 	1eoo&1<<-affajj!D;;#''(1#

#
#TF
+--.0 0 !! Q
(1G1Gllajj333!"!>!>?A144??::003<<BBD$%$8$89qadd9
9**1-66<<> 	xj 9  *|= FAAB 	B a)!,,
q'[
 DGv/J/J$J ##%Q-D-D-T-T)UU

&
&!WI 1gY/1 ' 3
 !AtT488667S 9<<= = Q4t44 5??#!!$$%IIK=23 3 ~	$$	$ AJJakk4HH	"1::	.39>qzz,,Q/vf	##	#$$T+?+G!&,XtT; 	;$$T+?+G!&,X/ / %~ !33539;"	1b$d(:D	AAu @9s   T+Tc          	     ~   t        |t              st        |t              rt        d      	 t        j                  |       }t        |t              r1|}|j                  }t        | d      r| j                  j                  nd }|$|j                  t        | ||j                  |      S t        |j                  t              rt        |t        t        d       f      st        d| d|j                                t!        | dd       |k(  r"t!        | d	d
      r|t"        j$                  k(  r| S ||t        | ||j                  |      S  t'        j(                  t*        ||t"        j,                  k(  rdnd       |       S t        | |||      S # t
        $ r!}t        d|  dt        |        d      |d }~ww xY w)NzTransferToMemoryKind argument to jax.device_put can only be used inside jax.jit. If you are using device_put outside jax.jit, then please provide a concrete Sharding with memory_kind.r   r   z is not a valid JAX typer   zVsharding and device_local_layout in `Layout` instance should be concrete. Got layout: z for input layoutrJ  Fr   r  )rW   r%   rU  r   abstractifyr   r   r   device_local_layouthasattrr   r   r`  r"   r   	str_shortrM  r  r  r   rA   r  r  )	rR   rf   srcr"  r   errldllx_dlls	            r3   _device_put_implrl    s    -.*+
	@A A
NAD
 A


C,3Ax,@AHH((dE
{qzz)&q$

DAAqzz8,s.T
;<$$%3k$..2B1CEF F 	8T"a'GA|U,K###h}&q$

DAAF377A!]%9%99tFFGI I 
#1dFD	991 
 N

QCz$q'*BCEJMNNs   F 	F<F77F<c                Z   g }g g g g f\  }}}}t        t        || ||            D ]  \  }	\  }
}}}t        |
|||      }t        |t              rb|j                  |	       |j                  |j                         |j                  |j                         |j                  |j                         |j                  |        |ret        j                  |d gt        |      z  ||      }t        ||      D ]1  \  }	}t        ||	   t              sJ ||	   j                  |      ||	<   3 |S )N)rf   rg  r"  )	enumerateziprl  rW   rA  r   rR   r_   r-  r   r[   rW  rG  )r]   srcsr-  xsysdsa_indicesdsa_xsdsa_shardingsdsa_copy_semanticsr   rR   rf   rg  cpyshard_arg_resultsrF  s                    r3   _batched_device_put_implrz  2  s4   
 
";=r2r>8+v}&8!*3r7D.+Q!R a	!VS"6s<A!&'mmACC133 0 01IIaL 
 vF7K(:FD";0AB 510111e""#34be5 
)rB   rY   c                    |S rD   ru   )r]   rp  r-  rq  s       r3   _device_put_abstract_evalr|  T      	)rB   c                  d gt        |       z  }g }t        t        | |||            D ]<  \  }\  }}	}
}t        |      t        j
                  us'|j                  |||	|
|f       > |rt        t        |       \  }}}}}g }|D ]  }|t        j                  k(  rt        d      |t        j                  k(  r |j                  t        j                         T|t        j                  k(  sJ |j                  t        j                          t        j                  |||t        |      d}t        ||      D ]
  \  }}|||<    |S )Nztdonate=True is not allowed during tranposition of device_put. Please file an issue if you want this to be supported.)r]   rp  r-  )rW  rn  ro  r   r   Zeror   listr  r  rU  r  r  r   r:   r  )ctsr]   rp  r-  _resultsdp_argsr   ctrf   rg  rw  indicesr.   new_copy_semanticsrr  rx  s                    r3   _device_put_transposer  X  sW   FSX''"+CWdN,S"T /a	"fc2BxrwwnnaVS"-./ 37W3F0GT7D. 	6	}##	#FG 	G $$$!!-"4"45]'''''!!-"4"45	6 
		D$W*/0B*C
EBGR  1gaj	.rB   c                    |D cg c]  }|t         j                  us| c}rt        fddd  D              sJ |       t        j                  | i ||fS c c}w )Nc              3  .   K   | ]  }d    |k(    yw)r   Nru   )r   bdmapped_batch_dimss     r3   r   z&_device_put_batcher.<locals>.<genexpr>u  s!      &%'b &s   r   )r   
not_mappedallr   r:   )batched_args
batch_dimsr/   r  r  s       @r3   _device_put_batcherr  s  st    $.Pb"H<O<O2OrP# &+<QR+@& #  
 
		L	3F	3Z	??	 Qs
   AAc          	           j                   j                  r|S  fd}t        t        ||| j                   j
                              S )Nc                   t        |t        t        f      r|j                  t        |t              rt        j
                  j                  r2t        j                  | ||j                  |j                              } n?t        j                  | ||j                  |j                        j                               } t        j                  | |j                  |      } | S | S rD   )rW   r"   r%   r   r
   use_shardy_partitionerr   r   wrap_with_sharding_op_to_sdy_shardingr:  r8  to_protowrap_with_memory_kind)rR   rf   r   out_avalctxs       r3   lowerz+_tpu_gpu_device_put_lowering.<locals>.lower  s    6H&:;<&	FH	%((..((1h%%dii02! ((1h))$))4==?A! 
$
$Q(:(:H
EahHrB   )module_contextall_default_mem_kindr  mapavals_in	avals_out)r  r]   rp  r-  rq  r  s   `     r3   _tpu_gpu_device_put_loweringr  {  s@     	,,I 
c%WcllCMMB	CCrB   r   )r   r0  c                   |S rD   ru   )r  r]   rp  r-  rq  s        r3   _common_device_put_loweringr    r}  rB   c                    g }| D ]E  }t        |t        t        f      r|j                  |j                         5|j                  d        G |S rD   )rW   r"   r%   r   r   )r]   rp  r-  xmmemory_kindsrf   s         r3   _propagate_mem_kind_dpr    sP    ,  f&8%9:;&,,-$	 
 
rB   )r-   zcore.Primitive)r   r  r   r   rn   rB  )r   
core.Jaxprr   r   rn   rB  )r   r  rn   rB  )r   r  rn   z%Sequence[tuple[Sharding, SourceInfo]])r   zcore.AxisSizern   rB  )r   r   )r   r  rn   r  )r   zcore.JaxprEqnrn   r  )r/   zdict[str, Any]rn   r  )rn   rB  )r=   r   r   zSequence[basearray.Array]rn   None)r=   r   r   znp.dtyper   zbasearray.Arrayrn   r  )r"  r  )r-  r  )rf   !Device | Sharding | Format | Nonerg  r  r"  r  )r]   +Sequence[Device | Sharding | Format | None]rp  r  r-  zSequence[CopySemantics])
__future__r   atexitcollections.abcr   dataclassesr	  	functoolsr   r   r   	threadingr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   jax._src.abstract_arraysr   jax._src.interpretersr   r   r   r   r   jax._src.api_utilr   jax._src.layoutr   r   jax._src.libr   r+  jax._src.meshr   r   jax._src.monitoringr   r   r    jax._src.partition_specr!   jax._src.shardingr"   jax._src.sharding_implsr#   r$   r%   r&   r'   jax._src.stagesr(   numpyrT   JAXPR_TRACE_EVENTJAXPR_TO_MLIR_MODULE_EVENTBACKEND_COMPILE_EVENTregister_exclusion__file___xlaxeClientBackendrp   CompileOptionssafe_mapr  r   safe_zipro  
unsafe_zip	getLoggerr>   r   r   r4   cacher*   rF   rq   localrH   rv   rt   registerrx   rz   log_elapsed_timer   r   setr   weakref_lru_cacher   r   r   r   r   r   r   r   r   r   r   Enumr  r  r(  r   r>  	dataclassrA  r`  rl  rz  	Primitiver   multiple_resultsrE   r|  def_abstract_evalr  
linear_jvpprimitive_jvpsprimitive_transposesr  primitive_batchersr  register_loweringr  r  memory_kind_propagate_ruleru   rB   r3   <module>r     s    #  $                 #   0 $ * & & % 8 5 ) , a a 1 &  '  = N D  ! ! !( +WW
))	""--Z--Z			8	$ 
  0 5ioo 5n #2"3 3% % B 0  >AU %': B  ? @O!?<+
4DII 
668 > >0 d#= = $=&]B@$:3$:	*$:2?$:N8 6 ,	< t~~l+ $    . /   8 90 #*"--"F  , (=   %@ -@  L )D,   ,u>   ,u>   |%@ A 1G   -rB   