Ë
    ÄÓ^jx  ã                   ó@  — 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	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 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 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dl+m,Z, de-e.ej^                  j`                  jb                     edef   f   dejd                  jf                  de4e5ej^                  j`                  jb                  f   de6fd„Z7dddddœdededee8e8f   de6de6dejd                  jf                  dz  de&e-e8e8f      dz  de6fd „Z9dejd                  jf                  d!eejd                  jt                     d"ed#ede	e-ejd                  jt                  e-edf   dz  f      f
d$„Z; ed¬%«       G d&„ d'«      «       Z< G d(„ d)«      Z=d*ej|                  de8fd+„Z?dejd                  jf                  de8dz  fd,„Z@d-ed.ejd                  jt                  dz  defd/„ZA	 d4d-ejd                  jf                  d.ejd                  jt                  dz  de-e6e-edf   e4e5ef   f   fd0„ZBdejd                  jf                  de6fd1„ZCdejd                  jf                  de8dz  fd2„ZDdejd                  jf                  de6fd3„ZEy)5é    N)Údefaultdict)ÚCallableÚ
CollectionÚ	ContainerÚ	GeneratorÚIterableÚMapping)Ú	dataclass)Úpartial)Úchain)ÚAny)Úenable_python_dispatcher)Úcontrol_deps)ÚFakeTensorMode)Úcompute_unbacked_bindingsÚrebind_unbackedÚstatically_known_trueÚsym_eq)Ú_pytree)Ú
OrderedSet)Útree_map)Úflop_registryé   )Ú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      úc/var/www/ramen.bs-engineer-server.com/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‰<×ÑÓ Ò"ØØó    T©Úcheck_stridesÚcheck_storager   Úrecursive_idsÚnewÚoldÚexisting_storagesr2   r3   r4   c                óÐ  ‡‡‡‡‡— d„ }t        | «      t        |«      uryt        | t        j                  «      �s'| €|du S t        | t        «      rv‰€
t        «       Št        | «      t        |«      f}|‰v }	‰j                  |«       |	xs; t        | «      t        |«      k(  xr" t        ˆˆˆˆˆfd„t        | |«      D «       «      S t        | t        j                  j                  «      rr| j                  j                  j                  t!        j"                  | j                  j$                  |j                  j$                  «      «      t         j&                  k(  S | |k(  S | j(                  |j(                  k7  s || j*                  |j*                  «      sy| j,                  |j,                  k7  ry‰rC| j(                  t        j.                  k(  r& || j1                  «       |j1                  «       «      sy‰syt3        | j5                  «       |j5                  «       k(  «      rt7        | «      t7        |«      k7  ryd„ }
‰t7        |«         dk(  rt7        | «      ‰vr	 |
‰«      syy)a  Validate that two FakeTensors (or iterables thereof) are the same, including
    storage locations if enabled.

    check_strides: disabling this flag will remove checks for striding.
    check_storage: disabling this flag will remove checks for storage offset and
    location.  This is useful for subgraph argument and output updating, where storage
    location can change without invalidating the subgraph.
    recursive_ids: This is only for use when recursing through collections, and must not
    be supplied by users of this function.c                 ó,   — t        t        | |«      «      S ©N)r   r   )r5   r6   s     r.   Úis_intlist_samez-_is_fake_tensor_same.<locals>.is_intlist_same]   s   € Ü$¤V¨C°Ó%5Ó6Ð6r0   FNc           
   3   óH   •K  — | ]  \  }}t        ||‰‰‰‰‰¬ «      –— Œ y­w)r1   N)Ú_is_fake_tensor_same)Ú.0Únew_iÚold_ir3   r2   r7   r   r4   s      €€€€€r.   ú	<genexpr>z'_is_fake_tensor_same.<locals>.<genexpr>t   s>   øè ø€ ò ñ %˜˜uô )ØØØ)Ø&3Ø&3Ø!Ø&3÷ð ñùs   ƒ"Tc           	      óÊ  — t        | j                  d   t        j                  «      sy| j                  D �]‡  }t        |j
                  t        j                  j                  «      s<|j
                  t        j                  j                  j                  j                  u s yt        |j
                  t        j                  j                  «      rŒ�t        |«      \  }}}|s yt        j                  5  t!        «       5  t#        j$                  «       5 }t        j                  j&                  x}�|j)                  |j+                  «       «        |j
                  |i |¤Ž}d d d «       d d d «       d d d «       t        t        j                  «      s yt-        |«      t-        | j                  d   «      k(  s�Œˆ y y# 1 sw Y   Œ_xY w# 1 sw Y   ŒcxY w# 1 sw Y   ŒgxY w)NÚvalTF)r%   Úmetar&   ÚTensorr-   r*   Ú_opsÚOperatorBaseÚ	_inductorÚ	fx_passesÚ	reinplaceÚ_generalized_scatterÚHigherOrderOperatorÚget_fake_args_kwargsr   Ú	fake_moder   Ú
contextlibÚ	ExitStackÚ	shape_envÚenter_contextÚignore_fresh_unbacked_symbolsÚget_storage)r   ÚuserÚis_validr$   ÚkwargsÚstackrQ   Únew_fake_tensors           r.   Úany_user_may_aliasz0_is_fake_tensor_same.<locals>.any_user_may_alias¤   s„  € Ü˜$Ÿ)™) EÑ*¬E¯L©LÔ9àà—J‘Jó %	ˆDä˜4Ÿ;™;¬¯
©
×(?Ñ(?Ô@Ø—;‘;Ü—?‘?×,Ñ,×6Ñ6×KÑKñLñ ä˜$Ÿ+™+¤u§z¡z×'EÑ'EÔFð ô &:¸$Ó%?Ñ"ˆH�d˜FÙÙô —‘ñ	?ä(Ó*ñ	?ô ×$Ñ$Ó&ð	?ð +0ô "#§¡×!6Ñ!6Ð6�IÐCØ×'Ñ'¨	×(OÑ(OÓ(QÔRØ"- $§+¡+¨tÐ">°vÑ">�÷	?÷ 	?÷ 	?ô ˜o¬u¯|©|Ô<áä˜?Ó+¬{¸4¿9¹9ÀUÑ;KÓ/LÔLÙðK%	ðN ÷%	?ð 	?ú÷ 	?ð 	?ú÷ 	?ð 	?ús=   Ã5GÄ GÄAG	Å#GÅ+GÇG
ÇGÇGÇGÇG"	r   )r,   r%   r&   rE   r   r   ÚidÚaddr#   ÚallÚzipÚtypesÚpy_sym_typesr   rQ   Ú_maybe_evaluate_staticÚsympyÚEqÚexprÚtrueÚlayoutÚshapeÚdeviceÚstridedÚstrider   Ústorage_offsetrT   )r5   r6   r7   r2   r3   r   r4   r;   Úid_pairÚvisitedrZ   s     `````    r.   r=   r=   I   sÿ  ü€ ò(7ô ˆCƒyœ˜S›	Ñ!Øä�cœ5Ÿ<™<Õ(Øˆ;Ø˜$�;Ðä�cœ:Ô&ØÐ$Ü *£�ä˜#“w¤ 3£Ð(ˆGØ Ð.ˆGØ×Ñ˜gÔ&ð
 ò Ü�C“œC ›HÑ$ò Ü÷ ô ),¨C°«ôó ðô  �cœ5Ÿ;™;×3Ñ3Ô4à—‘×"Ñ"×9Ñ9Ü—H‘H˜SŸX™XŸ]™]¨C¯H©H¯M©MÓ:óô —:‘:ñðð �c‰zÐà
