§
    Ÿ²Åjñ  ã                   ó   — 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      úOC:\Projects\Historical\venv\Lib\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˜~Ñ.Ô.ˆ
ÝÔ,¨T¯ZªZ¸
Ñ-CÔ-CÑDÔDˆõ �x  VÑ,Ô,ˆÝ”y ¤Ñ0Ô0ˆÝ˜,×+Ò+Ñ-Ô-Ñ.Ô.ˆÝˆT�<Ñ Ô Ð Ý�˜L×-Ò-Ñ/Ô/Ñ0Ô0°;Ñ>Ñ?Ô?ˆÝ�8‰}Œ} Ò!Ð!Ð!Ð!Ø" 8¨A¤;Ô/ˆð	ð 	ð 	ð  #Ð" ;¸¼Ð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ˆ	Ý˜)¥S¤XÑ.Ô.Ð.Ð.Ð.Øœ(ÐIˆdŒhˆh­¬¸2ÀDÐ(IÑ(IÔ(IˆØœ) SÐ)ˆ	Œõ ”x iÐ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#   ø€ õ
 ‰wŒw�}Š}�X d™^œ^¨]Ñ;Ô;Ð;r%   rp   )r   rc   rd   r	   rf   ÚnnÚModuler   r   r   Ústrr   r   rr   Ú__classcell__)rt   s   @r#   rk   rk   o   s~   ø€ € € € € ð 37ð<ð <à�E”H”O XÐ-Ô.ð<ð    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”   ø€ Ý‘G”G×$Ò$Ñ&Ô&Ð&Ø $¤× 3Ò 3Ñ 5Ô 5ð <ð <™˜˜1Ý% a­¬¬Ñ9Ô9ð <Ý/3¬y¸¸ÈÑ9JÔ9JÑ/KÔ/K˜DœM¨!Ñ,Ð,å/3¬y¸©|¬|˜DœM¨!Ñ,Ð,ð	<ð <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   ø€ ð<ð <ð <ð <ð <ð <ð <¥%¤(¤/ñ <ô <ð <õ '3¡n¤n×&<Ò&<Ý•\ 1¤9Ñ-Ô-ñ'ô 'ˆOÔ#ð #�? 1Ñ%Ô%Ð%r%   )rG   rf   ru   rv   r   rA   r   r   )r   r…   s    @r#   rs   rs   x   sx   ø€ Ý�"•e”h”oÑ&Ô&ð >ð	&�eœhœoð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð ˆ~˜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ñ <ô <ð <ð>��u”x”¨Ð0Ô1ð >°e¸E¼H¼OÈXÐ<UÔ6Vð >ð >ð >ð >ð >ð >r%   