
    uki,                       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 d dlmZmZ d dlmZmZmZmZmZ d dlm Z m!Z!m"Z" d dl#m$Z% d dl&m'Z' ejP                  j                  Z)ee*cZ*Z+ee,cZ,Z-ed"d       Z.d#dZ/ed$d       Z0d%dZ1d Z2ed        Z3 ejh                  d      Z5de5_6         ejn                  e5       d Z8e5js                  e8       d Z: ejv                  e5e:       d Z<e<ejz                  e5<   d Z>e>ej~                  e5<   d Z@e@ej                  e5<   	 	 	 	 	 	 	 	 	 	 	 	 d&dZB eej                  deB      ej                  e5<   ed         ZEd! ZFeFej                  e5<   y)'    )annotations)contextmanager)partial)Sequence)config)
xla_client)dispatch)core)linear_util)adbatchingmlirpartial_eval)tree_flattentree_unflatten)safe_mapsafe_zipweakref_lru_cacheunzip2
split_list)
debug_infoflatten_fun_nokwargsflatten_axes)func)irc              #  6  K   | d  y t         j                  j                  |       }	 |%|t        j                  ur| |k7  rt        d|       |  t         j                  j                  |       y # t         j                  j                  |       w xY ww)NzaNesting `compute_on` with different compute types is not supported yet. Current compute_on type: )r   compute_on_context_manager
swap_local
config_extunsetNotImplementedError	set_local)c_typeprevs     N/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/compute_on.pyextend_compute_typer&   &   s     ^	
		*	*	5	5f	=$6D
(8(88Vt^,,0634 4 L
%%//5F%%//5s   'B+A5  B5!BBc                N    | dvr!| j                  d      st        d|  d      y y )N>   devicedevice_hosttpu_sparsecoregpu_stream:zInvalid compute type z]. Current supported values are `device_host`, `device`, `tpu_sparsecore`, and `gpu_stream:#`.)
startswith
ValueError)r#   s    r%   _check_validr.   7   sF    ??.

x (M 	MN N / @    c              #     K   t        | t              st        d      t        |        t	        |       5  d  d d d        y # 1 sw Y   y xY ww)Nz6`compute_on`'s compute_type argument must be a string.)
isinstancestr	TypeErrorr.   r&   )compute_types    r%   
compute_onr5   >   sC     	L#	&
L
MM|<( 
	
 
 
s   2AA	AAANc               D    t        ||      | fdS t        | fi S )N)r4   out_memory_spacesc                    t        | fi S N)_compute_on2)gkwargss    r%   <lambda>zcompute_on2.<locals>.<lambda>J   s    \!.v. r/   )dictr:   )fr4   r7   r<   s      @r%   compute_on2r@   G   s+    \=NO&Y..	a	"6	""r/   c                     fd}|S )Nc                     t        d
| i       }t        |       \  }}t        d |D              }t        
|||      \  }}t	        d|      }t        j                  ||	t        |      d}t        ||      S )Nr5   c              3  F   K   | ]  }t        j                  |        y wr9   )r
   shaped_abstractify.0xs     r%   	<genexpr>z0_compute_on2.<locals>.wrapped.<locals>.<genexpr>Q   s     CAT,,Q/C   !zcompute_on out_memory_spacesjaxprr4   r7   )r   r   tuple_trace_to_jaxprr   compute_on_pbindr   )argsdbg	args_flatin_treein_avalsrK   out_treeout_memory_spaces_flat	outs_flatr4   r?   r7   s            r%   wrappedz_compute_on2.<locals>.wrappedN   s    
