
    Vh,q                        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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    N/home/dcms/DCMS/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	1m
'm} ddlm5 ddlm}m} ddlm} |j&                  j)                         7 j*                  3t,        j.                  j1                  3      ;t2        j5                  dt7        d	|  d
             i 0t9               }d}	3j:                  D ]&  66j<                  dk7  r6}	 n|j?                  6       ( dt,        j@                  dtB        f(:fd}
d<3j:                  D ]$  6d6jD                  v rd< nd6jD                  v s$ n 	 	 d.dtF        j,                  j@                  dtH        tJ           dtH        tL        tJ        tN        f      ddf<fd*t9               -t9               /|r|n|##,fd,dddtB        f:fd)()*+,-/01 37fd}tQ        3j:                        }tS        |dd       D ]~  \  463jU                  6|vr|4dz      n|	      5  6|v rtW        6      x}*+0 :;fd} ||6fd       tY        |x}tF        jZ                        rtS        |j]                               D ]  \  4} ||346fd        t_        |      sJtS        |ja                               D ]  \  4} ||346fd         ||jc                         36fd        6|	k(  r |7je                  dg              6jf                  tF        jh                  tF        jj                  jl                  jn                  jp                  fv r6jr                  d   d
k(  s&tu        6jr                  d         x}0v s
|t )|      rl6jr                  d   } j*                  jw                  6       tY        |t,        j@                        r9|jx                  s- j*                  jw                  |       n-j?                  |       6j<                  dk7  rqtu        6      x9c09fd!} ||6jD                  j{                  d"i             88J 08fd#}90v s |
6      r |       s |       s |
6      rf + t}        j~                  *6jD                  j{                  d      6jD                  j{                  d      $            5   ,09      09<   ddd       09   j                  }6j                  |        j*                  jw                  6       t        j5                  d%6|9       nT90vrPtY        9:j                  :j                  j                  j                  f      st-        j                  6;&      09<   6jf                  tF        jj                  jl                  j                  jp                  tF        jj                  jl                  j                  jp                  fv r j*                  jw                  6       g } ||6jD                  j{                  d"            x}r|j                         D ]s  \  }}|j                  |       $%&'.23fd'2|0vs' + *      5  t-        j                   26|      ;&      0|<   ddd       t        j5                  d(|0|          u |D ]  }7je                  |g       }|/v r||j                  v r}|rM3j                  tF        jj                  jl                  j                  jp                  0|   j                  f       n.3j                  tF        j                  0|   j                  f       |j                  |   }|j                  r3|j                  t        j                  dz
  k(  r ||j                  5      }|j                         j                  |      s5fd)}0|   j                  jf                  .k7  rj + t}        j~                  *6jD                  j{                  d      6jD                  j{                  d      $            5   ||j                        x}t ,0||k\        j                  }3j                  tF        jj                  jl                  jn                  jp                  |d*||k\   d+| d,f       -j?                  ||k\          ||j                        x}t ,0||k        j                  } 3j                  tF        jj                  jl                  jn                  jp                  | d*||k   d+|  d,f       -j?                  ||k         ddd       /j?                  |        ||        	 ddd        0j                         D ]  \  }!}"tY        |!:j                        s|"j                  j<                  dk7  s7|"j                  jx                  rNt        j5                  d-|!        j*                  jw                  |"j                          y# 1 sw Y   GxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   Nx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) 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_stackc                 |   t        j                  d | j                        }	 | j                  }| j                  dk(  r:t        | j                  t              sJ t        |d   | j                        }|dd  } || | j                  <   ||| 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)    +5c588==+I"3' OR r   call_methodr      rD   rE   )
