ó
    EñiÕ>  ã                   ó$  • S SK r S SKJr  S SKJrJr  S SKrS SKJ	r	  S SK
Jr  / SQr " S S\R                  R                  5      r SS	\R                  R                  S
\S\S\\R                  R&                  \R                  R&                  4   4S jjrS\R                  R                  S\S\4S jr  SS\\R,                  R.                  \R                  R                  4   S\\\R                  R&                  /\4      S\S\4S jjrg)é    N)ÚCallable)ÚOptionalÚUnion)Úmap_arg)Úsplit_module)ÚFoldedGraphModuleÚget_unique_attr_name_in_moduleÚsplit_const_subgraphsc                   óä   ^ • \ rS rSrSr   SS\R                  R                  S\R                  R                  S\
\R                  R                     S\
\   S\4
U 4S jjjrU 4S	 jrS
 rSrU =r$ )r   é   as  
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U ]  X5        Uc  S O[        R                  R	                  X5      U l        SU l        X@l        XPl        g )NF)	ÚsuperÚ__init__ÚtorchÚfxÚGraphModuleÚconst_subgraph_moduleÚhas_folding_been_runr   r   )Úselfr   r   r   r   r   Ú	__class__s         €Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/fx/experimental/const_fold.pyr   ÚFoldedGraphModule.__init__   sO   ø€ ô 	‰Ñ˜Ô%ð Ñ%ñ ä—‘×%Ñ% dÓ;ð 	Ô"ð
 %*ˆÔ!Ø*DÔ'Ø'>Õ$ó    c                 ó`   >• U R                   (       d  U R                  5         [        TU ]  " U6 $ ©N)r   Úrun_foldingr   Ú__call__)r   ÚargsÚkwargsr   s      €r   r"   ÚFoldedGraphModule.__call__.   s(   ø€ Ø×(×(Ø×ÑÔÜ‰wÒ Ð&Ð&r   c                 óŠ  ^ • T R                   b  T R                  c  g T R                  (       a  [        S5      eST l        T R                  5       nU 4S jn[	        U[
        5      (       a5  [        R                  R                  U Vs/ s H
  o2" U5      PM     sn5      OU" U5      n[        T T R                  U5        g s  snf )NzFolding has already been runTc                 óX  >• [         R                  R                  [        U [        5      (       d  U R                  5       R                  5       O-[         R                  " U /5      R                  TR                  S9[        U [         R                  5      (       a  U R                  S9$ SS9$ )N)ÚdeviceF)Úrequires_grad)r   ÚnnÚ	ParameterÚ
isinstanceÚintÚdetachÚcloneÚTensorÚtor   r)   )Úir   s    €r   Ú_create_paramÚ4FoldedGraphModule.run_folding.<locals>._create_paramE   s�   ø€ Ü—8‘8×%Ñ%ä! !¤S×)Ñ)ð —‘“
× Ñ Ô"ä—\’\ 1 #Ó&×)Ñ)°×1MÑ1MÐ)ÐNÜ1;¸A¼u¿|¹|×1LÑ1L˜aŸo™oð	 &ð ð ð SXð	 &ð ð r   )
r   r   r   ÚAssertionErrorr,   Útupler   r*   ÚParameterListÚsetattr)r   Úfolded_attrsr3   r2   Úparamss   `    r   r!   ÚFoldedGraphModule.run_folding3   s°   ø€ ð ×&Ñ&Ñ.Ø×.Ñ.Ñ6àà×$×$Ü Ð!?Ó@Ð@Ø$(ˆÔ!ð
 ×1Ñ1Ó3ˆõ	ô ˜,¬×.Ñ.ô �H‰H×"Ñ"¹lÓ#Kºl¸ M°!Ö$4¹lÑ#KÔLá˜|Ó,ð 	ô
 	��d×5Ñ5°vÕ>ùò	 $Ls   ÂC )r   r   r   r   )NNÚcuda)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r*   ÚModuler   ÚGraphr   Ústrr   r"   r!   Ú__static_attributes__Ú__classcell__)r   s   @r   r   r      s}   ø† ñð 48Ø48Ø'-ñ?à�h‰h�o‰oð?ð �x‰x�~‰~ð?ð ! §¡§¡Ñ0ð	?ð
 %-¨S¡Mð?ð "%÷?ð ?õ$'÷
