
    קgm                        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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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                 ^    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    Z/var/www/html/ai-engine/env/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                    "#$%&'()*+,-./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                                        6 j        2t*                              dt/          d	|  d
                     i /t1                      }d}2j        D ]&55j        dk    r5} n|                    5           'dt8          j        dt<          f'7fd}d82j        D ]5d5j        v rd8 nd5j        v r n	 	 d+dt@          j        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          2j                  }
tM          |
dd                   D ]\  352'                    5|vr|
3dz            n|          5  5|v rtQ          5          x}Ո)*/ 7fd} ||5fd           tS          |x}t@          j*                  rtM          |+                                          D ]\  3} ||235fd           tY          |          sZtM          |-                                          D ]\  3} ||235fd            ||.                                25fd            5|k    r |	6/                    dg                      5j0        t@          j1        t@          j2        j3        j4        j5        fv r5j6        d         d
k    s+to          5j6        d                   x}/v s|n (|          rc5j6        d         } j        8                    5           tS          |t8          j                  r!|j9        s j        8                    |           n,                    |           5j        dk    rto          5          x}|j	        /:                                z
  } ||5j        ;                    d!i                     :                                /:                                z
  }|/v s |5          r|s|s |5          rx * ty          j=        )5j        ;                    d          5j        ;                    d          "                    5   +/|          /|<   ddd           n# 1 swxY w Y   /|         j>        }5?                    |            j        8                    5           t                              d#5||           nA|/vr=tS          |7jA        7jB        jC        jD        f          st9          jE        5          /|<   5j0        t@          j2        j3        jF        j5        t@          j2        j3        jG        j5        fv r j        8                    5           g } ||5j        ;                    d!                    x}r|H                                D ]\  }}|I                    |           "#$%-12fd$1|/vrg * )          5  t9          jE         15|                    /|<   ddd           n# 1 swxY w Y   t                              d%|/|                    |D ]}6/                    |g           }|.v r||jJ        v rj|r<2K                    t@          j2        j3        jG        j5        /|         j>        f           n,2K                    t@          jL        /|         j>        f           |jM        |         }|jN        r)|jO        t          jQ        dz
  k    r ||jR        4          }|S                                T                    |          s}4fd&}/|         j>        j0        -k    ra * ty          j=        )5j        ;                    d          5j        ;                    d          "                    5   ||jR                  x}j +/||k              j>        }2K                    t@          j2        j3        j4        j5        |d'||k     d(| d)f           ,                    ||k                ||jO                  x}j +/||k              j>        }2K                    t@          j2        j3        j4        j5        |d'||k     d(| d)f           ,                    ||k               ddd           n# 1 swxY w Y   .                    |            |	|           	 ddd           n# 1 swxY w Y   /H                                D ]p\  } }!tS          | 7jU                  rV|!j>        j        dk    rF|!j>        j9        s:t                              d*|             j        8                    |!j>                   qdS ),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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_stackc                     d | j         D             }	  | j        | | j        <   n# t          $ r Y nw xY w|
|| j        d<   ||| j        d<   d S d S )Nc                 n    g | ]2}t          |t          j        j                  rt	          |          n|3S  )r   r9   r	   r8   r   r=   s     r   
<listcomp>zPinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<listcomp>   sI     
 
 
 (2#ux}'E'ENs###3
 
 
r   rF   rG   )rC   targetr   NotImplementedError)r   rF   rG   	fake_argsval_keys       r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s    

 
y
 
 
		!,i!8DIg" 	 	 	 D		
 "'2DIm$&+:DI'((( '&s   ' 
