
    /jq                        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j!        "                    ed          Z#dej$        dee%         fdZ&dej$        ded         fdZ' ed          	 ddede
de%de(ddf
d            Z)dS )    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                 ^    d| j         v r| j         d         S d| j         v r| j         d         S dS )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    c/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/fx/passes/runtime_assert.py_get_example_valuer   "   s=    
 $)##y))	$)		yt    
sympy.Exprc                 f    t          |           }t          |t                    r|j        j        S d S N)r   
isinstancer   r   expr)r   r   s     r   _get_sym_valr   /   s0    
T
"
"C#|$$ x}4r   T)is_backward_compatibleF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                                        9| j        5t.          j                            5          =t4                              dt9          d	| | d
                     i 2t;                      }	d}
5j        D ]&88j        dk    r8}
 n|	                     8           'dt.          j!        dtD          f,<fd}d>5j        D ]8d8j#        v rd> nd8j#        v r n	 	 	 d0dtH          j        j!        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 ]\  685+                    8|	vr|6dz            n|
          5   || tY          j-        |8j#        .                    d          8j#        .                    d          8j#        .                    d                              5  8|	v rt_          8          x}Ԉ+2<=fd} ||8fd           ta          |x}tH          j1                  rtU          |2                                          D ]\  6} ||568fd            tg          |          sZtU          |4                                          D ]\  6} ||568fd!            ||5                                58fd"           8|
k    r |96                    dg                      8j7        tH          j8        tH          j9        j:        j;        j<        fv r8j=        r8j=        d         n8j>        .                    d#          }|d
k    st          |          x}2v r\|/v rX|}| j        @                    8           ta          |t.          j!                  r!|jA        s| j        @                    |           n/                     |           8j        dk    rt          8          x;2;fd$} ||8j#        .                    d%i                     :2:fd&};2v s |8          r |            s~ |            st |8          r .2;          2;<   2;         jB        }8C                    |           | j        @                    8           t                              d'8|;           nC;2vr?ta          ;<jE        <jF        jG        jH        f          st/          jI        8=(          2;<   8j7        tH          j9        j:        jJ        j<        tH          j9        j:        jK        j<        fv r| j        @                    8           g } ||8j#        .                    d%                    x}r|L                                D ]n\  }}|M                    |           '()*045fd)4|2vrEt/          jI         48|          =(          2|<   t                              d*|2|                    o|D ]}96                    |g           }|1v r|jN        |         }|jO        r)|jP        t          jR        dz
  k    r ||jS        7          }|T                                U                    |          s7fd+}2|         jB        j7        0ur ||jS                  x} j .2|| k              jB        }!5V                    tH          j9        j:        j;        j<        |!d,|| k     d-|! d.f           /                     || k                ||jP                  x}"j .2||"k              jB        }#5V                    tH          j9        j:        j;        j<        |#d,||"k     d-|# d.f           /                     ||"k               1                     |            ||           	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   2L                                D ]p\  }$}%ta          |$<jW                  rV|%jB        j        dk    rF|%jB        jA        s:t                              d/|$           | j        @                    |%jB                   qdS )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o?t          |j                   o) |           o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   | ]\}t          |t          j                  o=t          t          |          t          j        t          j        f          o
|j        d k    V  ]dS )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>   sw          3(( ,1#66uz8RSS,Fm+     r   )r   r   Numberanyargs)r   r   r(   sympys     r    _is_intermediate_tensor_sym_callzIinsert_deferred_runtime_asserts.<locals>._is_intermediate_tensor_sym_call   s     !&&&St3 	sEL111	 87<<<	     9	    	
r   r   r   stack_tracenn_module_stackcustomc                    t          j        d | j                  }	 | j        }| j        dk    rct          | j        t                    s$t          dt          | j                             t          |d         | j                  }|dd          } || | j
        <   n/# t          $ r Y n#t          j        j        j        j        $ r Y nw xY w|
|| j
        d<   |
|| j
        d<   ||| j
        d<   d S d S )	Nc                 b    t          | t          j        j                  rt	          |           n| S r   )r   r9   r   r8   r   )r>   s    r   <lambda>zNinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s+    +5c58=+I+IR"3'''s 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   sB    O  I	
 
		[Fw-''!$+s33 (GD4E4EGG   !1t{;;%abbM	!'!3DIg" 	 	 	 Dx$4P 	 	 	 D		
 "'2DIm$&+:DI'("(DIh s   B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  |	 fd|j
        D             |           |<    |         S )Nr   )Integerr@   Symbol)BooleanAtom)_run_sympy_handlersympy_interpc                 (    g | ]} |          S  rb   )r=   r>   _sympy_interpexpr_to_proxys     r   