‡z�z�S—Z‘ZÒ¡°s·y±yÀ#Ç)Á)Ô'LØà
‡z�z�S—Z‘ZÒØñ 	Ø�J‰Jœ%Ÿ-™-Ò'Ù §
¡
£¨c¯j©j«lÔ;àáØä Ø×ÑÓ × 2Ñ 2Ó 4Ñ4ôä	�SÓ	œ[¨Ó-Ò	-Øò,ðd 	œ+ cÓ*Ñ+¨qÒ0Ü˜ÓÐ$5Ñ5Ù" 4Ô(ààr0   Úvalid_subgraphsr$   rW   c           
   /   ó6  ‡‡K  — dt         j                  j                  dt        t         j                  df   fd„}dt         j
                  dt        fd„}| j                  t         j                  j                  j                  u r(|d   g d„ |d	   D «       ¢d
„ |d	   D «       ¢|d   ¢­f–— y| j                  t         j                  j                  j                  u r!t        |d   «      }|d	   |f–— |d   |f–— y| j                  t         j                  j                  j                  u rå|d   } ||«      }|d   d   }	 ||	«      }
t        t         j
                     d„ t        |d	d |
dd «      D «       «      }|d   j
                  |d   j
                  k(  rFt        |«      d	k(  r8 ||j!                  «       «      r"t#        d„ t        |dd |
dd «      D «       «      sJ d«       ‚|g |dd ¢|d   ¢­f–— |d   d   g |
dd ¢|d   ¢­f–— y| j                  t         j                  j                  j$                  u �r1|d   } ||«      }|d   } ||«      }|d   d   }	 ||	«      }
t        t         j
                     d„ t        |d	d |d	d |
