
    Cjz                        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%dz  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    a/var/www/html/Carbon-Document/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&m'm	2m
(m} ddlm6 ddlm}m} ddlm} |j                                        8 j        4t,          j                            4          <t2                              dt7          d	|  d
                     i 1t9                      }d}	4j        D ]&77j        dk    r7}	 n|                    7           'dt,          j         dtB          f*;fd}
d=4j        D ]7d7j"        v rd= nd7j"        v r n	 	 	 	 d2d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 ]\  574)                    7|vr|5dz            n|	          5  7|v rtU          7          x}؈),-1 7;<fd} ||7fd            tW          |x}tF          j,                  rtQ          |-                                          D ]\  5} ||457fd!           t]          |          sZtQ          |/                                          D ]\  5} ||457fd"            ||0                                47fd#           7|	k    r |81                    dg                      7j2        tF          j3        tF          j4        j5        j6        j7        fv r7j8        r7j8        d         n7j9        :                    d$          }|d
k    stw          |          x}1v r\|/v rX|} j        <                    7           tW          |t,          j                   r!|j=        s j        <                    |           n/                    |           7j        dk    rtw          7          x:1:fd%} ||7j"        :                    d&i                     919fd'}:1v s |
7          r |            s  |            s |
7          r - t}          j?        ,7j"        :                    d          7j"        :                    d          7j"        :                    d          (                    5   .1:          1:<   ddd           n# 1 swxY w Y   1:         j@        }7A                    |            j        <                    7           t                              d)7|:           nC:1vr?tW          :;jC        ;jD        jE        jF        f          st-          jG        7<*          1:<   7j2        tF          j4        j5        jH        j7        tF          j4        j5        jI        j7        fv r j        <                    7           g } ||7j"        :                    d&                    x}r|J                                D ]\  }}|K                    |           %&'(34fd+3|1vr - t}          j?        ,7j"        :                    d          7j"        :                    d          7j"        :                    d          (                    5  t-          jG         37|          <*          1|<   ddd           n# 1 swxY w Y   t                              d,|1|                    |D ]"}81                    |g           }|0v r|jL        |         }|jM        r)|jN        t          jP        dz
  k    r ||jQ        6          }|R                                S                    |          s6fd-} - t}          j?        ,7j"        :                    d          7j"        :                    d          7j"        :                    d          (                    5   ||jQ                  x}j .1||k              j@        }4T                    tF          j4        j5        j6        j7        |d.||k     d/| d0f           /                    ||k                ||jN                  x} j .1|| k              j@        }!4T                    tF          j4        j5        j6        j7        |!d.|| k     d/|! d0f           /                    || k               ddd           n# 1 swxY w Y   0                    |            ||           $	 ddd           n# 1 swxY w Y   1J                                D ]p\  }"}#tW          |";jU                  rV|#j@        j        dk    rF|#j@        j=        s:t                              d1|"            j        <                    |#j@                   qdS )3a  
    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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 )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>   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   Fstack_tracenn_module_stackcustomskip_valc                    |st          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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   r8   r   r7   r   )r=   s    r   <lambda>zNinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s,    /9#ux}/M/MV&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7m++%dk377 ,KT[8I8IKK   %Yq\4;??F )!""I%+VY%7	'""&    	
 "'2DIm$&+:DI'("(DIh s   BB# #
B0/B0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  r_   )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   )rB   rY   r?   rZ   sympy.logic.boolalgr[   torch.utils._sympy.interpr\   r]   r   rA   )
ra   r   rY   r?   rZ   r[   r\   r]   Analysisr`   s
   `       r   r`   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)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     ty>>Q$)ENEDU3V"V"V59S3--O*S%,2O2O 
sEL))Kjel.K.K	
r   c                    | D ]}|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                               |            	t          j        j                            d          j                            d          j                            d                              5   
|j                   j        }                    t$          j        j        j        j        |d|j          d	| d
f           d d d            n# 1 swxY w Y                       |j                    d S )NrL   zinserting runtime assert %s)keyrD   rE   rF   rD   rE   rF   (Runtime assertion failed for expression 
 on node '')r   rh   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(   rn   rW   r&   r`   added_assertsconstrained_unbacked_symbolsra   r,   r!   graphr   ras_by_symbols         r   add_runtime_assertsz<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts   sQ    2	+ 2	+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;;;; -,%+$(IMM-$@$@(,	6G(H(H  $y}}X66  
 
   (-rw??DC''	5=  `rw``Z]```	                , !!"'****e2	+ 2	+s   )AG		G	G	rL   c                 ^   t          | t          j                  r
t          | j        t                    rt           | j                  x}	j                  r|vr t          j        j        	                    d          j        	                    d          j        	                    d                              5  t          j         |            
          |<   d d d            n# 1 swxY w Y   t                              d||                    d S d S d S d S d S )NrD   rE   rF   rq   tracerexpr_to_proxy[%s] = %s)r   r8   SymIntr   r   rZ   r}   r~   r   r   r   Proxyrw   rx   )symintcbsr'   rW   r&   ra   r!   r   rB   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44%- 3,0IMM-,H,H04	>O0P0P (,y}}X'>'>  
 
 M M 02xV/L/L/LM!,M M M M M M M M M M M M M M M 		":A}Q?OPPPPP+Q Q Q Q Q Q 32s   
"C88C<?C<c                       S r   r_   r   s   r   rJ   z1insert_deferred_runtime_asserts.<locals>.<lambda>P  s    D r   c                  f                          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 ;dAY% % r   c                  f                          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*    (;(;$)IN$=$AD!9)" )" r   c                  d                          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 ID7% % r   condc                  *    j         D ]	} | vr dS 
dS )NTF)r,   )symbolra   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   )rp   ra   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   rq   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                   r5                     t          j        | dd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|           )	Nr_   rg   r   rL   sizestridestorage_offsetzunrecognized keypath )rh   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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 3EMD!Q< P P '$ $  (
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   r/   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convertu  sL    & 111#'4(#&q66M( ( ( (#'44(s    
))rr   rs   rt   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_logrx   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usersr}   r~   r   replace_all_uses_withrw   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   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   re   r)   r*   r+   r-   r'   r(   rn   rW   r&   r`   r   r   ra   r,   r   r   r   r/   r   r   r   r   rB   r   rV   s>   `                                   @@@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   s   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   #'15(,") ")hm")4Z") c3h$.") S#X%	")
 ") 
