Ë
    f^(h<0  ã            	       ó¬  — d dl Z d dlmZmZmZ d dlZd dlmZ d dl	m
Z
 g d¢Z G d„ dej                  j                  «      Zdej                  j                  d	efd
„Zdej                  j                  dedefd„Z	 	 ddeej$                  j&                  ej                  j                  f   deeej                  j(                  gef      dedefd„Zy)é    N)ÚCallableÚOptionalÚUnion)Úmap_arg)Úsplit_module)ÚFoldedGraphModuleÚget_unique_attr_name_in_moduleÚsplit_const_subgraphsc                   óÔ   ‡ — e Zd ZdZ	 	 	 d
dej
                  j                  dej                  j                  de	ej                  j                     de	e
   de
f
ˆ fd„Zˆ fd„Zd	„ Zˆ xZS )r   a�  
    FoldedGraphModule is a GraphModule which also contains another
    `const_subgraph_module` representing a subgraph which has all const attr
    inputs and which can be run once before running the main standard
    `graph`. The `const_output_names` are the ordered list names of attrs which
    represent what each respective output from the const_subgraph should be set
    on which attrs.
    ÚrootÚgraphÚconst_subgraphÚfx_const_folded_attrs_nameÚdevice_for_folded_attrsc                 ó¢   •— t         ‰| �  ||«       |€d nt        j                  j	                  ||«      | _        d| _        || _        || _        y )NF)	ÚsuperÚ__init__ÚtorchÚfxÚGraphModuleÚconst_subgraph_moduleÚhas_folding_been_runr   r   )Úselfr   r   r   r   r   Ú	__class__s         €ú^/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/fx/experimental/const_fold.pyr   zFoldedGraphModule.__init__   sW   ø€ ô 	‰Ñ˜˜uÔ%ð Ð%ñ ä—‘×%Ñ% d¨NÓ;ð 	Ô"ð
 %*ˆÔ!Ø*DˆÔ'Ø'>ˆÕ$ó    c                 óT   •— | j                   s| j                  «        t        ‰| �  |Ž S ©N)r   Úrun_foldingr   Ú__call__)r   ÚargsÚkwargsr   s      €r   r    zFoldedGraphModule.__call__-   s(   ø€ Ø×(Ò(Ø×ÑÔÜ‰wÑ Ð&Ð&r   c                 óZ  ‡ — ‰ j                   �‰ j                  €y ‰ j                  rJ ‚d‰ _        ‰ j                  «       }ˆ fd„}t        |t        «      r3t
        j                  j                  |D �cg c]
  } ||«      ‘Œ c}«      n ||«      }t        ‰ ‰ j                  |«       y c c}w )NTc                 óT  •— t         j                  j                  t        | t        «      s| j                  «       j                  «       n/t        j                  | g«      j                  ‰j                  ¬«      t        | t         j                  «      r| j                  ¬«      S d¬«      S )N)ÚdeviceF)Úrequires_grad)r   ÚnnÚ	ParameterÚ
isinstanceÚintÚdetachÚcloneÚTensorÚtor   r&   )Úir   s    €r   Ú_create_paramz4FoldedGraphModule.run_folding.<locals>._create_paramC   s‰   ø€ Ü—8‘8×%Ñ%ä! !¤SÔ)ð —‘“
× Ñ Ô"ä—\‘\ 1 #Ó&×)Ñ)°×1MÑ1MÐ)ÓNÜ1;¸A¼u¿|¹|Ô1L˜aŸo™oð	 &ó ð ð SXð	 &ó ð r   )	r   r   r   r)   Útupler   r'   ÚParameterListÚsetattr)r   Úfolded_attrsr0   r/   Úparamss   `    r   r   zFoldedGraphModule.run_folding2   s£   ø€ ð ×&Ñ&Ð.Ø×.Ñ.Ð6àà×,Ò,Ð,Ð,Ø$(ˆÔ!ð
 ×1Ñ1Ó3ˆô	ô ˜,¬Ô.ô �H‰H×"Ñ"¸lÖ#K¸¡M°!Õ$4Ò#KÔLá˜|Ó,ð 	ô
 	��d×5Ñ5°vÕ>ùò	 $Ls   Á2B()NNÚcuda)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   ÚModuler   ÚGraphr   Ústrr   r    r   Ú__classcell__)r   s   @r   r   r      ss   ø„ ñð 48Ø48Ø'-ñ?à�h‰h�o‰oð?ð �x‰x�~‰~ð?ð ! §¡§¡Ñ0ð	?ð
 %-¨S¡Mð?ð "%õ?ô$'ö
