§
    ŠŠtj.  ã                   ó(  — 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 d dl	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j        j        ede
f         z  dej        j        ede
f         z  fd„ZdS )é    N)ÚCallable)ÚFunctionType)ÚAnyÚcast)Únormalize_source_lines)ÚTracer)ÚGraphc                   óŽ   — e Zd ZdZej        j        dedefd„¦   «         Zde	j
        de	j        fd„Zde	j        de	j        f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
    ÚfnÚreturnc                 ó(  — t          j        |¦  «        \  }}t          |¦  «        }d                     |¦  «        }t	          j        |¦  «        }t          j        |¦  «        }t          j        |  	                    |¦  «        ¦  «        }t          |dd¦  «        }t          j        |j        ¦  «        }	t          |	                     ¦   «         ¦  «        }
t          ||	¦  «         t!          t          |	                     ¦   «         ¦  «        |
z
  ¦  «        }t#          |¦  «        dk    rt%          dt#          |¦  «        › �¦  «        ‚|	|d                  }dt&          dt(          t*          t,          f         dt&          fd	„} |||j        ¬
¦  «        S )NÚ Úexecé   zExpected 1 new key, got r   ÚfÚglobalsr   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__)r   r   Úgs      ú\/var/www/html/CA-Chatbot/venv/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ÚAssertionErrorr   ÚdictÚstrÚobject)Úselfr   ÚsourcelinesÚ_ÚsourceÚnormalized_strÚ
source_astÚdest_astÚcodeÚglobals_dictÚkeys_beforeÚnew_keysÚfn_compiledr"   s                 r!   ÚrewritezAST_Rewriter.rewrite   sp  € õ !Ô/°Ñ3Ô3‰ˆ�QÝ,¨[Ñ9Ô9ˆØ—’˜Ñ%Ô%ˆÝ!œ¨Ñ0Ô0ˆõ ”Y˜~Ñ.Ô.ˆ
ÝÔ,¨T¯ZªZ¸
Ñ-CÔ-CÑDÔDˆõ �x  VÑ,Ô,ˆÝ”y ¤Ñ0Ô0ˆÝ˜,×+Ò+Ñ-Ô-Ñ.Ô.ˆÝˆT�<Ñ Ô Ð Ý�˜L×-Ò-Ñ/Ô/Ñ0Ô0°;Ñ>Ñ?Ô?ˆÝˆx‰=Œ=˜AÒÐÝ Ð!K½CÀ¹M¼MÐ!KÐ!KÑLÔLÐLØ" 8¨A¤;Ô/ˆð	Ýð	Ý&*­3µ¨;Ô&7ð	åð	ð 	ð 	ð 	ð$ #Ð" ;¸¼ÐGÑGÔGÐGr#   Únodec                 óØ  — t          j        dd¬¦  «        }t          |t           j        ¦  «        st	          dt          |¦  «        › �¦  «        ‚|j        }t          |t           j        ¦  «        st	          dt          |¦  «        › �¦  «        ‚|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)ÚmodezExpected ast.Expression, got zExpected ast.Call, got r   N)ÚvalueÚkind)rH   )r)   r*   Ú
isinstanceÚ
Expressionr3   ÚtypeÚbodyÚCallÚmsgÚConstantÚtestÚargsÚExprÚcopy_location)r7   rD   ÚnÚ	call_noderO   Úexpr_wrappers         r!   Úvisit_AssertzAST_Rewriter.visit_AssertJ   sÜ   € õ ŒIÐ'¨fÐ5Ñ5Ô5ˆÝ˜!�Sœ^Ñ,Ô,ð 	LÝ Ð!JÅÀaÁÄÐ!JÐ!JÑKÔKÐKØ”Fˆ	Ý˜)¥S¤XÑ.Ô.ð 	NÝ Ð!L½4À	¹?¼?Ð!LÐ!LÑMÔMÐMØœ(Ð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)ÚfuncrR   Úkeywords)ÚtargetsrH   )r)   ÚAssignÚtargetrN   ÚNameÚLoadrH   Ú
annotation)r7   rD   s     r!   Úvisit_AnnAssignzAST_Rewriter.visit_AnnAssign`   s_   € õ ŒzØ”[�MÝ”(Ý”X µ´±´Ð<Ñ<Ô<à”j $¤/Ð2Øð	ñ ô ð
ñ 
ô 
ð 	
r#   N)r   Ú
__module__Ú__qualname__Ú__doc__ÚtorchÚ_dynamoÚdisabler   rC   r)   ÚAssertrS   rX   Ú	AnnAssignr`   re   © r#   r!   r   r      s¥   € € € € € ðð ð „]Ôð(H˜,ð (H¨<ð (Hð (Hð (Hñ Ôð(HðT5 ¤ð 5°´ð 5ð 5ð 5ð 5ð,
 C¤Mð 
