Ë
    g^(h<#  ã            	       ó�  — d dl Z d dlmZ d dlmZmZm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 d dlmZ d dlmZ d dlmZ d	d
lmZ deeej8                  j:                  j<                     edef   f   dej>                  j@                  jB                  de"e#ej8                  j:                  j<                  f   de$fd„Z% G d„ d«      Z&dejN                  de(fd„Z)dej>                  jB                  dee(   fd„Z*d„ Z+dej>                  jB                  dee$ee   e"e#ef   f   fd„Z,dej>                  jB                  de$fd„Z-y)é    N)Údefaultdict)ÚAnyÚCallableÚOptional)Úenable_python_dispatcher)Úcompute_unbacked_bindingsÚrebind_unbackedÚstatically_known_trueÚsym_eq)Ú_pytree)Ú
OrderedSet)Útree_mapé   )ÚVÚpattern.ÚnodeÚmodulesÚreturnc                 óª  — t        |j                  «      dk(  ryt        |j                  d   t        j                  j
                  «      r$t        |t        j                  j
                  «      sy|j                  d   j                  dk7  ryt        |j                  d   j                  t        «      sy|j                  d   j                  |vryt        ||j                  d   j                     «      | d   ury|j                  dk7  r|j                  dk7  ry|j                  | d   k7  ryt        |j                  d   j                  «      dkD  ryy)Nr   FÚcall_moduleÚcall_functionÚcall_methodr   T)ÚlenÚargsÚ
isinstanceÚtorchÚfxÚNodeÚopÚtargetÚstrÚtypeÚusers)r   r   r   s      úV/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/fx_utils.pyÚmatches_module_function_patternr%      s
  € ô
 ˆ4�9‰9ƒ~˜ÒØÜ�d—i‘i ‘l¤E§H¡H§M¡MÔ2¼*ØŒe�h‰h�m‰mô;ð à‡y�y��|‡�˜-Ò'ØÜ�d—i‘i ‘l×)Ñ)¬3Ô/ØØ‡y�y��|×Ñ 'Ñ)ØÜˆG�D—I‘I˜a‘L×'Ñ'Ñ(Ó)°¸±Ñ;Øà‡w�w�/Ò! d§g¡g°Ò&>ØØ‡{�{�g˜a‘jÒ Øä
ˆ4�9‰9�Q‰<×ÑÓ Ò"ØØó    c                   ó‚   — e Zd ZdZdej
                  j                  ddfd„Zdej
                  j                  fd„Z	d„ Z
y)	ÚFakeTensorUpdatera:  
    The main idea here is that it's difficult to maintain accurate fake
    tensors (our primary form of metadata) for each node in our graph as we
    transform it.

    The most reliable way to obtain this information is by rerunning
    faketensor propagation. However, in general, faketensor propagation is
    fairly expensive. So, instead we'd like to only rerun faketensor
    propagation on nodes that have changed.

    In order to detect which nodes have changed, we first hash its node,
    target, and argument lists (which are immutable in FX).

    Then, whenever we call incremental_update, we check which FX nodes have a
    new hash, and recompute the faketensor metadata for that node. Then, we
    continue to recursively compute the faketensors for all users until the
    fake tensors stop changing.
    Úgraphr   Nc                 óÈ   — t        t           «       | _        || _        | j                  j                  D ],  }| j                  j                  | j                  |«      «       Œ. y ©N)r   r   Úprocessed_hashesr)   ÚnodesÚaddÚ	hash_node)Úselfr)   r   s      r$   Ú__init__zFakeTensorUpdater.__init__M   sN   € Ü *¬3¡Ó 1ˆÔØˆŒ
