o
    #iC                     @   s   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m	Z	 neZ	d dl
Z
d dlm  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 e eZe
jed	Zd
ejdee fddZ edd	ddede	dede!ddf
ddZ"dS )    N)AnyDictOptionalSetTYPE_CHECKING)ShapeEnv)fx)compatibility)lazy_format_graph_code)SymNode)GraphModule
graph_codenodereturnc                 C   s,   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    r   \/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/fx/passes/runtime_assert.py_get_example_value   s
   



r   T)is_backward_compatibleFgm	shape_envnameexportc              
      s  t  }t  }| jjD ]Ijdkr4jtjjjj	kr4t
jdks#J |jd jd jd f jdkrSjtjjjj	krSt
jdksKJ |jd  q
ddlddlm mmmmm ddlm dd	lm |j | jtd
d  D sdS t dt!d| |  g }t  }"dg D ]}|j#|vr|$| ||j# q|d< i t  }	d}
jD ]jdkr n}
|	 q|
du rt%t&j}
t   D ]}|D ]
}'|j# qqt( d fdd}d
t)j}t*|dd D ]n\	+|	vr&|	d  n|
j%N |	v rt, }dur
fdd}||fdd t-| }tj.rt*|/ D ]\	}||	fdd q[t*|0 D ]\	}||	fdd qr||1 fdd |	vr|
}t2
D ]}|j%}q+|j% |"dg  W d   n	1 sw   Y  g }j34d }r|5 D ])\}}|$|  fddt67||< t( d||  q|D ]v}"|g }||j8v r.|r#| j9|vr":tjjjj	| j9f n:tj;| j9f |j<| }|= >|sldd }||j?}||j@}| j9||f|vrl:tjjjj	| j9f||j?||j@d  || qW d   n	1 s}w   Y  qd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.
    call_function   r   minmaxN)CallMethodKey cast_symbool_to_symint_guardlessConvertIntKeyDivideByKeyfree_symbolsInnerTensorKey)sympy_interp)PythonReferenceAnalysisc                 s   s    | ]}|V  qd S Nr   ).0rasr   r   r   	<genexpr>_   s    z2insert_deferred_runtime_asserts.<locals>.<genexpr>z%sz$pre insert_deferred_runtime_asserts placeholderzneeded_symbols = %sc              
      s   | D ]B}t d|j |j}|  }|r(t|td}|g | q |jj}	t
jjjj|d|j d| df qd S )Nzinserting runtime assert %s)keyz(Runtime assertion failed for expression z
 on node '')logdebugexprkeysr   str
setdefaultappendr   r   torchopsaten_assert_scalardefault)r*   rafvsmissingi1res)r'   r$   graphras_by_symbolsymbol_to_proxyr&   r   r   add_runtime_asserts   s&   

z<insert_deferred_runtime_asserts.<locals>.add_runtime_assertsc                    s~   t | tjr5t | jtr7t | jj }jr9|vr;|v r=t| |< t	
d||   d7  d S d S d S d S d S d S )Nsymbol_to_proxy[%s] = %sr   )
isinstancer6   SymIntr   r   r1   Symbolr   Proxyr/   r0   )symintcbs)inserted_sym_nodesneeded_symbolsrB   sympyr   r   match_symbol   s   

z5insert_deferred_runtime_asserts.<locals>.match_symbolc                      s    S r(   r   r   r   r   r   <lambda>   s    z1insert_deferred_runtime_asserts.<locals>.<lambda>c                           tjjjjfS r(   )r   r6   r7   r8   sym_sizeintr   r@   ir   r   r   rQ          c                      rR   r(   )r   r6   r7   r8   
sym_striderT   r   rU   r   r   rQ      rW   c                      s     tjjjjfS r(   )r   r6   r7   r8   sym_storage_offsetr:   r   )r@   r   r   r   rQ      s    unbacked_bindingsc                    s  |dkr| S t |dkrjt|d  rjt|d tjrj|d jdkr8tjjj	j
| |d jf|dd  S |d jdkrUtjjjj
| |d jf|dd  S |d j| |d jf|dd  S t|d  r|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      r   r   sizestridezunrecognized keypath )lenrF   pytreeSequenceKeyr   r   r6   r7   r8   rS   rT   idxr]   call_methodoperatorgetitemfloordivdivisorgetattr
inner_nameAssertionError)r   keypath)r    r"   r#   r%   r!   gor@   r   r   rk      s|   








z+insert_deferred_runtime_asserts.<locals>.gorE   c                 S   s    zt | W S  ty   Y d S w r(   )rT   	TypeError)rL   r   r   r   convertq  s
   
z0insert_deferred_runtime_asserts.<locals>.convert)r   r   )Asetr@   nodesoptargetr6   r7   r8   sym_constrain_ranger:   r^   argsaddkwargssym_constrain_range_for_sizerO   %torch.fx.experimental.symbolic_shapesr    r!   r"   r#   r$   r%   torch.utils._sympy.interpr&   torch.utils._sympy.referencer'   deferred_runtime_assertscopyanyvaluesgraph_code_logr0   r
   popr1   r5   nextiterupdater/   list	enumerateinserting_beforer   rF   Tensorr\   r]   storage_offsetranger   getitemsr   rI   	size_liker   r   _check_is_sizevar_to_range _default_unspecified_value_rangeissubsetlowerupper)r   r   r   r   ,nodes_that_already_have_sym_constraint_range+nodes_that_already_have_sym_constraint_sizenew_ras	ras_exprsr*   placeholderslast_placeholderr;   rC   ro   r   rP   trL   last_sym_node_defsrZ   rj   i0vrrm   min_valmax_valr   )r    r"   r#   r%   r'   r!   r$   rk   r@   rV   rM   rN   r   rA   rB   rO   r&   r   insert_deferred_runtime_asserts%   s  

 










B)






	 r   )F)#loggingrc   typingr   r   r   r   r   rw   r   r6   torch.utils._pytreeutils_pytreer_   r   torch.fx._compatibilityr	   torch.fx._utilsr
   torch.fx.experimental.sym_noder   torch.fx.graph_moduler   	getLogger__name__r/   _logginggetArtifactLoggerr~   Noder3   r   boolr   r   r   r   r   <module>   s:   
