
    [Th,q                        S SK r S SKrS SKrS SKrS SKJrJrJr  \(       a  S SKrS SK	J
r
  O\r
S SKrS SKJs  Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S/r\R<                  " \5      r \RB                  RE                  \S5      r#S\RH                  S\\%   4S jr&S\RH                  S\S   4S jr'\" SS9 SS\S\
S\%S\(SS4
S jj5       r)g)    N)AnyOptionalTYPE_CHECKING)ShapeEnv)fx)is_sparse_any)compatibility)lazy_format_graph_code)py_sym_types)SymNode)GraphModuleinsert_deferred_runtime_asserts
graph_codenodereturnc                     SU R                   ;   a  U R                   S   $ SU R                   ;   a  U R                   S   $ g)zl
Get the example value key for a node, since dynamo uses "example_value"
while non-strict export uses "val.
example_valuevalN)metar   s    V/var/www/auris/envauris/lib/python3.13/site-packages/torch/fx/passes/runtime_assert.py_get_example_valuer   "   s=    
 $))#yy))	$))	yy    
sympy.Exprc                 p    [        U 5      n[        U[        5      (       a  UR                  R                  $ g N)r   
isinstancer   r   expr)r   r   s     r   _get_sym_valr   /   s*    
T
"C#|$$xx}}r   T)is_backward_compatiblegm	shape_envnameexportc                   ^ ^#^$^%^&^'^(^)^*^+^,^-^.^/^0^1^2^3^4^5^6^7^8^9^:^;^< SSK m:SSKJm+  SSKJm(Jm$Jm.Jm%Jm&J	m1J
m'Jn  SSKJm5  SSKJnJn  SSKJn  UR&                  R)                  5       m7T R*                  m3[,        R.                  R1                  T35      m;[2        R5                  S[7        S	U 3T S
S95        0 m0[9        5       nSn	T3R:                   H(  m6T6R<                  S:w  a  T6n	  OUR?                  T65        M*     S[,        R@                  S[B        4U(U:4S jjn
Sm<T3R:                   H)  m6ST6RD                  ;   a  Sm<  OST6RD                  ;   d  M)    O     S.S[F        R,                  R@                  S[H        [J           S[H        [L        [J        [N        4      SS4U<4S jjjm*[9        5       m-[9        5       m/U(       a  UOUm#U#U,4S jm,SSS[B        4U:4S jjm)U(U)U*U+U,U-U/U0U1U U3U74S jn[Q        T3R:                  5      n[S        USS 5       GH  u  m4m6T3RU                  T6U;  a  UT4S-      OU	5         T6U;   a  [W        T65      =nb  U*U+U0U U:U;4S jnU" UU64S j5        [Y        U=n[F        RZ                  5      (       a  [S        UR]                  5       5       H  u  m4nU" UU3U4U64S j5        M     [_        U5      (       dN  [S        URa                  5       5       H  u  m4nU" UU3U4U64S j5        M     U" URc                  5       U3U64S  j5        T6U	:X  a  U" T7Re                  S/ 5      5        T6Rf                  [F        Rh                  [F        Rj                  Rl                  Rn                  Rp                  4;   a  T6Rr                  S   S
:X  d.  [u        T6Rr                  S   5      =nT0;   d  Ub  T)" U5      (       av  T6Rr                  S   nT R*                  Rw                  T65        [Y        U[,        R@                  5      (       a,  URx                  (       d  T R*                  Rw                  U5        OT-R?                  U5        T6R<                  S:w  Ga  [u        T65      =m9Gb  U0U94S! jnU" UT6RD                  R{                  S"0 5      5      m8T8c   eU0U84S# jnT9T0;   d  U
" T65      (       a  U" 5       (       d  U" 5       (       d  U
" T65      (       ad  T+" T [|        R~                  " T*T6RD                  R{                  S5      T6RD                  R{                  S5      S$95         T," T0T95      T0T9'   SSS5        T0T9   R                  nT6R                  U5        T R*                  Rw                  T65        [        R5                  S%T6UT95        OYT9T0;  aS  [Y        T9T:R                  T:R                  R                  R                  45      (       d  [,        R                  " T6T;S&9T0T9'   T6Rf                  [F        Rj                  Rl                  R                  Rp                  [F        Rj                  Rl                  R                  Rp                  4;   a  T R*                  Rw                  T65        / nU" UT6RD                  R{                  S"5      5      =n(       a  UR                  5        Hv  u  nnUR                  U5        U$U%U&U'U.U2U34S' jm2UT0;  d  M+  T+" T T*5         [,        R                  " T2" T6U5      T;S&9T0U'   SSS5        [        R5                  S(UT0U   5        Mx     U GH  nT7Re                  U/ 5      nUT/;   a  M  UUR                  ;   a  U(       aM  T3R                  [F        Rj                  Rl                  R                  Rp                  T0U   R                  45        O.T3R                  [F        R                  T0U   R                  45        UR                  U   nUR                  (       a4  UR                  [        R                  S-
  :X  a  U" UR                  T55      nUR                  5       R                  U5      (       Gd  U54S) jnT0U   R                  Rf                  T.:w  Gaj  T+" T [|        R~                  " T*T6RD                  R{                  S5      T6RD                  R{                  S5      S$95         U" UR                  5      =nbt  T," T0UU:  5      R                  nT3R                  [F        Rj                  Rl                  Rn                  Rp                  US*UU:   S+U S,345        T-R?                  UU:  5        U" UR                  5      =nbt  T," T0UU:*  5      R                  n T3R                  [F        Rj                  Rl                  Rn                  Rp                  U S*UU:*   S+U  S,345        T-R?                  UU:*  5        SSS5        T/R?                  U5        U" U5        GM     SSS5        GM     T0R                  5        H  u  n!n"[Y        U!T:R                  5      (       d  M#  U"R                  R<                  S:w  d  M?  U"R                  Rx                  (       a  M\  [        R5                  S-U!5        T R*                  Rw                  U"R                  5        M     g! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN
= f! , (       d  f       GM  = f)/a  
During tracing, we may have discovered that some data-dependent values
had runtime assert on them; e.g., torch.empty(x.item()) induces a runtime
that x.item() >= 0.  This asserts can happen unpredictably during fake
tensor propagation, so we cannot conveniently insert them into the FX graph
when they occur.  Instead, we accumulate them in the ShapeEnv, and in this
pass insert them into the graph as proper tests.

This pass also deduplicates size-related computation, CSE-ing ops that produce
symbolic values and/or are involved in runtime asserts. Additionally, shape calls
(size/stride/storage_offset) are turned into compute on input sizes if possible,
allowing intermediate tensors to be freed earlier. For example, here dynamo will
DCE the cat and repeat calls:

    z = torch.cat([x, x], dim=0)  # 2*s0
    w = z.repeat(y.shape[0])  # 2*s0*s1
    _w = w.shape[0]
    # something with _w, but not w ...

    # turns into ->
    _w0 = 2 * s0
    _w = _w0 * s1

    # where s0, s1 are either SymInt graph inputs, or the result of added size calls

Redundant torch._check or torch.ops.aten._assert_scalar.default calls that assert
the same expression, and redundant constrain_range calls are also deduplicated.
Additionally, because single-symbol bound checks (e.g. u0 >= 0, u0 <= 5) accumulate
information in the ShapeEnv, the ShapeEnv contains min/max bounds for each symbol,
and we delete all previous calls, adding bound checks at the end of this pass.
r   N)_set_node_metadata_hook)#_has_uninterpretable_sympy_functionCallMethodKey cast_symbool_to_symint_guardlessConvertIntKeyDivideByKeyfree_symbolsInnerTensorKeyresolve_unbacked_bindings)int_oo) OptimizedPythonReferenceAnalysisPythonReferenceAnalysis)ValueRangesz%sz$pre insert_deferred_runtime_asserts T)coloredplaceholderr   r   c                    > [        U 5      =nSL=(       aR    [        UTR                  5      (       + =(       a0    T" U5      (       + =(       a    [        S U R                   5       5      $ )z|
If a size/stride/storage offset call on an intermediate tensor,
we can try to compute the value from input shapes instead.
Nc              3      #    U  Ho  n[        U[        R                  5      =(       aI    [        [        U5      [        R
                  [        R                  45      =(       a    UR                  S :g  v   Mq     g7f)r4   N)r   r   Noder   torchTensorSizeop).0args     r   	<genexpr>\insert_deferred_runtime_asserts.<locals>._is_intermediate_tensor_sym_call.<locals>.<genexpr>   s^       %C 3( ,1#6uzz8RS,FFm+, %s   A7A9)r   r   Numberanyargs)r   r   r'   sympys     r    _is_intermediate_tensor_sym_callIinsert_deferred_runtime_asserts.<locals>._is_intermediate_tensor_sym_call   sf     !&&St3 	sELL11	 8<<	    99	 	
r   r   r   stack_tracenn_module_stackc                   > [         R                  " S U R                  5      n U R                  nU R                  S:X  a?  [        U R                  [        5      (       d   e[        US   U R                  5      nUSS  nU" U6 U R                  T'   Ub  XR                  S'   Ub  X R                  S'   g g ! [         a     N0f = f)Nc                 n    [        U [        R                  R                  5      (       a  [	        U 5      $ U $ r   )r   r8   r   r7   r   )r=   s    r   <lambda>Ninsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s'    +5c588==+I+I"3'RsRr   call_methodr      rF   rG   )
pytreetree_maprB   targetr;   r   strgetattrr   NotImplementedError)r   rF   rG   	fake_argsrP   val_keys        r   _node_metadata_hook<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s    
 OO II	
		[[Fww-'!$++s3333 1t{{;%abM	!'!3DIIg "'2IIm$&+:II'( ' # 	 		s   A-B6 6
CCc           
         > SSK JnJnJn  SSKJn  SSKJnJn  X;   a  X   $ [        XX4U45      (       a	  U" T	X5      $ U" T	UR                   Vs/ s H  nT
" X5      PM     snU5      X'   X   $ s  snf )Nr   )Integerr@   Symbol)BooleanAtom)_run_sympy_handlersympy_interp)rC   rY   r@   rZ   sympy.logic.boolalgr[   torch.utils._sympy.interpr\   r]   r   rB   )expr_to_proxyr   rY   r@   rZ   r[   r\   r]   r=   Analysis_sympy_interps            r   rb   6insert_deferred_runtime_asserts.<locals>._sympy_interp   s    113N   &&dfkBCC->> 1:>))D)3]=.)D

 "" Es   A0
r   r   c                 z  > [        U R                  5      S:w  d&  U R                  TR                  TR                  4;  a  gU R                  u  p[        UTR                  5      =(       a    [        UTR                  5      =(       d3    [        UTR                  5      =(       a    [        UTR                  5      $ )N   F)lenrB   funcLessThanGreaterThanr   rZ   r@   )r   lhsrhsrC   s      r   _is_bound_expr_for_symbolBinsert_deferred_runtime_asserts.<locals>._is_bound_expr_for_symbol   s     tyy>Q$))ENNEDUDU3V"V993-O*S%,,2O 
sELL)Kjell.K	
r   c                   > U  GH  nUR                   T;   d}  [        UR                   R                  5      S:X  aC  [        [	        UR                   R                  5      5      T;   a  T" UR                   5      (       d  T" UR                   5      (       a  M  [
        R                  SUR                   5        T" UR                   5      nUTR                  5       -
  nU(       a2  [        U[        S9nTR                  U/ 5      R                  U5        GM  T	" TT5         T
" TUR                   5      R                  nTR                  [        R                  R                   R"                  R$                  USUR                    SU S345        S S S 5        TR'                  UR                   5        GM     g ! , (       d  f       N/= f)NrM   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   rf   r,   nextiterlogdebugkeysminrQ   
setdefaultappendr   call_functionr8   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr'   rl   rV   r&   rb   added_assertsconstrained_unbacked_symbolsr`   r,   r!   graphras_by_symbols         r   add_runtime_asserts<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts   sd   B =( ,,-2T"''"6"678<XX1"'':: 7rww??II3RWW=rww'CM..00Gc* ((R077; -R1DE'rww?DDC''		55==  FrwwizZ]Y^^_`	 F !!"''*O 8 FEs   A/F66
G	rM   c                   > [        U [        R                  5      (       a  [        U R                  [        5      (       a  [        U R                  R
                  =nTR                  5      (       aQ  UT;  aJ  T" TT5         [        R                  " U" 5       TS9TU'   S S S 5        [        R                  SUTU   5        g g g g g ! , (       d  f       N-= f)Ntracerexpr_to_proxy[%s] = %s)r   r8   SymIntr   r   r   rZ   r   Proxyru   rv   )	symintcbsrV   r&   r`   r!   rC   r   s	      r   match_symbol5insert_deferred_runtime_asserts.<locals>.match_symbol!  s    "65<<88&v{{G<<&FKK,<,<'<qellKK]24R9LM/1xxV/LM!, N		":A}Q?OP	 3 L = 9
 NMs    C
Cc                     > T $ r    r   s   r   rJ   1insert_deferred_runtime_asserts.<locals>.<lambda>,  s    Dr   c                     > T R                  [        R                  R                  R                  R
                  TT45      $ r   )r{   r8   r|   r}   sym_sizeintr   ir   s   r   rJ   r   1  s-    E$7$7 %		 7 7 ; ;dAY%r   c                     > T R                  [        R                  R                  R                  R
                  TT45      $ r   )r{   r8   r|   r}   
sym_strider   r   s   r   rJ   r   9  s-    (;(;$)IINN$=$=$A$AD!9)"r   c                     > T R                  [        R                  R                  R                  R
                  T45      $ r   )r{   r8   r|   r}   sym_storage_offsetr   )r   r   s   r   rJ   r   ?  s+    E$7$7 %		 A A I ID7%r   c                  <   > TR                    H  n U T;  d  M    g   gNTF)r,   )symbolr`   sym_exprs    r   has_new_untracked_symbolsBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbolsf  s#    "*"7"7!6#' #8 !r   unbacked_bindingsc                  D   > TR                  5        H  n U T;  d  M    g   gr   )rw   )ro   r`   resolved_unbacked_bindingss    r   has_new_unbacked_bindingsBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindingsu  s'    9>>@m3#'  A !r   )rF   rG   zCSE node %s -> %s for expr %sr   c                   > US:X  a  U $ [        U5      S:  GaA  [        US   T5      (       Ga,  [        US   [        R                  5      (       Ga	  US   R                  S:X  aV  T" TR                  [        R                  R                  R                  R                  XS   R                  45      USS  5      $ US   R                  S:X  aV  T" TR                  [        R                  R                  R                  R                  XS   R                  45      USS  5      $ T" TR                  US   R                  XS   R                  45      USS  5      $ [        US   T5      (       a*  T" TR                  US   R                  U 45      USS  5      $ [        US   [        R                  5      (       a8  T" TR                  [        R                  XS   R                  45      USS  5      $ [        US   T5      (       a  T" TR                  TU 45      USS  5      $ [        US   T5      (       a8  T" TR                  [        R                   XS   R"                  45      USS  5      $ [        US   T5      (       a.  T" TR                  [$        XS   R&                  45      USS  5      $ [)        SU 35      e)Nr   re   r   rM   sizestridezunrecognized keypath )rf   r   rN   SequenceKeyr#   r{   r8   r|   r}   r   r   idxr   rL   operatorgetitemfloordivdivisorrR   
inner_nameAssertionError)	r   keypathr(   r*   r+   r-   r)   gor   s	     r   r   +insert_deferred_runtime_asserts.<locals>.go  s   "b=#'KLA- *71:} E E *71:v7I7I J J&qz&8')$)$7$7(-		(?(?(C(C)-qz~~(>%& %,ABK(" !"  'qz(:')$)$7$7(-		(A(A(E(E)-qz~~(>%& %,ABK(" !" $& % 1 1$+AJOOdAJNN5K!" !(	$  (
MBB#% % 1 1'!*//D7 KWUVUW[$  (
F4F4FGG#% % 3 3$,$4$4tQZ^^6L!" !(	$  (
MBB#% % 3 3$Dtg!" !(	$  (
K@@#% % 3 3$,$5$5aj>P>P7Q!" !(	$  (
NCC#% % 3 3$+dAJ4I4I-J!" !(	$  #13H	1R"SSr   r   c                 P   > U TT* 4;   a  g  [        U 5      $ ! [         a     g f = fr   )r   	TypeError)r   r/   s    r   convert0insert_deferred_runtime_asserts.<locals>.convert?  s5    & 11#'(#&q6M( (#'(s   
 
%%rp   rq   rr   z%deleting unused reified symbol for %s)NN)XrC   (torch._export.passes._node_metadata_hookr&   %torch.fx.experimental.symbolic_shapesr'   r(   r)   r*   r+   r,   r-   r.   torch.utils._sympy.numbersr/   torch.utils._sympy.referencer0   r1   torch.utils._sympy.value_rangesr2   deferred_runtime_assertscopyr   r   proxyGraphAppendingTracergraph_code_logrv   r
   setnodesr;   r   r7   boolr   r8   r   rQ   dictr   list	enumerateinserting_beforer   r   r9   r   r   r   storage_offsetpoprP   _checkr|   r}   r~   r   rB   r   
erase_nodeusersget	functoolspartialr   replace_all_uses_withru   r@   logicboolalgr[   r   sym_constrain_rangesym_constrain_range_for_sizeitemsrz   	size_liker{   _check_is_sizevar_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetrZ   )=r!   r"   r#   r$   r.   r0   r1   r2   placeholdersfirst_non_placeholderrD   r   r   r   r   tr   assert_exprr=   r   r   	hash_nodedefsr   r   i0r   vrr   min_valgemax_valler   r   ra   r(   r*   r+   r-   r'   rl   rV   r&   rb   r   r)   r   r`   r,   r   r   r   r/   r   r   r   r   rC   r   rU   s=   `                                  @@@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   sc	   P P	 	 	 2 < 66;;=MHHEXX**51F24&92t	
 13M5L 77m#$(!T" 
rww 
4 
 
& Gdii'%Gdii  &*48;hhmm;c]; "$sCx.1; 
	; ;: &)UM69e *0&6VH#,	
 	
 	
(+ (+ (+T EU3BZ(4 ## 4E!a%L:O
 $&8&>>]K	Q 	Q ]L9=0a%,,?? )!&&( 31$ !4 )++$-ahhj$9DAq( !!" %: %,,. ,,#M$5$5dB$?@ {{		--55 
 IIaLD('3DIIaL'AAmS#/5kBB ))A,CHH''-!#rww//		++C0!%%k2
 =(!-d!33X@! .Gtyy}}-@"E.* 2===! -8>> 9 ; ;3557  5%-- 3,0IIMM-,H04		>O0P 7DMS[6\M(3 !.h 7 < <I..y9HH''-II7y(
 ]2:u||U[[-@-@-L-LM< < /1hhtF.KM(+ {{		22::		;;CC  ##D)D %>499==)<=%    #4"9"9";JAwKKN@T @TD -4R9LM/1xx "4 1&0M!, N 		":A}Q?OPY #<\ #''B/P 55,,,++!IINNGGOO*2.335
 ++!00=3D3I3I2K ++B/99S[[1_!< %RXXv6B AACLLRPP
( &b)..55;< 5%-- 3,0IIMM-,H04		>O0P ,3288+< <I%2="-%P%U%U % 3 3$)IINN$A$A$I$I(**RSUY`S`Raaklnkoop(q%&!" !. 1 1"- @+2288+< <I%2="-%P%U%U % 3 3$)IINN$A$A$I$I(**RSUY`S`Raaklnkoop(q%&!" !. 1 1"- @7: -004#C(] S
 
	 )|
 %**,etU\\**

.JJ$$$II=tDHH

+ -Q b NMl s	
 
s^   4K-k#!j-.Fk#	k# j?	7Gk#;Dk	&k#-
j<7k#?
k	k#
k k##
k3	)F)*r   loggingr   r   typingr   r   r   rC   r   r   r8   torch.utils._pytreeutils_pytreerN   r   torch._subclasses.meta_utilsr   torch.fx._compatibilityr	   torch.fx._utilsr
   "torch.fx.experimental.proxy_tensorr   torch.fx.experimental.sym_noder   torch.fx.graph_moduler   __all__	getLogger__name__ru   _logginggetArtifactLoggerr   r7   rQ   r   r   r   r   r   r   r   <module>r     s       
 / / >H  $ $  6 1 2 ; 2 - -
-!11(LI
RWW 
# 
rww 8L#9  d+
 	,,, , 	,
 
, ,,r   