
    sgm                        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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jF                  jI                  e!d      Z%dejL                  dee'   fdZ(dejL                  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DictOptionalSet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                 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    Q/var/www/html/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                 |   "#$%&'()*+,-./012345678 ddl 7ddlm* ddlm'm"m-m#m$m	0m
%m} ddlm4 ddlm& ddlm} |j$                  j'                         6 j(                  2t*        j-                  dt/        d	|  d
             i /t1               }d}2j2                  D ]&  55j4                  dk7  r5} n|j7                  5       ( dt8        j:                  dt<        f'7fd}d82j2                  D ]$  5d5j>                  v rd8 nd5j>                  v s$ n 	 	 d+dt@        j8                  j:                  dtB        tD           dtB        tF        tD        tH        f      ddf8fd)t1               ,t1               .&+fd+dddt<        f7fd('()*+,./0 26fd}	tK        2j2                        }
tM        |
dd       D ]  \  352jO                  5|vr|
3dz      n|      5  5|v rtQ        5      x})*/ 7fd} ||5fd       tS        |x}t@        jT                        rtM        |jW                               D ]  \  3} ||235fd        tY        |      sJtM        |j[                               D ]  \  3} ||235fd         ||j]                         25fd        5|k(  r |	6j_                  dg              5j`                  t@        jb                  t@        jd                  jf                  jh                  jj                  fv r5jl                  d   d
k(  s&to        5jl                  d         x}/v s
|t (|      rl5jl                  d   } j(                  jq                  5       tS        |t8        j:                        r9|jr                  s- j(                  jq                  |       n,j7                  |       5j4                  dk7  rto        5      x}|j                  /ju                         z
  } ||5j>                  jw                  d!i             ju                         /ju                         z
  }|/v s
 |5      r|s|s |5      rf * ty        jz                  )5j>                  jw                  d      5j>                  jw                  d      "            5   +/|      /|<   ddd       /|   j|                  }5j                  |        j(                  jq                  5       t        j-                  d#5||       nR|/vrNtS        |7j                  7j                  j                  j                  f      st9        j                  5      /|<   5j`                  t@        jd                  jf                  j                  jj                  t@        jd                  jf                  j                  jj                  fv r j(                  jq                  5       g } ||5j>                  jw                  d!            x}r|j                         D ]q  \  }}|j                  |       "#$%-12fd$1|/vs' * )      5  t9        j                   15|            /|<   ddd       t        j-                  d%|/|          s |D ]  }6j_                  |g       }|.v r||j                  v r}|rM2j                  t@        jd                  jf                  j                  jj                  /|   j|                  f       n.2j                  t@        j                  /|   j|                  f       |j                  |   }|j                  r3|j                  t        j                  dz
  k(  r ||j                  4      }|j                         j                  |      s4fd&}/|   j|                  j`                  -k7  rj * ty        jz                  )5j>                  jw                  d      5j>                  jw                  d      "            5   ||j                        x}t +/||k\        j|                  }2j                  t@        jd                  jf                  jh                  jj                  |d'||k\   d(| d)f       ,j7                  ||k\          ||j                        x}t +/||k        j|                  }2j                  t@        jd                  jf                  jh                  jj                  |d'||k   d(| d)f       ,j7                  ||k         ddd       .j7                  |        |	|        	 ddd        /j                         D ]  \  } }!tS        | 7j                        s|!j|                  j4                  dk7  s7|!j|                  jr                  rNt        j-                  d*|         j(                  jq                  |!j|                          y# 1 sw Y   CxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   kxY w),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)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_stackc                 >   | j                   D cg c]3  }t        |t        j                  j                        rt        |      n|5 }}	  | j                  | | j                  <   ||| j                  d<   ||| j                  d<   y y c c}w # t        $ r Y 4w xY w)NrE   rF   )	rB   r   r9   r	   r8   r   targetr   NotImplementedError)r   rE   rF   r>   	fake_argsval_keys        r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s     yy
 (2#uxx}}'Es#3N
	 
	!,i!8DIIg "'2DIIm$&+:DII'( '
 # 	 		s   8BB 	BB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   rN   r@   rO   sympy.logic.boolalgrP   torch.utils._sympy.interprQ   rR   r   rB   )expr_to_proxyr    rN   r@   rO   rP   rQ   rR   r>   r2   _sympy_interps            r   rV   z6insert_deferred_runtime_asserts.<locals>._sympy_interp   s    113N =  &&dWffkBC 7MM 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   rO   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                 X   | 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                  |        	      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)N   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r    rY   r.   nextiterlogdebugkeysminstr
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr)   r_   rL   r(   rV   added_assertsconstrained_unbacked_symbolsrU   r.   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; -R1DE 
'rww?DDC''		55==  FrwwizZ]Y^^_`	
 !!"''*O'	+8
 
