
    	iq                        d dl Z d dlZd dlZd dlZd dlmZmZmZ erd dlZd dl	m
Z
 neZ
d dlZd dlmc 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gZ ej<                  e      Z ejB                  jE                  ed      Z#dejH                  dee%   fdZ&dejH                  ded   fdZ' ed      	 ddede
de%de(ddf
d       Z)y)    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                 x    d| j                   v r| j                   d   S d| j                   v r| j                   d   S y)zx
    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/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/torch/fx/passes/runtime_assert.py_get_example_valuer   "   s=    
 $))#yy))	$))	yy    
sympy.Exprc                 f    t        |       }t        |t              r|j                  j                  S y 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                   &'()*+,-./0123456789:;<=> ddl <ddlm} ddlm+m,m'm0m(m	)m
3m*m} ddlm7 ddlm}m} ddlm} |j(                  j+                         9| j,                  5t.        j0                  j3                  5      =t4        j7                  dt9        d	| | d
             i 2t;               }	d}
5j<                  D ]&  88j>                  dk7  r8}
 n|	jA                  8       ( dt.        jB                  dtD        f,<fd}d>5j<                  D ]$  8d8jF                  v rd> nd8jF                  v s$ n 	 	 	 d0dtH        j.                  jB                  dtJ        tL           dtJ        tN        tL        tP        f      dtJ        tN        tL        tP        f      ddf
>fd}t;               /t;               1|r|n|&&.fd.dddtD        f<fd-,-./12359f	d}tS        5j<                        }tU        |dd       D ]  \  685jW                  8|	vr|6dz      n|
      5   || tY        jZ                  |8jF                  j]                  d      8jF                  j]                  d      8jF                  j]                  d                  5  8|	v rt_        8      x}+2<=fd} ||8fd       ta        |x}tH        jb                        rtU        |je                               D ]  \  6} ||568fd         tg        |      sJtU        |ji                               D ]  \  6} ||568fd!         ||jk                         58fd"       8|
k(  r |9jm                  dg              8jn                  tH        jp                  tH        jr                  jt                  jv                  jx                  fv r8jz                  r8jz                  d   n8j|                  j]                  d#      }|d
k(  st        |      x}2v rc|/v r_|}| j,                  j                  8       ta        |t.        jB                        r9|j                  s-| j,                  j                  |       n/jA                  |       8j>                  dk7  rt        8      x;2;fd$} ||8jF                  j]                  d%i             :2:fd&};2v s |8      rv |       so |       sh |8      r .2;      2;<   2;   j                  }8j                  |       | j,                  j                  8       t        j7                  d'8|;       nT;2vrPta        ;<j                  <j                  j                  j                  f      st/        j                  8=(      2;<   8jn                  tH        jr                  jt                  j                  jx                  tH        jr                  jt                  j                  jx                  fv r| j,                  j                  8       g } ||8jF                  j]                  d%            x}rt|j                         D ]a  \  }}|j                  |       '()*045fd)4|2vs't/        j                   48|      =(      2|<   t        j7                  d*|2|          c |D ]  }9jm                  |g       }|1v r|j                  |   }|j                  r3|j                  t        j                  dz
  k(  r ||j                  7      }|j                         j                  |      s17fd+}2|   j                  jn                  0ur ||j                        x} t .2|| k\        j                  }!5j                  tH        jr                  jt                  jv                  jx                  |!d,|| k\   d-|! d.f       /jA                  || k\          ||j                        x}"t .2||"k        j                  }#5j                  tH        jr                  jt                  jv                  jx                  |#d,||"k   d-|# d.f       /jA                  ||"k         1jA                  |        ||        	 ddd       ddd        2j                         D ]  \  }$}%ta        |$<j                        s|%j                  j>                  dk7  s7|%j                  j                  rNt        j7                  d/|$       | j,                  j                  |%j                          y# 1 sw Y   xY w# 1 sw Y   YxY w)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                     t        |       x}duxr@ t        |j                         xr'  |       xr t        d | j                  D              S )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      K   | ]d  }t        |t        j                        xrD t        t        |      t        j
                  t        j                  f      xr |j                  d k7   f yw)r5   N)r   r   Noder   torchTensorSizeop).0args     r   	<genexpr>z\insert_deferred_runtime_asserts.<locals>._is_intermediate_tensor_sym_call.<locals>.<genexpr>   s]        3( ,1#6uzz8RS,FFm+,s   A*A,)r   r   Numberanyargs)r   r   r(   sympys     r    _is_intermediate_tensor_sym_callzIinsert_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                 @   t        j                  d | j                        }	 | j                  }| j                  dk(  rYt        | j                  t              s!t        dt        | j                               t        |d   | j                        }|dd  } || | j                  <   ||| j                  d<   ||| j                  d<   ||| j                  d<   y y # t        $ r Y @t        j                  j                  j                  j                   $ r Y rw xY w)	Nc                 d    t        | t        j                  j                        rt	        |       S | S r   )r   r9   r   r8   r   )r>   s    r   <lambda>zNinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s)    +5c588==+I"3' OR r   call_methodzExpected str target, got r      rE   rF   rG   )pytreetree_maprB   targetr<   r   strAssertionErrortypegetattrr   NotImplementedErrorr9   r   experimentalsymbolic_shapesGuardOnDataDependentSymNode)r   rE   rF   rG   	fake_argsrO   val_keys         r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s    OO II	
		[[Fww-'!$++s3(3D4E3FG  !1t{{;%abM	!'!3DIIg "'2DIIm$&+:DII'("(DIIh  # 	 xx$$44PP 	 		s   BC 	D*0DDc           
          ddl m}m}m} ddlm} ddlm}m} || v r| |   S t        |||||f      r
 |	| |      S  |	|j                  D cg c]  } 
