
    9jz                        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%dz  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    ^/media/conek/DATA/Code/OCR/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&m'm	2m
(m} ddlm6 ddlm}m} ddlm} |j&                  j)                         8 j*                  4t,        j.                  j1                  4      <t2        j5                  dt7        d	|  d
             i 1t9               }d}	4j:                  D ]&  77j<                  dk7  r7}	 n|j?                  7       ( dt,        j@                  dtB        f*;fd}
d=4j:                  D ]$  7d7jD                  v rd= nd7jD                  v s$ n 	 	 	 	 d1dtF        j,                  j@                  dtH        dz  dtJ        tH        tL        f   dz  dtJ        tH        tL        f   dz  dtB        ddf=fd,t9               /t9               0|r|n|$$.fd.dddtB        f;fd+*+,-./012 478fd}tO        4j:                        }tQ        |dd       D ]r  \  574jS                  7|vr|5dz      n|	      5  7|v rtU        7      x}),-1 7;<fd} ||7fd       tW        |x}tF        jX                        rtQ        |j[                               D ]  \  5} ||457fd         t]        |      sJtQ        |j_                               D ]  \  5} ||457fd!         ||ja                         47fd"       7|	k(  r |8jc                  dg              7jd                  tF        jf                  tF        jh                  jj                  jl                  jn                  fv r7jp                  r7jp                  d   n7jr                  ju                  d#      }|d
k(  stw        |      x}1v rc|/v r_|} j*                  jy                  7       tW        |t,        j@                        r9|jz                  s- j*                  jy                  |       n/j?                  |       7j<                  dk7  rtw        7      x:y1:fd$} ||7jD                  ju                  d%i             919fd&}:1v s |
7      r |       s |       s |
7      r - t}        j~                  ,7jD                  ju                  d      7jD                  ju                  d      7jD                  ju                  d      '            5   .1:      1:<   ddd       1:   j                  }7j                  |        j*                  jy                  7       t        j5                  d(7|:       nT:1vrPtW        :;j                  ;j                  j                  j                  f      st-        j                  7<)      1:<   7jd                  tF        jh                  jj                  j                  jn                  tF        jh                  jj                  j                  jn                  fv r j*                  jy                  7       g } ||7jD                  ju                  d%            x}r|j                         D ]  \  }}|j                  |       %&'(34fd*3|1vs& - t}        j~                  ,7jD                  ju                  d      7jD                  ju                  d      7jD                  ju                  d      '            5  t-        j                   37|      <)      1|<   ddd       t        j5                  d+|1|           |D ]*  }8jc                  |g       }|0v r|j                  |   }|j                  r3|j                  t        j                  dz
  k(  r ||j                  6      }|j                         j                  |      s6fd,} - t}        j~                  ,7jD                  ju                  d      7jD                  ju                  d      7jD                  ju                  d      '            5   ||j                        x}t .1||k\        j                  }4j                  tF        jh                  jj                  jl                  jn                  |d-||k\   d.| d/f       /j?                  ||k\          ||j                        x} t .1|| k        j                  }!4j                  tF        jh                  jj                  jl                  jn                  |!d-|| k   d.|! d/f       /j?                  || k         ddd       0j?                  |        ||       - 	 ddd       u 1j                         D ]  \  }"}#tW        |";j                        s|#j                  j<                  dk7  s7|#j                  jz                  rNt        j5                  d0|"        j*                  jy                  |#j                          y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   BxY w)2a  
    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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)r4   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customskip_valc                    |st        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 @w xY w)	Nc                 d    t        | t        j                  j                        rt	        |       S | S r   )r   r8   r   r7   r   )r=   s    r   <lambda>zNinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s)    /9#uxx}}/M&s+ SV r   call_methodzExpected str target, got r      rD   rE   rF   )pytreetree_maprA   targetr;   r   strAssertionErrortypegetattrr   NotImplementedError)r   rD   rE   rF   rG   	fake_argsrO   val_keys          r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s      			I77m+%dkk37,7T[[8I7JK  %Yq\4;;?F )!"I%+Y%7		'" "'2DIIm$&+:DII'("(DIIh  '  	s   BC! !	C-,C-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)rB   rY   r?   rZ   sympy.logic.boolalgr[   torch.utils._sympy.interpr\   r]   r   rA   )expr_to_proxyr   rY   r?   rZ   r[   r\   r]   r=   Analysis_sympy_interps            r   rb   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)lenrA   funcLessThanGreaterThanr   rZ   r?   )r   lhsrhsrB   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                  |        	t        j                  j                  j                  d      j                  j                  d      j                  j                  d                  5   
|j                         j                   }j#                  t$        j&                  j(                  j*                  j,                  |d|j                    d	| d
f       d d d        j/                  |j                           y # 1 sw Y   (xY w)NrL   zinserting runtime assert %s)keyrD   rE   rF   rD   rE   rF   (Runtime assertion failed for expression 
 on node '')r   re   r,   nextiterlogdebugkeysminrP   
