Ë
    *êñi]  ã                   ó<  — 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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j0                  j2                  ef   deej0                  j2                  ef   fd„Zy)é    N)ÚCallable)ÚFunctionType)ÚAnyÚ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                 ó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/pod-logistic/pod-ai/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)rE   )r*   r+   Ú
isinstanceÚ
Expressionr4   ÚtypeÚbodyÚCallÚmsgÚConstantÚtestÚargsÚExprÚcopy_location)r5   ÚnodeÚnÚ	call_noderL   Ú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)ÚfuncrO   Úkeywords)ÚtargetsrE   )r*   ÚAssignÚtargetrK   ÚNameÚLoadrE   Ú
annotation)r5   rR   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   rA   rV   rc   © r$   r"   r   r      s:   „ ñð ‡]�]×Ñð&H˜,ò &Hó ð&HòP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)r5   rm   rn   Ú	__class__s      €r"   rs   zRewritingTracer.tracet   s   ø€ ô
 ‰w‰}œX d›^¨]Ó;Ð;r$   rq   )r   rd   re   r   rg   ÚnnÚModuler   r   ÚdictÚstrr   r   rs   Ú__classcell__)ru   s   @r"   rl   rl   s   sM   ø„ ð 37ñ<à�E—H‘H—O‘O XÐ-Ñ.ð<ð    S¨# X¡Ñ/ð<ð 
÷	<ñ <r$   rl   r   ro   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 rq   )	rr   Ú__init__Ú__dict__ÚitemsrG   rg   rv   rw   r   )r5   ÚorigÚkÚvru   Ú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   rd   re   r�   rz   )ru   r‡   s   @€r"   ÚRewrittenModuler   ‚   s   ù„ ÷<ñ <r$   rˆ   )rg   rv   rw   r   rA   r   r   Úforward)r|   rˆ   r‡   s     €r"   r‡   z _rewrite.<locals>.rewrite_module�   sI   ø€ ö<¤%§(¡(§/¡/ô <ô '3£n×&<Ñ&<Ü”\ 1§9¡9Ó-ó'ˆOÔ#ñ # 1Ó%Ð%r$   )rG   rg   rv   rw   r   rA   r   r   )r   r‡   s    @r"   rt   rt   |   sR   ø€ Ü�"”e—h‘h—o‘oÔ&ð	&œeŸh™hŸo™oõ 	&ñ ˜bÓ!Ð!ô ‹~×%Ñ%¤d¬<¸Ó&<Ó=Ð=r$   )r*   r   r   r%   r(   Úcollections.abcr   Útypesr   Útypingr   r   r   r   rg   Útorch._sourcesr	   Útorch.fx._symbolic_tracer
   Útorch.fx.graphr   ÚNodeTransformerr   rl   rv   rw   rt   rj   r$   r"   ú<module>r‘      s†   ðó Û Û Û Û Ý $Ý ß -Ó -ã Ý 1Ý +Ý  ô^
�3×&Ñ&ô ^
ôB<�fô <ð>��u—x‘x—‘¨Ð0Ñ1ð >°e¸E¿H¹H¿O¹OÈXÐ<UÑ6Vô >r$   