
    rhq                        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jB                  jE                  ed      Z#dejH                  dee%   fdZ&dejH                  ded   fdZ' ed      	 ddede
de%de(ddf
d       Z)y)    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                 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    q/var/www/html/ai-insurance-compliance-backend/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:;<= ddl ;ddlm, ddlm(m)m$m/m%m	&m
2m'm} ddlm6 ddlm}m} ddlm} |j(                  j+                         8 j,                  4t.        j0                  j3                  4      <t4        j7                  dt9        d	|  d
             i 1t;               }d}	4j<                  D ]&  77j>                  dk7  r7}	 n|jA                  7       ( dt.        jB                  dtD        f);fd}
d=4j<                  D ]$  7d7jF                  v rd= nd7jF                  v s$ n 	 	 d.dtH        j.                  jB                  dtJ        tL           dtJ        tN        tL        tP        f      ddf=fd+t;               .t;               0|r|n|##-fd-dddtD        f;fd*)*+,-.012 48fd}tS        4j<                        }tU        |dd       D ]y  \  574jW                  7|vr|5dz      n|	      5  7|v rtY        7      x}(+,1 ;<fd} ||7fd       t[        |x}tH        j\                        rtU        |j_                               D ]  \  5} ||457fd        ta        |      sJtU        |jc                               D ]  \  5} ||457fd         ||je                         47fd        7|	k(  r |8jg                  dg              7jh                  tH        jj                  tH        jl                  jn                  jp                  jr                  fv r7jt                  d   d
k(  s tw        7jt                  d         x}1v rp|.v rl7jt                  d   } j,                  jy                  7       t[        |t.        jB                        r9|jz                  s- j,                  jy                  |       n.jA                  |       7j>                  dk7  rqtw        7      x:c1:fd!} ||7jF                  j}                  d"i             99J 19fd#}:1v s |
7      r |       s |       s |
7      rf , t        j                  +7jF                  j}                  d      7jF                  j}                  d      $            5   -1:      1:<   ddd       1:   j                  }7j                  |        j,                  jy                  7       t        j7                  d%7|:       nT:1vrPt[        :;j                  ;j                  j                  j                  f      st/        j                  7<&      1:<   7jh                  tH        jl                  jn                  j                  jr                  tH        jl                  jn                  j                  jr                  fv r j,                  jy                  7       g } ||7jF                  j}                  d"            x}r|j                         D ]s  \  }}|j                  |       $%&'/34fd'3|1vs' , +      5  t/        j                   37|      <&      1|<   ddd       t        j7                  d(|1|          u |D ]  }8jg                  |g       }|0v r||j                  v r}|rM4j                  tH        jl                  jn                  j                  jr                  1|   j                  f       n.4j                  tH        j                  1|   j                  f       |j                  |   }|j                  r3|j                  t        j                  dz
  k(  r ||j                  6      }|j                         j                  |      s6fd)}1|   j                  jh                  /k7  rj , t        j                  +7jF                  j}                  d      7jF                  j}                  d      $            5   ||j                        x}t -1||k\        j                  }4j                  tH        jl                  jn                  jp                  jr                  |d*||k\   d+| d,f       .jA                  ||k\          ||j                        x}t -1||k        j                  } 4j                  tH        jl                  jn                  jp                  jr                  | d*||k   d+|  d,f       .jA                  ||k         ddd       0jA                  |        ||        	 ddd       | 1j                         D ]  \  }!}"t[        |!;j                        s|"j                  j>                  dk7  s7|"j                  jz                  rNt        j7                  d-|!        j,                  jy                  |"j                          y# 1 sw Y   GxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   Ix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.  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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)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>   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_stackc                 |   t        j                  d | j                        }	 | j                  }| j                  dk(  r:t        | j                  t              sJ t        |d   | j                        }|dd  } || | j                  <   ||| 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   r9   r   r8   r   )r>   s    r   <lambda>zNinsert_deferred_runtime_asserts.<locals>._node_metadata_hook.<locals>.<lambda>   s)    +5c588==+I"3' OR 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    
 OO II	
		[[Fww-'!$++s333 1t{{;%abM	!'!3DIIg "'2DIIm$&+:DII'( ' # 	 		s   A'B/ /	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  |	|j                  D cg c]  } 
| |       c}|      | |<   | |   S c c}w )Nr   )Integerr@   Symbol)BooleanAtom)_run_sympy_handlersympy_interp)rC   rV   r@   rW   sympy.logic.boolalgrX   torch.utils._sympy.interprY   rZ   r   rB   )expr_to_proxyr   rV   r@   rW   rX   rY   rZ   r>   Analysis_sympy_interps            r   r_   z6insert_deferred_runtime_asserts.<locals>._sympy_interp   s    113N =  &&dWffkBC->> 1:>))D3]=#.D
d
 T"" Es   A.
