Ë
    P/æjq/  ã            	       ó´  — d dl 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 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ÚDictÚOptionalÚSetÚ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         €úc/root/repos/pocs/video-evals/.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_param>   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_attrsr2   r1   Úparamss   `    r   r!   zFoldedGraphModule.run_folding-   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                 óú  ‡— t        | j                  «       «      |   }t        |t        j                  j
                  «      sJ ‚d}| j                  j                  D ]%  }|j                  dk(  sŒ|j                  |k(  sŒ#|} n |€J ‚|j                  }i Šd}ˆfd„}|j                  j                  D ]   }|j                  dk(  r||   ‰|<   |dz  }Œ |j                  dk(  r-|j                  d   }	t        |	|«      }
|j                  |
«       Œ\| 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_fnc   s$   ø€ Ø& tÑ,ˆØŸ	™	Ÿ™Ó(ˆŒØˆr   Úplaceholderé   Úoutput)ÚdictÚnamed_modulesr+   r   r   r   r   ÚnodesÚopÚtargetr#   r   Úreplace_all_uses_withÚinserting_beforeÚ	node_copyÚeliminate_dead_code)rA   rB   Ú
inline_modÚcall_mod_node_to_replacerH   Úcall_mod_argsÚph_countrK   Úinline_nodeÚoutputsÚoutput_replacementsrI   rJ   s               @r   Ú_inline_moduler_   N   s~  ø€ ô �b×&Ñ&Ó(Ó)¨/Ñ:€JÜ�j¤%§(¡(×"6Ñ"6Ô7Ð7Ð7Ø#ÐØ—‘—‘ò ˆØ�7‰7�mÓ#¨¯©°Ó(FØ'+Ð$Ùðð $Ð/Ð/Ð/ð -×1Ñ1€MØ>@ÐØ€Hôð
 "×'Ñ'×-Ñ-ò 4ˆØ�>‰>˜]Ò*Ø/<¸XÑ/FÐ Ñ,Ø˜‰MˆHØà�>‰>˜XÒ%Ø!×&Ñ& qÑ)ˆGÜ")¨'°>Ó"BÐØ$×:Ñ:Ð;NÔOØà�X‰X×&Ñ&Ð'?Ó@ñ 	GØ—x‘x×)Ñ)¨+°~ÓFˆH÷	Gà+3Ð˜KÒ(ð4ð  ‡H�H× Ñ Õ"÷		Gð 	Gús   Ä*E1Å1E:	Ú
mod_tracedÚnameÚ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+)$Ú_1rM   é   )ÚreÚsubÚisdigitÚhasattrÚmatchÚgroupr,   )r`   ra   rk   Ú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>   rN   rL   Úget_attrTrH   c                 ó   •— | ‰v rdS dS )Nr   rM   © )rH   Úconst_nodess    €r   Úmod_partitionz,split_const_subgraphs.<locals>.mod_partitionÄ   s   ø€ Ø˜KÑ'ˆqÐ.¨QÐ.r   )Úsubmod_0Úsubmod_1NrD   rN   r   rL   c              3   óV   •K  — | ]   }|j                   ‰j                  k(  sŒ|–— Œ" y ­wr    )ra   rS   )Ú.0ÚnrH   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   rQ   rR   Úall_input_nodesÚissubsetÚ	is_impureÚaddr
   ÚNoder	   rw   Úgetattrr5   rS   r#   r3   ÚnextrU   rr   rF   rG   rT   Ú
erase_nodeÚlocalsr   r)   r4   r*   rj   r_   rW   )ro   rp   r   r`   Úfound_const_foldingrv   ÚsplitÚconst_mod_nameÚnon_const_mod_nameÚconst_gmÚnon_const_gmÚcall_const_gm_argsÚroot_const_gmr}   Úin_noderI   r   r6   ru   rH   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)rg   Útypingr   r   r   r   r   Útorch.fxr   Útorch.fx.noder   Útorch.fx.passes.split_moduler	   Ú__all__r   r   r
   r?   r_   r   r)   r=   r…   Úboolr   rt   r   r   ú<module>rš      sæ   ðã 	ß 7Õ 7ã Ý !Ý 5ò [€ô??˜Ÿ™×,Ñ,ô ??ðD*#�u—x‘x×+Ñ+ð *#¸có *#ðZ¨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   