
    קg                         d dl Z 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
mZmZmZ d dlmZ d dlmZ d dlmZ d dlZ G d de j                  Z G d	 d
e          Zde	ej        j        e
f         de	ej        j        e
f         fdZdS )    N)FunctionType)castUnionCallableDictOptionalAny)Tracer)Graph)normalize_source_linesc                   N    e Zd ZdZej        j        defd            Zd Z	d Z
dS )AST_Rewriterax  
    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                    t          j        |          \  }}t          |          }d                    |          }t	          j        |          }t          j        |          }t          j        | 	                    |                    }t          |dd          }t          j        |j                  }	t          |	                                          }
t          ||	           t!          t          |	                                          |
z
            }t#          |          dk    sJ |	|d                  }d } |||j                  S )N exec   r   c                     t          | j        || j        | j        | j                  }t          j        ||           }t          j        | j                  |_        |S )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      Z/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/fx/experimental/rewriter.pychange_func_globalsz1AST_Rewriter.rewrite.<locals>.change_func_globals5   s]     
Z  A (A..A#y)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#   rewritezAST_Rewriter.rewrite   s3    !/33Q,[99%%!00 Y~..
,TZZ
-C-CDD xV,,y00,++--..T<   L--//00;>??8}}!!!!"8A;/	 	 	 #";GGGGr%   c                 d   t          j        dd          }t          |t           j                  sJ |j        }t          |t           j                  sJ |j        r|j        nt          j        dd          }|j        |g|_	        t          j
        |          }t          j        ||          S )z
        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)rE   )r+   r,   
isinstance
ExpressionbodyCallmsgConstanttestargsExprcopy_location)r5   noden	call_noderK   expr_wrappers         r#   visit_AssertzAST_Rewriter.visit_AssertF   s     I'f555!S^,,,,,F	)SX.....(Idhh2D(I(I(I)S)	 xi000  t444r%   c           
          t          j        |j        gt          j        t          j        dt          j                              |j        |j        gg                     S )a  
        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)funcrN   keywords)targetsrE   )r+   AssigntargetrJ   NameLoadrE   
annotation)r5   rQ   s     r#   visit_AnnAssignzAST_Rewriter.visit_AnnAssignZ   s\     z4;-sxZSXZZ888*do.8= 8= 8= > > > 	>r%   N)r   
__module____qualname____doc__torch_dynamodisabler   rA   rU   rb    r%   r#   r   r      so          ]%H, %H %H %H %HN5 5 5(> > > > >r%   r   c                   n     e Zd Zddeej        j        ef         dee	e
ef                  def fdZ xZS )RewritingTracerNrootconcrete_argsreturnc                 b    t                                          t          |          |          S N)supertrace_rewrite)r5   rl   rm   	__class__s      r#   rr   zRewritingTracer.tracei   s!    ww}}Xd^^];;;r%   rp   )r   rc   rd   r   rf   nnModuler   r   r   strr	   r   rr   __classcell__)rt   s   @r#   rk   rk   h   sx        < <% 9: <8TXY\^aYaTbKc <ot < < < < < < < < < <r%   rk   r   rn   c                     t          | t          j        j                  r"dt          j        j        ffd |           S t	                                          t          t          |                     S )Nmc                      G fddt           j        j                  }t                                          t          t          | j                            |_         ||           S )Nc                   "     e Zd Z fdZ xZS )9_rewrite.<locals>.rewrite_module.<locals>.RewrittenModulec                 H   t                                                       |j                                        D ]f\  }}t	          |t
          j        j                  r&t          j         |                    | j        |<   Jt          j        |          | j        |<   gd S rp   )	rq   __init____dict__itemsrG   rf   ru   rv   r   )r5   origkvrt   rewrite_modules       r#   r   zB_rewrite.<locals>.rewrite_module.<locals>.RewrittenModule.__init__t   s    GG$$&&& $ 3 3 5 5 < <1%a99 </3y9J9J/K/KDM!,,/3y||DM!,,	< <r%   )r   rc   rd   r   rx   )rt   r   s   @r#   RewrittenModuler}   s   s>        < < < < < < < < < <r%   r   )rf   ru   rv   r   rA   r   r   forward)rz   r   r   s     r#   r   z _rewrite.<locals>.rewrite_moduler   su    < < < < < < <%(/ < < < '3nn&<&<T,PQPY=Z=Z&[&[O#"?1%%%r%   )rG   rf   ru   rv   r   rA   r   r   )r   r   s    @r#   rs   rs   m   sx    "eho&& >
	&ux 
	& 
	& 
	& 
	& 
	& 
	& ~b!!! ~~%%d<&<&<===r%   )r+   r&   r)   r   r   typesr   typingr   r   r   r   r   r	   torch.fx._symbolic_tracer
   torch.fx.graphr   torch._sourcesr   rf   NodeTransformerr   rk   ru   rv   rs   ri   r%   r#   <module>r      s`   


              = = = = = = = = = = = = = = = = + + + + + +             1 1 1 1 1 1 V> V> V> V> V>3& V> V> V>r< < < < <f < < <
>ux01 >eEHOX<U6V > > > > > >r%   