Ë
    M²j7  ã                   ó,  — 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z  dej,                  j.                  ez  fd„Zy)é    N)ÚCallable)ÚFunctionType)ÚAnyÚcast)Únormalize_source_lines)ÚTracer)ÚGraphc                   óZ   — e Zd ZdZej
                  j                  defd„«       Zd„ Z	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
    Úfnc                 óz  — 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„ } |||j                  ¬«      S )NÚ Úexecé   zExpected 1 new key, got 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      ú]/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/fx/experimental/rewriter.pyÚchange_func_globalsz1AST_Rewriter.rewrite.<locals>.change_func_globals8   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ÚAssertionError)Ú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¡;Ñ/ˆò	ñ  # ;¸¿¹ÔGÐGr"   c                 óè  — 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)rC   )r(   r)   Ú
isinstanceÚ
Expressionr2   ÚtypeÚbodyÚCallÚmsgÚConstantÚtestÚargsÚExprÚcopy_location)r3   ÚnodeÚnÚ	call_noderJ   Ú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)ÚfuncrM   Úkeywords)ÚtargetsrC   )r(   ÚAssignÚtargetrI   ÚNameÚLoadrC   Ú
annotation)r3   rP   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   r?   rT   ra   © r"   r    r   r      s:   „ ñð ‡]�]×Ñð&H˜,ò &Hó ð&HòP5ó,
r"   r   c                   ón   ‡ — e Zd Z	 ddej                  j
                  ez  deee	f   dz  de
fˆ fd„Zˆ xZS )ÚRewritingTracerNÚrootÚconcrete_argsÚreturnc                 ó6   •— t         ‰| �  t        |«      |«      S ©N)ÚsuperÚtraceÚ_rewrite)r3   rk   rl   Ú	__class__s      €r    rq   zRewritingTracer.tracet   s   ø€ ô
 ‰w‰}œX d›^¨]Ó;Ð;r"   ro   )r   rb   rc   re   ÚnnÚModuler   ÚdictÚstrr   r	   rq   Ú__classcell__)rs   s   @r    rj   rj   s   sH   ø„ ð 04ñ<à�h‰h�o‰o Ñ(ð<ð ˜C ˜H‘~¨Ñ,ð<ð 
÷	<ñ <r"   rj   r   rm   c                 óê   ‡— t        | t        j                  j                  «      r(dt        j                  j                  fˆfd„Š ‰| «      S t	        «       j                  t        t        | «      «      S )NÚmc                 óÊ   •—  G ˆfd„dt         j                  j                  «      }t        «       j	                  t        t        | j                  «      «      |_         || «      S )Nc                   ó"   •‡ — e Zd Zˆ ˆfd„Zˆ xZS )ú9_rewrite.<locals>.rewrite_module.<locals>.RewrittenModulec                 óD  •— t         ‰| �  «        |j                  j                  «       D ]t  \  }}t	        |t
        j                  j                  «      r)t        j                   ‰|«      «      | j                  |<   ŒSt        j                  |«      | j                  |<   Œv y ro   )	rp   Ú__init__Ú__dict__ÚitemsrE   re   rt   ru   r   )r3   ÚorigÚkÚvrs   Ú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   rb   rc   r   rx   )rs   r…   s   @€r    ÚRewrittenModuler}   ‚   s   ù„ ÷<ñ <r"   r†   )re   rt   ru   r   r?   r   r   Úforward)rz   r†   r…   s     €r    r…   z _rewrite.<locals>.rewrite_module�   sI   ø€ ö<¤%§(¡(§/¡/ô <ô '3£n×&<Ñ&<Ü”\ 1§9¡9Ó-ó'ˆOÔ#ñ # 1Ó%Ð%r"   )rE   re   rt   ru   r   r?   r   r   )r   r…   s    @r    rr   rr   |   sR   ø€ Ü�"”e—h‘h—o‘oÔ&ð	&œeŸh™hŸo™oõ 	&ñ ˜bÓ!Ð!ô ‹~×%Ñ%¤d¬<¸Ó&<Ó=Ð=r"   )r(   r   r   r#   r&   Úcollections.abcr   Útypesr   Útypingr   r   re   Útorch._sourcesr   Útorch.fx._symbolic_tracer   Útorch.fx.graphr	   ÚNodeTransformerr   rj   rt   ru   rr   rh   r"   r    ú<module>r�      sy   ðó Û Û Û Û Ý $Ý ß ã Ý 1Ý +Ý  ô^
�3×&Ñ&ô ^
ôB<�fô <ð>�—‘—‘ 8Ñ+ð >°·±·±À(Ñ0Jô >r"   