dd «      D «       «      }|d   j
                  |d   j
                  k(  ri|d   j
                  |d   j
                  k(  rJt        |«      d	k(  r< ||j!                  «       «      r&t#        d„ t        |dd |dd |
dd «      D «       «      sJ d«       ‚|‰v r|g |dd ¢|d   ¢­f–— |‰v r|g |dd ¢|d   ¢­f–— |	‰v r|	g |
dd ¢|d   ¢­f–— yy| j                  t         j                  j                  j&                  t         j                  j                  j(                  t         j                  j                  j*                  fv r|d   t        |d	d «      f–— y| j                  t         j                  j                  j,                  u r|d   t        |dd «      f–— y| j                  t         j                  j                  j.                  u r|d   g d„ |d	   D «       ¢|d   ¢­f–— y| j                  t         j                  j                  j0                  u r!|d   g |d	   ¢d„ |d   D «       ¢|d   ¢­f–— y| j                  t         j                  j                  j2                  t         j                  j                  j4                  fv r g |d   ¢|d   ¢­}|d   |f–— |d	   |f–— y| j                  t6        u �rR|rJ d«       ‚|d	   }t        |dd «      }|‰v r||f–— t9        |t         j                  j                  «      �rt;        j<                  t         j                  j                  ˆfd „|«      rÓt?        tA        |jB                  jE                  d!¬"«      |d#¬$«      «      Š|jB                  jF                  D �cg c]  }|jH                  d%k(  sŒ|‘Œ }}t        |«      d	k(  sJ ‚|d   }d&tJ        dtJ        fˆfd'„}t;        jL                  ||jN                  |jP                  f«      \  }}tS        |‰g|¢­i |¤ŽE d{  –—†  yyytU        jV                  d(| j                  › d)�«       t;        jX                  ||f«      \  }}ˆfd*„|D «       E d{  –—†  yc c}w 7 Œ]7 Œ­w)+aA  HOPs that invoke subgraphs take a number of different forms.  This function
    regularizes them, yielding subgraphs from the args and kwargs coupled with
    appropriate args to update those subgraphs.

    If the second yielded value is None, this function was unable to determine what args
    to pass to the subgraph.Úsubgraphr   .c                 ó`   ‡ — t        ˆ fd„‰ j                  j                  d¬«      D «       «      S )Nc              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr:   )Úget_fake)r>   Únrp   s     €r.   rA   zI_extract_subgraphs_and_args.<locals>.get_subgraph_args.<locals>.<genexpr>ï   s   øè ø€ ò 
Ø&'ŒH�Q˜×!ñ
ùs   ƒÚplaceholder©r)   )ÚtupleÚgraphÚ
find_nodes)rp   s   `r.   Úget_subgraph_argsz6_extract_subgraphs_and_args.<locals>.get_subgraph_argsì   s1   ø€ ô ó 
Ø+3¯>©>×+DÑ+DÈÐ+DÓ+Vô
ó 
ð 	
r0   Údc                 ó:   — | j                    xr | j                   S r:   )Úis_floating_pointÚ
is_complex)r{   s    r.   Ú
is_integerz/_extract_subgraphs_and_args.<locals>.is_integeró   s   € Ø×&Ñ&Ð&Ò;¨q¯|©|Ð+;Ð;r0   r   c              3   ó&   K  — | ]	  }|d    –— Œ y­w©r   N© ©r>   Úas     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>ú   ó   è ø€ Ò0 1˜!˜A�$Ñ0ùó   ‚r   c              3   ó&   K  — | ]	  }|d    –— Œ y­wr�   r‚   rƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>ú   s   è ø€ Ò3J¸Q°A°aµDÑ3Jùr†   é   é   é   éÿÿÿÿc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr:   ©Údtyperƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>  s   è ø€ ò 5
ØˆA�G�Gñ5
ùó   ‚é   Nc              3   óT   K  — | ]   }t        |j                  «       «      d k(  –— Œ" y­wr�   ©r#   Úsizerƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>  s'   è ø€ ò àô �A—F‘F“H“ Õ"ñùó   ‚&(z/flex_attention subgraph arg format has changed!é   é   é	   c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr:   r�   rƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>%  s   è ø€ ò 5
àð �G�Gñ5
ùr�   c              3   óT   K  — | ]   }t        |j                  «       «      d k(  –— Œ" y­wr�   r’   rƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>2  s'   è ø€ ò àô �A—F‘F“H“ Õ"ñùr”   é   z8flex_attention_backward subgraph arg format has changed!é   é   c              3   ó&   K  — | ]	  }|d    –— Œ y­wr�   r‚   rƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>L  r…   r†   c              3   ó&   K  — | ]	  }|d    –— Œ y­wr�   r‚   rƒ   s     r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>P  s   è ø€ Ò#:¨Q A a¥DÑ#:ùr†   zfSubgraph arguments can be renamed, so we cannot consistently handle kwargs at this point in the stack.c                 ó   •— | ‰v S r:   r‚   )rp   rn   s    €r.   ú<lambda>z-_extract_subgraphs_and_args.<locals>.<lambda>e  s   ø€ ˜X¨Ð8€ r0   ru   rv   T©Ústrictr!   Úitemc                 ót   •— t        | t        j                  j                  «      r‰j	                  | | «      S | S r:   )r%   r&   r'   r(   Úget)r£   Úplaceholder_to_args    €r.   Úreplace_placeholderz8_extract_subgraphs_and_args.<locals>.replace_placeholderu  s-   ø€ Ü˜d¤E§H¡H§M¡MÔ2Ø-×1Ñ1°$¸Ó=Ð=Ø�r0   z1Please add support for subgraph args to function ú!c              3   óv   •K  — | ]0  }t        |t        j                  j                  «      r
|‰v r|d f–— Œ2 y ­wr:   )r%   r&   r'   ÚGraphModule)r>   Úsrn   s     €r.   rA   z._extract_subgraphs_and_args.<locals>.<genexpr>‰  s8   øè ø€ ò 
àÜ˜!œUŸX™X×1Ñ1Ô2°q¸OÑ7Kð �ŒIñ
ùs   ƒ69)-r&   r'   rª   rw   rE   rŽ   Úboolr*   ÚopsÚhigher_orderÚassociative_scanÚcondÚflex_attentionr   r   r#   Úpopr]   Úflex_attention_backwardÚforeach_mapÚinvoke_quant_packedÚinvoke_quantÚinvoke_subgraphÚmap_implÚscanÚ
while_loopÚwhile_loop_stack_outputr   r%   ÚpytreeÚtree_any_onlyÚdictr^   rx   ry   Únodesr)   r   r   r$   rW   Ú_extract_subgraphs_and_argsÚwarningsÚwarnÚtree_flatten)r   rn   r$   rW   rz   r   Úsubgraph_argsÚscore_subgraphÚscore_subgraph_argsÚmask_subgraphÚmask_subgraph_argsÚinteger_arg_dtypesÚfw_subgraphÚfw_subgraph_argsÚjoint_subgraphÚjoint_subgraph_argsÚcontrol_deps_subgraphÚcontrol_deps_argsrt   Úwrapped_nodesÚwrapped_noder§   Úwrapped_argsÚwrapped_kwargsÚflat_args_kwargsÚ_r¦   s    `                        @r.   rÀ   rÀ   ß   s€  ùè ø€ ð
Ü—(‘(×&Ñ&ð
ä	Œu�|‰|˜SÐ Ñ	!ó
ð<”e—k‘kð <¤dó <ð ‡{�{”e—i‘i×,Ñ,×=Ñ=Ñ=ð �1‰gÐUÑ0¨¨Q©Ô0ÐUÑ3JÀ$ÀqÁ'Ô3JÐUÈTÐRSÉWÑUÐUÓUØ	�‰œŸ	™	×.Ñ.×3Ñ3Ñ	3Ü˜d 1™g›ˆØ�1‰g�}Ð$Ò$Ø�1‰g�}Ð$Ó$Ø	�‰œŸ	™	×.Ñ.×=Ñ=Ñ	=ð 04°A©wˆÙ/°Ó?ÐØ˜Q™ ™ˆÙ.¨}Ó=Ðä'¬¯©Ñ4ñ 5
Ü"Ð#6°q¸Ð#;Ð=OÐPRÐQRÐ=SÓTô5
ó 
Ðð   Ñ"×(Ñ(¨D°©G¯M©MÒ9ÜÐ&Ó'¨1Ò,ÙÐ-×1Ñ1Ó3Ô4Üñ äÐ2°2°AÐ6Ð8JÈ2ÈAÐ8NÓOôô ð		=ð =ó	=ðð ÐBÐ 3°B°QÐ 7ÐB¸$¸q¹'ÑBÐBÒBØ�1‰g�b‰kÐ>Ð/°°Ð3Ð>°d¸1±gÑ>Ð>Ó>Ø	�‰œŸ	™	×.Ñ.×FÑFÒ	FØ˜1‘gˆÙ,¨[Ó9ÐØ˜a™ˆÙ/°Ó?ÐØ˜Q™ ™ˆÙ.¨}Ó=Ðä'¬¯©Ñ4ñ 5
äØ   1Ð%Ø# A aÐ(Ø" 2 AÐ&óô5
ó 
Ðð ˜QÑ×%Ñ%¨¨a©¯©Ò6Ø# AÑ&×,Ñ,°°Q±·±Ò=ÜÐ&Ó'¨1Ò,ÙÐ-×1Ñ1Ó3Ô4Üñ äØ$ R aÐ(Ø'¨¨Ð+Ø& r¨Ð*óôô ð	Fð Fó	Fðð ˜/Ñ)ØÐAÐ!1°"°1Ð!5ÐA¸¸R¹ÑAÐAÒAØ˜_Ñ,Ø Ð"GÐ$7¸¸Ð$;Ð"G¸dÀ2¹hÑ"GÐGÒGØ˜OÑ+ØÐ!EÐ#5°b°qÐ#9Ð!E¸DÀ¹HÑ!EÐEÓEð ,à	�‰Ü�	‰	×Ñ×*Ñ*Ü�	‰	×Ñ×2Ñ2Ü�	‰	×Ñ×+Ñ+ðñ 
ð
 �1‰g”u˜T ! "˜X“Ð&Ó&Ø	�‰œŸ	™	×.Ñ.×>Ñ>Ñ	>Ø�1‰g”u˜T ! "˜X“Ð&Ó&Ø	�‰œŸ	™	×.Ñ.×7Ñ7Ñ	7à�1‰gÐ;Ñ0¨¨Q©Ô0Ð;°4¸±7Ñ;Ð;Ó;Ø	�‰œŸ	™	×.Ñ.×3Ñ3Ñ	3ð �1‰gÐE˜˜a™ÐEÑ#:°$°q±'Ô#:ÐE¸TÀ!¹WÑEÐEÓEØ	�‰Ü�	‰	×Ñ×)Ñ)Ü�	‰	×Ñ×6Ñ6ðñ 
ð -˜$˜q™'Ð, D¨¡GÑ,ˆØ�1‰g�}Ð$Ò$Ø�1‰g�}Ð$Ó$Ø	�‰œÒ	$Ùð 	
ð8ó	
ˆzð !% Q¡ÐÜ! $ q r (›OÐØ  OÑ3Ø'Ð):Ð:Ò:ÜØ!¤5§8¡8×#7Ñ#7õ
ä×"Ñ"Ü�H‰H× Ñ Û8Øô
ô
 "&ÜØ)×/Ñ/×:Ñ:¸mÐ:ÓLØ%Øôó"Ðð 1×6Ñ6×<Ñ<öØÀÇÁÈÓ@W’ðˆMð ô �}Ó%¨Ò*Ð*Ð*Ø(¨Ñ+ˆLð¬#ð ´#õ ô
 ,2¯?©?Ø#Ø×"Ñ" L×$7Ñ$7Ð8ó,Ñ(ˆL˜.ô 3Ø˜oðØ0<òØ@Nñ÷ ñ ð7
ð
ôB 	�‰Ø?ÀÇÁ¸}ÈAÐNô	
ô %×1Ñ1°4¸°.ÓAÑÐ˜!ó
à%ô
÷ 	
ñ 	
ùò5ðøð	
ús8   „X/\Ø3\Ù\ÙA+\Ú7\Ú8A\Ü
\Ü\Ü\)Úfrozenc                   ó®   — e Zd ZU ej                  j
                  ed<   ej                  j                  j                  ed<   e	e
df   ed<   e	e
df   ed<   y)Ú_FxNodeHashr   r*   .Ú
arg_hashesÚkwarg_hashesN)Ú__name__Ú
__module__Ú__qualname__r&   r'   r(   Ú__annotations__r   ÚTargetrw   Úintr‚   r0   r.   rØ   rØ   �  s@   … à
�(‰(�-‰-ÓØ�H‰H�M‰M× Ñ Ó Ø�c˜3�h‘ÓØ˜˜S˜‘/Ô!r0   rØ   c                   óŒ   — e Zd ZdZdej
                  j                  ddfd„Zdej
                  j                  de	fd„Z
def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.

    Since this runs in the context of Inductor, we assume that the input and
    output semantics for the outermost graph are not subject to change after class
    initialization, but we allow striding changes for subgraphs.  Any other changes will
    result in errors or undefined behavior.
    Úgmr   Nc                 ó|  — t        t           «       | _        || _        ddlm}  || j                  «      D �ci c]$  }t        | j                  |«      x}t        |«      “Œ& c}| _        | j                  j                  j                  D ],  }| j                  j                  | j                  |«      «       Œ. y c c}w )Nr   )Ú_get_subgraph_names)r   rØ   Úprocessed_hashesrã   Útorch._inductor.compile_fxrå   Úgetattrrâ   Úsubgraph_updatersrx   r¿   r\   Ú	hash_node)Úselfrã   rå   Úsubgraph_namerp   r   s         r.   Ú__init__zFakeTensorUpdater.__init__±  s¤   € Ü *¬;Ñ 7Ó 9ˆÔØˆŒõ 	Cñ "5°T·W±WÓ!=öQ
àô ! §¡¨-Ó8Ð8ˆXÔ;LÈXÓ;VÑVòQ
ˆÔð
 —G‘G—M‘M×'Ñ'ò 	<ˆDØ×!Ñ!×%Ñ% d§n¡n°TÓ&:Õ;ñ	<ùòQ
s   ¸)B9r   c                 óô   — dt         t           dt        t        df   fd„}t	        ||j
                   ||j                  «       |t        j                  |j                  j                  «       «      «      «      S )NÚn_iterr   .c                 óL   ‡— dt         dt        fd„Št        ˆfd„| D «       «      S )a  Replace unhashable items from the input with the ids of those items, and
            hash all other items.  This is kludgy, but allows us to attempt to account
            for unhashable classes like torch.fx.Node when hashing args and kwargs for
            other nodes.Úor   c                 óN   — 	 t        | «      S # t        $ r t        | «      cY S w xY wr:   )ÚhashÚ	Exceptionr[   )rñ   s    r.   Úget_hash_or_idzLFakeTensorUpdater.hash_node.<locals>.get_hash_or_ids.<locals>.get_hash_or_idÇ  s(   € ð!Ü ›7�NøÜ ò !Ü˜a›5’Lð!ús   ‚
 �$£$c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr:   r‚   )r>   rt   rõ   s     €r.   rA   zGFakeTensorUpdater.hash_node.<locals>.get_hash_or_ids.<locals>.<genexpr>Í  s   øè ø€ Ò;¨q™¨×*Ñ;ùó   ƒ)Úobjectrà   rw   )rï   rõ   s    @r.   Úget_hash_or_idsz4FakeTensorUpdater.hash_node.<locals>.get_hash_or_idsÁ  s)   ø€ ð!¤&ð !¬Só !ô Ó;°FÔ;Ó;Ð;r0   )r   r   rw   rà   rØ   r*   r$   r   Úfrom_iterablerW   Úitems)rë   r   rù   s      r.   rê   zFakeTensorUpdater.hash_nodeÀ  sf   € ð	<¤H¬S¡Mð 	<´e¼CÀ¸H±oó 	<ô ØØ�K‰KÙ˜DŸI™IÓ&ÙœE×/Ñ/°·±×0AÑ0AÓ0CÓDÓEó	
ð 	
r0   c           
      óè  ‡ — t        t        «      }‰ j                  j                  j                  D ]  }t        |«      x}sŒ||xx   dz  cc<   Œ dt        j                  j                  dt        fd„}dt        j                  j                  dt        dt        dt        fˆ fd„}t        t           «       }d}t        t           «       }i }	‰ j                  j                  j                  D �]â  }|j                  ‰ j                  |«      x}
«       t        |‰ j                  «      \  }}}|sŒC ||g|¢­i |¤Žx}s|
‰ j                   v rt#        |«      |vrŒm ||«      sŒv|�rRd	}t%        |‰ j&                  g|¢­i |¤ŽD �]   \  }}||	v}|rd	|	|<   |�€t)        |j                  j+                  d¬«      |d¬«      D ]U  \  }}t-        |t/        ||«      x}|d	¬«      rŒ"|sJ d«       ‚t-        |||d	d	¬«      sJ d«       ‚||j0                  d<   |dz  }ŒW |r‚t        |j                  j3                  «       |«      \  }}}|‰ j&                  |   j5                  «       z  }t        |j                  j3                  «       |«      \  }}}t-        |||«      sd|	|<   |xs |	|   }�Œ# |sd|j0                  v r�ŒËt6        j8                  5  t;        «       5   |j<                  |i |¤Ž}d
d
d
«       d
d
d
«       d|j0                  v rt-        |j0                  d   ||¬«      r�Œ5t?        t6        j8                  j@                  |«       ||j0                  d<   |dz  }t6        j8                  j@                  x}rtC        ||«      x}r||j0                  d<   t        |«      x}r||xx   dz  cc<   |jE                  d„ |jF                  D «       «       �Œå |‰ _        |S # 1 sw Y   Œ÷xY w# 1 sw Y   ŒûxY w)z§Update FakeTensors on self.graph. We will try to do the minimum amount of work.

        Returns the number of nodes updated, including recursive updates on subgraphs.r   r   r   c                 ó^   — t        | j                  «      xr t        | j                  d«       S )NÚ_inductor_lowering_function)Úcallabler*   Úhasattr©r   s    r.   Úshould_process_nodezAFakeTensorUpdater.incremental_update.<locals>.should_process_nodeß  s-   € ä˜Ÿ™Ó%ò Lô   §¡Ð-JÓKÐKðr0   r$   rW   c                 ó:  •— | j                   dk(  xrŠ | j                  t        j                  j                  j
                  t        j                  j                  j                  fvxr4 t        j                  t        j                  j                  ˆfd„||f«      S )Nr!   c                 ó    •— | ‰j                   v S r:   )ré   )r«   rë   s    €r.   r    zUFakeTensorUpdater.incremental_update.<locals>.node_invokes_subgraph.<locals>.<lambda>÷  s   ø€ ˜a 4×#9Ñ#9Ð9€ r0   )r)   r*   r&   r­   r®   Úauto_functionalizedÚauto_functionalized_v2r¼   r½   r'   rª   )r   r$   rW   rë   s      €r.   Únode_invokes_subgraphzCFakeTensorUpdater.incremental_update.<locals>.node_invokes_subgraphè  s€   ø€ ð —‘˜?Ñ*ò Ø—K‘Kô
 —I‘I×*Ñ*×>Ñ>Ü—I‘I×*Ñ*×AÑAððòô ×(Ñ(Ü—H‘H×(Ñ(Û9Ø˜6�Nóðr0   r   FNru   rv   Tr¡   )r3   z*subgraph args must have consistent values!)r2   r3   ziA subgraph argument other than striding has been modified; FakeTensorUpdater cannot update this argument!rC   r  Úunbacked_bindingsc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr:   )r[   )r>   rU   s     r.   rA   z7FakeTensorUpdater.incremental_update.<locals>.<genexpr>‚  s   è ø€ Ò>¨4œb ŸhÑ>ùs   ‚)$r   rà   rã   rx   r¿   Úget_node_storager&   r'   r(   r¬   r   r   rØ   r\   rê   rM   ræ   r[   rÀ   ré   r^   ry   r=   rs   rD   Úoutput_nodeÚincremental_updater   rN   r   r*   r   rQ   r   Úupdater-   )rë   r7   r   Ústorager  r  Úcurrent_graph_hashesÚnodes_updatedÚ
to_processÚsubgraph_updatingsró   rV   r$   rW   Úinvokes_subgraphÚany_output_updatedrp   rÄ   Úupdate_subgraphÚpr„   Úp_fakerÕ   Úorig_output_argsÚnew_output_argsrY   rQ   Úsymbol_to_paths   `                           r.   r  z$FakeTensorUpdater.incremental_updateÖ  sV  ø€ ô 4?¼sÓ3CÐØ—G‘G—M‘M×'Ñ'ò 	0ˆDÜ*¨4Ó0Ð0ˆwÑ0Ø! 'Ó*¨aÑ/Ô*ð	0ð	¤e§h¡h§m¡mð 	¼ó 	ð	Ü—(‘(—-‘-ð	Ü(+ð	Ü7:ð	äõ	ô0  *¬+Ñ6Ó8ÐàˆÜ¤‘_Ó&ˆ
à?AÐØ—G‘G—M‘M×'Ñ'ó |	?ˆDØ ×$Ñ$¨T¯^©^¸DÓ-AÐ%A TÔBÜ%9¸$ÀÇÁÓ%HÑ"ˆH�d˜FÙØñ *?¸tÐ)UÀdÒ)UÈfÑ)UÐUÐ%ÐUØ˜D×1Ñ1Ñ1Ü�t“H JÑ.àá& tÔ,ØâØ%*Ð"ä/JØ˜$×0Ñ0ð0Ø37ò0Ø;Añ0ó CÑ+�H˜mð '/Ð6HÐ&H�OÙ&Ø7<Ð*¨8Ñ4ð %Ð0Ü$'Ø$ŸN™N×5Ñ5¸Ð5ÓGØ)Ø#'ô%ò !3™D˜A˜qô $8Ø !Ü*2°1°hÓ*?Ð ? Ø 1Ø.3ö	$ñ (7ð !"Ø$Pó!" ô
 (<Ø$%Ø$*Ø$5Ø27Ø27õ("ð 
!"ð%0ó
!"ð ("ð 12 §¡ u¡Ø -°Ñ 2¡ðC!3ñF 'Ü1EØ$ŸN™N×6Ñ6Ó8¸(ó2Ñ.˜Ð+¨Qð &¨×)?Ñ)?Ø$ñ*ç,Ñ,Ó.ñ/˜ô 1EØ$ŸN™N×6Ñ6Ó8¸(ó1Ñ-˜˜?¨Aô  4Ø+Ø,Ø-ô ð
 <@Ð.¨xÑ8ð +ÒJÐ.@ÀÑ.Jò 'ðCCñT *¨e°t·y±yÑ.@Ùä—‘ñ ?Ô6Ó8ñ ?Ø"- $§+¡+¨tÐ">°vÑ">�÷?÷ ?ð ˜Ÿ	™	Ñ!Ô&:Ø §¡¨5Ñ!1Ð3DÈ4õ'ñ äœAŸK™K×1Ñ1°4¸ÔIà.ˆD�I‰I�eÑØ˜QÑˆMäŸ[™[×2Ñ2Ð2�	Ð2Ü";¸IÀÓ"WÐW�ÐWð 2@�—	‘	Ð-Ñ.ä*¨4Ó0Ð0ˆwÐ0Ø! 'Ó*¨aÑ/Ó*à×ÑÑ>°4·:±:Ô>Ö>ðy|	?ð| !5ˆÔàÐ÷7?ð ?ú÷ ?ð ?ús$   ËO(ËOË&O(ÏO%Ï!O(Ï(O1	)rÛ   rÜ   rÝ   Ú__doc__r&   r'   rª   rí   r(   rØ   rê   rà   r  r‚   r0   r.   râ   râ   ˜  sM   „ ñð0<˜5Ÿ8™8×/Ñ/ð <°Dó <ð
˜eŸh™hŸm™mð 
°ó 
ð,p Cô pr0   râ   Útc                 ó6   — | j                  «       j                  S r:   )Úuntyped_storageÚ_cdata)r  s    r.   rT   rT   ‰  s   € Ø×ÑÓ×%Ñ%Ð%r0   c                 óú   — d| j                   vry t        | j                   d   t        j                  «      sy t        j                  j                  | j                   d   «      sy t        | j                   d   «      S )NrC   )rD   r%   r&   rE   Ú_CÚ_has_storagerT   r  s    r.   r
  r
  �  s]   € Ø�D—I‘IÑØÜ�d—i‘i Ñ&¬¯©Ô5ØÜ�8‰8× Ñ  §¡¨5Ñ!1Ô2ØÜ�t—y‘y Ñ'Ó(Ð(r0   Úxrã   c                 ón  — t        | t        j                  j                  «      r�d| j                  v r| j                  d   S d| j                  v r| j                  d   S | j
                  dk(  rFt        | j                  t        «      r,t        || j                  «      rt        || j                  «      S y| S )z•Return a fake tensor from the meta values of an input FX node.  If the input node
    is a get_attr node, we attempt to resolve it as a member of gm.rC   Úexample_valueÚget_attrN)