| |       c}|      | |<   | |   S c c}w )Nr   )Integerr@   Symbol)BooleanAtom)_run_sympy_handlersympy_interp)rC   r\   r@   r]   sympy.logic.boolalgr^   torch.utils._sympy.interpr_   r`   r   rB   )expr_to_proxyr   r\   r@   r]   r^   r_   r`   r>   Analysis_sympy_interps            r   re   z6insert_deferred_runtime_asserts.<locals>._sympy_interp   s    113N =  &&dWffkBC->> 1:>))D3]=#.D
d
 T"" Es   A.
r   r   c                 X   t        | j                        dk7  s$| j                  j                  j                  fvry| j                  \  }}t        |j                        xr t        |j                        xs. t        |j                        xr t        |j                        S )N   F)lenrB   funcLessThanGreaterThanr   r]   r@   )r   lhsrhsrC   s      r   _is_bound_expr_for_symbolzBinsert_deferred_runtime_asserts.<locals>._is_bound_expr_for_symbol   s     tyy>Q$))ENNEDUDU3V"V99S3-O*S%,,2O 
sELL)Kjell.K	
r   c           
        	 | D ]  }|j                   	v spt        |j                   j                        dk(  r<t        t	        |j                   j                              
v r |j                         s |j                         rt
        j                  d|j                           |j                         }|j                         z
  }|r3t        |t              }j                  |g       j                  |        |j                         j                  }j                  t        j                  j                   j"                  j$                  |d|j                    d| df       	j'                  |j                           y )NrL   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   rh   r-   nextiterlogdebugkeysminrP   
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rn   re   added_assertsconstrained_unbacked_symbolsrc   r-   graphras_by_symbols         r   add_runtime_assertsz<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts   sH    '	+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   rL   )rE   rF   rG   c                 @   t        | t        j                        rt        | j                  t              rht         | j                        x}j
                        r?|vr:t        j                   |             |<   t        j                  d||          y y y y y )Ntracerexpr_to_proxy[%s] = %s)
r   r9   SymIntr   r   r]   r   Proxyrv   rw   )symintcbsr'   rc   rC   r   s      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol8  s    "65<<8&v{{G<&!6v{{!CCAU\\ ]2+-88BD+Ha(		":A}Q?OP	 3 = 9r   c                       S r    r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>E  s    D r   c                       j                  t        j                  j                  j                  j
                  f      S r   )r|   r9   r}   r~   sym_sizeintr   ir   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>K  s/    E$7$7 %		 7 7 ; ;dAY% r   c                       j                  t        j                  j                  j                  j
                  f      S r   )r|   r9   r}   r~   