<listcomp>zJinsert_deferred_runtime_asserts.<locals>._sympy_interp.<locals>.<listcomp>   s%    DDD3]]=#..DDDr   )rC   r\   r@   r]   sympy.logic.boolalgr^   torch.utils._sympy.interpr_   r`   r   rB   )
rd   r   r\   r@   r]   r^   r_   r`   Analysisrc   s
   `       r   rc   z6insert_deferred_runtime_asserts.<locals>._sympy_interp   s    1111111111333333NNNNNNNN =   &&dWffkBCC 	?<->>> 10DDDDD$)DDD
 
d
 T""r   r   r   c                    t          | j                  dk    s| j        j        j        fvrdS | j        \  }}t          |j                  rt          |j                  p)t          |j                  o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     ty>>Q$)ENEDU3V"V"V59S3--O*S%,2O2O 
sEL))Kjel.K.K	
r   c           
        	 | D ]h}|j         	v set          |j         j                  dk    r8t          t	          |j         j                            
v r |j                   s |j                   rrt
                              d|j                     |j                   }|                                z
  }|r@t          |t                    }
                    |g                               |            |j                   j        }                    t          j        j        j        j        |d|j          d| df           	                    |j                    jd S )NrL   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   rk   r-   nextiterlogdebugkeysminrP   
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rq   rc   added_assertsconstrained_unbacked_symbolsrd   r-   graphras_by_symbols         r   add_runtime_assertsz<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts   s    '	+ '	+B =(( ,--22T"'"67788<XXX11"':: Y 76rw??	 Y II3RW===,rw''CM..000G +c*** ((R0077;;;; $mM27;;@##IN19 \27\\VY\\\	   !!"'****O'	+ '	+r   rL   )rE   rF   rG   c                 X   t          | t          j                  rt          | j        t                    rpt           | j                  x}j                  rM|vrKt          j         |                      |<   t          	                    d||                    d S d S d S d S d S )Ntracerexpr_to_proxy[%s] = %s)
r   r9   SymIntr   r   r]   r   Proxyry   rz   )symintcbsr'   rd   rC   r   s      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol8  s    "65<88
Q&v{G<<
Q '!6!6v{!C!CCAU\ 
Q ]22+-8BBDD+H+H+Ha(		":A}Q?OPPPPP
Q 
Q 
Q 
Q 
Q 
Q 32r   c                       S r   rb   r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>E  s    D r   c                  f                          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 ;dAY% % r   c                  f                          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*    (;(;$)IN$=$AD!9)" )" r   c                  d                          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 ID7% % r   condc                  *    j         D ]	} | vr dS 
dS )NTF)r-   )symbolrd   sym_exprs    r   has_new_untracked_symbolszBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbols~  s1    "*"7 ( (!66#'44 7 5r   unbacked_bindingsc                  B    t          d          D ]	} | vr dS 
dS )Nz"resolved_unbacked_bindings is NoneTF)rQ   )rs   rd   resolved_unbacked_bindingss    r   has_new_unbacked_bindingszBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindings  sC    19,-QRRR9 ( (m33#'44 4 5r   zCSE node %s -> %s for expr %sr   c                    |dk    r| S t          |          dk    r5t          |d                   rt          |d         t          j                  r|d         j        dk    rN                     t          j        j        j	        j
        | |d         j        f          |dd                    S |d         j        dk    rN                     t          j        j        j        j
        | |d         j        f          |dd                    S                      |d         j        | |d         j        f          |dd                    S t          |d                   r|d         j        dk    rB                     t          j        j        j        j        | f          |dd                    S                      |d         j        | f          |dd                    S t          |d         t          j                  r?                     t           j        | |d         j        f          |dd                    S t          |d                   r)                     | f          |dd                    S t          |d                   r?                     t           j        | |d         j        f          |dd                    S t          |d                   r:                     t(          | |d         j        f          |dd                    S t-          d|           )	Nrb   rj   r   rL   sizestridestorage_offsetzunrecognized keypath )rk   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LLA-- *71:} E E . *71:v7I J J .  'qz&88')r$)$7$7(-	(?(C)-wqz~(>%& %& %,ABBK(" (" !"  'qz(::')r$)$7$7(-	(A(E)-wqz~(>%& %& %,ABBK(" (" !" $&2 % 1 1$+AJOdGAJN5K!" !" !(	$ $  (
MBB +T&qz2BBB')r$)$7$7(-	(I(Q)-%& %& %,ABBK(" (" !" $&2 % 1 1'!*/D7 K KWUVUWUW[$ $  (
F4FGG T#%2 % 3 3$,$4tWQZ^6L!" !" !(	$ $  (
MBB T#%2 % 3 3$Dtg!" !" !(	$ $  (
K@@ T#%2 % 3 3$,$5gaj>P7Q!" !" !(	$ $  (
NCC T#%2 % 3 3$+dGAJ4I-J!" !" !(	$ $  #11R1R1R"S"SSr   r   c                 X    |  fv rd S 	 t          |           S # t          $ r Y d S w xY wr   )r   	TypeError)r   r0   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convertT  sL    & 111#'4(#&q66M( ( ( (#'44(s    
))rt   ru   rv   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_logrz   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_withry   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   rh   r)   r+   r,   r.   r'   r(   rq   rc   r   r*   r   rd   r-   r   r   r   r0   r   r   r   r   rC   r   rY   s?                                         @@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   sQ   P LLLPPPPPP
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 211111        <;;;;; 6;;==MHEX**511F94992t	
 	
 	
   13M55L  # #7m##$(!ET""""
rw 
4 
 
 
 
 
 
 
& G  di''%GEdiE  
 &*48+/	%) %)hm%)c]%) "$sCx.1%) c3h(	%)
 
%) %) %) %) %) %)P &)UUM69ee *0V&&6VH# # # # # #,	
 	
 	
 	
 	
 	
 	
 	
