
    ^jǃ                        d dl Z d dlZd dlZd dlZd dlm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jF                  jI                  e!d      Z%dejL                  de'dz  fdZ(dejL                  ded   fdZ) ed      	 ddedede'de*ddf
d       Z+y)    N)Callable)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                 x    d| j                   v r| j                   d   S d| j                   v r| j                   d   S y)zx
    Get the example value key for a node, since dynamo uses "example_value"
    while non-strict export uses "val.
    example_valuevalN)metar   s    i/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/passes/runtime_assert.py_get_example_valuer   "   s=    
 $))#yy))	$))	yy    
sympy.Exprc                 f    t        |       }t        |t              r|j                  j                  S y N)r   
isinstancer   r   expr)r   r   s     r   _get_sym_valr    /   s'    
T
"C#|$xx}}r   T)is_backward_compatiblegm	shape_envnameexportc                    +,-./0123456789:;<=>?@ABC ddl ?ddlm1 ddlm-m.m6m}m} ddl	m
9 ddlm}m} ddlm} |j                   j#                         < j$                  7t&        j(                  j+                  7      @t,        j/                  dt1        d	|  d
             i 5t3               }	d}
7j4                  D ]&  ::j6                  dk7  r:}
 n|	j9                  :       ( dt&        j:                  dt<        f.?fd}dB7j4                  D ]$  :d:j>                  v rdB nd:j>                  v s$ n 	 	 	 	 d>dt@        j&                  j:                  dtB        dz  dtD        tB        tF        f   dz  dtD        tB        tF        f   dz  dt<        ddfBfd0t3               3t3               4|r|n|+dtD        ?jH                  t&        jJ                  f   d?jH                  dt&        jJ                  f+2fd2dddt<        f?fd/t@        jL                  t@        jN                  t@        jP                  jR                  jN                  jT                  f}d;dt&        j:                  dtF        fd}dt&        j:                  dtF        dtV        d   dtB        f fd ,dt&        j:                  dt<        f;fd!}dt&        j:                  dtF        dtV        d   ddf,7;fd"}t3               A7j4                  D ]\  ::jX                  |v s |:      s |:      }t[        |t&        j:                        s>t]        |      }|LAj9                  |       ^ d#t^        |   ddf./0123456 7:<Afd$}t_        7j4                        }ta        |dd%       D ]  \  8:7jc                  :|	vr|8d&z      n|
      5  :|	v rte        :      x}d'tf        d(th        g t&        j:                  f   ddf-015 :?@fd)} ||:fd*       t[        |x}t@        jj                        rta        |jm                               D ]  \  8} ||78:fd+        to        |      sJta        |jq                               D ]  \  8} ||78:fd,         ||js                         7:fd-       :|
