
    &Vjigs                        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    X/root/voice-cloning/.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	 	 d/dtH          j        j!        dtJ          tL                   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+*+,-./123 59fd}tS          5j                  }tU          |dd                   D ]\  685+                    8|vr|6dz            n|	          5  8|v rtY          8          x}׈),-2 <=fd} ||8fd           t[          |x}tH          j.                  rtU          |/                                          D ]\  6} ||568fd           ta          |          sZtU          |1                                          D ]\  6} ||568fd            ||2                                58fd            8|	k    r |93                    dg                      8j4        tH          j5        tH          j6        j7        j8        j9        fv r8j:        r8j:        d         n8j;        <                    d!          }|d
k    st{          |          x}2v r\|/v rX|} j        >                    8           t[          |t.          j!                  r!|j?        s j        >                    |           n/                     |           8j        dk    rt{          8          x;x2;fd"} ||8j#        <                    d#i                     ::J 2:fd$};2v s |
8          r |            s |            s |
8          rx - t          jA        ,8j#        <                    d          8j#        <                    d          %                    5   .2;          2;<   ddd           n# 1 swxY w Y   2;         jB        }8C                    |            j        >                    8           t                              d&8|;           nC;2vr?t[          ;<jE        <jF        jG        jH        f          st/          jI        8='          2;<   8j4        tH          j6        j7        jJ        j9        tH          j6        j7        jK        j9        fv r j        >                    8           g } ||8j#        <                    d#                    x}r|L                                D ]\  }}|M                    |           %&'(045fd(4|2vri - ,          5  t/          jI         48|          ='          2|<   ddd           n# 1 swxY w Y   t                              d)|2|                    |D ]}93                    |g           }|1v r||jN        v rj|r<5O                    tH          j6        j7        jK        j9        2|         jB        f           n,5O                    tH          jP        2|         jB        f           |jQ        |         }|jR        r)|jS        t          jU        dz
  k    r ||jV        7          }|W                                X                    |          s}7fd*}2|         jB        j4        0k    ra - t          jA        ,8j#        <                    d          8j#        <                    d          %                    5   ||jV                  x}j .2||k              jB        }5O                    tH          j6        j7        j8        j9        |d+||k     d,| d-f           /                     ||k                ||jS                  x} j .2|| k              jB        }!5O                    tH          j6        j7        j8        j9        |!d+|| k     d,|! d-f           /                     || k               ddd           n# 1 swxY w Y   1                     |            ||           	 ddd           n# 1 swxY w Y   2L                                D ]p\  }"}#t[          |"<jY                  rV|#jB        j        dk    rF|#jB        j?        s:t                              d.|"            j        >                    |#jB                   qdS )0a  
    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)	_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_stackc                 V   t          j        d | j                  }	 | j        }| j        dk    rAt          | j        t                    sJ t          |d         | j                  }|dd          } || | j        <   n# t          $ r Y nw xY w|