") ") ") ") ") ")J &)UUM69ee *0V&&6VH# # # # # #,	
 	
 	
 	
 	
 	
 	
 	
3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+ 3+j EU3B3Z(( v) v)4 ## 44E!a%LL:O
 
 r	) r	) $$&8&>&>>]KQ Q Q Q Q Q Q Q Q Q Q Q0 ]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   54%- 3,0IMM-,H,H04	>O0P0P (,y}}X'>'>  
 
   7Dm - (7 7M(3                !.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==)<==% %   aQ #4"9"9";"; ^Q ^QJAwKKNNNHT HT HT HT HT HT HT HT HT HTT --44%- 3,0IMM-,H,H04	>O0P0P (,y}}X'>'>  
 
   02x "4 1 1&0 0 0M!,               		":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 +=
( ( ( ( ( 10!)/(,	m(D(D,0IMM:K,L,L $(9==#:#:  
 
 = = (/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((((_)gr	) r	) r	) r	) r	) r	) r	) r	) r	) r	) r	) r	) r	) r	) r	)j %**,, , ,etU\**	,
..J$ / II=tDDDH
+++, ,s   =K"fT;/f;T??fT?Gf	$\9	-f9\==f \=DfC9e 	f e$$f'e$(%ff	!f	)F)*r}   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__rw   _logginggetArtifactLoggerr   r7   rP   r   r   r   r   r_   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 
t 
 
 
 
rw 8L#9     d+++
 	q	, q	,q	,q	, q	, 	q	,
 
q	, q	, q	, ,+q	, q	, q	,r   