?r   r   ÚgmÚinline_mod_namec                 óL  ‡— t        | j                  «       «      |   }t        |t        j                  j
                  «      sJ ‚d}| j                  j                  D ]%  }|j                  dk(  sŒ|j                  |k(  sŒ#|} n |€J ‚|j                  }|j                  }i Šd}ˆfd„}|j                  j                  D ]½  }	|	j                  dk(  r+|	j                  |v r||	j                     n||   ‰|	<   |dz  }Œ=|	j                  dk(  r-|	j                  d   }
t        |
|«      }|j                  |«       Œy| j                  j                  |«      5  | j                  j!                  |	|«      }ddd«       ‰|	<   Œ¿ | j                  j#                  «        y# 1 sw Y   Œ+xY w)z´
    Given `gm` and some graph module which is called with target name `inline_mod_name`,
    this helper will inline all of the nodes from that called graph module into `gm`.
    NÚcall_moduler   c                 óP   •— ‰|    }| j                   j                  «       |_         |S r   )ÚmetaÚcopy)ÚnodeÚnew_nodeÚreplacement_mappings     €r   Úreplacement_fnz&_inline_module.<locals>.replacement_fnj   s$   ø€ Ø& tÑ,ˆØŸ	™	Ÿ™Ó(ˆŒØˆr   Úplaceholderé   Úoutput)ÚdictÚnamed_modulesr)   r   r   r   r   ÚnodesÚopÚtargetr!   r"   Únamer   Úreplace_all_uses_withÚinserting_beforeÚ	node_copyÚeliminate_dead_code)r?   r@   Ú