k(  r |<ju                  dg              :jX                  |v rp |:      }t[        |t&        j:                        rt]        |      nd}|d
k(  r`|} j$                  jw                  :       t[        |t&        j:                        r|jx                  s j$                  jw                  |       n |:      rX:jX                  t@        jP                  jR                  jN                  jT                  ur
 |:||       |3j9                  |       n||g|5v rc|3v r_|} j$                  jw                  :       t[        |t&        j:                        r;|jx                  s/ j$                  jw                  |       n|3j9                  |       :j6                  dk7  rt]        :      x>dt<        f5>fd.} ||:j>                  j{                  d/i             =dt<        f5=fd0}>5v s |:      r |       s |       s |:      r 1 t}        j~                  0:j>                  j{                  d      :j>                  j{                  d      :j>                  j{                  d      1            5   25>      5><   ddd       5>   j                  }:j                  |        j$                  jw                  :       t        j/                  d2:|>       nT>5vrPt[        >?j                  ?j                  j                  j                  f      st'        jJ                  :@3      5><   :jX                  t@        jP                  jR                  j                  jT                  t@        jP                  jR                  j                  jT                  fv r j$                  jw                  :       g } ||:j>                  j{                  d/            x}r!|j                         D ]  \  }}|j                  |       d4t@        j                  dt&        j:                  t        z  f25fd5}|5vsK 1 t}        j~                  0:j>                  j{                  d      :j>                  j{                  d      :j>                  j{                  d      1            5  t'        jJ                  7j                  :t        |      |6      @3      5|<   ddd       t        j/                  d7|5|           |D ]g  } <ju                  | g       }!| 4v r|j                  |    CCj                  r3Cj                  t        j                  d&z
  k(  r |Cj                  9      C|j                         j                  C      sd8tF        dt        t        z  dz  f9?Cfd9}" 1 t}        j~                  0:j>                  j{                  d      :j>                  j{                  d      :j>                  j{                  d      1            5   |"Cj                        x}#| |#k\  }$|$Av r3j9                  |$       nk 25|$      j                  }%7j                  t@        jP                  jR                  jN                  jT                  |%d:|$ d;|% d<f       3j9                  |$        |"Cj                        x}&| |&k  }'|'Av r3j9                  |'       nk 25|'      j                  }(7j                  t@        jP                  jR                  jN                  jT                  |(d:|' d;|( d<f       3j9                  |'       ddd       4j9                  |         ||!       j 	 ddd        5j                         D ]  \  })}*t[        |)?j                        s|*j                  j6                  dk7  s7|*j                  jx                  rNt        j/                  d=|)        j$                  jw                  |*j                          y# 1 sw Y   xY w# 1 sw Y   IxY w# 1 sw Y   xY w# 1 sw Y   	axY w)?a(  
    During tracing, we may have discovered that some data-dependent values
    had runtime assert on them; e.g., torch.empty(x.item()) induces a runtime
    that x.item() >= 0.  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 compiler-generated asserts 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
    add bound checks at the end of this pass when an equivalent explicit assert
    is not already present in the graph.
    r   N)_set_node_metadata_hook)_get_placeholder_expr#_has_uninterpretable_sympy_functionfree_symbolsresolve_unbacked_bindingsRuntimeAssert)int_oo) OptimizedPythonReferenceAnalysisPythonReferenceAnalysis)ValueRangesz%sz$pre insert_deferred_runtime_asserts T)coloredplaceholderr   r   c                     t        |       x}duxr@ t        |j                         xr'  |       xr t        d | j                  D              S )z
        If a size/stride/storage offset call on an intermediate tensor,
        we can try to compute the value from input shapes instead.
        Nc              3      K   | ]d  }t        |t        j                        xrD t        t        |      t        j
                  t        j                  f      xr |j                  d k7   f yw)r2   N)r   r   Noder   torchTensorSizeop).0args     r   	<genexpr>z\insert_deferred_runtime_asserts.<locals>._is_intermediate_tensor_sym_call.<locals>.<genexpr>   s]        3( ,1#6uzz8RS,FFm+,s   A*A,)r    r   Numberanyargs)r   r   r)   sympys     r    _is_intermediate_tensor_sym_callzIinsert_deferred_runtime_asserts.<locals>._is_intermediate_tensor_sym_call   sf     !&&St3 	sELL11	 8<<	    99	 	
r   r   r   stack_tracenn_module_stackcustomskip_valc                    |st        j                  d | j                        }	 | j                  }| j                  dk(  rYt        | j                  t              s!t        dt        | j                               t        |d   | j                        }|dd  } || | j                  <   ||| j                  d<   ||| j                  d<   ||| j                  d<   y y # t        $ r Y @w xY w)	Nc                 d    t        | t        j                  j                        rt	        |       S | S r   )r   r6   r   r5   r   )r;   s    r   <lambda>zNinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s)    /9#uxx}}/M&s+ SV r   call_methodExpected str target, got r      rB   rC   rD   )pytreetree_mapr?   targetr9   r   strAssertionErrortypegetattrr   NotImplementedError)r   rB   rC   rD   rE   	fake_argsrN   val_keys          r   _node_metadata_hookz<insert_deferred_runtime_asserts.<locals>._node_metadata_hook   s      			I77m+%dkk37,7T[[8I7JK  %Yq\4;;?F )!"I%+Y%7		'" "'2DIIm$&+:DII'("(DIIh  '  	s   BC! !	C-,C-expr_to_proxyr   c           
          ddl m}m}m} ddlm} ddlm}m} || v r| |   S t        |||||f      r
 |	| |      S  |	|j                  D cg c]  } 
| |       c}|      | |<   | |   S c c}w )Nr   )Integerr=   Symbol)BooleanAtom)_run_sympy_handlersympy_interp)r@   rY   r=   rZ   sympy.logic.boolalgr[   torch.utils._sympy.interpr\   r]   r   r?   )rW   r   rY   r=   rZ   r[   r\   r]   r;   Analysis_sympy_interps            r   ra   z6insert_deferred_runtime_asserts.<locals>._sympy_interp   s     	213N =  &&dWffkBC->> 1:>))D3]=#.D
d
 T"" Es   A.
r   c                 X   t        | j                        dk7  s$| j                  j                  j                  fvry| j                  \  }}t        |j                        xr t        |j                        xs. t        |j                        xr t        |j                        S )N   F)lenr?   funcLessThanGreaterThanr   rZ   r=   )r   lhsrhsr@   s      r   _is_bound_expr_for_symbolzBinsert_deferred_runtime_asserts.<locals>._is_bound_expr_for_symbol   s     tyy>Q$))ENNEDUDU3V"V99S3-O*S%,,2O 
sELL)Kjell.K	
r   _fx_runtime_assert_preservec                     | j                   r| j                   d   S | j                  j                  d| j                  j                  d            S )Nr   condself)r?   kwargsgetr   s    r   _assertion_conditionz=insert_deferred_runtime_asserts.<locals>._assertion_condition   s9    9999Q<{{vt{{v'>??r   rm   assert_exprc                    dt         g t        f   dt        d z  fd}d }t        | j                        dkD  r| j                  d   }nS| j
                  t        j                  u r| j                  j                  d      }n| j                  j                  d      }t        |t              r|S t        |t        j                        r|j                  dk(  r}t        |j
                  t              s!t        dt        |j
                               |j
                  j!                  d	      D ]  }t#        ||      } t%        |      r ||      }||S t        |t              r|S d
| d| dS )Nfnr   c                 D   t        | dd       }|-|j                  dk7  s|j                  dk7  s|j                  dk7  ry h d}t	        j
                  |       D cg c]  }|j                  |vr| }}t        |      dk(  r>|d   j                  dk(  r,t        |d   j                  t              r|d   j                  S t        |      dk(  rP|d   j                  dk(  r>t        |d   j                  t              r!|d   j                  dk(  r|d   j                  S y c c}w )	N__code__r   >   NOPCACHERESUMEEXTENDED_ARGCOPY_FREE_VARSrK   RETURN_CONSTrc   
LOAD_CONSTRETURN_VALUE)rR   co_argcountco_posonlyargcountco_kwonlyargcountdisget_instructionsopnamerd   r   argvalrO   )rt   codeignored_opnamesinstinstructionss        r   static_string_from_callablez`insert_deferred_runtime_asserts.<locals>._assertion_message.<locals>.static_string_from_callable  s!   2z40D##q(**a/))Q.O  004;;o5 L  L!Q& O**n<|A55s;#A---L!Q& O**l:|A55s; O**n<#A---%s   DrK   message
assert_msgget_attrrJ   .(Runtime assertion failed for expression 
 on node '')r   objectrO   rd   r?   rN   r6   _checkro   rp   r   r   r5   r9   rP   rQ   splitrR   callable)	r   rm   rr   r   msgattratom