44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   )IntegerrA   Symbol)BooleanAtom)_run_sympy_handlersympy_interpc                 (    g | ]} |          S rJ   rJ   )r>   r?   _sympy_interpexpr_to_proxys     r   rK   zJinsert_deferred_runtime_asserts.<locals>._sympy_interp.<locals>.<listcomp>   s%    DDD3]]=#..DDDr   )rD   rR   rA   rS   sympy.logic.boolalgrT   torch.utils._sympy.interprU   rV   r   rC   )
rY   r    rR   rA   rS   rT   rU   rV   r2   rX   s
   `       r   rX   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 	N< 7MMM 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)lenrC   funcLessThanGreaterThanr   rS   rA   )r    lhsrhsrD   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                               |            	          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 )N   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r    r^   r.   nextiterlogdebugkeysminstr
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr)   rd   rP   r(   rX   added_assertsconstrained_unbacked_symbolsrY   r.   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;;;; -,R1DEE 
 
'-rw??DC''	5=  `rw``Z]```	  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 !!"'****O'	+ '	+s   AE++E/	2E/	rf   c                    t          | t          j                  rt          | j        t                    rt          | j        j        x}j                  ro|vrm           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 )Nexpr_to_proxy[%s] = %s)r   r9   SymIntr   r   r    rS   r	   Proxyrm   rn   )symintcbsrP   r(   rY   r#   rD   s      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol  s*   "65<88Q&v{G<<Q 'FK,<'<qelKKQ ]2244R9LMM > >/1x~~M!,> > > > > > > > > > > > > > >		":A}Q?OPPPPPQ Q Q Q Q Q 32s   ' BBBc                       S r   rJ   r   s   r   <lambda>z1insert_deferred_runtime_asserts.<locals>.<lambda>  s    D r   c                  f                          t          j        j        j        j        f          S r   )rt   r9   ru   rv   sym_sizeintr   ir   s   r   r   z1insert_deferred_runtime_asserts.<locals>.<lambda>$  s*    E$7$7 %	 7 ;dAY% % r   c                  f                          t          j        j        j        j        f          S r   )rt   r9   ru   rv   
sym_strider   r   s   r   r   z1insert_deferred_runtime_asserts.<locals>.<lambda>,  s*    (;(;$)IN$=$AD!9)" )" r   c                  d                          t          j        j        j        j        f          S r   )rt   r9   ru   rv   sym_storage_offsetrx   )r   r   s   r   r   z1insert_deferred_runtime_asserts.<locals>.<lambda>2  s(    E$7$7 %	 A ID7% % r   unbacked_bindings)rF   rG   zCSE node %s -> %s for expr %sc                    |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                   r4                     |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|           )NrJ   r]   r   rf   sizestridezunrecognized keypath )r^   r   pytreeSequenceKeyr%   rt   r9   ru   rv   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  sE   "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#%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   r1   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convert&  sL    & 111#'4(#&q66M( ( ( (#'44(s    
))rh   ri   rj   z%deleting unused reified symbol for %s)NN)VrD   (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_logrn   r   setnodesr<   ry   r	   r8   boolr   r9   r   rq   r   r   list	enumerateinserting_beforer   r   r:   r   r
   r   storage_offsetpoprL   _checkru   rv   rw   rx   rC   r!   
erase_nodeusersro   get	functoolspartialr   replace_all_uses_withrm   rA   logicboolalgrT   r   sym_constrain_rangesym_constrain_range_for_sizeitemsrs   	size_likert   _check_is_sizevar_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetrS   )9r#   r$   r%   r&   r0   r3   placeholdersfirst_non_placeholderrE   r   r   r   r   tr   assert_exprr?   sym_exprnew_untracked_symbolsnew_unbacked_bindings	hash_nodedefsr   r   i0rz   vrr   min_valgemax_valler    proxyr*   r,   r-   r/   r2   r)   rd   rP   r(   rX   r   r+   r   rY   r.   r   r   r   r1   r   r   rD   rO   s9   `                                 @@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   s~   P LLLPPPPPP	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 211111DDDDDD;;;;;; 6;;==MHE94992t	
 	
 	
   13M55L  # #7m##$(!ET""""
rw 
4 
 
 
 
 
 
 
& G  di''%GEdiE  
 &*48; ;hm;c]; "$sCx.1; 
	; ; ; ; ; ;, &)UUM69ee # # # # # #,	
 	
 	
 	
 	
 	
 	
 	
(+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+ (+T EU3B3Z(( O) O)4 ## 44E!a%LL:O
 
 K	) K	) $$&8&>&>>]K	Q 	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  
 IaLD(('3DIaL'A'AAmSS#/55kBB 0 )A,CH''---!#rw// 1	 1++C000!%%k222
 =((!-d!3!33X@ )1(=@R@R@T@T(T%
 .-!49==1Db#I#I dff#((**+ & --88>> . !6	 . 0 . 87  ] 54%- 3,0IMM-,H,H04	>O0P0P    ] ] 7DmMS[6\6\M(3] ] ] ] ] ] ] ] ] ] ] ] ] ] ] !.h 7 <I..y999H''---II7y(   
 ]22:u|U[-@-LM< <2 /1htnnM(+ {	2:	;C   ##D)))D %>$=49==)<==% %   MQ #4"9"9";"; JQ JQJAwKKNNN@T @T @T @T @T @T @T @T @T @T @TD --44R9LMM K K/1x48I8I/J/JM!,K K K K K K K K K K K K K K K		":A}Q?OPPP n) n)#''B//P 555,,, ++!INGO*2.35   
 ++!0=3D3I2K   +B/9 7S[1_!<!< %RXv66B AACCLLRPP /A
( ( ( ( ( &b).5;< < 54%- 3,0IMM-,H,H04	>O0P0P    A A ,3728+<+< <I%2]="-%P%P%U % 3 3$)IN$A$I(*(qSUY`S`(q(qln(q(q(q%&!" !" !" !. 1 1"- @ @ @+2728+<+< <I%2]="-%P%P%U % 3 3$)IN$A$I(*(qSUY`S`(q(qln(q(q(q%&!" !" !" !. 1 1"- @ @ @7A A A A A A A A A A A A A A A: -00444##C((((]n){K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	) K	)\
 %**,, , ,etU\**	,
..J$ / II=tDDDH
+++, ,s   =K'e.$T 4e. Te.TE&e.."Z	e.Z  e.#Z $Fe./C9d4	(e.4d88e.;d8<%e..e2	5e2	)F),r   loggingr   r   typingr   r   r   r   r   rD   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__rm   _logginggetArtifactLoggerr   r8   rq   r   r!   r   r   rJ   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(LII
RW 
# 
 
 
 
rw 8L#9     d+++
 	f, f,f,f, f, 	f,
 
f, f, f, ,+f, f, f,r   