|| 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_methodr      rE   rF   )
pytreetree_maprB   targetr<   r   strgetattrr   NotImplementedError)r   rE   rF   	fake_argsrN   val_keys        r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s    
 O  I	
 
		[Fw-''!$+s33333 1t{;;%abbM	!'!3DIg" 	 	 	 D		
 "'2DIm$&+:DI'((( '&s   A A? ?
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  |	 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   )rC   rV   r@   rW   sympy.logic.boolalgrX   torch.utils._sympy.interprY   rZ   r   rB   )
r^   r   rV   r@   rW   rX   rY   rZ   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)lenrB   funcLessThanGreaterThanr   rW   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 ]}|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 )NrK   zinserting runtime assert %s)key(Runtime assertion failed for expression 
 on node '')r   re   r-   nextiterlogdebugkeysminrO   
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rk   rT   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   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]```	                 !!"'****Q(	+ (	+s   AE++E/	2E/	rK   c                    t          | t          j                  rt          | j        t                    rt           | j                  x}j                  rq|vro           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tracerexpr_to_proxy[%s] = %s)
r   r9   SymIntr   r   rW   r   Proxyrs   rt   )
symintcbsr'   rT   r&   r^   r!   rC   r   s
      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol#  sO   "65<88
Q&v{G<<
Q '!6!6v{!C!CCAU\ 
Q ]2244R9LMM M M/1x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   +"BB Bc                       S r   r\   r   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>0  s    D r   c                  f                          t          j        j        j        j        f          S r   )ry   r9   rz   r{   sym_sizeintr   ir   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>5  s*    E$7$7 %	 7 ;dAY% % r   c                  f                          t          j        j        j        j        f          S r   )ry   r9   rz   r{   
sym_strider   r   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>=  s*    (;(;$)IN$=$AD!9)" )" r   c                  d                          t          j        j        j        j        f          S r   )ry   r9   rz   r{   sym_storage_offsetr}   )r   r   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>C  s(    E$7$7 %	 A ID7% % r   condc                  *    j         D ]	} | vr dS 
dS NTF)r-   )symbolr^   sym_exprs    r   has_new_untracked_symbolszBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbolsh  s1    "*"7 ( (!66#'44 7 5r   unbacked_bindingsc                  D                                     D ]	} | vr dS 
dS r   )ru   )rm   r^   resolved_unbacked_bindingss    r   has_new_unbacked_bindingszBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindingsw  s:    9>>@@ ( (m33#'44 4 5r   )rE   rF   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|           )	Nr\   rd   r   rK   sizestridestorage_offsetzunrecognized keypath )re   r   rL   SequenceKeyr#   ry   r9   rz   r{   r   r   idxr   rJ   r   r}   operatorgetitemfloordivdivisorrP   
inner_nameAssertionError)	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>.convertM  sL    & 111#'4(#&q66M( ( ( (#'44(s    
))rn   ro   rp   z%deleting unused reified symbol for %s)NN)ZrC   (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_logrt   r
   setnodesr<   r~   r8   boolr   r9   r   rO   dictr   list	enumerateinserting_beforer   r   r:   r   r   r   r   poprN   _checkrz   r{   r|   r}   rB   kwargsgetr   
erase_nodeusers	functoolspartialr   replace_all_uses_withrs   r@   logicboolalgrX   r   sym_constrain_rangesym_constrain_range_for_sizeitemsrx   	size_likery   _check_is_sizevar_to_rangeis_intuppersysmaxsizelower _default_unspecified_value_rangeissubsetrW   )?r!   r"   r#   r$   r/   r1   r2   r3   placeholdersfirst_non_placeholderrD   r   r   r   r   tr   r   assert_exprr>   r   r   	hash_nodedefsr   r   i0r   vrr   min_valgemax_valler   r   rb   r)   r+   r,   r.   r'   r(   rk   rT   r&   r]   r   r*   r   r^   r-   r   r   r   r0   r   r   r   r   rC   r   rS   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  
 &*48; ;hm;c]; "$sCx.1; 
	; ; ; ; ; ;: &)UUM69ee *0V&&6VH# # # # # #,	
 	
 	
 	
 	
 	
 	
 	
)+ )+ )+ )+ )+ )+ )+ )+ )+ )+ )+ )+ )+ )+ )+ )+V EU3B3Z(( g) g)4 ## 44E!a%LL:O
 
 c	) c	) $$&8&>&>>]KQ Q 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   (,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. .* 2===! ! ! ! ! ! --88>> . !: 9 ; ;	 . 4355 . 87   54%- 3,0IMM-,H,H04	>O0P0P    
 
 7Dm -x7 7M(3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 !.h 7 <I..y999H''---II7y(   
 ]22:u|U[-@-LM< <2 /1htF.K.K.KM(+ {	2:	;C   ##D)))D %>$=49==)<==% %   YQ #4"9"9";"; VQ V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 --44R9LMM  /1x "4 1 1&0 0 0M!,               		":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c	) c	) c	) c	) c	) c	) c	) c	) c	) c	) c	) c	) c	) c	) c	)L %**,, , ,etU\**	,
..J$ / II=tDDDH
+++, ,s   *K
f4TfTfTE(f $Z0	$f0Z44f7Z48FfC9e	<fefe%ff		f	)F)*r   loggingr   r   typingr   r   r   rC   r   r   r9   torch.utils._pytreeutils_pytreerL   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__rs   _logginggetArtifactLoggerr   r8   rO   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 
# 
 
 
 
rw 8L#9     d+++
 	M	, M	,M	,M	, M	, 	M	,
 
M	, M	, M	, ,+M	, M	, M	,r   