à—J‘J×$Ñ$ò 	<ˆDØ×!Ñ!×%Ñ% d§n¡n°TÓ&:Õ;ñ	<r&   r   c                 ón   — ||j                   t        |j                  «      t        |j                  «      fS r+   )r    Úidr   Úkwargs)r0   r   s     r$   r/   zFakeTensorUpdater.hash_nodeT   s%   € à�d—k‘k¤2 d§i¡i£=´"°T·[±[³/ÐBÐBr&   c           	      óR  ‡ ‡‡‡— t        t        «      Š‰ j                  j                  D ]  }‰t	        |«      xx   dz  cc<   Œ d„ Šˆˆˆˆ fd„Šd„ }t        t           «       }‰ j                  j                  D �]‹  }‰ j                  |«      ‰ j                  v rt        |«      |vrŒ/ ||«      sŒ8t        |«      \  }}}|sŒJt        j                  5  t        «       5   |j                  |i |¤Ž}d d d «       d d d «       d|j                  v r ‰|j                  d   «      rŒ­t        t        j                  j                   |«       ||j                  d<   t        j                  j                   x}rt#        ||«      x}	r|	|j                  d<   ‰t	        |«      xx   dz  cc<   |j%                  |j&                  D �
cg c]  }
t        |
«      ‘Œ c}
«       ‰ j                  j)                  ‰ j                  |«      «       �ŒŽ y # 1 sw Y   �ŒxY w# 1 sw Y   �ŒxY wc c}
w )Nr   c                 ó,   — t        t        | |«      «      S r+   )r
   r   )ÚnewÚolds     r$   Úis_intlist_samez=FakeTensorUpdater.incremental_update.<locals>.is_intlist_same]   s   € Ü(¬°°SÓ)9Ó:Ð:r&   c                 óŽ  •— t        | «      t        |«      k7  ryt        | t        t        f«      r6t	        | «      t	        |«      k7  ryt        ˆfd„t        | |«      D «       «      S | €|d u S t        | t        j                  «      sËt        | t        j                  t        j                  t        j                  f«      s J dt        | «      › d‰j                  › �«       ‚| j                  j                  j                  t!        j"                  | j                  j$                  |j                  j$                  «      «      t         j&                  k(  S  ‰| j(                  |j(                  «      r| j*                  |j*                  k7  ry| j*                  t        j,                  k(  rP ‰| j/                  «       |j/                  «       «      r*t1        | j3                  «       |j3                  «       k(  «      sy| j4                  |j4                  k7  ryt7        | «      t7        |«      k(  ry‰t7        |«         dk(  rt7        | «      ‰vryy)NFc              3   ó6   •K  — | ]  \  }} ‰||«      –— Œ y ­wr+   © )Ú.0Únew_iÚold_iÚis_fake_tensor_sames      €r$   ú	<genexpr>zTFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same.<locals>.<genexpr>f   s"   øè ø€ ò Ù:F¸%ÀÑ'¨¨u×5ñùs   ƒzUnknown type z in Tr   )r"   r   ÚlistÚtupler   ÚallÚzipr   ÚTensorÚSymIntÚSymBoolÚSymFloatr)   r   Ú	shape_envÚ_maybe_evaluate_staticÚsympyÚEqÚexprÚtrueÚshapeÚlayoutÚstridedÚstrider
   Ústorage_offsetÚdeviceÚget_storage)r7   r8   Úexisting_storagesr@   r9   r0   s     €€€€r$   r@   zAFakeTensorUpdater.incremental_update.<locals>.is_fake_tensor_same`   sÇ  ø€ Ü�C‹yœD ›IÒ%ØÜ˜#¤¤e˜}Ô-Ü�s“8œs 3›xÒ'Ø Üó ÜJMÈcÐSVË-ôó ð ð ˆ{Ø˜d�{Ð"Ü˜c¤5§<¡<Ô0Ü! #¬¯©´e·m±mÄUÇ^Á^Ð'TÔUð Ø#¤D¨£I ;¨d°4·:±:°,Ð?óÐUð —H‘H×&Ñ&×=Ñ=ÜŸ™ §¡§¡°·±·±Ó>óô —z‘zñ"ðñ # 3§9¡9¨c¯i©iÔ8¸C¿J¹JÈ#Ï*É*Ò<TØØ�z‰zœUŸ]™]Ò*Ù# C§J¡J£L°#·*±*³,Ô?Ü,Ø×&Ñ&Ó(¨C×,>Ñ,>Ó,@Ñ@ôð à�z‰z˜SŸZ™ZÒ'Øä˜3Ó¤;¨sÓ#3Ò3Øð "¤+¨cÓ"2Ñ3°qÒ8Ü Ó$Ð,=Ñ=àØr&   c                 ó¾   — | j                   dk(  xrM t        | j                  t        j                  j
                  «      xs | j                  t        j                  k(  S )Nr   )r   r   r    r   Ú_opsÚ
OpOverloadÚoperatorÚgetitem©r   s    r$   Úshould_process_nodezAFakeTensorUpdater.incremental_update.<locals>.should_process_node�   sI   € ð —7‘7˜oÑ-ò Ü˜4Ÿ;™;¬¯
©
×(=Ñ(=Ó>ò 3Ø—;‘;¤(×"2Ñ"2Ñ2ðr&   ÚvalÚunbacked_bindings)r   Úintr)   r-   Úget_node_storager   r/   r,   r3   Úget_fake_args_kwargsr   Ú	fake_moder   r    Úmetar	   rJ   r   Úupdater#   r.   )r0   r   r^   Ú
to_processÚis_validr   r4   Únew_fake_tensorrJ   Úsymbol_to_pathÚuserrW   r@   r9   s   `          @@@r$   Úincremental_updatez$FakeTensorUpdater.incremental_updateX   sæ  û€ Ü=HÌÓ=MÐØ—J‘J×$Ñ$ò 	;ˆDØÔ.¨tÓ4Ó5¸Ñ:Ô5ð	;ò	;÷+	òZ		ô  ¤‘_Ó&ˆ
Ø—J‘J×$Ñ$ó !	<ˆDà—‘˜tÓ$¨×(=Ñ(=Ñ=Ü�t“H JÑ.àá& tÔ,Øä%9¸$Ó%?Ñ"ˆH�d˜FÙØÜ—‘ñ ?Ô6Ó8ñ ?Ø"- $§+¡+¨tÐ">°vÑ">�÷?÷ ?à˜Ÿ	™	Ñ!Ñ&9Ø §¡¨5Ñ!1ô'ð äœAŸK™K×1Ñ1°4¸ÔIà.ˆD�I‰I�eÑÜŸ[™[×2Ñ2Ð2�	Ð2Ü";¸IÀÓ"WÐW�ÐWð 2@�—	‘	Ð-Ñ.àÔ.¨tÓ4Ó5¸Ñ:Ó5à×Ñ°D·J±JÖ?¨Dœr $�xÒ?Ô@à×!Ñ!×%Ñ% d§n¡n°TÓ&:Ö;ñC!	<÷?ñ ?ú÷ ?ñ ?üò$ @s*   ÃHÃH
Ã2HÇH$
È
HÈHÈH!	)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚGraphr1   r   r/   rl   r<   r&   r$   r(   r(   9   s>   „ ñð&<˜eŸh™hŸn™nð <°ó <ðC˜eŸh™hŸm™mó Cób<r&   r(   Útc                 ó6   — | j                  «       j                  S r+   )Úuntyped_storageÚ_cdata)rr   s    r$   rV   rV   ½   s   € Ø×ÑÓ×%Ñ%Ð%r&   c                 óú   — d| j                   vry t        | j                   d   t        j                  «      sy t        j                  j                  | j                   d   «      sy t        | j                   d   «      S ©Nr_   )re   r   r   rF   Ú_CÚ_has_storagerV   r]   s    r$   rb   rb   Á   s]   € Ø�D—I‘IÑØÜ�d—i‘i Ñ&¬¯©Ô5ØÜ�8‰8× Ñ  §¡¨5Ñ!1Ô2ØÜ�t—y‘y Ñ'Ó(Ð(r&   c                 óŒ   — t        | t        j                  j                  «      rd| j                  vr| S | j                  d   S | S rw   )r   r   r   r   re   )Úxs    r$   Úget_faker|   Ë   s8   € Ü�!”U—X‘X—]‘]Ô#Ø˜Ÿ™ÑØˆHØ�v‰v�e‰}ÐØ€Hr&   r{   c                 ó²   — t        t        | j                  | j                  f«      \  }}t	        d„ t        j                  |i |¤ŽD «       «      rd||fS d||fS )zZ
    First value returns a boolean if any of the input nodes don't have a faketensor.
    c              3   ód   K  — | ](  }t        |t        j                  j                  «      –— Œ* y ­wr+   )r   r   r   r   )r=   Úas     r$   rA   z'get_fake_args_kwargs.<locals>.<genexpr>Ø   s$   è ø€ ò Ø)*Œ