\1dB
/C%d+IwCCCH%a7C@OE8)&2CE!!	%l 679I (I..r/    )r?   r4   r7   rX   s   ``` r%   r:   r:   M   s    
/ 
.r/   c                    t        j                  | |      }t        ||      \  }}t        j                  ||      \  }}}t        j                  ||       |       fS )Nr   )lu	wrap_initr   petrace_to_jaxpr_dynamicr
   ClosedJaxpr)	funrT   rS   rQ   r?   rU   rK   _constss	            r%   rM   rM   [   sU    ll33'!$Q0+!X..q(;%F			%	((*	44r/   r5   Tc                    t        | j                  |      D cg c]  \  }}|j                  |       c}}S c c}}w )N)memory_space)zip	out_avalsupdate)rK   r4   r7   rT   ass         r%   _compute_on_abstract_evalrk   g   s=    %//+<=
?a (((
" 
? ? 
?s   :c               <   t        j                  |j                        }t        |      \  }}|D 	cg c]'  \  }}	t	        j
                  || j                  |	      ) }
}}	g || j                  }t	        j                  d|| j                  t        |      || j                  | j                        \  }}}|j                  j                  }t	        j                  |      }|D cg c]  }| j                  j!                  |       }}g | j"                  ||
|}t%        j&                  |t(        j*                  j!                  |      t	        j,                  |            }|j/                  d      rRt(        j0                  j!                  |j3                  d      d         t(        j0                  j!                  d      d}n4dt(        j0                  j!                  t	        j4                  |            i}t(        j6                  j!                  |      |j8                  j:                  d	<   t	        j<                  |j>                  |      }tA        |t        |      g      \  }}| j                  jC                  t	        jD                  tG        ||                  }| jI                  |       tG        || j                  |      D cg c]0  \  }}}t	        jJ                  |t        jL                  |      |      2 c}}}S c c}	}w c c}w c c}}}w )
N)const_loweringavalr5   r+   :   false)_xla_stream_annotation
inlineable_xla_compute_typezmhlo.frontend_attributes)'r
   jaxpr_const_argsrK   r   r   ir_constantrm   avals_inlower_called_computationmodule_contextlen	avals_out	tokens_innamevalueflatten_ir_typesgetdim_var_valuesfunc_dialectCallOpr   FlatSymbolRefAttrflatten_ir_valuesr,   
StringAttrsplitmap_compute_typeDictAttr	operation
attributesunflatten_ir_values_like_typesresultsr   update_tokensTokenSetrf   set_tokens_outwrap_with_memory_kindmem_space_to_kind)ctxrK   r4   r7   rP   const_args_and_avals
const_argsconst_avalscrn   const_arg_valuesrT   func_opoutput_typeseffectssymbol_nameflat_output_typesefftokenscall	dict_attr	out_nodes
tokens_outonout_avalomss                             r%   _compute_on_loweringr   m   s   ..u{{;"#78*k *+
!T q););$G+ + +{*S\\*(#'#@#@E3--s:	mmS]]$$ '< ""+++L9.56sCMMc"6&6	A3	A	A)9	AD	A$			--11+>
T"
$$ ]+ " 1 1,2D2DS2I!2L MMM%%g.I 	R]]..t/D/D\/RSI ;=++//):T$..6711$,,M) S\N;&)}}**4==Wf9M+NO*Z #&y#--AR#S
U 
Ub(C 
$
$R)?)?)Dh
O 
U U?+ 7*
Us   ,L("L5Lc               l    t        j                  || |      \  }}t        j                  ||||d}||fS NrJ   )r   batch_jaxpr2rN   rO   )		axis_datavals_indims_inrK   r4   r7   batched_jaxprdims_outoutss	            r%   _compute_on_batcherr      sB    $11%GL-			G=(4->
@$ 
xr/   c                  |D cg c]  }t        |t        j                          }}t        j                  ||d      \  }}|D cg c]  }t        |t        j                        r|! }	}g |t	        ||      D 
cg c]
  \  }
}|s	|
 c}}
}t        j                  g | |	|||d}|d t        |       |t        |      d  }}t        |      }t	        |j                  |      D cg c]5  \  }}|rt        |      n"t        j                  |j                               7 }}}t        |d       J ||fS c c}w c c}w c c}}
w c c}}w )NFrJ   )r1   r   Zero	jvp_jaxprrf   rN   rO   rz   iterrg   nextto_tangent_aval)primalstangentsrK   r4   r7   tnzs	jaxpr_jvpout_nzsnz_tangentsrj   nz
spaces_jvpr   primals_outnz_tangents_outnz_outsrn   tangents_outs                      r%   _compute_on_jvpr      s^   -56Z277#	#6#6||E36)W$CqJq"'',BC+CI" I!$%6!@G2B!GI*			 
9G 
9k 
9(4-7
9$ "&ms7|!4d3w<=6I+!'"%eoow"?AdB $&$w-27743G3G3I+JJ A, A	gt		$$	$	l	"" 	7CGAs#   "D?E'E?
E	
E	0:Ec                  t        j                  || d      \  }dgt              z  dgt              z  z   }t	        j
                  |j                  |d      \  }t	        j                  |      t        d t        |      D              t        j                  |||d}|j                  D 	cg c]  }	|	j                          c}	fd}
|||
fS c c}	w )NFTc              3  ,   K   | ]  \  }}|s	|  y wr9   rY   )rF   rj   r   s      r%   rH   z"_compute_on_lin.<locals>.<genexpr>   s     J51brQJ   
rJ   c                   |D cg c]  }t        |t        j                        r|! }}t        g | |      D cg c]
  \  }}|s	| }}}t	        j
                  |d}t        |      }t              D 	
cg c]'  \  }	}
|	rt        |      nt        j                  |
      ) }}	}
t        |d       J |S c c}w c c}}w c c}
}	w r   )r1   r   r   rf   rN   rO   r   r   )r   r   r   r   rG   uinputsr   nz_outs_r   ri   r   r4   	jaxpr_linr   
spaces_lintangent_avals_outused_inputss               r%   compute_on_linz'_compute_on_lin.<locals>.compute_on_lin   s    &EjBGG.D1EKE 8' 8K 8+FLDAq!aLFLy-92<>G G}HW&78:A !DNbggaj0 :D :$'''K FL
:s   CC
C
C,C)r   r   rz   sumr^   	dce_jaxprrK   close_jaxprrL   rf   rN   rO   rg   r   )r   rK   r4   r7   r   r   lin_outs
jaxpr_lin_r   ri   r   r   r   r   r   r   s     `        @@@@@r%   _compute_on_linr      s    ||E36)WWs7|#tfs7|&;;(LL(EJ*knnZ()JC(97$CJJ*!!7%/;4EG+ 5:OODqq((*D
 
 
gw	66 Es   :C$c                   t        j                  ||d         \  }}	t        |g |	t        j                  j
                  g|z        }