pytreetree_maprA   targetr;   r   strgetattrr   NotImplementedError)r   rD   rE   	fake_argsrM   val_keys        r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s    
 OO II	
		[[Fww-'!$++s333 1t{{;%abM	!'!3DIIg "'2DIIm$&+:DII'( ' # 	 		s   A'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)rB   rU   r?   rV   sympy.logic.boolalgrW   torch.utils._sympy.interprX   rY   r   rA   )expr_to_proxyr   rU   r?   rV   rW   rX   rY   r=   Analysis_sympy_interps            r   r^   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   rV   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                 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)NrJ   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   ra   r,   nextiterlogdebugkeysminrN   
setdefaultappendr   call_functionr8   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr'   rg   rS   r&   r^   added_assertsconstrained_unbacked_symbolsr\   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)	rJ   c                    t        | t        j                        rt        | j                  t              r~t        | j                  j
                  x}j                        rQ|vrL       5  t        j                   |             |<   d d d        t        j                  d||          y y y y y # 1 sw Y   (xY w)Ntracerexpr_to_proxy[%s] = %s)r   r8   SymIntr   r   r   rV   r   Proxyro   rp   )	symintcbsrS   r&   r\   r!   rB   r   s	      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol!  s    "65<<8&v{{G<&FKK,<,<'<qellK]24R9LM M/1xxV/LM!,M		":A}Q?OP	 3 L = 9
M Ms   / B66B?c                       S r    r   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>,  s    D r   c                       j                  t        j                  j                  j                  j
                  f      S r   )ru   r8   rv   rw   sym_sizeintr   ir   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>1  s/    E$7$7 %		 7 7 ; ;dAY% r   c                       j                  t        j                  j                  j                  j
                  f      S r   )ru   r8   rv   rw   
sym_strider   r   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>9  s/    (;(;$)IINN$=$=$A$AD!9)" r   c                       j                  t        j                  j                  j                  j
                  f      S r   )ru   r8   rv   rw   sym_storage_offsetry   )r   r   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>?  s-    E$7$7 %		 A A I ID7% r   c                  4    j                   D ]  } | vs y yNTF)r,   )symbolr\   sym_exprs    r   has_new_untracked_symbolszBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbolsf  s(    "*"7"7 (!6#'( !r   unbacked_bindingsc                  <    j                         D ]  } | vs y yr   )rq   )ri   r\   resolved_unbacked_bindingss    r   has_new_unbacked_bindingszBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindingsu  s+    9>>@ (m3#'( !r   )rD   rE   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* 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   r`   r   rJ   sizestridezunrecognized keypath )ra   r   rK   SequenceKeyr#   ru   r8   rv   rw   r   r   idxr   rI   operatorgetitemfloordivdivisorrO   
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   r/   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convert?  s5    & 11#'(#&q6M( (#'(s   
 	""rj   rk   rl   z%deleting unused reified symbol for %s)NN)XrB   (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_logrp   r
   setnodesr;   rz   r7   boolr   r8   r   rN   dictr   list	enumerateinserting_beforer   r   r9   r   r   r   storage_offsetpoprM   _checkrv   rw   rx   ry   rA   r   
erase_nodeusersget	functoolspartialr   replace_all_uses_withro   r?   logicboolalgrW   r   sym_constrain_rangesym_constrain_range_for_sizeitemsrt   	size_likeru   _check_is_sizevar_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetrV   )=r!   r"   r#   r$   r.   r0   r1   r2   placeholdersfirst_non_placeholderrC   r   r   r   r   tr   assert_exprr=   r   r   	hash_nodedefsr   r   i0r{   vrr   min_valgemax_valler   r   r]   r(   r*   r+   r-   r'   rg   rS   r&   r^   r   r)   r   r\   r,   r   r   r   r/   r   r   r   r   rB   r   rR   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; 
	;: &)UM69e *0&6VH#,	
 	
 	
(+ (+T EU3BZ( [)4 ## 4E!a%L:O
 W	) $&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@! .Gtyy}}-@"E.* 2===! -8> 9 ;3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< /1hhtF.KM(+ {{		22::		;;CC  ##D)D %>499==)<=%    #4"9"9"; LQJAwKKN@T @TD -4R9LM /1xx "4 1&0M!, 		":A}Q?OPYLQ\  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)SW	) W	)	[)|
 %**, ,etU\\*

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

+,Q] ]b lA As	W	) W	)s^   J(h>hFh>#	h>,"h%	F-h>;Dh2	$h>h"h>%h/*h>2h;7h>>i	)F)*r   loggingr   r   typingr   r   r   rB   r   r   r8   torch.utils._pytreeutils_pytreerK   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__ro   _logginggetArtifactLoggerr   r7   rN   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+
 	,,, , 	,
 
, ,,r   