r   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)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     tyy>Q$))ENNEDUDU3V"V99S3-O*S%,,2O 
sELL)Kjell.K	
r   c                 X   | D ]  }|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
  }|r3t        |t              }j                  |g       j                  |        	      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)key(Runtime assertion failed for expression 
 on node '')r   rb   r-   nextiterlogdebugkeysminrO   
setdefaultappendr   call_functionr9   opsaten_assert_scalardefaultadd)rasrafvsmissingi1resr(   rh   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   sh    (	+B =( ,,-2T"''"6"678<XX1"'': 7rww?II3RWW=rww'CM..00Gc* ((R077; -R1DE 'rww?DDC''		55==  FrwwizZ]Y^^_`	 !!"''*Q(	+8 s   
A/F  F)	rK   c                 |   t        | t        j                        rt        | j                  t              rzt         | j                        x}j
                        rQ|vrL       5  t        j                   |       	      |<   d d d        t        j                  d||          y y y y y # 1 sw Y   (xY w)Ntracerexpr_to_proxy[%s] = %s)
r   r9   SymIntr   r   rW   r   Proxyrp   rq   )
symintcbsr'   rT   r&   r]   r!   rC   r   s
      r   match_symbolz5insert_deferred_runtime_asserts.<locals>.match_symbol#  s    "65<<8&v{{G<&!6v{{!CCAU\\ ]24R9LM M/1xxV/LM!,M		":A}Q?OP	 3 = 9M Ms   + B22B;c                       S r    r   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>0  s    D r   c                       j                  t        j                  j                  j                  j
                  f      S r   )rv   r9   rw   rx   sym_sizeintr   ir   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>5  s/    E$7$7 %		 7 7 ; ;dAY% r   c                       j                  t        j                  j                  j                  j
                  f      S r   )rv   r9   rw   rx   
sym_strider   r   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>=  s/    (;(;$)IINN$=$=$A$AD!9)" r   c                       j                  t        j                  j                  j                  j
                  f      S r   )rv   r9   rw   rx   sym_storage_offsetrz   )r   r   s   r   rI   z1insert_deferred_runtime_asserts.<locals>.<lambda>C  s-    E$7$7 %		 A A I ID7% r   c                  4    j                   D ]  } | vs y yNTF)r-   )symbolr]   sym_exprs    r   has_new_untracked_symbolszBinsert_deferred_runtime_asserts.<locals>.has_new_untracked_symbolsg  s(    "*"7"7 (!6#'( !r   unbacked_bindingsc                  <    j                         D ]  } | vs y yr   )rr   )rj   r]   resolved_unbacked_bindingss    r   has_new_unbacked_bindingszBinsert_deferred_runtime_asserts.<locals>.has_new_unbacked_bindingsv  s+    9>>@ (m3#'( !r   )rE   rF   zCSE node %s -> %s for expr %sr   c                 >   |dk(  r| S t        |      dk\  r8t        |d         r(t        |d   t        j                        r
|d   j                  dk(  rW j                  t        j                  j                  j                  j                  | |d   j                  f      |dd        S |d   j                  dk(  rW j                  t        j                  j                  j                  j                  | |d   j                  f      |dd        S  j                  |d   j                  | |d   j                  f      |dd        S t        |d         r* j                  |d   j                  | f      |dd        S t        |d   t        j                        r9 j                  t        j                  | |d   j                  f      |dd        S t        |d         r j                  | f      |dd        S t        |d         r9 j                  t        j                   | |d   j"                  f      |dd        S t        |d         r/ j                  t$        | |d   j&                  f      |dd        S t)        d|       )Nr   ra   r   rK   sizestridezunrecognized keypath )rb   r   rL   SequenceKeyr#   rv   r9   rw   rx   r   r   idxr   rJ   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LA- *71:} E *71:v7I7I J&qz&8')$)$7$7(-		(?(?(C(C)-wqz~~(>%& %,ABK(" !"  'qz(:')$)$7$7(-		(A(A(E(E)-wqz~~(>%& %,ABK(" !" $& % 1 1$+AJOOdGAJNN5K!" !(	$  (
MB#% % 1 1'!*//D7 KWUVUW[$  (
F4F4FG#% % 3 3$,$4$4tWQZ^^6L!" !(	$  (
MB#% % 3 3$Dtg!" !(	$  (
K@#% % 3 3$,$5$5gaj>P>P7Q!" !(	$  (
NC#% % 3 3$+dGAJ4I4I-J!" !(	$  #13H	1R"SSr   r   c                 J    |  fv ry 	 t        |       S # t        $ r Y y w xY wr   )r   	TypeError)r   r0   s    r   convertz0insert_deferred_runtime_asserts.<locals>.convertB  s5    & 11#'(#&q6M( (#'(s   
 	""rk   rl   rm   z%deleting unused reified symbol for %s)NN)YrC   (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_logrq   r
   setnodesr<   r{   r8   boolr   r9   r   rO   dictr   list	enumerateinserting_beforer   r   r:   r   r   r   storage_offsetpoprN   _checkrw   rx   ry   rz   rB   r   
erase_nodeusersget	functoolspartialr   replace_all_uses_withrp   r@   logicboolalgrX   r   sym_constrain_rangesym_constrain_range_for_sizeitemsru   	size_likerv   _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   assert_exprr>   r   r   	hash_nodedefsr   r   i0r|   vrr   min_valgemax_valler   r   r^   r)   r+   r,   r.   r'   r(   rh   rT   r&   r_   r   r*   r   r]   r-   r   r   r   r0   r   r   r   r   rC   r   rS   s>   `                                  @@@@@@@@@@@@@@@@@@@@@@@@@@@r   r   r   6   sr	   P P
 
 
 2 < 66;;=MHHEXX**51F24&92t	
 13M5L  #77m#$(!T"#
rww 
4 
& G dii'%Gdii &*48;hhmm;c]; "$sCx.1; 
	;: &)UM69e *0&6VH#,	
 	
 	
)+ )+V EU3BZ( \)4 ## 4E!a%L:O
 X	) $&8&>>]KQ Q ]L9=0a%,,? )!&&( 3 1$ )+$-ahhj$9 DAq( !!" %,,. ,,#M$5$5dB$?@ {{		--55 
 IIaLD('3DIIaL'AAmS#}4))A,CHH''-!#rww/		++C0!%%k2
 =(!-d!33X@! .Gtyy}}-@"E.* 2===! -8> 9 ;357 5%-- 3,0IIMM-,H04		>O0P 
 7D -x7M(3
 !.h 7 < <I..y9HH''-II7y(
 ]2:u||U[[-@-@-L-LM< /1hhtF.KM(+ {{		22::		;;CC  ##D)D %>499==)<=%    #4"9"9"; LQJAwKKN@T @TD -4R9LM /1xx "4 1&0M!, 		":A}Q?OPYLQ\  n)#''B/P 55,,,++!IINNGGOO*2.335
 ++!00=3D3I3I2K ++B/99S[[1_!< %RXXv6B AACLLRP
( &b)..55;< 5%-- 3,0IIMM-,H04		>O0P A ,3288+< <I%2="-%P%U%U % 3 3$)IINN$A$A$I$I(**RSUY`S`Raaklnkoop(q%&!" !. 1 1"- @+2288+< <I%2="-%P%U%U % 3 3$)IINN$A$A$I$I(**RSUY`S`Raaklnkoop(q%&!" !. 1 1"- @7A: -004#C(]n)UX	) X	)	\)~
 %**, ,etU\\*

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

+,U
 
f lA Au	X	) X	)s^   !J#h<hFh<!	h<*"h#	F-h<9Dh0	
$h<h h<#h-(h<0h95h<<i	)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__rp   _logginggetArtifactLoggerr   r8   rO   r   r   r   r   r   r   r   <module>r      s      
 / / >H  $ $  6 1 2 ; 2 - -
-g!11(<PQ
RWW 
# 
rww 8L#9  d+
 	B	,B	,B	, B	, 	B	,
 
B	, ,B	,r   