s   
A/F  F)	ra   c                    t        | t        j                        rt        | j                  t              r|t        | j                  j
                  x}j                        rO|vrJ       5  t        j                   |             |<   d d d        t        j                  d||          y y y y y # 1 sw Y   (xY w)Nexpr_to_proxy[%s] = %s)r   r9   SymIntr   r   r    rO   r	   Proxyrh   ri   )symintcbsrL   r(   rU   r#   rC   s      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol  s    "65<<8&v{{G<&FKK,<,<'<qellK]24R9LM >/1xx~M!,>		":A}Q?OP	 3 L = 9
> >s   /B44B=c                       S r    r   s   r   <lambda>z1insert_deferred_runtime_asserts.<locals>.<lambda>  s    D r   c                       j                  t        j                  j                  j                  j
                  f      S r   )ro   r9   rp   rq   sym_sizeintr}   ir   s   r   r   z1insert_deferred_runtime_asserts.<locals>.<lambda>$  s/    E$7$7 %		 7 7 ; ;dAY% r   c                       j                  t        j                  j                  j                  j
                  f      S r   )ro   r9   rp   rq   
sym_strider   r   s   r   r   z1insert_deferred_runtime_asserts.<locals>.<lambda>,  s/    (;(;$)IINN$=$=$A$AD!9)" r   c                       j                  t        j                  j                  j                  j
                  f      S r   )ro   r9   rp   rq   sym_storage_offsetrs   )r}   r   s   r   r   z1insert_deferred_runtime_asserts.<locals>.<lambda>2  s-    E$7$7 %		 A A I ID7% r   unbacked_bindings)rE   rF   zCSE node %s -> %s for expr %sc                 >   |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* 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   rX   r   ra   sizestridezunrecognized keypath )rY   r   pytreeSequenceKeyr%   ro   r9   rp   rq   r   r   idxr   call_methodoperatorgetitemfloordivdivisorgetattr
inner_nameAssertionError)	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#% % 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   r1   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convert&  s5    & 11#'(#&q6M( (#'(s   
 	""rc   rd   re   z%deleting unused reified symbol for %s)NN)VrC   (torch._export.passes._node_metadata_hookr(   %torch.fx.experimental.symbolic_shapesr)   r*   r+   r,   r-   r.   r/   r0   torch.utils._sympy.numbersr1   torch.utils._sympy.referencer2   torch.utils._sympy.value_rangesr3   deferred_runtime_assertscopyr}   graph_code_logri   r   setnodesr<   rt   r	   r8   boolr   r9   r   rl   r   r   list	enumerateinserting_beforer   r   r:   r   r
   r   storage_offsetpoprH   _checkrp   rq   rr   rs   rB   r!   
erase_nodeusersrj   get	functoolspartialr   replace_all_uses_withrh   r@   logicboolalgrP   r   sym_constrain_rangesym_constrain_range_for_sizeitemsrn   	size_likero   _check_is_sizevar_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetrO   )9r#   r$   r%   r&   r0   r3   placeholdersfirst_non_placeholderrD   r   r   r   r   tr   assert_exprr>   sym_exprnew_untracked_symbolsnew_unbacked_bindings	hash_nodedefsr   r   i0ru   vrr   min_valgemax_valler    proxyr*   r,   r-   r/   r2   r)   r_   rL   r(   rV   r{   r+   r|   rU   r.   r   r}   r   r1   r   r~   rC   rK   s9   `                                 @@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   si	   P P	 	 	 2D; 66;;=MHHE24&92t	
 13M5L  #77m#$(!T"#
rww 
4 
& G dii'%Gdii &*48;hhmm;c]; "$sCx.1; 
	;, &)UM69e #,	
 	
 	
(+ (+T EU3BZ( O)4 ## 4E!a%L:O
 K	) $&8&>>]K	Q 	Q ]L9=0a%,,? )!&&( 3 1$ )+$-ahhj$9 DAq( !!" %,,. ,,#M$5$5dB$?@ {{		--55 
 IIaLD('3DIIaL'AAmS#/5kB ))A,CHH''-!#rww/		++C0!%%k2
 =(!-d!33X@ )1(=(=@R@R@T(T%
 .!499==1Db#Idf#((*+ & -8> 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< /1hhtnM(+ {{		22::		;;CC  ##D)D %>499==)<=%    #4"9"9"; JQJAwKKN@T @TD -4R9LM K/1xx48I/JM!,K		":A}Q?OPUJQX  n)#''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
( &b)..55;< 5%-- 3,0IIMM-,H04		>O0P A ,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A: -004#C(]n){K	) K	)	O)d
 %**, ,etU\\*

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

+,M] ]bK KhA A[	K	) K	)s^   4K	h1=h
Fh1	h1! h	F-h1.Dh%	?$h1hh1h"h1%h.*h11h;	)F),r   loggingr   r   typingr   r   r   r   r   rC   r   r   r9   torch.utils._pytreeutils_pytreer   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__rh   _logginggetArtifactLoggerr   r8   rl   r   r!   r   r   r   r   r   <module>r      s      
 : : >H  $ $  6 1 2 ; 2 - -
-g!11(LI
RWW 
# 
rww 8L#9  d+
 	f,f,f, f, 	f,
 
f, ,f,r   