�1”e—h‘h—m‘m×$ñùs   ‚.0FT)r   r|   r   r4   ÚanyÚpytreeÚarg_tree_leaves)r{   r   r4   s      r$   rc   rc   Ó   sb   € ô œH q§v¡v¨q¯x©xÐ&8Ó9�L€Dˆ&Ü
ñ Ü.4×.DÑ.DÀdÐ.UÈfÑ.Uôô ð �d˜FÐ"Ð"Ø��vÐÐr&   c                 ó  ‡‡‡‡— ddl mŠmŠ dt        j                  j
                  dt        fˆˆfd„Š ‰| «      rydt        j                  j
                  dt        fˆfd„Št        ˆfd„| j                  D «       «      ryy	)
züReturns true if a node is always realized when lowered to inductor IR.

    NOTE: This may return some false negatives. e.g. it doesn't
    handle buffers realized heuristically during lowering, or
    buffers realized indirectly through view ops.
    r   )Ú	fallbacksÚneeds_realized_inputsr   r   c                 óÀ   •— | j                   dk(  r1| j                  t        j                  u r ‰| j                  d   «      S | j                   dv xs | j                  ‰v S )Nr   r   )ÚplaceholderÚoutput)r   r    r[   r\   r   )r   r„   Ú	is_buffers    €€r$   r‰   z#is_node_realized.<locals>.is_bufferè   sS   ø€ Ø�7‰7�oÒ%¨$¯+©+¼×9IÑ9IÑ*Iñ ˜TŸY™Y q™\Ó*Ð*Ø�w‰wÐ3Ð3ÒO°t·{±{ÀiÐ7OÐOr&   Tc                 óB   •— | j                   dk(  xs | j                  ‰v S )Nrˆ   )r   r    )r   r…   s    €r$   Úrealizes_inputsz)is_node_realized.<locals>.realizes_inputsõ   s!   ø€ Ø�w‰w˜(Ñ"ÒJ d§k¡kÐ5JÐ&JÐJr&   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr+   r<   )r=   rk   r‹   s     €r$   rA   z#is_node_realized.<locals>.<genexpr>ø   s   øè ø€ Ò