setdefaultappend	functoolspartialr   getr   call_functionr8   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rk   rW   r&   rb   added_assertsconstrained_unbacked_symbolsr`   r,   r!   graphr   ras_by_symbols         r   add_runtime_assertsz<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts   s    2	+B =( ,,-2T"''"6"678<XX1"'': 7rww?II3RWW=rww'CM..00Gc* ((R077; -%%+$(IIMM-$@(,		6G(H  $yy}}X6
  (rww?DDC''		55==  FrwwizZ]Y^^_`	, !!"''*e2	+8 s   ,A/HH	rL   c                 @   t        | t        j                        rt        | j                  t              rt         | j                        x}	j
                        r|vr t        j                  j                  j                  d      j                  j                  d      j                  j                  d                  5  t        j                   |       
      |<   d d d        t        j                  d||          y y y y y # 1 sw Y   (xY w)NrD   rE   rF   rn   tracerexpr_to_proxy[%s] = %s)r   r8   SymIntr   r   rZ   rz   r{   r   r|   r   Proxyrt   ru   )symintcbsr'   rW   r&   r`   r!   r   rB   r   s      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol8  s    "65<<8&v{{G<&!6v{{!CCAU\\ ]24%-- 3,0IIMM-,H04		>O0P (,yy}}X'>
 M 02xxV/LM!,M 		":A}Q?OP 3 = 9M Ms    DDc                       S r    r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>P  s    D r   c                       j                  t        j                  j                  j                  j
                  f      S r   )r}   r8   r~   r   sym_sizeintr   ir   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>V  s/    E$7$7 %		 7 7 ; ;dAY% r   c                       j                  t        j                  j                  j                  j
                  f      S r   )r}   r8   r~   r   
sym_strider   r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>^  s/    (;(;$)IINN$=$=$A$AD!9)" r   c                       j                  t        j                  j                  j                  j
                  f      S r   )r}   r8   r~   r   sym_storage_offsetr   )r   r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>d  s-    E$7$7 %		 A A I ID7% r   condc                  4    j                   D ]  } | vs y y)NTF)r,   )symbolr`   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   )rm   r`   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   rn   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                  t        j$                  | dd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   rd   r   rL   sizestridestorage_offsetzunrecognized keypath )re   r   rM   SequenceKeyr#   r}   r8   r~   r   r   r   idxr   rK   r   r   operatorgetitemsym_itefloordivdivisorrS   
inner_namerQ   )r   keypathr)   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 3EMMD!Q< P '$  (
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   r/   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convertu  s5    & 11#'(#&q6M( (#'(s   
 	""ro   rp   rq   z%deleting unused reified symbol for %s)NNNF)VrB   (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_logru   r
   setnodesr;   r   r7   boolr   r8   rP   dictr   list	enumerateinserting_beforer   r   r9   r   r   r   r   poprO   _checkr~   r   r   r   rA   kwargsr|   r   
erase_nodeusersrz   r{   r   replace_all_uses_withrt   r?   logicboolalgr[   r   sym_constrain_rangesym_constrain_range_for_sizeitemsry   var_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetr}   rZ   )>r!   r"   r#   r$   r.   r0   r1   r2   placeholdersfirst_non_placeholderrC   r   r   r   r   tr   r   assert_exprr=   r   r   	hash_nodedefsr   r   i0r   vrr   min_valgemax_valler   r   ra   r)   r*   r+   r-   r'   r(   rk   rW   r&   rb   r   r   r`   r,   r   r   r   r/   r   r   r   r   rB   r   rV   s>   `                                   @@@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   sp	   P P	 	 	 2 < 66;;=MHHEXX**51F24&92t	
 13M5L  #77m#$(!T"#
rww 
4 
& G dii'%Gdii #'15(,")hhmm")4Z") c3h$.") S#X%	")
 ") 
")J &)UM69e *0&6VH#,	
 	
 	
3+ 3+ 3+j EU3BZ( v)4 ## 4E!a%L:O
 r	) $&8&>>]KQ Q0 ]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 5%-- 3,0IIMM-,H04		>O0P (,yy}}X'>
  7D - (7M(3  !.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"; ^QJAwKKNHT HTT -4%-- 3,0IIMM-,H04		>O0P (,yy}}X'>
  02xx "4 1&0M!, 		":A}Q?OP}^Q@  _)#''B/P 55++B/99S[[1_!< %RXXv6B AACLLRP
( 1!))/(,		m(D,0IIMM:K,L $(99==#:
 = (/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(_)gr	) r	)	v)r %**, ,etU\\*

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

+,m H \= =c
r	) r	)s_   5K	i	>h#Fi	A+i	"h0	'Di	Dh=	$i	#h-(i	0h:5i	=ii		i	)F)*rz   loggingr   r   typingr   r   r   rB   r   r   r8   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__rt   _logginggetArtifactLoggerr   r7   rP   r   r   r   r   r   r   r   <module>r      s      
 / / >H  $ $  6 1 2 ; 2 - -
-g!11(<PQ
RWW 
t 
rww 8L#9  d+
 	q	,q	,q	, q	, 	q	,
 
q	, ,q	,r   