
    N jq                        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_verbose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    o/root/GenerationalWealth/GenerationalWealth/venv/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n  SSKJm+Jm,Jm'Jm0Jm(J	m)J
m3Jm*Jn  SSKJm7  SSKJnJn  SSKJn  UR(                  R+                  5       m9U R,                  m5[.        R0                  R3                  T55      m=[4        R7                  S[9        S	U 3U S
S95        0 m2[;        5       n	Sn
T5R<                   H(  m8T8R>                  S:w  a  T8n
  OU	RA                  T85        M*     S[.        RB                  S[D        4U,U<4S jjnSm>T5R<                   H)  m8ST8RF                  ;   a  Sm>  OST8RF                  ;   d  M)    O      S0S[H        R.                  RB                  S[J        [L           S[J        [N        [L        [P        4      S[J        [N        [L        [P        4      SS4
U>4S jjjn[;        5       m/[;        5       m1U(       a  UOUm&U&U.4S jm.SSS[D        4U<4S jjm-U,U-U.U/U1U2U3U5U94	S jn[S        T5R<                  5      n[U        USS 5       GH  u  m6m8T5RW                  T8U	;  a  UT6S-      OU
5         U" U [X        RZ                  " UT8RF                  R]                  S5      T8RF                  R]                  S5      T8RF                  R]                  S5      S95         T8U	;   a  [_        T85      =nb  U+U2U<U=4S jnU" UU84S j5        [a        U=n[H        Rb                  5      (       a  [U        URe                  5       5       H  u  m6nU" UU5U6U84S  j5        M     [g        U5      (       dN  [U        URi                  5       5       H  u  m6nU" UU5U6U84S! j5        M     U" URk                  5       U5U84S" j5        T8U
:X  a  U" T9Rm                  S/ 5      5        T8Rn                  [H        Rp                  [H        Rr                  Rt                  Rv                  Rx                  4;   a  T8Rz                  (       a  T8Rz                  S   OT8R|                  R]                  S#5      nUS
:X  d  [        U5      =nT2;   ao  UT/;   ai  UnU R,                  R                  T85        [a        U[.        RB                  5      (       a,  UR                  (       d  U R,                  R                  U5        OT/RA                  U5        T8R>                  S:w  Ga1  [        T85      =m;Gb"  U2U;4S$ jnU" UT8RF                  R]                  S%0 5      5      m:U2U:4S& jnT;T2;   d  U" T85      (       a  U" 5       (       dy  U" 5       (       dm  U" T85      (       a  T." T2T;5      T2T;'   T2T;   R                  nT8R                  U5        U R,                  R                  T85        [        R7                  S'T8UT;5        OYT;T2;  aS  [a        T;T<R                  T<R                  R                  R                  45      (       d  [.        R                  " T8T=S(9T2T;'   T8Rn                  [H        Rr                  Rt                  R                  Rx                  [H        Rr                  Rt                  R                  Rx                  4;   a  U R,                  R                  T85        / nU" UT8RF                  R]                  S%5      5      =n(       ax  UR                  5        Hd  u  nnUR                  U5        U'U(U)U*U0U4U54S) jm4UT2;  d  M+  [.        R                  " T4" T8U5      T=S(9T2U'   [        R7                  S*UT2U   5        Mf     U GH  nT9Rm                  U/ 5      nUT1;   a  M  UR                  U   nUR                  (       a4  UR                  [        R                  S-
  :X  a  U" UR                  T75      nUR                  5       R                  U5      (       Gd5  U74S+ jnT2U   R                  Rn                  T0LGa  U" UR                  5      =n bt  T." T2UU :  5      R                  n!T5R                  [H        Rr                  Rt                  Rv                  Rx                  U!S,UU :   S-U! S.345        T/RA                  UU :  5        U" UR                  5      =n"bt  T." T2UU":*  5      R                  n#T5R                  [H        Rr                  Rt                  Rv                  Rx                  U#S,UU":*   S-U# S.345        T/RA                  UU":*  5        T1RA                  U5        U" U5        GM     SSS5        SSS5        GM     T2R                  5        H  u  n$n%[a        U$T<R                  5      (       d  M#  U%R                  R>                  S:w  d  M?  U%R                  R                  (       a  M\  [        R7                  S/U$5        U R,                  R                  U%R                  5        M     g! , (       d  f       N= f! , (       d  f       GM  = f)1a  
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.  These 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)	_get_placeholder_expr#_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)r5   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_stackcustomc                 R  > [         R                  " S U R                  5      n U R                  nU R                  S:X  a^  [        U R                  [        5      (       d!  [        S[        U R                  5       35      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'   Ub  X0R                  S'   g g ! [         a     NA[        R                  R                  R                  R                    a     Ntf = f)	Nc                 n    [        U [        R                  R                  5      (       a  [	        U 5      $ U $ r   )r   r9   r   r8   r   )r>   s    r   <lambda>Ninsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s'    +5c588==+I+I"3'RsRr   call_methodzExpected str target, got r      rG   rH   rI   )pytreetree_maprC   targetr<   r   strAssertionErrortypegetattrr   NotImplementedErrorr9   r   experimentalsymbolic_shapesGuardOnDataDependentSymNode)r   rG   rH   rI   	fake_argsrR   val_keys         r   _node_metadata_hook<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s    OO II	
		[[Fww-'!$++s33(3D4E3FG  !1t{{;%abM	!'!3DIIg "'2IIm$&+:II'("(IIh  # 	 xx$$44PP 	 		s   BC& &
D&21D&%D&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   )IntegerrA   Symbol)BooleanAtom)_run_sympy_handlersympy_interp)rD   r`   rA   ra   sympy.logic.boolalgrb   torch.utils._sympy.interprc   rd   r   rC   )expr_to_proxyr   r`   rA   ra   rb   rc   rd   r>   Analysis_sympy_interps            r   ri   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)lenrC   funcLessThanGreaterThanr   ra   rA   )r   lhsrhsrD   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           
      H  >	 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UR                   5      R                  nTR                  [        R                  R                   R"                  R$                  USUR                    SU S345        T	R'                  UR                   5        GM     g )NrO   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   rm   r-   nextiterlogdebugkeysminrS   
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rs   ri   added_assertsconstrained_unbacked_symbolsrg   r-   graphras_by_symbols         r   add_runtime_asserts<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts   sI   B =( ,,-2T"''"6"678<XX1"'':: 7rww??II3RWW=rww'CM..00Gc* ((R077; $M277;@@##IINN1199 B277):VYUZZ[\	 !!"''*O r   rO   )rG   rH   rI   c                 ^  > [        U [        R                  5      (       a  [        U R                  [        5      (       am  [        T" U R                  5      =nTR
                  5      (       a?  UT;  a8  [        R                  " U" 5       TS9TU'   [        R                  SUTU   5        g g g g g )Ntracerexpr_to_proxy[%s] = %s)
r   r9   SymIntr   r   ra   r   Proxyr|   r}   )symintcbsr'   rg   rD   r   s      r   match_symbol5insert_deferred_runtime_asserts.<locals>.match_symbol8  s    "65<<88&v{{G<<&!6v{{!CCAU\\  ]2+-88BD+Ha(		":A}Q?OP	 3 = 9r   c                     > T $ r    r   s   r   rL   1insert_deferred_runtime_asserts.<locals>.<lambda>E  s    Dr   c                     > T R                  [        R                  R                  R                  R
                  TT45      $ r   )r   r9   r   r   sym_sizeintr   ir   s   r   rL   r   K  s-    E$7$7 %		 7 7 ; ;dAY%r   c                     > T R                  [        R                  R                  R                  R
                  TT45      $ r   )r   r9   r   r   
sym_strider   r   s   r   rL   r   S  s-    (;(;$)IINN$=$=$A$AD!9)"r   c                     > T R                  [        R                  R                  R                  R
                  T45      $ r   )r   r9   r   r   sym_storage_offsetr   )r   r   s   r   rL   r   Y  s+    E$7$7 %		 A A I ID7%r   condc                  <   > TR                    H  n U T;  d  M    g   g)NTF)r-   )symbolrg   sym_exprs    r   has_new_untracked_symbolsBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbols~  s#    "*"7"7!6#' #8 !r   unbacked_bindingsc                  D   > Tc  [        S5      eT H  n U T;  d  M    g   g)Nz"resolved_unbacked_bindings is NoneTF)rT   )rv   rg   resolved_unbacked_bindingss    r   has_new_unbacked_bindingsBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindings  s/    19,-QRR9m3#'  : !r   zCSE node %s -> %s for expr %sr   c                 8  > 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  US   R                  S:X  aI  T" TR                  [        R                  R                  R                  R                  U 45      USS  5      $ 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   rl   r   rO   sizestridestorage_offsetzunrecognized keypath )rm   r   rP   SequenceKeyr#   r   r9   r   r   r   r   idxr   rN   r   r   operatorgetitemfloordivdivisorrV   
inner_namerT   )	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&qz2BB')$)$7$7(-		(I(I(Q(Q)-%& %,ABK(" !" $& % 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   r0   s    r   convert0insert_deferred_runtime_asserts.<locals>.convertT  s5    & 11#'(#&q6M( (#'(s   
 
%%rw   rx   ry   z%deleting unused reified symbol for %s)NNN)XrD   (torch._export.passes._node_metadata_hookr&   %torch.fx.experimental.symbolic_shapesr'   r(   r)   r*   r+   r,   r-   r.   r/   torch.utils._sympy.numbersr0   torch.utils._sympy.referencer1   r2   torch.utils._sympy.value_rangesr3   deferred_runtime_assertscopyr   r   proxyGraphAppendingTracergraph_code_logr}   r
   setnodesr<   r   r8   boolr   r9   r   rS   dictr   list	enumerateinserting_before	functoolspartialgetr   r   r:   r   r   r   r   poprR   _checkr   r   r   r   rC   kwargsr   
erase_nodeusersr   replace_all_uses_withr|   rA   logicboolalgrb   r   sym_constrain_rangesym_constrain_range_for_sizeitemsr   var_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetr   ra   )?r!   r"   r#   r$   r&   r/   r1   r2   r3   placeholdersfirst_non_placeholderrE   r]   r   r   r   r   tr   r   assert_exprr>   r   r   	hash_nodedefsr   r   i0r   vrr   min_valgemax_valler   r   rh   r)   r+   r,   r.   r'   r(   rs   ri   r   r*   r   rg   r-   r   r   r   r0   r   r   r   r   rD   r   r\   s?                                         @@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   s   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%) c3h(	%)
 
%) %)P &)UM69e *0&6VH#,	
 	
 	
(+ (+T EU3BZ(4
 "" $L 8a!e>S $!!' $		m <$(IIMM2C$D99==2	 $&8&>>]KQ Q ]L9=0a%,,?? )!&&( 31$ !4 )++$-ahhj$9DAq( !!" %: %,,. ,,#M$5$5dB$?@ {{		--55  (,yytyy|dkkoof6MDL'3D'99mK#}4CHH''-!#rww//		++C0!%%k2
 =(!-d!33X@! .Gtyy}}-@"E.*! -8>> 9 ; ;3557  3@)$3h/
 !.h 7 < <I..y9HH''-II7! 	 ]2:\\5;;#6#6#B#BC< < /1hhtF.KM(+ {{		22::		;;CC  ##D)D %>499==)<=%    #4"9"9";JAwKKNJT JTX -+-88BtW4Ef+Ua(		":A}Q?OPg #<j #''B/P 55++B/99S[[1_!< %RXXv6B AACLLRPP
( &b)..55?@ (/rxx'88GE!.}bGm!L!Q!QB!// %		 = = E E$&&NrU\}o]ghjgkkl$m!" *--bGm<'.rxx'88GE!.}bGm!L!Q!QB!// %		 = = E E$&&NrU\}o]ghjgkkl$m!" *--bGm<,004#C(w s  )~
 %**,etU\\**

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

+ -o
  s-   A*g66Qg%;H)g%$g6%
g3/g66
h	)F)*r   loggingr   r   typingr   r   r   rD   r   r   r9   torch.utils._pytreeutils_pytreerP   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__r|   _logginggetArtifactLoggerr   r8   rS   r   r   r   r   r   r   r   <module>r     s       
 / / >H  $ $  6 1 2 ; 2 - -
-!11(<PQ
RWW 
# 
rww 8L#9  d+
 	L	,L	,L	, L	, 	L	,
 
L	, ,L	,r   