static_msgr"   s	           r   _assertion_messagez;insert_deferred_runtime_asserts.<locals>._assertion_message   sB   %	HRZ,@ %	S4Z %	N tyy>A))A,C[[ELL(++//),C++//,/Cc3Jc277#*(<Dcjj#.$'@cjjAQ@R%STT

((- +tT*+~8>
)%%$$9+jQUPVVWXXr   c                    | j                   t        j                  t        j                  fv ry| j                   t        j                  j
                  j                  j                  u xr | j                  j                        du S NT)	rN   r6   r   _assert_scalaropsatendefaultr   rp   )r   preserve_runtime_assert_keys    r   _is_user_runtime_assertz@insert_deferred_runtime_asserts.<locals>._is_user_runtime_assertB  sb    ;;5<<)=)=>>KK599>>88@@@ C		9:dB	
r   c           
         j                  |       5  j                  t        j                  j                  j
                  j                  | | ||      f      }|j                  j                  | j                         d|j                  <   d d d        | j                         j                  |        y # 1 sw Y   ,xY wr   )inserting_beforecall_functionr6   r   r   r   r   r   updatereplace_all_uses_with
erase_node)r   rm   rr   new_noder   graphr   s       r   _replace_with_aten_assertzBinsert_deferred_runtime_asserts.<locals>._replace_with_aten_assertJ  s     ##D) 	>**		--55)$kBCH MM  +9=HMM56	> 	""8,	> 	>s   A=B;;Crasc                 r   | D ]$  }|j                   v rj                  |j                          .|j                   v spt        |j                   j                        dk(  r<t	        t        |j                   j                              v r |j                         s |j                         rt        j                  d|j                           |j                         }|j                         z
  }|r4t        |t              }j                  |g       j                  |       ( 	t        j                  j                  j!                  d      j                  j!                  d      j                  j!                  d                  5   
|j                         j"                  }j%                  t&        j(                  j*                  j,                  j.                  |d|j                    d	| d
f       d d d        j                  |j                          ' y # 1 sw Y   (xY w)NrK   zinserting runtime assert %s)keyrB   rC   rD   rB   rC   rD   r   r   r   )r   addrd   r*   nextiterlogdebugkeysminrO   
setdefaultappend	functoolspartialr   rp   r   r   r6   r   r   r   r   )r   rafvsmissingi1resr)   rj   rV   r'   ra   added_assertsconstrained_unbacked_symbolsrW   r*   r"   r   r   ras_by_symboluser_assert_exprss         r   add_runtime_assertsz<insert_deferred_runtime_asserts.<locals>.add_runtime_asserts`  s    5	+Bww++!!"''* =( ,,-2T"''"6"678<XX1"'': 7rww?II3RWW=rww'CM..00Gc* ((R077; -%%+$(IIMM-$@(,		6G(H  $yy}}X6
  (rww?DDC''		55==  FrwwizZ]Y^^_`	, !!"''*k5	+> s   A/H--H6	rK   symintcbc                 @   t        | t        j                        rt        | j                  t              rt         | j                        x}	j
                        r|vr t        j                  j                  j                  d      j                  j                  d      j                  j                  d                  5  t        j                   |       
      |<   d d d        t        j                  d||          y y y y y # 1 sw Y   (xY w)NrB   rC   rD   r   tracerexpr_to_proxy[%s] = %s)r   r6   SymIntr   r   rZ   r   r   r   rp   r   Proxyr   r   )r   r   sr(   rV   r'   rW   r"   r   r@   r   s      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol  s    "65<<8&v{{G<&!6v{{!CCAU\\ ]24%-- 3,0IIMM-,H04		>O0P (,yy}}X'>
 M 02xxV/LM!,M 		":A}Q?OP 3 = 9M Ms    DDc                       S r    r   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>  s    D r   c                  (     j                        S r   )create_size_noder   ir   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>  s    E$:$:4$C r   c                  (     j                        S r   )create_stride_noder   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>  s    (@(@q(I r   c                  &     j                        S r   )create_storage_offset_node)r   r   s   r   rH   z1insert_deferred_runtime_asserts.<locals>.<lambda>  s    E$D$DT$J r   c                  4    j                   D ]  } | vs y y)NTF)r*   )symbolrW   sym_exprs    r   has_new_untracked_symbolszBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbols  s(    "*"7"7 (!6#'( !r   unbacked_bindingsc                  :    t        d      D ]  } | vs y y)Nz"resolved_unbacked_bindings is NoneTF)rP   )r   rW   resolved_unbacked_bindingss    r   has_new_unbacked_bindingszBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindings  s4    19,-QRR9 (m3#'( !r   r   zCSE node %s -> %s for expr %sr   dc                      | j                   j                        }t        |t        j                        r|j                   S |S r   )r   r   r   r   r   )r   pra   rW   s     r   _lower_symint_divisorz>insert_deferred_runtime_asserts.<locals>._lower_symint_divisorY  s3    )-E)3Arxx)@qvvGaGr   )lower_symintr   r   c                     | j                   j                     fv ry 	 j                  rt        |       S j                  rt	        |       S 	 y # t
        t        f$ r Y y w xY wr   )oois_intintis_floatfloat	TypeErrorOverflowError)r   r-   r@   vrs    r   convertz0insert_deferred_runtime_asserts.<locals>.convert  sk    EHH9fvg FF#'(!yy'*1v!{{',Qx  +  $ !*=9 (#'(s   A A A$#A$r   r   r   z%deleting unused reified symbol for %s)NNNF)Zr@   (torch._export.passes._node_metadata_hookr'   %torch.fx.experimental.symbolic_shapesr(   r)   r*   r+   r,   torch.utils._sympy.numbersr-   torch.utils._sympy.referencer.   r/   torch.utils._sympy.value_rangesr0   deferred_runtime_assertscopyr   r   proxyGraphAppendingTracergraph_code_logr   r   setnodesr9   r   r5   boolr   r6   rO   dictr   Exprr   r   r   r   r   r   r   rN   r   r    list	enumerater   r   r   r   r7   sizer	   stridestorage_offsetpopr   usersrp   r   r   r   r   r   r=   logicboolalgr[   sym_constrain_rangesym_constrain_range_for_sizeitemsr   r   r   _resolve_unbacked_bindingtuplevar_to_ranger   uppersysmaxsizelower _default_unspecified_value_rangeissubsetr   r   rZ   )Dr"   r#   r$   r%   r+   r,   r.   r/   r0   placeholdersfirst_non_placeholderrA   assert_targetsrq   r   r   rm   rr   r   r   r   r   tr   r;   r   r   	hash_nodedefsr   keypathr   i0r   r   min_valge_exprgemax_valle_exprler   r   r`   r   r(   r)   rj   rV   r'   ra   r   r   rW   r*   r   r   r-   r   r   r   r   r   r@   r   r   rU   r   sD   `                                          @@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   s   R P  2 < 66;;=MHHEXX**51F24&92t	
 13M5L  #77m#$(!T"#
rww 
4 
& G dii'%Gdii #'15(,")hhmm")4Z") c3h$.") S#X%	")
 ") 
")J &)UM69e *0&6VH#EJJ01#9>#	#4	
 	
 	
 			%%--N
 #@@277 @s @
@Ygg@Y @Y/7/E@Y	@YD
bgg 
$ 
gg /7/E	 *- 7;;.(-DT-J'-D$(*40*%))+676+m!4 6+ 6+ 6+ 6+p EU3BZ( E)4 ## 4E!a%L:O
 A	) $&8&>>]KQ QXb"''k5J Qt Q Q0 ]L9=0a%,,? )!&&( 3 1$C
 )+$-ahhj$9 DAq( ! I
 %,,.J ,,#M$5$5dB$?@ {{n,+D14>tRWW4Ml40SW4<CHH''-!#rww/		++C0.t4;;eiinn.K.K.S.SS5dD+N&2)--k:#/'=8'=8"++D1%c2773CIIHH//4&2)--k:
 =(!-d!33X@!4 ! .Gtyy}}-@"E.*!4 ! -8> 9 ;357 5%-- 3,0IIMM-,H04		>O0P (,yy}}X'>
  7D - (7M(3  !.h 7 < <I..y9HH''-II7! 	 ]2:\\5;;#6#6#B#BC< /1hhtF.KM(+ {{		22::		;;CC  ##D)D %>499==)<=%    #4"9"9"; QJAwKKNH H"''C- H -4%-- 3,0IIMM-,H04		>O0P (,yy}}X'>
  02xx % ? ?$($)'N1F !@ !"
 (.0M!,& 		":A}Q?OP;Q>  k)#''B/P 55++B/99S[[1_!< %RXXv6B AACLLRP

$3 
$3;+= 
$ 1!))/(,		m(D,0IIMM:K,L $(99==#:
 &; (/rxx'88GE&(GmG&*;; - 1 1' :%2='%J%O%O % 3 3$)IINN$A$A$I$I(**RSZR[[efheiij(k%&!" !. 1 1' :'.rxx'88GE&(GmG&*;; - 1 1' :%2='%J%O%O % 3 3$)IINN$A$A$I$I(**RSZR[[efheiij(k%&!" !. 1 1' :M&;P -004#C(Wk)mA	) A	)	E)P
 %**, ,etU\\*

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

+,C | n&; &;qA	) A	)s_   	M0s<9sF4s<;A+s<&6s#	D9s<D5s0	
$s<s s<#s-(s<0s95s<<t	)F),r   r   loggingr  collections.abcr   typingr   r   r   r@   r   r   r6   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__r   _logginggetArtifactLoggerr   r5   rO   r   r    r   r   r   r   r   <module>r4     s   
   
 $ / / >H  $ $  6 1 2 ; 2 - -
-g!11(<PQ
RWW 
t 
rww 8L#9  d+
 	q
,q
,q
, q
, 	q
,
 
q
, ,q
,r   