inline_modÚcall_mod_node_to_replacerF   Úcall_mod_argsÚcall_mod_kwargsÚph_countrI   Úinline_nodeÚoutputsÚoutput_replacementsrG   rH   s                @r   Ú_inline_moduler_   S   s­  ø€ ô �b×&Ñ&Ó(Ó)¨/Ñ:€JÜ�j¤%§(¡(×"6Ñ"6Ô7Ð7Ð7Ø#ÐØ—‘—‘ò ˆØ�7‰7�mÓ#¨¯©°Ó(FØ'+Ð$Ùðð $Ð/Ð/Ð/ð -×1Ñ1€MØ.×5Ñ5€Oà>@ÐØ€Hôð
 "×'Ñ'×-Ñ-ò 4ˆØ�>‰>˜]Ò*ð ×#Ñ# Ñ6ð   × 0Ñ 0Ò1à" 8Ñ,ð   Ñ,ð ˜‰MˆHØà�>‰>˜XÒ%Ø!×&Ñ& qÑ)ˆGÜ")¨'°>Ó"BÐØ$×:Ñ:Ð;NÔOØà�X‰X×&Ñ&Ð'?Ó@ñ 	GØ—x‘x×)Ñ)¨+°~ÓFˆH÷	Gà+3Ð˜KÒ(ð'4ð* ‡H�H× Ñ Õ"÷		Gð 	Gús   ÅFÆF#	Ú
mod_tracedrR   Úreturnc                 ó"  — t        j                  dd|«      }|d   j                  «       rd|› �}t        | |«      rSt        j                  d|«      }|€|dz   }n(|j                  dd«      \  }}|› dt        |«      dz   › �}t        | |«      rŒS|S )zP
    Make sure the name is unique (in a module) and can represents an attr.
    z[^0-9a-zA-Z_]+Ú_r   z(.*)_(\d+)$Ú_1rK   é   )ÚreÚsubÚisdigitÚhasattrÚmatchÚgroupr*   )r`   rR   rj   ÚbaseÚnums        r   r	   r	   ‡   s—   € ô
 �6‰6Ð" C¨Ó.€DØˆA�w‡�ÔØ�4�&ˆzˆä
�*˜dÔ
#Ü—‘˜¨Ó.ˆØˆ=Ø˜$‘;‰DàŸ™ A qÓ)‰IˆD�#Ø�V˜1œS ›X¨™\˜NÐ+ˆDô �*˜dÕ
#ð €Kr   ÚmoduleÚskip_folding_node_fnr   c           	      ó
  ‡‡— t        | t        j                  j                  «      s t        j                  j	                  | «      }n| }t        «       Šd}|j                  j                  D ]„  Š‰j                  dv rŒ‰j                  dk7  r%t        ‰j                  «      j                  ‰«      sŒF|r	 |‰«      rŒQ‰j                  «       rŒb‰j                  ‰«       ‰j                  dk7  sŒƒd}Œ† |st        ||j                  «      S dt        j                  j                  fˆfd„}t        || |«      }d\  }}|j                   t#        ||d«      }
}	|
r|
j                  j                  ng D ]=  Š‰j                  d	k(  sŒt%        |‰j&                  t#        |
‰j&                  «      «       Œ? |	j                  j                  D ]=  Š‰j                  d	k(  sŒt%        |‰j&                  t#        |	‰j&                  «      «       Œ? d}|j                  j                  D ]/  Š‰j                  d	k(  sŒ‰j&                  |k(  sŒ#‰j(                  } n |€J ‚t        j                  j                  ||	j                  «      }|j                  j                  D ]ø  Š‰j                  d
k(  rt        ‰j(                  d   t*        «      }Œ0‰j                  dk7  rŒ@t-        ˆfd„|D «       «      }|j                  dk(  sJ ‚|j                  j/                  ‰«      5  |j                  j1                  |j&                  «      }ddd«       ‰j2                  j5                  «       _        ‰j7                  |«       |j                  j9                  ‰«       Œú dt;        «       v sJ ‚t=        |d«      }t%        ||rt        j>                  jA                  «       nt        j>                  jC                  «       «       |j                  j                  D ]’  Š‰j                  d	k(  sŒ‰j&                  |k(  sŒ#‰j                  j/                  ‰«      5  ‰j                  j1                  |«      }ddd«       ‰j2                  j5                  «       _        ‰j7                  |«        n tE        ||«      rtG        ||«       |j                  jI                  «        t        ||j                  |j                  ||«      S # 1 sw Y   �ŒºxY w# 1 sw Y   ŒžxY w)aJ  
    Looks through `module` for any nodes that have all constant attribute inputs
    and separates them out into their own constant subgraph, and returns a
    FoldedGraphModule which runs that constant subgraph on the first run to set
    attributes on the module prior to running the non-constant portion of the
    graph.
    F>   rL   rJ   Úget_attrTrF   c                 ó   •— | ‰v rdS dS )Nr   rK   © )rF   Úconst_nodess    €r   Úmod_partitionz,split_const_subgraphs.<locals>.mod_partitionÐ   s   ø€ Ø˜KÑ'ˆqÐ.¨QÐ.r   )Úsubmod_0Úsubmod_1NrB   rL   r   rJ   c              3   óV   •K  — | ]   }|j                   ‰j                  k(  sŒ|–— Œ" y ­wr   )rR   rQ   )Ú.0ÚnrF   s     €r   ú	<genexpr>z(split_const_subgraphs.<locals>.<genexpr>  s    øè ø€ ÒN˜Q¸¿¹À$Ç+Á+Ó8M”qÑNùs   ƒ)¢)Úmultiple_outputsÚ_FX_CONST_FOLDED_ATTRS)%r)   r   r   r   Úsymbolic_traceÚsetr   rO   rP   Úall_input_nodesÚissubsetÚ	is_impureÚaddr   ÚNoder   rv   Úgetattrr3   rQ   r!   r1   ÚnextrT   rq   rD   rE   rS   Ú
erase_nodeÚlocalsr	   r'   r2   r(   ri   r_   rV   )rn   ro   r   r`   Úfound_const_foldingru   ÚsplitÚconst_mod_nameÚnon_const_mod_nameÚconst_gmÚnon_const_gmÚcall_const_gm_argsÚroot_const_gmr|   Úin_noderG   r   r4   rt   rF   s                     @@r   r
   r
   ›   s`  ù€ ô �fœeŸh™h×2Ñ2Ô3Ü—X‘X×,Ñ,¨VÓ4‰
àˆ
ô '*£e€KØÐØ× Ñ ×&Ñ&ò 'ˆð �7‰7Ð/Ñ/Øð �7‰7�jÒ ¬¨T×-AÑ-AÓ)B×)KÑ)KØô*
ð ñ  Ñ$8¸Ô$>Øð �>‰>ÔØð 	�‰˜ÔØ�7‰7�jÓ Ø"&Ñð1'ñ6 Ü  ¨Z×-=Ñ-=Ó>Ð>ð/œEŸH™HŸM™Mõ /ô ˜ V¨]Ó;€Eà)?Ñ&€NÐ&à"Ÿ^™^¬W°UÐ<NÐPTÓ-Uˆl€Hñ
 -9�×"Ñ"×(Ò(¸bò LˆØ�7‰7�mÓ#Ü�E˜4Ÿ;™;¬°¸d¿k¹kÓ(JÕKðLð —‘×$Ñ$ò HˆØ�7‰7�mÓ#Ü�E˜4Ÿ;™;¬°¸$¿+¹+Ó(FÕGðHð ÐØ—‘×!Ñ!ò ˆØ�7‰7�mÓ#Ø�{‰{˜nÓ,Ø%)§Y¡YÐ"Ùð	ð
 Ð)Ð)Ð)ô —H‘H×(Ñ(¨°·±Ó?€MØ×#Ñ#×)Ñ)ò -ˆØ�7‰7�hÒÜ)¨$¯)©)°A©,¼Ó>ÐØØ�7‰7�mÒ#ØÜÓNÐ"4ÔNÓNˆØ�z‰z˜ZÒ'Ð'Ð'Ø× Ñ ×1Ñ1°$Ó7ñ 	DØ$×*Ñ*×3Ñ3°G·N±NÓCˆH÷	DàŸ	™	Ÿ™Ó(ˆŒØ×"Ñ" 8Ô,Ø×Ñ×&Ñ& tÕ,ð-ð ¤£Ñ)Ð)Ð)ô "@ØÐ,ó"Ðô ØØ"Ù$4Œ�‰×ÑÔ ¼%¿(¹(×:LÑ:LÓ:Nôð
 —‘×!Ñ!ò ˆØ�7‰7�mÓ#¨¯©°~Ó(EØ—‘×,Ñ,¨TÓ2ñ OØ#Ÿz™z×2Ñ2Ð3MÓN�÷Oà $§	¡	§¡Ó 0ˆLÔØ×&Ñ& |Ô4Ùðô ˆuÐ(Ô)Ü�uÐ0Ô1à	‡K�K×#Ñ#Ô%äØØ�‰Ø×ÑØ"Øóð ÷G	Dñ 	Dú÷*Oð Oús   Ì&S1ÑS>Ó1S;	Ó>T	)NÚcpu)rf   Útypingr   r   r   Útorch.fxr   Útorch.fx.noder   Útorch.fx.passes.split_moduler   Ú__all__r   r   r   r=   r_   r	   r'   r;   r„   Úboolr
   rs   r   r   ú<module>r™      så   ðã 	ß ,Ñ ,ã Ý !Ý 5ò€ô??˜Ÿ™×,Ñ,ô ??ðD1#�u—x‘x×+Ñ+ð 1#¸có 1#ðh¨u¯x©x×/CÑ/Cð È3ð ÐSVó ð, GKØ#(ñUØ�%—(‘(—/‘/ 5§8¡8×#7Ñ#7Ð7Ñ8ðUà" 8¨U¯X©X¯]©]¨O¸TÐ,AÑ#BÑCðUð !ðUð ô	Ur   