
    wib                         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Zd dlmZ d dlmZ d dlm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)AnyCallablecastDictOptionalUnion)normalize_source_lines)Tracer)Graphc                   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      n/root/.openclaw/workspace/chatterbox_venv_py311/lib/python3.11/site-packages/torch/fx/experimental/rewriter.pychange_func_globalsz1AST_Rewriter.rewrite.<locals>.change_func_globals6   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_AssertH   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_AnnAssign\   s_     z[M(X<<<j$/2  
 
 
 	
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                   p     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.tracep   s#    
 ww}}Xd^^];;;r%   rp   )r   rc   rd   r	   rf   nnModuler   r   r   strr   r   rr   __classcell__)rt   s   @r#   rk   rk   o   s~         37< <EHOX-.<  S#X/< 
	< < < < < < < < < <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__   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>        < < < < < < < < < <r%   r   )rf   ru   rv   r   rA   r   r   forward)rz   r   r   s     r#   r   z _rewrite.<locals>.rewrite_module}   sz    < < < < < < <%(/ < < < '3nn&<&<\19--' 'O# #?1%%%r%   )rG   rf   ru   rv   r   rA   r   r   )r   r   s    @r#   rs   rs   x   sx    "eho&& >	&eho 	& 	& 	& 	& 	& 	& ~b!!! ~~%%d<&<&<===r%   )r+   r   r   r&   r)   typesr   typingr   r   r   r   r   r	   rf   torch._sourcesr
   torch.fx._symbolic_tracer   torch.fx.graphr   NodeTransformerr   rk   ru   rv   rs   ri   r%   r#   <module>r      s`   


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