
    [Th\                     6   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJrJ	r	J
r
JrJr  S SKrS SKJr  S SKJr  S SKJr   " S S\ R(                  5      r " S	 S
\5      rS\\R.                  R0                  \	4   S\\R.                  R0                  \	4   4S jrg)    N)FunctionType)AnyCallablecastOptionalUnion)normalize_source_lines)Tracer)Graphc                   d    \ rS rSrSr\R                  R                  S\4S j5       r	S r
S rSrg)	AST_Rewriter   a\  
Take a FunctionType object representing a `forward` method, then
perform an AST rewrite to swap out nodes that are not symbolically
traceable with a callsite to the FX alternative.

To support swapping out an AST node, define a new `visit` method on
that node. For more details, see:
https://docs.python.org/3/library/ast.html#ast.NodeTransformer
fnc                 N   [         R                  " U5      u  p#[        U5      nSR                  U5      n[        R
                  " U5      n[        R                  " U5      n[        R                  " U R                  U5      5      n[        USS5      n[        R                  " UR                  5      n	[        U	R                  5       5      n
[        X5        [!        [        U	R                  5       5      U
-
  5      n[#        U5      S:X  d   eXS      nS nU" XR                  S9$ )N exec   r   c                     [        U R                  UU R                  U R                  U R                  S9n[
        R                  " X 5      n[        R                  " U R                  5      Ul        U$ )z?Based on https://stackoverflow.com/a/13503277/2988730 (@unutbu))nameargdefsclosure)	r   __code____name____defaults____closure__	functoolsupdate_wrappercopy__kwdefaults__)fglobalsgs      V/var/www/auris/envauris/lib/python3.13/site-packages/torch/fx/experimental/rewriter.pychange_func_globals1AST_Rewriter.rewrite.<locals>.change_func_globals6   s[     

ZZA ((.A#yy)9)9:AH    )r!   )inspectgetsourcelinesr	   jointextwrapdedentastparsefix_missing_locationsvisitcompiler   __globals__setkeysr   listlen)selfr   sourcelines_sourcenormalized_str
source_astdest_astcodeglobals_dictkeys_beforenew_keysfn_compiledr$   s                 r#   rewriteAST_Rewriter.rewrite    s     !//3,[9%!0 YY~.
,,TZZ
-CD xV,yy0,++-.T L--/0;>?8}!!!"A;/	  #;GGr&   c                    [         R                  " SSS9n[        U[         R                  5      (       d   eUR                  n[        U[         R
                  5      (       d   eUR                  (       a  UR                  O[         R                  " SSS9nUR                  U/Ul	        [         R                  " US9n[         R                  " XQ5      $ )zs
Swap out the Assert node (Python's `assert`) with a callsite to the
symbolically-traceable torch._assert function
ztorch._assert()eval)moder   N)valuekind)rG   )r,   r-   
isinstance
ExpressionbodyCallmsgConstanttestargsExprcopy_location)r6   noden	call_noderM   expr_wrappers         r#   visit_AssertAST_Rewriter.visit_AssertH   s     II'f5!S^^,,,,FF	)SXX....((dhh2D(I))S)	 xxi0   44r&   c           
          [         R                  " UR                  /[         R                  " [         R                  " S[         R
                  " 5       S9UR                  UR                  // S9S9$ )z
Swap out Python's AnnAssign with an Assign node where the annotation function is called.
Example:
     Original:
     y: Tensor_Type(1,2,3, Dyn) = f2(x)
    Output:
     y = annotate(f2(x),Tensor_Type((1,2,3,Dyn)))
annotate)idctx)funcrP   keywords)targetsrG   )r,   AssigntargetrL   NameLoadrG   
annotation)r6   rS   s     r#   visit_AnnAssignAST_Rewriter.visit_AnnAssign\   sQ     zz[[M((XX<jj$//2
 	
r&    N)r   
__module____qualname____firstlineno____doc__torch_dynamodisabler   rB   rW   re   __static_attributes__rg   r&   r#   r   r      s:     ]]%H, %H %HN5(
r&   r   c                      ^  \ rS rSr SS\\R                  R                  \4   S\	\
\\4      S\4U 4S jjjrSrU =r$ )RewritingTracero   rootconcrete_argsreturnc                 6   > [         TU ]  [        U5      U5      $ N)supertrace_rewrite)r6   rs   rt   	__class__s      r#   ry   RewritingTracer.tracep   s    
 w}Xd^];;r&   rg   rw   )r   rh   ri   rj   r   rl   nnModuler   r   dictstrr   r   ry   ro   __classcell__)r{   s   @r#   rq   rq   o   sM     37<EHHOOX-.<  S#X/< 
	< <r&   rq   r   ru   c                    ^ [        U [        R                  R                  5      (       a*  S[        R                  R                  4U4S jjmT" U 5      $ [	        5       R                  [        [        U 5      5      $ )Nmc                    >  " U4S jS[         R                  R                  5      n[        5       R	                  [        [        U R                  5      5      Ul        U" U 5      $ )Nc                   ,   >^  \ rS rSrU U4S jrSrU =r$ )9_rewrite.<locals>.rewrite_module.<locals>.RewrittenModule~   c                 V  > [         TU ]  5         UR                  R                  5        H|  u  p#[	        U[
        R                  R                  5      (       a+  [        R                  " T" U5      5      U R                  U'   MY  [        R                  " U5      U R                  U'   M~     g rw   )	rx   __init____dict__itemsrI   rl   r}   r~   r   )r6   origkvr{   rewrite_modules       r#   r   B_rewrite.<locals>.rewrite_module.<locals>.RewrittenModule.__init__   sn    G$& $ 3 3 5%a99/3yy9J/KDMM!,/3yy|DMM!,	 !6r&   rg   )r   rh   ri   rj   r   ro   r   )r{   r   s   @r#   RewrittenModuler   ~   s    < <r&   r   )rl   r}   r~   r   rB   r   r   forward)r   r   r   s     r#   r    _rewrite.<locals>.rewrite_module}   sI    <%((// < '3n&<&<\199-'O# #1%%r&   )rI   rl   r}   r~   r   rB   r   r   )r   r   s    @r#   rz   rz   x   sU    "ehhoo&&	&ehhoo 	& b!! ~%%d<&<==r&   )r,   r   r   r'   r*   typesr   typingr   r   r   r   r   rl   torch._sourcesr	   torch.fx._symbolic_tracer
   torch.fx.graphr   NodeTransformerr   rq   r}   r~   rz   rg   r&   r#   <module>r      s          7 7  1 +  [
3&& [
|<f <>uxx01 >eEHHOOX<U6V >r&   