8 T‰?˜4× Ñ
8ùs   ƒF)	Útorch._inductor.loweringr„   r…   r   r   r   Úboolr€   r#   )r   r„   r‰   r…   r‹   s    @@@@r$   Úis_node_realizedr�   ß   sm   û€ ÷ JðPœŸ™Ÿ™ð P¬$ö Pñ �„ØðKœeŸh™hŸm™mð K´õ Kô Ó
8¨T¯Z©ZÔ
8Ô8Øð r&   ).r[   Úcollectionsr   Útypingr   r   r   rL   r   Útorch.fxÚtorch._dispatch.pythonr   Ú%torch.fx.experimental.symbolic_shapesr   r	   r
   r   Útorch.utilsr   r�   Útorch.utils._ordered_setr   Útorch.utils._pytreer   Úvirtualizedr   rC   r"   Únnr   ÚModuler   r   r   Údictr!   rŽ   r%   r(   rF   ra   rV   rb   r|   rc   r�   r<   r&   r$   ú<module>rœ      sE  ðã Ý #ß *Ñ *ã ã Û Ý ;÷ó õ *Ý /Ý (å ð
Ø�4˜Ÿ™×(Ñ(×/Ñ/Ñ0°(¸3À¸8Ñ2DÐDÑEðà
�(‰(�-‰-×
Ñ
ðð �#�u—x‘x×'Ñ'×.Ñ.Ð.Ñ/ðð 
ó	÷>A<ñ A<ðH&�5—<‘<ð & Có &ð)˜5Ÿ8™8Ÿ=™=ð )¨X°c©]ó )òð	˜EŸH™HŸM™Mð 	¨e°D¸%À¹*ÀdÈ3ÐPSÈ8ÁnÐ4TÑ.Uó 	ð˜5Ÿ8™8Ÿ=™=ð ¨Tô r&   