Ë
    f^(h\  ã                   ó4  — 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 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.                  j0                  e	f   deej.                  j0                  e	f   fd„Zy)é    N)ÚFunctionType)ÚAnyÚCallableÚcastÚOptionalÚUnion)Ú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                 óP  — 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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      ú\/var/www/skyplay_api_hub/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)Ú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°;Ñ>Ó?ˆÜ�8‹} Ò!Ð!Ð!Ø" 8¨A¡;Ñ/ˆò	ñ  # ;¸¿¹ÔGÐGr$   c                 ó”  — 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)rD   )r*   r+   Ú
isinstanceÚ
ExpressionÚbodyÚCallÚmsgÚConstantÚtestÚargsÚExprÚcopy_location)r4   ÚnodeÚnÚ	call_noderJ   Úexpr_wrappers         r"   Úvisit_AssertzAST_Rewriter.visit_AssertH   s—   € ô �I‰IÐ'¨fÔ5ˆÜ˜!œSŸ^™^Ô,Ð,Ð,Ø—F‘Fˆ	Ü˜)¤S§X¡XÔ.Ð.Ð.ØŸ(š(ˆ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)ÚtargetsrD   )r*   ÚAssignÚtargetrI   ÚNameÚLoadrD   Ú
annotation)r4   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òN5ó(
r$   r   c                   ór   ‡ — 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 )ÚRewritingTracerÚrootÚconcrete_argsÚreturnc                 ó6   •— t         ‰| �  t        |«      |«      S ©N)ÚsuperÚtraceÚ_rewrite)r4   rk   rl   Ú	__class__s      €r"   rq   zRewritingTracer.tracep   s   ø€ ô
 ‰w‰}œX d›^¨]Ó;Ð;r$   ro   )r   rb   rc   r   re   ÚnnÚModuler   r   ÚdictÚstrr   r   rq   Ú__classcell__)rs   s   @r"   rj   rj   o   sM   ø„ ð 37ñ<à�E—H‘H—O‘O XÐ-Ñ.ð<ð    S¨# X¡Ñ/ð<ð 
÷	<ñ <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__ÚitemsrF   re   rt   ru   r   )r4   Ú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$   )rF   re   rt   ru   r   r@   r   r   )r   r…   s    @r"   rr   rr   x   sR   ø€ Ü�"”e—h‘h—o‘oÔ&ð	&œeŸh™hŸo™oõ 	&ñ ˜bÓ!Ð!ô ‹~×%Ñ%¤d¬<¸Ó&<Ó=Ð=r$   )r*   r   r   r%   r(   Útypesr   Útypingr   r   r   r   r   re   Útorch._sourcesr	   Útorch.fx._symbolic_tracer
   Útorch.fx.graphr   ÚNodeTransformerr   rj   rt   ru   rr   rh   r$   r"   ú<module>rŽ      sƒ   ðó Û Û Û Û Ý ß 7Õ 7ã Ý 1Ý +Ý  ô[
�3×&Ñ&ô [
ô|<�fô <ð>��u—x‘x—‘¨Ð0Ñ1ð >°e¸E¿H¹H¿O¹OÈXÐ<UÑ6Vô >r$   