?ð ?r   r   ÚgmÚinline_mod_nameÚrun_dceÚreturnc                 ó"  ^• [        U R                  5       5      U   n[        U[        R                  R
                  5      (       d  [        S[        U5       35      eSnU R                  R                   H)  nUR                  S:X  d  M  UR                  U:X  d  M'  Un  O   Uc  [        SU 35      eUR                  nUR                  n0 mSnU4S jn	UR                  R                   GHÌ  n
U
R                  S:X  a,  U
R                  U;   a  XzR                     OXh   TU
'   US-  nM@  U
R                  S	:X  Ga7  U
R                  S   n[        X¹5      n/ n[        U[         ["        45      (       aq  SSKnUR&                   Vs/ s HV  nUR                  S
:X  d  M  UR                  UR(                  L d  M0  [        UR                  S   [*        5      (       d  MT  UPMX     nnUR-                  U5        U Hu  nUR                  S   n[        U[*        5      (       d  [        S[        U5       35      eUR-                  UU   5        U R                  R/                  U5        UU   TU'   Mw     GMˆ  U R                  R1                  U5         U R                  R3                  X©5      nSSS5        WTU
'   GMÏ     U R                  R/                  U5        U(       a  U R                  R5                  5         T$ s  snf ! , (       d  f       N[= f)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`.

Returns a mapping from subgraph nodes to the newly created/mapped nodes in gm.
zExpected GraphModule, got NÚcall_modulez$Could not find call_module node for r   c                 óP   >• TU    nU R                   R                  5       Ul         U$ r    )ÚmetaÚcopy)ÚnodeÚnew_nodeÚreplacement_mappings     €r   Úreplacement_fnÚ&_inline_module.<locals>.replacement_fnr   s$   ø€ Ø& tÑ,ˆØŸ	™	Ÿ™Ó(ˆŒØˆr   Úplaceholderé   ÚoutputÚcall_functionzExpected int index, got )ÚdictÚnamed_modulesr,   r   r   r   r5   Útyper   ÚnodesÚopÚtargetr#   r$   Únamer   Úlistr6   ÚoperatorÚusersÚgetitemr-   Úreplace_all_uses_withÚ
erase_nodeÚinserting_beforeÚ	node_copyÚeliminate_dead_code)rG   rH   rI   Ú
inline_modÚcall_mod_node_to_replacerP   Úcall_mod_argsÚcall_mod_kwargsÚph_countrS   Úinline_nodeÚoutputsÚoutput_replacementsÚgetitem_usersra   ÚuserÚidxrQ   rR   s                     @r   Ú_inline_modulert   U   sÓ  ø€ ô �b×&Ñ&Ó(Ó)¨/Ñ:€JÜ�j¤%§(¡(×"6Ñ"6×7Ñ7ÜÐ9¼$¸zÓ:JÐ9KÐLÓMÐMØ#ÐØ—‘—”ˆØ�7‰7�mÕ#¨¯©°Õ(FØ'+Ð$Ùñ ð  Ñ'ÜÐCÀOÐCTÐUÓVÐVð -×1Ñ1€MØ.×5Ñ5€Oà>@ÐØ€Hõð
 "×'Ñ'×-Õ-ˆØ�>‰>˜]Ó*ð ×#Ñ# Ó6ð  × 0Ñ 0Ò1à"Ñ,ð   Ñ,ð ˜‰MˆHÙà�>‰>˜XÔ%Ø!×&Ñ& qÑ)ˆGÜ")¨'Ó"BÐð 24ˆMÜÐ-´´e¨}×=Ñ=Ûð !9× >Ò >ó!â >˜Ø—w‘w /Ñ1ó ð Ÿ™ x×'7Ñ'7Ð7ó ô # 4§9¡9¨Q¡<´×5÷	 Ù >ð ð !ð %×:Ñ:Ð;NÔOó &�Ø—i‘i ‘l�Ü! #¤s×+Ñ+Ü(Ð+CÄDÈÃIÀ;Ð)OÓPÐPØ×*Ñ*Ð+>¸sÑ+CÔDØ—‘×#Ñ# DÔ)Ø,?ÀÑ,DÐ# DÓ)ñ &ò à�X‰X×&Ñ&Ð'?Õ@Ø—x‘x×)Ñ)¨+ÓFˆH÷ Aà+3Ð˜KÔ(ñY .ðb ‡H�H×ÑÐ0Ô1ÞØ
�‰×$Ñ$Ô&àÐùòA!÷* AÕ@ús$   ÆK;ÆK;Æ9 K;ÇK;ÊL Ì 
L	Ú
mod_tracedr_   c                 óB  • [         R                  " SSU5      nUS   R                  5       (       a  SU 3n[        X5      (       aY  [         R                  " SU5      nUc  US-   nO'UR                  SS5      u  p4U S[        U5      S-    3n[        X5      (       a  MY  U$ )zH
Make sure the name is unique (in a module) and can represents an attr.
z[^0-9a-zA-Z_]+Ú_r   z(.*)_(\d+)$Ú_1rV   é   )ÚreÚsubÚisdigitÚhasattrÚmatchÚgroupr-   )ru   r_   r~   ÚbaseÚnums        r   r	   r	   ¯   sš   € ô
 �6Š6Ð" C¨Ó.€DØˆA�w‡�×ÑØ�4�&ˆzˆä
�*×
#Ñ
#Ü—’˜¨Ó.ˆØ‰=Ø˜$‘;‰DàŸ™ A qÓ)‰IˆDØ�V˜1œS ›X¨™\˜NÐ+ˆDô �*×
#Ó
#ð €Kr   ÚmoduleÚskip_folding_node_fnr   c           	      óö  ^^• SSK n[        U [        R                  R                  5      (       d   [        R                  R                  U 5      nOU nS[        R                  R                  S[        4U4S jjm[        5       mSnUR                  R                   GHF  nUR                  S;   a  M  UR                  S:w  a+  [        UR                  5      R                  T5      (       d  MQ  U(       a  U" U5      (       a  Mg  UR                  5       (       a  M~  [        UR                  R                  S	S5      UR                   5      (       a  Mµ  UR                  S
:X  a[  UR#                  UR$                  5      =n(       a9  [        U[        R                  R                  5      (       a  T" U5      (       a  GM   TR'                  U5        UR                  S:w  d  GMD  SnGMI     U(       d  [)        XDR                  5      $ S[        R                  R*                  4U4S jjn[-        X@U5      n	Su  p«U	R.                  [1        X›S5      pÜU(       a  UR                  R                  O/  H>  nUR                  S
:X  d  M  [3        X–R$                  [1        XÖR$                  5      5        M@     UR                  R                   H>  nUR                  S
:X  d  M  [3        X–R$                  [1        XÆR$                  5      5        M@     SnU	R                  R                   H3  nUR                  S
:X  d  M  UR$                  U
:X  d  M'  UR4                  n  O   Uc  [7        S5      e[        R                  R	                  XœR                  5      nSnUR                  R                   GH5  nUR                  S:X  a  [        UR4                  S   [8        5      nM3  UR                  S:w  a  ME  U[;        U5      :¼  a  [7        SU S[;        U5       S35      eUU   nUS-  nUR                  S:w  a  [7        SUR                   35      eUR                  R=                  U5         UR                  R?                  UR$                  5      nSSS5        UR@                  RC                  5       Wl         URE                  U5        UR                  RG                  U5        GM8     S[I        5       ;  a  [7        S5      e[K        US5      n[3        U	UW(       a  [        RL                  RO                  5       O[        RL                  RQ                  5       5        U	R                  R                   H–  nUR                  S
:X  d  M  UR$                  U
:X  d  M'  UR                  R=                  U5         UR                  R?                  U5      nSSS5        UR@                  RC                  5       Wl         URE                  U5          O   [S        X›5      (       a  [U        X›5        U	R                  RW                  5         [)        U	U	R                  UR                  UU5      $ ! , (       d  f       GNÚ= f! , (       d  f       N¬= f)a2  
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.
r   Nr‚   rJ   c                 óÈ  >• [        U [        R                  R                  5      (       d  [	        S5      eU R
                  R                   H“  nUR                  S:X  a  UR                  5       (       a    gUR                  S:X  d  M<  U R                  UR                  5      =n(       d  M`  [        U[        R                  R                  5      (       d  M‹  T" U5      s  $    g)zP
Return True if a GraphModule type subgraph contains any impure op, else False.
zDcaller should only pass GraphModule to subgraph_has_impure_ops checkrX   TrL   F)r,   r   r   r   r5   r   r\   r]   Ú	is_impureÚget_submoduler^   )r‚   rP   Ú	submoduleÚ_subgraph_has_impure_opss      €r   r‰   Ú7split_const_subgraphs.<locals>._subgraph_has_impure_ops×   sª   ø€ ô ˜&¤%§(¡(×"6Ñ"6×7Ñ7Ü ØVóð ð —L‘L×&Ô&ˆDØ�w‰w˜/Ó)¨d¯n©n×.>Ñ.>Ùà—‘˜=Õ(à"(×"6Ñ"6°t·{±{Ó"CÐC�Y×CÜ˜y¬%¯(©(×*>Ñ*>×?Ó?á/°	Ó:Ò:ñ 'ð r   F>   rW   rU   Úget_attrÚ
fill_valuerL   TrP   c                 ó   >• U T;   a  S$ S$ )Nr   rV   © )rP   Úconst_nodess    €r   Úmod_partitionÚ,split_const_subgraphs.<locals>.mod_partition  s   ø€ Ø˜KÓ'ˆqÐ.¨QÐ.r   )Úsubmod_0Úsubmod_1z,Could not find call_module node for const_gmrW   rU   zPlaceholder index z out of range for args (len=Ú)rV   zExpected get_attr, got Úmultiple_outputsz multiple_outputs not set in loopÚ_FX_CONST_FOLDED_ATTRS),Úsympyr,   r   r   r   Úsymbolic_traceÚboolÚsetr   r\   r]   Úall_input_nodesÚissubsetr†   r$   ÚgetÚExprr‡   r^   Úaddr   ÚNoder   r’   Úgetattrr8   r#   r5   r6   Úlenrf   r‹   rN   rO   rd   re   Úlocalsr	   r*   r7   r+   r}   rt   rh   )r‚   rƒ   r   r—   ru   Úfound_const_foldingrP   Ú
target_modr�   ÚsplitÚconst_mod_nameÚnon_const_mod_nameÚconst_gmÚnon_const_gmÚcall_const_gm_argsÚroot_const_gmÚph_idxr•   Úin_noderQ   r   r9   r‰   r�   s                         @@r   r
   r
   Ã   s  ù€ ó ä�fœeŸh™h×2Ñ2×3Ñ3Ü—X‘X×,Ñ,¨VÓ4‰
àˆ
ð¬¯©×)=Ñ)=ð Ä$÷ ô, '*£e€KØÐØ× Ñ ×&Õ&ˆð �7‰7Ð/Ó/Ùð �7‰7�jÓ ¬¨T×-AÑ-AÓ)B×)KÑ)KØ÷*
ñ *
ñ ö  Ñ$8¸×$>Ñ$>Ùð �>‰>×ÑÙô �d—k‘k—o‘o l°DÓ9¸5¿:¹:×FÑFÙð �G‰G�}Ó$à)×7Ñ7¸¿¹ÓDÐD�ÕDÜ˜:¤u§x¡x×';Ñ';×<Ñ<Ù(¨×4Ñ4âð 	�‰˜ÔØ�7‰7�jÖ Ø"&ÓñM 'öR Ü  ×-=Ñ-=Ó>Ð>ð/œEŸH™HŸM™M÷ /ô ˜¨]Ó;€Eà)?Ñ&€Nà"Ÿ^™^¬W°UÐPTÓ-Uˆlö
 -9�×"Ñ"×(Ò(¸bÒ@ˆØ�7‰7�mÕ#Ü�EŸ;™;¬°¿k¹kÓ(JÖKñ Að —‘×$Ô$ˆØ�7‰7�mÕ#Ü�EŸ;™;¬°¿+¹+Ó(FÖGñ %ð ÐØ—‘×!Ô!ˆØ�7‰7�mÕ#Ø�{‰{˜nÕ,Ø%)§Y¡YÐ"Ùñ	 "ð
 Ñ!ÜÐKÓLÐLô —H‘H×(Ñ(¨·±Ó?€Mð
 €FØ×#Ñ#×)Õ)ˆØ�7‰7�hÓÜ)¨$¯)©)°A©,¼Ó>ÐÙØ�7‰7�mÓ#ÙØ”SÐ+Ó,Ó,Ü Ø$ V Hð -ÜÐ.Ó/Ð0°ð3óð ð % VÑ,ˆØ�!‰ˆØ�:‰:˜Ó#Ü Ð#:¸7¿:¹:¸,Ð!GÓHÐHØ× Ñ ×1Ñ1°$Õ7Ø$×*Ñ*×3Ñ3°G·N±NÓCˆH÷ 8àŸ	™	Ÿ™Ó(ˆŒØ×"Ñ" 8Ô,Ø×Ñ×&Ñ& t×,ñ' *ð( ¤£Ó)ÜÐ?Ó@Ð@ô "@ØÐ,ó"Ðô ØØ"Þ$4Œ�‰×ÑÔ ¼%¿(¹(×:LÑ:LÓ:Nôð
 —‘×!Ô!ˆØ�7‰7�mÕ#¨¯©°~Õ(EØ—‘×,Ñ,¨TÕ2Ø#Ÿz™z×2Ñ2Ð3MÓN�÷ 3à $§	¡	§¡Ó 0ˆLÔØ×&Ñ& |Ô4Ùñ "ô ˆu×)Ñ)Ü�uÔ1à	‡K�K×#Ñ#Ô%äØØ�‰Ø×ÑØ"Øóð ÷I 8Ö7ú÷, 3Õ2ús   Ñ&YÖ(Y*Ù
Y'	Ù*
Y8	)T)NÚcpu)rz   Úcollections.abcr   Útypingr   r   Útorch.fxr   Útorch.fx.noder   Útorch.fx.passes.split_moduler   Ú__all__r   r   r   rD   r™   rY   r    rt   r	   r*   rB   r
   rŽ   r   r   Ú<module>r¶      s  ðã 	Ý $ß "ã Ý !Ý 5ò€ô@?˜Ÿ™×,Ñ,ô @?ðH EIñWØ�‰×ÑðWØ/2ðWØ=AðWà	ˆ%�(‰(�-‰-˜Ÿ™Ÿ™Ð
&Ñ'õWðt¨u¯x©x×/CÑ/Cð È3ð ÐSVô ð, GKØ#(ñHØ�%—(‘(—/‘/ 5§8¡8×#7Ñ#7Ð7Ñ8ðHà" 8¨U¯X©X¯]©]¨O¸TÐ,AÑ#BÑCðHð !ðHð ö	Hr   