sym_strider   r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>S  s/    (;(;$)IINN$=$=$A$AD!9)" r   c                       j                  t        j                  j                  j                  j
                  f      S r   )r|   r9   r}   r~   sym_storage_offsetr   )r   r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>Y  s-    E$7$7 %		 A A I ID7% r   condc                  4    j                   D ]  } | vs y y)NTF)r-   )symbolrc   sym_exprs    r   has_new_untracked_symbolszBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbols~  s(    "*"7"7 (!6#'( !r   unbacked_bindingsc                  :    t        d      D ]  } | vs y y)Nz"resolved_unbacked_bindings is NoneTF)rQ   )rp   rc   resolved_unbacked_bindingss    r   has_new_unbacked_bindingszBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindings  s4    19,-QRR9 (m3#'( !r   zCSE node %s -> %s for expr %sr   c                    |dk(  r| S t        |      dk\  r8t        |d         r(t        |d   t        j                        r
|d   j                  dk(  rW j                  t        j                  j                  j                  j                  | |d   j                  f      |dd        S |d   j                  dk(  rW j                  t        j                  j                  j                  j                  | |d   j                  f      |dd        S  j                  |d   j                  | |d   j                  f      |dd        S t        |d         r|d   j                  dk(  rI j                  t        j                  j                  j                  j                  | f      |dd        S  j                  |d   j                  | f      |dd        S t        |d   t        j                        r9 j                  t         j"                  | |d   j                  f      |dd        S t        |d         r j                  | f      |dd        S t        |d         r9 j                  t         j$                  | |d   j&                  f      |dd        S t        |d         r/ j                  t(        | |d   j*                  f      |dd        S t-        d|       )	Nr   rg   r   rL   sizestridestorage_offsetzunrecognized keypath )rh   r   rM   SequenceKeyr#   r|   r9   r}   r~   r   r   idxr   rK   r   r   operatorgetitemfloordivdivisorrS   
inner_namerQ   )	r   keypathr)   r+   r,   r.   r*   gor   s	     r   r   z+insert_deferred_runtime_asserts.<locals>.go  s   "b=#'KLA- *71:} E *71:v7I7I J&qz&8')$)$7$7(-		(?(?(C(C)-wqz~~(>%& %,ABK(" !"  'qz(:')$)$7$7(-		(A(A(E(E)-wqz~~(>%& %,ABK(" !" $& % 1 1$+AJOOdGAJNN5K!" !(	$  (
MB&qz2BB')$)$7$7(-		(I(I(Q(Q)-%& %,ABK(" !" $& % 1 1'!*//D7 KWUVUW[$  (
F4F4FG#% % 3 3$,$4$4tWQZ^^6L!" !(	$  (
MB#% % 3 3$Dtg!" !(	$  (
K@#% % 3 3$,$5$5gaj>P>P7Q!" !(	$  (
NC#% % 3 3$+dGAJ4I4I-J!" !(	$  #13H	1R"SSr   r   c                 J    |  fv ry 	 t        |       S # t        $ r Y y w xY wr   )r   	TypeError)r   r0   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convertT  s5    & 11#'(#&q6M( (#'(s   
 	""rq   rr   rs   z%deleting unused reified symbol for %s)NNN)XrC   (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   rP   dictr   list	enumerateinserting_before	functoolspartialgetr   r   r:   r   r   r   r   poprO   _checkr}   r~   r   r   rB   kwargsr   
erase_nodeusersr   replace_all_uses_withrv   r@   logicboolalgr^   r   sym_constrain_rangesym_constrain_range_for_sizeitemsr{   var_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetr|   r]   )?r!   r"   r#   r$   r&   r/   r1   r2   r3   placeholdersfirst_non_placeholderrD   rZ   r   r   r   r   tr   r   assert_exprr>   r   r   	hash_nodedefsr   r   i0r   vrr   min_valgemax_valler   r   rd   r)   r+   r,   r.   r'   r(   rn   re   r   r*   r   rc   r-   r   r   r   r0   r   r   r   r   rC   r   rY   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X	) $!!' $		m <$(IIMM2C$D99==2		X	)& $&8&>>]KQ ]L9=0a%,,? )!&&( 3 1$ )+$-ahhj$9 DAq( !!" %,,. ,,#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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"; SQJAwKKNJT JTX -+-88BtW4Ef+Ua(		":A}Q?OPgSQj  [)#''B/P 55++B/99S[[1_!< %RXXv6B AACLLR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[){X	) X	) X	)	\)~
 %**, ,etU\\*

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

+,w
X	) X	) X	) X	)s-   6A,e!"O-eHe&e!ee!!e+	)F)*r   loggingr   r   typingr   r   r   rC   r   r   r9   torch.utils._pytreeutils_pytreerM   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   rP   r   r   r   r   r   r   r   <module>r      s      
 / / >H  $ $  6 1 2 ; 2 - -
-g!11(<PQ
RWW 
# 
rww 8L#9  d+
 	L	,L	,L	, L	, 	L	,
 
L	, ,L	,r   