r%   r&   r'   r(   rD   r)   r*   r+   r   rè   )r#  rã   s     r.   rs   rs   —  s‹   € ô �!”U—X‘X—]‘]Ô#Ø�A—F‘F‰?Ø—6‘6˜%‘=Ð Ø˜aŸf™fÑ$Ø—6‘6˜/Ñ*Ð*Ø�4‰4�:Ò¤*¨Q¯X©X´sÔ";ÄÈÈAÏHÉHÔ@UÜ˜2˜qŸx™xÓ(Ð(ð à€Hr0   c                 óÈ   — t        t        t        |¬«      | j                  | j                  f«      \  }}t        d„ t        j                  |i |¤ŽD «       «      rd||fS d||fS )z{
    First value returns a boolean if any of the input nodes don't have a faketensor and
    weren't resolved from gm.
    )rã   c              3   ód   K  — | ](  }t        |t        j                  j                  «      –— Œ* y ­wr:   )r%   r&   r'   r(   rƒ   s     r.   rA   z'get_fake_args_kwargs.<locals>.<genexpr>±  s$   è ø€ ò Ø)*Œ
�1”e—h‘h—m‘m×$ñùs   ‚.0FT)r   r   rs   r$   rW   Úanyr¼   Úarg_tree_leaves)r#  rã   r$   rW   s       r.   rM   rM   ©  si   € ô œG¤H°Ô4°q·v±v¸q¿x¹xÐ6HÓI�L€Dˆ&Ü
ñ Ü.4×.DÑ.DÀdÐ.UÈfÑ.Uôô ð �d˜FÐ"Ð"Ø��vÐÐr0   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   )ru   Úoutput)r)   r*   ÚoperatorÚgetitemr$   )r   r,  Ú	is_buffers    €€r.   r2  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ÐOr0   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ÐJr0   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr:   r‚   )r>   rU   r4  s     €r.   rA   z#is_node_realized.<locals>.<genexpr>Ñ  s   øè ø€ Ò
8 T‰?˜4× Ñ
8ùr÷   F)	Útorch._inductor.loweringr,  r-  r&   r'   r(   r¬   r)  r-   )r   r,  r2  r-  r4  s    @@@@r.   Úis_node_realizedr7  ¸  sm   û€ ÷ JðPœŸ™Ÿ™ð P¬$ö Pñ �„ØðKœeŸh™hŸm™mð K´õ Kô Ó
8¨T¯Z©ZÔ
8Ô8Øð r0   c           	      óÖ  — t        | «      rt        | j                  t        «      ry t	        d¬«      5  t        | «      \  }}}|�r| j                  t        j                  j                  j                  t        j                  j                  j                  fv rOt        j                  | j                  «      }|�. ||i |¤d| j                  j                  d«      i¤Žcd d d «       S t        j                  j                  j!                  d¬«      5 } | j                  |i |¤Ž d d d «       j#                  «       }|cd d d «       S 	 d d d «       y # 1 sw Y   Œ.xY w# 1 sw Y   y xY w)NT)Úallow_non_fake_inputsÚout_valrC   F)Údisplay)Úcountable_fxr%   r*   r+   r   rM   r&   r­   r®   r±   r³   r   r¥   rD   ÚutilsÚflop_counterÚFlopCounterModeÚget_total_flops)r   Úsuccessr$   rW   Úflop_formulaÚflop_counter_modeÚcounted_flopss          r.   Úcount_flops_fxrE  Ø  s=  € Ü˜Ô¤¨D¯K©K¼Ô!=ØÜ	¨dÔ	3ñ !Ü 4°TÓ :Ñˆ��vâð �{‰{Ü—	‘	×&Ñ&×5Ñ5Ü—	‘	×&Ñ&×>Ñ>ðñ ô  -×0Ñ0°·±Ó=�ØÐ+Ù'¨ÐV°ÑVÀÇÁÇÁÈuÓAUÒV÷!ñ !ô —‘×)Ñ)×9Ñ9Øð :ó ð -à"Ø�—‘˜TÐ, VÒ,÷-ð
 .×=Ñ=Ó?ˆMØ ÷)!ñ !ð ÷!ð* ÷-ð -ú÷!ð* ús*   ³B,EÃ)*EÄEÄ&EÅE	ÅEÅE(c                 óÐ   — t        | t        j                  j                  «      sJ ‚t	        | d«      sy| j
                  }t	        |d«      s|t        v S |j                  }|t        v S )z>
    Whether or not we can count the flops of an FX node.
    r*   FÚoverloadpacket)r%   r&   r'   r(   r   r*   r   rG  )r   r*   Úpackets      r.   r<  r<  ó  s^   € ô �dœEŸH™HŸM™MÔ*Ð*Ð*Ü�4˜Ô"ØØ�[‰[€FÜ�6Ð+Ô,ØœÐ&Ð&Ø×"Ñ"€FØ”]Ð"Ð"r0   r:   )FrO   r0  rÁ   Úcollectionsr   Úcollections.abcr   r   r   r   r   r	   Údataclassesr
   Ú	functoolsr   Ú	itertoolsr   Útypingr   rb   r&   Útorch.fxÚtorch._dispatch.pythonr   Ú.torch._inductor.fx_passes.control_dependenciesr   Útorch._subclasses.fake_tensorr   Ú%torch.fx.experimental.symbolic_shapesr   r   r   r   Útorch.utilsr   r¼   Útorch.utils._ordered_setr   Útorch.utils._pytreer   Útorch.utils.flop_counterr   Úvirtualizedr   rw   r,   Únnr   ÚModuler'   r(   r¾   r+   r¬   r/   rà   r=   rª   rÀ   rØ   râ   rE   rT   r
  rs   rM   r7  rE  r<  r‚   r0   r.   ú<module>r[     s  ðã Û Û Ý #÷÷ õ "Ý Ý Ý ã ã Û Ý ;Ý GÝ 8÷ó õ *Ý /Ý (Ý 2å ð
Ø�4˜Ÿ™×(Ñ(×/Ñ/Ñ0°(¸3À¸8Ñ2DÐDÑEðà
�(‰(�-‰-ðð �#�u—x‘x×'Ñ'×.Ñ.Ð.Ñ/ðð 
ó	ðH ØØ!%Ø8<òSØ	ðSà	ðSð ˜s C˜xÑ(ðSð
 ðSð ðSð �(‰(�-‰-˜$Ñ
ðSð ˜e C¨ H™oÑ.°Ñ5ðSð 
óSðln
Ø
�(‰(�-‰-ðn
à˜uŸx™x×3Ñ3Ñ4ðn
ð ðn
ð ð	n
ð
 ˆu�U—X‘X×)Ñ)¨5°°c°©?¸TÑ+AÐAÑBÑCón
ñb �$Ô÷"ð "ó ð"÷nñ nðb&�5—<‘<ð & Có &ð)˜5Ÿ8™8Ÿ=™=ð )¨S°4©Zó )ð�ð ˜Ÿ™×-Ñ-°Ñ4ð ¸ó ð& 9=ñØ‡x�x‡}�}ðØŸ(™(×.Ñ.°Ñ5ðà
ˆ4��s˜C�x‘ $ s¨C x¡.Ð0Ñ1óð˜5Ÿ8™8Ÿ=™=ð ¨Tó ð@˜Ÿ™Ÿ™ð ¨3°©:ó ð6#�u—x‘x—}‘}ð #¨ô #r0   