t        |
d         t        |d   j                        k(  sJ t        j                  ||d         \  }}t        |t        |            }t        |d         t        |d   j                        k(  sJ |
|fS )Nr7   )r7   rK   )	r^   partition_listr>   r
   MemorySpaceDevicerz   rg   rL   )unks_ininst_inkept_outs_knownkept_outs_stagednum_res_out
num_res_inparams_knownparams_stagedrb   out_memory_spaces_knownnew_params_knownout_memory_spaces_stagednew_params_stageds                r%   ._compute_on_partial_eval_custom_params_updaterr      s   
  "00|$78 :!C1 C++223kAC
 23
4
l7#--
./ 0 / !# 1 1&9:!<!67  34
5
mG$..
/0 1 0	,	,,r/   rK   c                    d  fd} j                   j                  j                         }t        j                  t        j                  ||      |      \  }}}t        j                  ||      j                  fS )Nc                      y r9   rY   rY   r/   r%   r=   z"_transpose_jaxpr.<locals>.<lambda>   s    r/   c                    t        |       \  }}t        j                  j                  dj                  ||      }|D cg c]   }t        |t        j                        s|nd " }}t        |      \  }_        |S c c}w )NF)	r   r   backward_passrK   rc   r1   r   r   rU   )	in_flat
primals_incts_inoutctcts_outcellrS   rK   s	         r%   
transposedz$_transpose_jaxpr.<locals>.transposed   su    '9J


5;;u||Z
PCAD
E2ZBGG,2$6
EC
E)#.GT]N Fs   %A>r[   )
rK   r   with_unknown_namesr^   r_   r\   r]   r
   r`   rU   )	rK   rT   rS   r   rQ   trans_jaxprrb   rc   r   s	   ` `     @r%   _transpose_jaxprr      sj    	$ 	113#44ll:#.:+q&			+v	.	==r/   c                  t        || f      \  }}t        d |D              }t        |||      \  }}	|D 
cg c]Q  }
t        |
t        j
                        r|
j                  j                  nt        j                  |
      j                  S }}
t        |	|j                        }t        d t        ||      D              }t        j                  ||||d}t        |	|      S c c}
w )Nc              3  F   K   | ]  }t        j                  |        y wr9   )r
   typeofrE   s     r%   rH   z(_compute_on_transpose.<locals>.<genexpr>   s     3a4;;q>3rI   c              3  ,   K   | ]  \  }}|s	|  y wr9   rY   )rF   rG   rj   s      r%   rH   z(_compute_on_transpose.<locals>.<genexpr>   s     CTQqCr   rJ   )r   rL   r   r1   r   UndefinedPrimalrn   re   r
   r   r   rg   rf   rN   rO   )r   rK   r4   r7   r   r   rS   rT   r   rU   rG   	in_spacescts_out_trans_spacesr   s                  r%   _compute_on_transposer      s    !:v"67'73733(*5(GD+x9CE45 '1B4F4F&Gqvv""KKN//0 E) EHk&;&;<(CS9%=CC,wk+70<>' 
'	**Es   AC$)r#   z
str | None)r#   r2   )r4   r2   r9   )r   Sequence[bool]r   r  r   r  r   r  r   intr   r  )H
__future__r   
contextlibr   	functoolsr   typingr   jax._srcr   jax._src.libr   r	   r
   r   r\   jax._src.interpretersr   r   r   r   r^   jax._src.tree_utilr   r   jax._src.utilr   r   r   r   r   jax._src.api_utilr   r   r   jax._src.lib.mlir.dialectsr   r   jax._src.lib.mlirr   _xlar   map
unsafe_maprf   
unsafe_zipr&   r.   r5   r@   r:   rM   	PrimitiverN   multiple_resultssimple_implrk   def_abstract_evalr   register_loweringr   fancy_primitive_batchersr   primitive_jvpsr   primitive_linearizationsr   $closed_call_partial_eval_custom_rulepartial_eval_jaxpr_custom_rulesr   r   primitive_transposesrY   r/   r%   <module>r     s   # %    #   & H H ;' ' L L ;  __##
CZCZ 6 6 N 
 
# 5 5 t~~l+ $    \ "?   8 9#UJ   |%9 : 3F ! !, /#  #2  , 7. -<  L )--&4-#-7E- - #&-6 B33W:<  " "< 0 > >+ )>   %r/   