Ë
    ÄÓ^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 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y)é    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y)	Ú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j                  |«      }t	        j
                  |«      }t        j                  |«      }t        j                  | j                  |«      «      }t        |dd«      }t        j                  |j                  «      }	t        |	j                  «       «      }
t        ||	«       t!        t        |	j                  «       «      |
z
  «      }t#        |«      dk7  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      úi/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/experimental/rewriter.pyÚchange_func_globalsz1AST_Rewriter.rewrite.<locals>.change_func_globals6   s]   € ô Ø—
‘
ØØ—Z‘ZØŸ™ØŸ™ôˆAô ×(Ñ(¨¨AÓ.ˆAÜ#Ÿy™y¨×)9Ñ)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   s-  € ô !×/Ñ/°Ó3‰ˆ�QÜ,¨[Ó9ˆØ—‘˜Ó%ˆÜ!Ÿ™¨Ó0ˆô —Y‘Y˜~Ó.ˆ
Ü×,Ñ,¨T¯Z©Z¸
Ó-CÓDˆô �x  VÓ,ˆÜ—y‘y §¡Ó0ˆÜ˜,×+Ñ+Ó-Ó.ˆÜˆT�<Ô Üœ˜L×-Ñ-Ó/Ó0°;Ñ>Ó?ˆÜˆx‹=˜AÒÜ Ð#;¼CÀ»M¸?Ð!KÓLÐLØ" 8¨A¡;Ñ/ˆð	Üð	Ü&*¬3´¨;Ñ&7ð	äó	ñ$ # ;¸¿¹Ô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‰IÐ'¨fÔ5ˆÜ˜!œSŸ^™^Ô,Ü Ð#@ÄÀaÃÀ	Ð!JÓKÐKØ—F‘Fˆ	Ü˜)¤S§X¡XÔ.Ü Ð#:¼4À	»?Ð:KÐ!LÓMÐMØŸ(š(ˆd�hŠh¬¯©¸2ÀDÔ(IˆØŸ)™) SÐ)ˆ	Œô —x‘x iÔ0ˆô × Ñ  ¨tÓ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`   sQ   € ô �z‰zØ—[‘[�MÜ—(‘(Ü—X‘X ´·±³Ô<à—j‘j $§/¡/Ð2Øô	ô
ð 	
r#   N)r   Ú
__module__Ú__qualname__Ú__doc__ÚtorchÚ_dynamoÚdisabler   rC   r)   ÚAssertrS   rX   Ú	AnnAssignr`   re   © r#   r!   r   r      sn   „ ñð ‡]�]×Ñð(H˜,ð (H¨<ò (Hó ð(HðT5 §¡ð 5°·±ó 5ð,
 C§M¡Mð 
°c·j±jô 
r#   r   c                   óx   ‡ — 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                 ó6   •— t         ‰| �  t        |«      |«      S ©N)ÚsuperÚtraceÚ_rewrite)r7   rq   rr   Ú	__class__s      €r!   rv   zRewritingTracer.traceu   s   ø€ ô
 ‰w‰}œX d›^¨]Ó;Ð;r#   rt   )r   rf   rg   ri   ÚnnÚModuler   r   r4   r5   r	   rv   Ú__classcell__)rx   s   @r!   rp   rp   t   sQ   ø„ ð 04ñ<à�h‰h�o‰o ¨¨c¨Ñ 2Ñ2ð<ð ˜C ˜H‘~¨Ñ,ð<ð 
÷	<ñ <r#   rp   r   .r   c                 ó  ‡— t        | t        j                  j                  «      rBdt        j                  j                  dt        j                  j                  fˆfd„Š ‰| «      S t	        «       j                  t        t        | «      «      S )NÚmr   c                 óÊ   •—  G ˆfd„dt         j                  j                  «      }t        «       j	                  t        t        | j                  «      «      |_         || «      S )Nc                   óT   •‡ — 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                 óD  •— t         ‰| �  «        |j                  j                  «       D ]t  \  }}t	        |t
        j                  j                  «      r)t        j                   ‰|«      «      | j                  |<   ŒSt        j                  |«      | j                  |<   Œv y 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__†   sr   ø€ Ü‘GÑ$Ô&Ø $§¡× 3Ñ 3Ó 5ò <™˜˜1Ü% a¬¯©¯©Ô9Ü/3¯y©y¹ÈÓ9JÓ/K˜DŸM™M¨!Ò,ä/3¯y©y¸«|˜DŸM™M¨!Ò,ñ	<r#   )r   rf   rg   ri   ry   rz   rƒ   r{   )rx   rˆ   s   @€r!   ÚRewrittenModuler€   …   s#   ù„ ð<¨¯©¯©ð <¸T÷ <ò <r#   r‰   )ri   ry   rz   r   rC   r   r   Úforward)r}   r‰   rˆ   s     €r!   rˆ   z _rewrite.<locals>.rewrite_module„   sI   ø€ ö<¤%§(¡(§/¡/ô <ô '3£n×&<Ñ&<Ü”\ 1§9¡9Ó-ó'ˆOÔ#ñ # 1Ó%Ð%r#   )rJ   ri   ry   rz   r   rC   r   r   )r   rˆ   s    @r!   rw   rw   }   sc   ø€ ô �"”e—h‘h—o‘oÔ&ð	&œeŸh™hŸo™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’      s‹   ðÛ 
Û Û Û Û Ý $Ý ß ã Ý 1Ý +Ý  ôa
�3×&Ñ&ô a
ôH<�fô <ð>Ø�‰�‰˜( 3¨ 8Ñ,Ñ,ð>à
‡X�X‡_�_�x  S Ñ)Ñ)ô>r#   