
    9igs                        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    ^/var/www/html/land-doc-ocr/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m-  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       m9T R,                  m5[.        R0                  R3                  T55      m=[4        R7                  S[9        S	U 3T 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     S/S[H        R.                  RB                  S[J        [L           S[J        [N        [L        [P        4      SS4U>4S jjjm,[;        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-U.U/U1U2U3U U5U94S jn[S        T5R<                  5      n[U        USS 5       GH  u  m6m8T5RW                  T8U;  a  UT6S-      OU	5         T8U;   a  [Y        T85      =nb  U)U,U-U2U U<U=4S jnU" UU84S j5        [[        U=n[H        R\                  5      (       a  [U        UR_                  5       5       H  u  m6nU" UU5U6U84S j5        M     [a        U5      (       dN  [U        URc                  5       5       H  u  m6nU" UU5U6U84S j5        M     U" URe                  5       U5U84S  j5        T8U	:X  a  U" T9Rg                  S/ 5      5        T8Rh                  [H        Rj                  [H        Rl                  Rn                  Rp                  Rr                  4;   a  T8Rt                  (       a  T8Rt                  S   OT8Rv                  Ry                  S!5      nUS
:X  d  [{        U5      =nT2;   ao  UT/;   ai  UnT R,                  R}                  T85        [[        U[.        RB                  5      (       a,  UR~                  (       d  T R,                  R}                  U5        OT/RA                  U5        T8R>                  S:w  Ga  [{        T85      =m;Gb  U2U;4S" jnU" UT8RF                  Ry                  S#0 5      5      m:T:c   eU2U:4S$ jnT;T2;   d  U
" T85      (       a  U" 5       (       d  U" 5       (       d  U
" T85      (       ad  T-" T [        R                  " T,T8RF                  Ry                  S5      T8RF                  Ry                  S5      S%95         T." T2T;5      T2T;'   SSS5        T2T;   R                  nT8R                  U5        T R,                  R}                  T85        [        R7                  S&T8UT;5        OYT;T2;  aS  [[        T;T<R                  T<R                  R                  R                  45      (       d  [.        R                  " T8T=S'9T2T;'   T8Rh                  [H        Rl                  Rn                  R                  Rr                  [H        Rl                  Rn                  R                  Rr                  4;   a  T R,                  R}                  T85        / nU" UT8RF                  Ry                  S#5      5      =n(       a  UR                  5        Hv  u  nnUR                  U5        U%U&U'U(U0U4U54S( jm4UT2;  d  M+  T-" T T,5         [.        R                  " T4" T8U5      T=S'9T2U'   SSS5        [        R7                  S)UT2U   5        Mx     U GH  nT9Rg                  U/ 5      nUT1;   a  M  UUR                  ;   a  U(       aM  T5R                  [H        Rl                  Rn                  R                  Rr                  T2U   R                  45        O.T5R                  [H        R                  T2U   R                  45        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d  U74S* jnT2U   R                  Rh                  T0:w  Gaj  T-" T [        R                  " T,T8RF                  Ry                  S5      T8RF                  Ry                  S5      S%95         U" UR                  5      =nbt  T." T2UU:  5      R                  nT5R                  [H        Rl                  Rn                  Rp                  Rr                  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        Rl                  Rn                  Rp                  Rr                  U!S+UU :*   S,U! S-345        T/RA                  UU :*  5        SSS5        T1RA                  U5        U" U5        GM     SSS5        GM     T2R                  5        H  u  n"n#[[        U"T<R                  5      (       d  M#  U#R                  R>                  S:w  d  M?  U#R                  R~                  (       a  M\  [        R7                  S.U"5        T R,                  R}                  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)0a  
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)	_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_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   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_methodr      rG   rH   )
pytreetree_maprC   targetr<   r   strgetattrr   NotImplementedError)r   rG   rH   	fake_argsrQ   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   )IntegerrA   Symbol)BooleanAtom)_run_sympy_handlersympy_interp)rD   rZ   rA   r[   sympy.logic.boolalgr\   torch.utils._sympy.interpr]   r^   r   rC   )expr_to_proxyr   rZ   rA   r[   r\   r]   r^   r>   Analysis_sympy_interps            r   rc   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   r[   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                   > 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)NrN   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   rg   r-   nextiterlogdebugkeysminrR   
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rm   rW   r&   rc   added_assertsconstrained_unbacked_symbolsra   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 !!"''*Q 8 FEs   A/F66
G	rN   c                   > [        U [        R                  5      (       a  [        U R                  [        5      (       a  [        T" U R                  5      =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   r9   SymIntr   r   r[   r   Proxyrv   rw   )
symintcbsr'   rW   r&   ra   r!   rD   r   s
      r   match_symbol5insert_deferred_runtime_asserts.<locals>.match_symbol#  s    "65<<88&v{{G<<&!6v{{!CCAU\\  ]24R9LM/1xxV/LM!, N		":A}Q?OP	 3 = 9 NMs   <C
Cc                     > T $ r    r   s   r   rK   1insert_deferred_runtime_asserts.<locals>.<lambda>0  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   rK   r   5  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   rK   r   =  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   rK   r   C  s+    E$7$7 %		 A A I ID7%r   condc                  <   > TR                    H  n U T;  d  M    g   gNTF)r-   )symbolra   sym_exprs    r   has_new_untracked_symbolsBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbolsh  s#    "*"7"7!6#' #8 !r   unbacked_bindingsc                  D   > TR                  5        H  n U T;  d  M    g   gr   )rx   )rp   ra   resolved_unbacked_bindingss    r   has_new_unbacked_bindingsBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindingsw  s'    9>>@m3#'  A !r   )rG   rH   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   rf   r   rN   sizestridestorage_offsetzunrecognized keypath )rg   r   rO   SequenceKeyr#   r|   r9   r}   r~   r   r   idxr   rM   r   r   operatorgetitemfloordivdivisorrS   
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&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>.convertM  s5    & 11#'(#&q6M( (#'(s   
 
%%rq   rr   rs   z%deleting unused reified symbol for %s)NN)ZrD   (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_logrw   r
   setnodesr<   r   r8   boolr   r9   r   rR   dictr   list	enumerateinserting_beforer   r   r:   r   r   r   r   poprQ   _checkr}   r~   r   r   rC   kwargsgetr   
erase_nodeusers	functoolspartialr   replace_all_uses_withrv   rA   logicboolalgr\   r   sym_constrain_rangesym_constrain_range_for_sizeitemsr{   	size_liker|   _check_is_sizevar_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetr[   )?r!   r"   r#   r$   r/   r1   r2   r3   placeholdersfirst_non_placeholderrE   r   r   r   r   tr   r   assert_exprr>   r   r   	hash_nodedefsr   r   i0r   vrr   min_valgemax_valler   r   rb   r)   r+   r,   r.   r'   r(   rm   rW   r&   rc   r   r*   r   ra   r-   r   r   r   r0   r   r   r   r   rD   r   rV   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#,	
 	
 	
)+ )+ )+V EU3BZ(4 ## 4E!a%L:O
 $&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.* 2===! -8>> 9 ; ;3557  5%-- 3,0IIMM-,H04		>O0P 7D -x7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JT JTX -4R9LM/1xx "4 1&0M!, N 		":A}Q?OPm #<p #''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(] k
 
	 )T %**,etU\\**

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

+ -i z NMl K

 
s^   7K8k1/j;<Fk1	k1% k	Gk1	Dk	&k1;
k
k1
kk1
k.)k11
l	)F)*r   loggingr   r   typingr   r   r   rD   r   r   r9   torch.utils._pytreeutils_pytreerO   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__rv   _logginggetArtifactLoggerr   r8   rR   r   r   r   r   r   r   r   <module>r
     s       
 / / >H  $ $  6 1 2 ; 2 - -
-!11(<PQ
RWW 
# 
rww 8L#9  d+
 	M	,M	,M	, M	, 	M	,
 
M	, ,M	,r   