(+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+T EU3B3Z(( \) \)4
 "" $L 8 8a!e>S X	) X	) $#!' $	m < <$(IMM2C$D$D9==22	   	X	) X	)& $$&8&>&>>]KQ Q Q Q Q Q Q Q ]LLLL999=0a%,??  )!&&(( 3 3  1$         )++ $-ahhjj$9$9  DAq(L !!" !" !" !" !" !"    %,,..       ,,,##M$5$5dB$?$?@@@ {	-5   (,yMty||dkoof6M6MDLL'3D'9'99mKK#}44CH''---!#rw// 1	 1++C000!%%k222
 =((!-d!3!33X@! ! ! ! ! ! .G-Fty}}-@"EE. .*! ! ! ! ! ! --88>> . !: 9 ; ;	 . 4355 . 87   3@-)$3 3h/
 !.h 7 <I..y999H''---II7! 	    ]22:\5;#6#BC< <2 /1htF.K.K.KM(+ {	2:	;C   ##D)))D %>$=49==)<==% %   VQ #4"9"9";"; SQ SQJAwKKNNNJT JT JT JT JT JT JT JT JT JT JTX --+-8BBtW4E4Ef+U+U+Ua(		":A}Q?OPPP [) [)#''B//P 555+B/9 7S[1_!<!< %RXv66B AACCLLRPP '=
( ( ( ( ( &b).5?@ @ (/wrx'8'88GE!.}bGm!L!L!QB!// %	 = E$&$mrU\}$m$mhj$m$m$m!"   *--bGm<<<'.wrx'8'88GE!.}bGm!L!L!QB!// %	 = E$&$mrU\}$m$mhj$m$m$m!"   *--bGm<<<,00444##C((((w[){X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	) X	)v
 %**,, , ,etU\**	,
..J$ / II=tDDDH
+++, ,s8   	A+b04Wbb0bb0 b!b00b4	7b4	)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__ry   _logginggetArtifactLoggerr   r8   rP   r   r   r   r   rb   r   r   <module>r     s         



 / / / / / / / / / /  LLL>>>>>>>H  $ $ $ $ $ $ $ $ $       6 6 6 6 6 6 1 1 1 1 1 1 2 2 2 2 2 2 ; ; ; ; ; ; 2 2 2 2 2 2 - - - - - - -
-g!!11(<PQQ
RW 
# 
 
 
 
rw 8L#9     d+++
 	L	, L	,L	,L	, L	, 	L	,
 
L	, L	, L	, ,+L	, L	, L	,r   