°c´jð 
ð 
ð 
ð 
ð 
ð 
r#   r   c                   óp   ‡ — e Zd Z	 ddej        j        edef         z  dee	ef         dz  de
fˆ fd„Zˆ xZS )ÚRewritingTracerNÚroot.Úconcrete_argsr   c                 ób   •— t          ¦   «                              t          |¦  «        |¦  «        S ©N)ÚsuperÚtraceÚ_rewrite)r7   rq   rr   Ú	__class__s      €r!   rv   zRewritingTracer.traceu   s#   ø€ õ
 ‰wŒw�}Š}�X d™^œ^¨]Ñ;Ô;Ð;r#   rt   )r   rf   rg   ri   ÚnnÚModuler   r   r4   r5   r	   rv   Ú__classcell__)rx   s   @r!   rp   rp   t   s‚   ø€ € € € € ð 04ð<ð <àŒhŒo ¨¨c¨Ô 2Ñ2ð<ð ˜C ˜H”~¨Ñ,ð<ð 
ð	<ð <ð <ð <ð <ð <ð <ð <ð <ð <r#   rp   r   .r   c                 ó  ‡— t          | t          j        j        ¦  «        r3dt          j        j        dt          j        j        fˆfd„Š ‰| ¦  «        S t	          ¦   «                              t          t          | ¦  «        ¦  «        S )NÚmr   c                 óÔ   •—  G ˆfd„dt           j        j        ¦  «        }t          ¦   «                              t          t          | j        ¦  «        ¦  «        |_         || ¦  «        S )Nc                   ó@   •‡ — e Zd Zdej        j        ddfˆ ˆfd„Zˆ xZS )ú9_rewrite.<locals>.rewrite_module.<locals>.RewrittenModuleÚorigr   Nc                 óH  •— t          ¦   «                              ¦   «          |j                             ¦   «         D ]f\  }}t	          |t
          j        j        ¦  «        r&t          j         ‰|¦  «        ¦  «        | j        |<   ŒJt          j        |¦  «        | j        |<   Œgd S rt   )	ru   Ú__init__Ú__dict__ÚitemsrJ   ri   ry   rz   r   )r7   r�   ÚkÚvrx   Ú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   rf   rg   ri   ry   rz   rƒ   r{   )rx   rˆ   s   @€r!   ÚRewrittenModuler€   …   sU   øø€ € € € € ð<¨¬¬ð <¸Tð <ð <ð <ð <ð <ð <ð <ð <ð <ð <ð <r#   r‰   )ri   ry   rz   r   rC   r   r   Úforward)r}   r‰   rˆ   s     €r!   rˆ   z _rewrite.<locals>.rewrite_module„   sz   ø€ ð<ð <ð <ð <ð <ð <ð <¥%¤(¤/ñ <ô <ð <õ '3¡n¤n×&<Ò&<Ý•\ 1¤9Ñ-Ô-ñ'ô 'ˆOÔ#ð #�? 1Ñ%Ô%Ð%r#   )rJ   ri   ry   rz   r   rC   r   r   )r   rˆ   s    @r!   rw   rw   }   s…   ø€ õ �"•e”h”oÑ&Ô&ð >ð	&�eœhœoð 	&µ%´(´/ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð ˆ~˜bÑ!Ô!Ð!õ ‰~Œ~×%Ò%¥d­<¸Ñ&<Ô&<Ñ=Ô=Ð=r#   )r)   r   r   r$   r'   Úcollections.abcr   Útypesr   Útypingr   r   ri   Útorch._sourcesr   Útorch.fx._symbolic_tracer   Útorch.fx.graphr	   ÚNodeTransformerr   rp   ry   rz   rw   rn   r#   r!   ú<module>r’      sb  ðØ 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð à €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø +Ð +Ð +Ð +Ð +Ð +Ø  Ð  Ð  Ð  Ð  Ð  ða
ð a
ð a
ð a
ð a
�3Ô&ñ a
ô a
ð a
ðH<ð <ð <ð <ð <�fñ <ô <ð <ð>ØŒŒ˜( 3¨ 8Ô,Ñ,ð>à
„X„_�x  S Ô)Ñ)ð>ð >ð >ð >ð >ð >r#   