Ë
    ÄÓ^jÂ‚ ã                  óÔ  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZm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mZmZm Z  dd	l!m"Z"m#Z# ddl$Z$ddl%Z$ddl&Z$ddl'm(c m)Z* dd
l+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZE ddlFmGZGmHZH ddlImJZJ ddlKmLZLmMZM ddlNmOZO ddlPmDZD ddlQmRZR ddlSmTZT  e	jª                  eV«      ZWe$j°                  j²                  ZYe$j°                  j´                  ZZeZ[e[e$jœ                  j¸                  z  Z]ej¼                  j¿                  dd«      Z`daad ebd!<   dacd"ebd#<   d¦d$„Zd G d%„ d&e«      Ze G d'„ d(e«      Zf G d)„ d*e«      Zg e d+«      Zhe$jœ                  jÒ                  jÔ                  ekz  Zl G d,„ d-«      Zm em«       Zn	 d§	 	 	 	 	 	 	 d¨d.„Zo G d/„ d0«      Zp G d1„ d2eq«      Zreperz  Zsd©d3„Zt G d4„ d5«      Zu G d6„ d7e«      Zv G d8„ d9ev«      Zw G d:„ d;ev«      Zx G d<„ d=ev«      Zy G d>„ d?ev«      Zz G d@„ dAev«      Z{e|edBf   Z} G dC„ dDe{«      Z~ G dE„ dFe~«      Z G dG„ dHe~«      Z€ G dI„ dJe~«      Z� G dK„ dLe{«      Z‚ G dM„ dNe‚«      Zƒ G dO„ dPe‚«      Z„ G dQ„ dRe‚«      Z… G dS„ dTev«      Z† G dU„ dVev«      Z‡ G dW„ dXev«      Zˆ G dY„ dZ«      Z‰ G d[„ d\e«      ZŠe�j                   G d]„ d^«      «       ZŒe�j                   G d_„ d`eŒ«      «       Z�e�j                   G da„ dbeŒ«      «       ZŽe�j                   G dc„ ddeŒ«      «       Z�dªde„Z�d«df„Z‘ e�j                  dg¬h«       G di„ dj«      «       Z’d¬dl„Z“	 	 	 	 	 	 	 	 d­dm„Z”d®dn„Z•	 d¯	 	 	 	 	 	 	 d°do„Z–d±dp„Z—	 d²	 	 	 	 	 	 	 	 	 d³dr„Z˜e�ddsddqdeRf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d´dt„Z™ eB«       Zšdkebdu<   	 	 	 	 	 	 	 	 	 	 	 	 dµdv„Z› eeœ«      �j:                  dwz  dxz  Zžg ZŸdyebdz<   e�ddsdqeRf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d¶d{„Z  eE�jB                  dq¬|«      ddseRf	 	 	 	 	 	 	 	 	 	 	 	 	 d·d}„«       Z¢	 	 d¸	 	 	 	 	 	 	 	 	 	 	 d¹d~„Z£e�fdqdœ	 	 	 	 	 	 	 	 	 dºd€„Z¤e�fdqdœ	 	 	 	 	 	 	 	 	 dºd�„Z¥d»d‚„Z¦ e�jN                  dƒ«      Z¨d¼d„„Z©d½d…„Zªd¾d†„Z«d¿d‡„Z¬dÀdˆ„Z­dÁd‰„Z® e�j                  dg¬h«       G dŠ„ d‹«      «       Z¯e�j                   G dŒ„ d�«      «       Z°e�jb                  	 	 	 	 dÂdŽ„«       Z²dÃd�„Z³dÄd�„Z´	 	 	 	 	 	 dÅd‘„Zµ	 	 	 	 	 	 dÆd’„Z¶	 	 	 	 	 	 dÇd“„Z·dÈd”„Z¸ G d•„ d–«      Z¹dÉd—„Zº	 	 	 	 dÊ	 	 	 	 	 	 	 	 	 	 	 dËd˜„Z» e$�jx                  «       dgeRd™œ	 	 	 	 	 	 	 	 	 dÌdš„«       Z½ e$�j|                  «       eRd›œ	 	 	 	 	 	 	 dÍdœ„«       Z¿dÎd�„ZÀdÁdž„ZÁdÏdŸ„ZÂdÐd „ZÃdÑd¡„ZÄ eB«       ZÅdkebd¢<   	 d¯	 	 	 	 	 	 	 dÒd£„ZÆdÓd¤„ZÇdÔd¥„ZÈy)Õa4  
# Inductor Pattern Matcher

The pattern matcher enables search/replace within an FX graph.

The main entrypoint to the pattern matcher is register_replacement(). Given a
search function and a replacement function this will register a replacement with
a pass (such as torch._inductor.fx_passes.joint_graph.patterns).

Internally the pattern matcher represents patterns as a graph (a DAG). Creating
new patterns manually as a graph is cumbersome and error-prone so the standard
way to create patterns (using register_replacement()) is to provide a search
function and a replacement function which is traced and converted into a graph.

Because the search functions are built somewhat generic (they tend to ignore
tensor sizes, for example) register_replacement() allows you to specify an
`extra_check` function which performs additional checks to verify that the
matched pattern fully matches before returning it.

## Precompiled Patterns

New patterns are added using register_replacement(). Patterns added in this way
can have a compile-time overhead because they need to be traced before
use. Patterns can be precompiled and added using gen_register_replacement()
instead. To do this you call gen_register_replacement() instead of
register_replacement(). The arguments are the same except for an additional
unique name which is used as a lookup key.

## Internals

The match DAG is represented by a graph of `PatternExpr` nodes. Each PatternExpr
implements a `_match` method which returns either a `Match` object for a
successful match or a `FailedMatch` object for a failure to match.
é    )ÚannotationsN)ÚABCÚabstractmethod)Údefaultdict)ÚCallableÚ
CollectionÚ	GeneratorÚIterableÚMappingÚSequence)ÚPath)ÚAnyÚNoReturnÚProtocolÚTypeVar)ÚSelfÚTypeIs)Úenable_python_dispatcher)Úcounters)Úis_integer_dtype)Úunset_fake_temporarily)Úmake_fx)Úguard_or_falseÚstatically_known_true)Ú	_get_attr)Úimmutable_dictÚimmutable_list)ÚGraphTransformObserver)Úpreserve_node_meta)Ú
OrderedSeté   ©Úconfig)Úaot_functionÚmake_boxed_func)Údefault_partition)Ú
FakeTensorÚFakeTensorMode)ÚTransformeré   )Úselect_decomp_table)Ú%fallback_node_due_to_unsupported_typeÚ#TORCHINDUCTOR_PATTERN_MATCH_BACKENDÚinductorzbool | OrderedSet[str] | NoneÚ_debug_nodes_cacheú
str | NoneÚ_debug_nodes_env_value_cachec                óD   — dd„} |«       }t        |t        «      r|S | |v S )Nc                 ó†   — dd„} t         j                  j                  d«      }|t        k7  st        €
 | |«      a|at        S )Nc                óH   — | sy| dk(  ryt        | j                  d«      «      S )NFÚallTú,)r    Úsplit)Ú	env_values    új/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/pattern_matcher.pyÚparse_debug_envzE_should_debug_node.<locals>._get_debug_nodes.<locals>.parse_debug_enve   s'   € ÙØØ˜EÒ!ØÜ˜iŸo™o¨cÓ2Ó3Ð3ó    Ú!TORCHINDUCTOR_PATTERN_MATCH_DEBUG)r8   r0   Úreturnúbool | OrderedSet[str])ÚosÚenvironÚgetr1   r/   )r:   Úcurrent_envs     r9   Ú_get_debug_nodesz,_should_debug_node.<locals>._get_debug_nodesb   sD   € ó	4ô —j‘j—n‘nÐ%HÓIˆð Ô6Ò6Ô:LÐ:TÙ!0°Ó!=ÐØ+6Ð(ä!Ð!r;   )r=   r>   )Ú
isinstanceÚbool)Ú	node_namerC   Údebug_nodess      r9   Ú_should_debug_noderH   a   s,   € ó"ñ& #Ó$€KÜ�+œtÔ$ØÐØ˜Ð#Ð#r;   c                  ó    — e Zd ZU ded<   dd„Zy)ÚSearchFnÚstrÚ__name__c                 ó   — y ©N© ©ÚselfÚargsÚkwargss      r9   Ú__call__zSearchFn.__call__~   ó   � r;   N©rR   r   rS   r   r=   r   )rL   Ú
__module__Ú__qualname__Ú__annotations__rT   rO   r;   r9   rJ   rJ   {   s
   … ØƒMä=r;   rJ   c                  ó   — e Zd Zdd„Zy)Ú	ReplaceFnc                 ó   — y rN   rO   rP   s      r9   rT   zReplaceFn.__call__‚   rU   r;   NrV   ©rL   rW   rX   rT   rO   r;   r9   r[   r[   �   s   „ Ü=r;   r[   c                  ó$   — e Zd Z	 	 	 	 	 	 	 	 dd„Zy)ÚTraceFnc                 ó   — y rN   rO   )rQ   ÚfnrR   rS   s       r9   rT   zTraceFn.__call__†   s   € à"r;   N)ra   zSearchFn | ReplaceFnrR   r   rS   r   r=   útorch.fx.GraphModuler]   rO   r;   r9   r_   r_   …   s'   „ ð#Ø&ð#Ø/2ð#Ø>Að#à	ô#r;   r_   ÚTc                  ó   — e Zd Zdd„Zy)ÚMultiplec                ó2   — dt        «       vs| t        u sJ ‚y y )NÚMULTIPLE)Úglobalsrg   ©rQ   s    r9   Ú__init__zMultiple.__init__’   s   € à¤£Ñ*¨d´hÑ.>Ð>Ð>Ð.>Ð*r;   N©r=   ÚNone)rL   rW   rX   rj   rO   r;   r9   re   re   ‘   s   „ ô?r;   re   c                ót  — ddl m}m} t        j                  j
                  dk(  ry| j                  dg «      j                  «       }|j                   ||||j                  «      «       | j                  d„ |j                  j                  «       D «       «       || d<   n0| j                  d„ |j                  j                  «       D «       «       d|j                  v r|j                  d   | d<   d| vr d|j                  v r|j                  d   | d<   d	| vr"d	|j                  v r|j                  d	   | d	<   y y y )
Nr   )Ú
NodeSourceÚNodeSourceActionr*   Ú	from_nodec              3  óv   K  — | ]1  \  }}|t         j                  j                  j                  v r||f–— Œ3 y ­wrN   ©ÚtorchÚfxÚproxyÚ_COPY_META_FIELDS©Ú.0ÚkÚvs      r9   ú	<genexpr>z!_transfer_meta.<locals>.<genexpr>¥   ó6   è ø€ ò 
á��1Ø”E—H‘H—N‘N×4Ñ4Ñ4ð �ŒFñ
ùó   ‚79c              3  óv   K  — | ]1  \  }}|t         j                  j                  j                  v r||f–— Œ3 y ­wrN   rr   rw   s      r9   r{   z!_transfer_meta.<locals>.<genexpr>¬   r|   r}   Ústack_traceÚvalÚtensor_meta)Útorch.fx.tracebackrn   ro   r#   ÚtraceÚprovenance_tracking_levelrA   ÚcopyÚappendÚREPLACEÚupdateÚmetaÚitems)Únew_metaÚold_nodeÚ	pass_namern   ro   Únew_from_nodes         r9   Ú_transfer_metar�   ›   s"  € ÷ @ô ‡|�|×-Ñ-°Ò2Ø Ÿ™ [°"Ó5×:Ñ:Ó<ˆØ×Ñ™Z¨°)Ð=M×=UÑ=UÓVÔWØ�‰ñ 
à Ÿ™×+Ñ+Ó-ô
ô 	
ð
 !.ˆ�Òà�‰ñ 
à Ÿ™×+Ñ+Ó-ô
ô 	
ð
 ˜Ÿ™Ñ%Ø"*§-¡-°Ñ">ˆ�Ñð �HÑ ¨(¯-©-Ñ!7Ø"Ÿ-™-¨Ñ.ˆ�‰Ø˜HÑ$¨¸(¿-¹-Ñ)GØ"*§-¡-°Ñ">ˆ�Òð *HÐ$r;   c                  óú   ‡ — e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   	 	 d	 	 	 	 	 	 	 	 	 dˆ fd„Zedd„«       Zdd„Zdd„Z	dd„Z
d d„Zd!d„Zd"d„Z	 	 	 	 	 	 d#d„Z	 	 d$	 	 	 	 	 	 	 	 	 d%d„Zˆ xZS )&ÚMatcha‹  
    Represents a successfully matched pattern.

    The `Match` object is returned to represent a successfully matched
    pattern. Included in the Match are the pattern that was matched, the graph
    nodes matched, and any args that were used during the matching.

    The args and kwargs are specific to the type of pattern that was matched and
    provide hints about what was matched.
    ÚPatternExprÚpatternú	list[Any]rR   údict[str, Any]rS   úlist[torch.fx.Node]Únodesz'dict[_TargetExpr, torch.fx.node.Target]ÚtargetsÚMatchContextÚctxztorch.fx.GraphModule | NoneÚreplacement_graphc                ó¦   •— t         ‰| �  «        || _        t        |xs g «      | _        |xs i | _        g | _        i | _        || _        d | _	        y rN   )
Úsuperrj   r“   ÚlistrR   rS   r—   r˜   rš   r›   )rQ   rš   r“   rR   rS   Ú	__class__s        €r9   rj   zMatch.__init__Ð   sO   ø€ ô 	‰ÑÔØˆŒä˜š Ó$ˆŒ	Ø’l ˆŒàˆŒ
àˆŒØˆŒØ!%ˆÕr;   c                ó.   — | j                   j                  S rN   )rš   Úgraphri   s    r9   r¡   zMatch.graphã   s   € à�x‰x�~‰~Ðr;   c                ó2  — | j                   rwt        | j                   j                  «       «      t        |j                   j                  «       «      z  D ]-  }| j                   |   |j                   |   k7  sŒ#t        d|«      ‚ | j                  j                  |j                  «       | j                  j                  |j                  «       | j                   j                  |j                   «       | j                  j                  |j                  «       y )Nzkwarg mismatch: {})	rS   r    ÚkeysÚFailedMatchrR   Úextendr—   rˆ   r˜   )rQ   ÚotherÚkeys      r9   r¥   zMatch.extendç   sÅ   € Ø�;Š;Ü! $§+¡+×"2Ñ"2Ó"4Ó5¼
À5Ç<Á<×CTÑCTÓCVÓ8WÑWò A�Ø—;‘;˜sÑ# u§|¡|°CÑ'8Ó8Ü%Ð&:¸CÓ@Ð@ðAð 	�	‰	×Ñ˜Ÿ™Ô$Ø�
‰
×Ñ˜%Ÿ+™+Ô&Ø�‰×Ñ˜5Ÿ<™<Ô(Ø�‰×Ñ˜EŸM™MÕ*r;   c                óf   — | j                   rt        | j                   «      g| _         | S g | _         | S rN   )rR   Útupleri   s    r9   ÚbundlezMatch.bundleñ   s.   € à*.¯)ª)”U˜4Ÿ9™9Ó%Ð&ˆŒ	Øˆð :<ˆŒ	Øˆr;   c                ó<   — d| j                   › d| j                  › d�S )NzMatch(..., ú, ú)©rR   rS   ri   s    r9   Ú__repr__zMatch.__repr__ö   s   € Ø˜TŸY™Y˜K r¨$¯+©+¨°aÐ8Ð8r;   c                ó¦   — | j                   }t        | j                  «      D ]-  }|j                  rŒ|j                  rŒ|j                  |«       Œ/ y rN   )r¡   Úreversedr—   Ú_erasedÚusersÚ
erase_node)rQ   r¡   Úns      r9   Úerase_nodeszMatch.erase_nodesù   s>   € Ø—
‘
ˆÜ˜$Ÿ*™*Ó%ò 	$ˆAØ—9“9 Q§W£WØ× Ñ  Õ#ñ	$r;   c                óŠ   — | j                   j                  D �cg c]  }|�| j                   j                  |   nd ‘Œ! c}S c c}w rN   )rš   ÚoutputsÚpattern_to_node)rQ   Úps     r9   Úoutput_nodeszMatch.output_nodesÿ   sF   € ð —X‘X×%Ñ%ö
àð -.¨MˆT�X‰X×%Ñ% aÒ(¸tÑCò
ð 	
ùò 
s   ™$A c                óB   — t        d„ | j                  «       D «       «      S )Nc              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­wrN   rO   )rx   rº   s     r9   r{   z$Match.output_node.<locals>.<genexpr>  s   è ø€ Ò8˜!²a”AÑ8ùs   ‚Š)Únextr»   ri   s    r9   Úoutput_nodezMatch.output_node  s   € ÜÑ8˜t×0Ñ0Ó2Ô8Ó8Ð8r;   c                óZ   — t         j                  | | j                  j                  ||«      S rN   )ÚReplacementPatternEntryÚreplace_with_graphrš   r¡   )rQ   r›   rR   s      r9   rÂ   zMatch.replace_with_graph  s)   € ô '×9Ñ9Ø�$—(‘(—.‘.Ð"3°Tó
ð 	
r;   c                ó6  ‡‡— ddl m}m} t        |j                  |«      r|j                  €|j                  nt        j                  «       }dd„}|5  |€t        j                  t        |¬«      } || j                  «      �rzi Š| j                  d   j                  d   \  }	}
i |
¥}
t        | j                  «      | j                  }}dˆfd„}t        j                   j"                  j%                  |||f|	|
f«       t        j&                  j)                  |ˆfd„«      } |||«      }t        j&                  j)                  |d	„ «      } |||«      }t+        |j,                  j                  «      t+        |j,                  j                  «      k(  sJ ‚t/        |j,                  j                  |j,                  j                  «      D ]0  \  }}d|j                  v sŒ|j                  d   |j                  d<   Œ2 n„t        j&                  j)                  |d
„ «      }t        j0                  j                   j3                  |«      Š‰�/ˆfd„}t        j&                  j4                  j7                  ||«      } |||«      }t+        | j                  «      dk(  r@|j,                  j                  D ]'  }t9        |j                  | j                  d   d¬«       Œ) t:        j=                  | | j>                  j,                  ||«      cddd«       S # 1 sw Y   yxY w)a	  Replace with a graph generated by tracing the replacement_fn.

        Args:
            run_functional_passes (bool). If we should run passes that
                assume functional IR (like DCE, remove_noop_ops), on the
                replacement graph.

        r   )ÚNullHandlerÚVNc                ó  — t        | «      dk7  ry| d   }d|j                  vry|j                  t        t        j
                  j                  j                  t        j
                  j                  j                  g«      v S )Nr*   Fr   Úeager_input_vals)	Úlenr‰   Útargetr    rs   ÚopsÚhigher_orderÚauto_functionalizedÚauto_functionalized_v2)r—   Únodes     r9   Ú!should_propagate_eager_input_valszCMatch.replace_by_example.<locals>.should_propagate_eager_input_vals&  sk   € Ü�5‹z˜QŠØØ˜‘8ˆDØ!¨¯©Ñ2ØØ—;‘;¤*ä—I‘I×*Ñ*×>Ñ>Ü—I‘I×*Ñ*×AÑAðó#ð ð r;   )Úrun_functional_passesrÇ   c                óZ   •— t        | t        j                  j                  «      r|‰| <   y y rN   )rD   rs   rt   ÚNode)rÎ   r€   Únode_to_vals     €r9   Úrecordz(Match.replace_by_example.<locals>.recordH  s$   ø€ Ü! $¬¯©¯©Ô6Ø,/˜ DÒ)ð 7r;   c                ó   •— ‰|    S rN   rO   )ÚargrÓ   s    €r9   ú<lambda>z*Match.replace_by_example.<locals>.<lambda>P  s   ø€ À+ÈcÑBR€ r;   c                ó    — | j                   d   S )Nr€   ©r‰   ©rÖ   s    r9   r×   z*Match.replace_by_example.<locals>.<lambda>V  s   € À#Ç(Á(È5Á/€ r;   c                óZ   — d| j                   v r| j                   d   S | j                   d   S ©Nr€   Úexample_valuerÙ   rÚ   s    r9   r×   z*Match.replace_by_example.<locals>.<lambda>k  s.   € Ø §¡Ñ(ð !$§¡¨¡€ àŸ™ /Ñ2ð r;   c                óN   •— t        | t        «      r‰�‰j                  | «      S | S rN   )rD   r'   Úfrom_tensor)ÚitÚ	fake_modes    €r9   Ú_convert_to_fake_modez7Match.replace_by_example.<locals>._convert_to_fake_moder  s(   ø€ Ü% b¬*Ô5¸)Ð:OØ#,×#8Ñ#8¸Ó#<Ð<Ø!˜	r;   r*   Úreplace_by_example©r‹   rŒ   r�   )r—   r–   r=   rE   )rÎ   útorch.fx.Noder€   r   r=   rl   ) Útorch._inductor.virtualizedrÄ   rÅ   rD   rá   Ú
contextlibÚnullcontextÚ	functoolsÚpartialÚfwd_onlyr—   r‰   r©   rR   rS   rs   ÚutilsÚ_pytreeÚtree_maprt   Úmap_argrÈ   r¡   ÚzipÚ_dynamoÚdetect_fake_moderÎ   Úmap_aggregater�   rÁ   rÂ   rš   )rQ   Úreplacement_fnrR   Útrace_fnrÐ   rÄ   rÅ   ÚcontextrÏ   Ú	fake_argsÚfake_kwargsÚ
match_argsÚmatch_kwargsrÔ   Úexample_valsÚgraph_with_eager_valsÚreplacementrŒ   Únew_noderâ   rµ   rá   rÓ   s                        @@r9   rã   zMatch.replace_by_example  sÈ  ù€ ÷ 	?ô ˜qŸ{™{¨KÔ8¸Q¿[¹[Ð=Pð �KŠKä×'Ñ'Ó)ð 	ó	ð ñ T	ØÐÜ$×,Ñ,ÜÐ4Iô�ñ 1°·±Õ<ð !�à)-¯©°A©×);Ñ);Ð<NÑ)OÑ&�	˜;Ø- ˜o�Ü+0°·±Ó+;¸T¿[¹[˜L�
õ0ô —‘×#Ñ#×,Ñ,Ø˜Z¨Ð6¸ÀKÐ8Pôô  %Ÿx™x×/Ñ/°Ó6RÓS�ñ )1°ÀÓ(NÐ%ô  %Ÿx™x×/Ñ/°Ñ6QÓR�á&Ð'<¸lÓK�ô
 Ð0×6Ñ6×<Ñ<Ó=ÄØ×%Ñ%×+Ñ+óBò ð ð ô +.Ø)×/Ñ/×5Ñ5°{×7HÑ7H×7NÑ7Nó+ò Ñ&�H˜hð *¨X¯]©]Ò:Ø<D¿M¹MØ.ñ=˜Ÿ™Ð&8Ò9ñ	ô  %Ÿx™x×/Ñ/Øñ3ó �ô "ŸM™M×/Ñ/×@Ñ@ÀÓN�	ØÐ(ô"ô
 $)§8¡8§=¡=×#>Ñ#>Ø$Ð&;ó$�Lñ ' ~°|ÓD�Ü�4—:‘:‹ !Ò#Ø$×*Ñ*×0Ñ0ò �AÜ"Ø!"§¡Ø!%§¡¨A¡Ø"6öðô +×=Ñ=ØØ—‘—‘ØØó	÷_T	÷ T	ò T	ús   ÁFLÇD&LÌL©NN)
rš   r™   r“   r’   rR   zSequence[Any] | NonerS   zdict[str, Any] | Noner=   rl   )r=   útorch.fx.Graph)r¦   r‘   r=   rl   )r=   r‘   ©r=   rK   rk   )r=   zlist[torch.fx.Node | None])r=   rå   )r›   r   rR   úSequence[Any]r=   r–   ©NT)
rô   r[   rR   r  rõ   zTraceFn | NonerÐ   rE   r=   r–   )rL   rW   rX   Ú__doc__rY   rj   Úpropertyr¡   r¥   rª   r¯   r¶   r»   r¿   rÂ   rã   Ú__classcell__©rŸ   s   @r9   r‘   r‘   ¼   s  ø… ñ	ð ÓØ
ƒOØÓØÓØ4Ó4Ø	ÓØ2Ó2ð &*Ø(,ð&àð&ð ð&ð #ð	&ð
 &ð&ð 
õ&ð& òó ðó+óó
9ó$ó
ó9ð
Ø!/ð
Ø7Dð
à	ó
ð $(Ø&*ðyà!ðyð ðyð !ð	yð
  $ðyð 
÷yr;   r‘   c                  ó4   — e Zd ZU dZded<   dd„Zd	d„Zd
d„Zy)r¤   zƒ
    Represents a unsuccessful match.

    The `FailedMatch` object is returned to represent a failure to match a
    pattern.
    rK   Úformat_stringc                óf   — || _         t        |«      dkD  rt        d|› �«      ‚|| _        || _        y )NéÈ   zUFormat string too long - use lazy construction of strings instead. Format string is
 )r	  rÈ   ÚRuntimeErrorrR   rS   )rQ   r	  rR   rS   s       r9   rj   zFailedMatch.__init__•  sB   € Ø*ˆÔô ˆ}Ó Ò#ÜØhÐivÐhwÐxóð ð ˆŒ	Øˆ�r;   c                ób   —  | j                   j                  | j                  i | j                  ¤ŽS rN   )r	  ÚformatrR   rS   ri   s    r9   Ú__str__zFailedMatch.__str__   s(   € Ø(ˆt×!Ñ!×(Ñ(¨$¯)©)ÐC°t·{±{ÑCÐCr;   c                 ó   — y©NFrO   ri   s    r9   Ú__bool__zFailedMatch.__bool__£  ó   € Ør;   N)r	  rK   rR   r   rS   r   r=   rl   r  ©r=   rE   )rL   rW   rX   r  rY   rj   r  r  rO   r;   r9   r¤   r¤   ‹  s   … ñð Óó	óDôr;   r¤   c                ó   — t        | «      S )z|
    TypeIs cannot act on `self`. Thus this function exists to let mypy
    recognize FailedMatch.__bool__ as a TypeIs.
    )rE   )Úms    r9   Úis_matchr  ª  s   € ô
 �‹7€Nr;   c                  ód   — e Zd ZU dZded<   ded<   ded<   ded	<   	 d	 	 	 	 	 	 	 dd„Zdd„Zdd„Zy
)r™   zC
    Internal state needed while running PatternExpr._match().
    úlist[PatternExpr | None]r¸   z'dict[PatternExpr, torch.fx.Node | None]r¹   r   r¡   zlist[NodeOrConstant]Úexclusive_node_setNc               óV   — || _         |€i n
t        |«      | _        || _        g | _        y rN   )r¸   Údictr¹   r¡   r  )rQ   r¸   r¹   r¡   s       r9   rj   zMatchContext.__init__¼  s.   € ð ˆŒØ%4Ð%<™rÄ$ÀÓBWˆÔØˆŒ
Ø"$ˆÕr;   c                óÞ   — || j                   v r)| j                   |   |k(  rt        | |«      S t        d«      S |j                  || «      }|| j                   vsJ ‚|r|nd| j                   |<   |S )z)wrapper to check reused nodes in patternszrepeated pattern differsN)r¹   r‘   r¤   Ú_match)rQ   r“   rÎ   r  s       r9   ÚmatchzMatchContext.matchÈ  sy   € à�d×*Ñ*Ñ*Ø×#Ñ# GÑ,°Ò4Ü˜T 7Ó+Ð+ä"Ð#=Ó>Ð>Ø�N‰N˜4 Ó&ˆØ˜d×2Ñ2Ñ2Ð2Ð2Ù01©°tˆ×Ñ˜WÑ%Øˆr;   c                óŽ   — | j                   j                  «       D ��ci c]  \  }}|j                  «       r|�||“Œ c}}S c c}}w rN   )r¹   rŠ   Úhas_multiple_users)rQ   r“   rÎ   s      r9   Úfilter_multi_user_patternsz'MatchContext.filter_multi_user_patternsÔ  sL   € ð "&×!5Ñ!5×!;Ñ!;Ó!=÷
á�˜Ø×)Ñ)Ô+°Ð0@ð �T‰Mó
ð 	
ùó 
s   žArN   )r¸   r  r¹   z'dict[PatternExpr, torch.fx.Node] | Noner¡   r   r=   rl   )r“   r’   rÎ   ÚNodeOrConstantr=   ÚMatchResult)r=   z dict[PatternExpr, torch.fx.Node])rL   rW   rX   r  rY   rj   r  r"  rO   r;   r9   r™   r™   ²  s^   … ñð &Ó%Ø<Ó<ØÓØ,Ó,ð
 DHð
%à)ð
%ð Að
%ð
 ð
%ð 
ó
%ó
ô
r;   r™   c                  óV   — e Zd ZdZed	d„«       Zd
d„Zdd„Zdd„Z	 	 	 	 	 	 dd„Z	dd„Z
y)r’   z+
    Base class for types of patterns.
    c                 ó   — y rN   rO   ©rQ   rÎ   rš   s      r9   r  zPatternExpr._matchá  s   € ØMPr;   c                ó„   — 	 t        | g|j                  ¬«      j                  | |«      S # t        $ r}|cY d }~S d }~ww xY w©N©r¡   )r™   r¡   r  r¤   ©rQ   rÎ   Úes      r9   r  zPatternExpr.matchä  s<   € ð	Ü  ¨d¯j©jÔ9×?Ñ?ÀÀdÓKÐKøÜò 	Ø�Hûð	ús   ‚'* ª	?³:´?º?c                 ó   — yr  rO   ri   s    r9   r!  zPatternExpr.has_multiple_usersê  r  r;   c                ó4   — | j                   j                  dz   S )Nz())rŸ   rL   ri   s    r9   r¯   zPatternExpr.__repr__í  s   € Ø�~‰~×&Ñ&¨Ñ-Ð-r;   c              #  óL   K  — | |j                   v r|j                   |    –— y y ­wrN   )r¹   ©rQ   rš   Úsearcheds      r9   Úfind_anchor_nodeszPatternExpr.find_anchor_nodesð  s,   è ø€ ð �3×&Ñ&Ñ&Ø×%Ñ% dÑ+Ó+ð 'ùs   ‚"$c                ó.   — t        || j                  «      S )zÀ
        Compare two `PatternExpr`s and return true if they are the
        same. Note this is NOT matching a pattern - it is comparing the pattern
        structures (for debugging).
        )rD   rŸ   )rQ   r¦   s     r9   Ú
pattern_eqzPatternExpr.pattern_eqö  s   € ô ˜% §¡Ó0Ð0r;   N©rÎ   rå   rš   r™   r=   r$  ©rÎ   rå   r=   r$  r  r  ©rš   r™   r1  úOrderedSet[torch.fx.Node]r=   z+Generator[torch.fx.Node | None, None, None]©r¦   r   r=   rE   )rL   rW   rX   r  r   r  r  r!  r¯   r2  r4  rO   r;   r9   r’   r’   Ü  sH   „ ñð ÚPó ØPóóó.ð,Øð,Ø+Dð,à	4ó,ô1r;   r’   c                  ó   — e Zd ZdZdd„Zy)ÚArgzn
    Capture an arg which will become an input to the handler.  Args are
    passed in depth first order.
    c                ó    — t        || |g¬«      S )N)rR   ©r‘   r'  s      r9   r  z
Arg._match  s   € Ü�S˜$ d VÔ,Ð,r;   N©rÎ   r#  rš   r™   r=   r$  ©rL   rW   rX   r  r  rO   r;   r9   r;  r;  ÿ  s   „ ñô
-r;   r;  c                  ó(   — e Zd ZdZdd„Zdd„Zdd„Zy)	ÚIgnoredz4
    Match an arg, but don't pass it to handler
    c                ó   — t        || «      S rN   r=  r'  s      r9   r  zIgnored._match  s   € Ü�S˜$ÓÐr;   c                 ó   — y)NÚ*rO   ri   s    r9   r¯   zIgnored.__repr__  s   € Ør;   c                 ó   — y)Nz	Ignored()rO   )rQ   Úpps     r9   Úpretty_printzIgnored.pretty_print  s   € Ør;   Nr>  r  ©rF  ÚPatternPrettyPrinterr=   rK   )rL   rW   rX   r  r  r¯   rG  rO   r;   r9   rA  rA  	  s   „ ñó óôr;   rA  c                  ó@   ‡ — e Zd ZdZdˆ fd„Zdd„Zdd„Zd	ˆ fd„Zˆ xZS )
Ú
KeywordArgúD
    Capture a kwarg which will become an input to the handler.
    c                ó0   •— t         ‰| �  «        || _        y rN   ©r�   rj   Úname©rQ   rO  rŸ   s     €r9   rj   zKeywordArg.__init__  ó   ø€ Ü‰ÑÔØˆ�	r;   c                ó"   — d| j                   ›d�S )NzKeywordArg(r­   ©rO  ri   s    r9   r¯   zKeywordArg.__repr__!  s   € Ø˜TŸY™Y˜M¨Ð+Ð+r;   c                ó6   — t        || | j                  |i¬«      S )N©rS   )r‘   rO  r'  s      r9   r  zKeywordArg._match$  s   € Ü�S˜$¨¯	©	°4Ð'8Ô9Ð9r;   c                óŒ   •— t        j                  t        |«      }t        ‰| �  |«      xr | j
                  |j
                  k(  S rN   ©ÚtypingÚcastr   r�   r4  rO  ©rQ   r¦   rŸ   s     €r9   r4  zKeywordArg.pattern_eq'  ó5   ø€ Ü—‘œD %Ó(ˆÜ‰wÑ! %Ó(ÒD¨T¯Y©Y¸%¿*¹*Ñ-DÐDr;   ©rO  rK   r=   rl   r  r>  r9  ©	rL   rW   rX   r  rj   r¯   r  r4  r  r  s   @r9   rK  rK    s#   ø„ ñõó,ó:÷Eñ Er;   rK  c                  óL   ‡ — e Zd ZU dZded<   dˆ fd„Zd	d„Zd
d„Zdˆ fd„Zˆ xZ	S )ÚExclusiveKeywordArgrL  rK   rO  c                ó0   •— t         ‰| �  «        || _        y rN   rN  rP  s     €r9   rj   zExclusiveKeywordArg.__init__3  rQ  r;   c                ó"   — d| j                   ›d�S )NzExclusiveKeywordArg(r­   rS  ri   s    r9   r¯   zExclusiveKeywordArg.__repr__7  s   € Ø% d§i¡i ]°!Ð4Ð4r;   c                óž   — ||j                   v rt        d«      S |j                   j                  |«       t        || | j                  |i¬«      S )Nzexclusive arg appears twicerU  )r  r¤   r†   r‘   rO  r'  s      r9   r  zExclusiveKeywordArg._match:  sH   € Ø�3×)Ñ)Ñ)ÜÐ<Ó=Ð=à×Ñ×%Ñ% dÔ+Ü�S˜$¨¯	©	°4Ð'8Ô9Ð9r;   c                óŒ   •— t        j                  t        |«      }t        ‰| �  |«      xr | j
                  |j
                  k(  S rN   rW  rZ  s     €r9   r4  zExclusiveKeywordArg.pattern_eqA  r[  r;   r\  r  r>  r9  )
rL   rW   rX   r  rY   rj   r¯   r  r4  r  r  s   @r9   r_  r_  ,  s*   ø… ñð ƒIõó5ó:÷Eñ Er;   r_  c                  ó¬   ‡ — e Zd ZU dZded<   ded<   	 d	 	 	 	 	 dˆ fd„Zeedd„«       «       Zdd„Z	dd	„Z
dd
„Z	 	 	 	 	 	 dd„Zdd„Zdd„Zdˆ fd„Zˆ xZS )Ú_TargetExprz7
    Base class for filtering match by node.target
    zlist[FnsType]ÚfnszOrderedSet[FnsType]Úfns_setc                óF  •— t         ‰| �  «        t        |«      st        |t        «      r|gn
t        |«      }|D ]F  }t        |t        j                  j                  «      sŒ(|j                  |j                  «       «       ŒH || _        t        |«      | _        || _        y rN   )r�   rj   ÚcallablerD   rK   rž   rs   Ú_opsÚOpOverloadPacketr¥   Úop_overloadsrf  r    rg  r³   )rQ   rf  r³   ra   rŸ   s       €r9   rj   z_TargetExpr.__init__N  s}   ø€ ô 	‰ÑÔÜ ”}¬
°3¼Ô(<ˆs‰eÄ$ÀsÃ)ˆØò 	.ˆBÜ˜"œeŸj™j×9Ñ9Õ:Ø—
‘
˜2Ÿ?™?Ó,Õ-ð	.ð ˆŒÜ! #“ˆŒØˆ�
r;   c                 ó   — y rN   rO   ri   s    r9   Úopz_TargetExpr.op[  s   € àr;   c                ó¾  — | j                   d   }t        |t        «      s|j                  }t	        | j                   «      dkD  rd|› d�S | j                   d   t        t        |d «      u rd|› �S | j                   d   t        t        |d «      u rd|› �S t        | j                   d   t        j                  j                  «      rt        | j                   d   «      S |S )Nr   r*   ú[z, ...]útorch.z	operator.)
rf  rD   rK   rL   rÈ   Úgetattrrs   Úoperatorrj  Ú
OpOverload)rQ   Ú
first_reprs     r9   Úfns_reprz_TargetExpr.fns_repr_  sÄ   € Ø—X‘X˜a‘[ˆ
Ü˜*¤cÔ*Ø#×,Ñ,ˆJäˆt�x‰x‹=˜1ÒØ�z�l &Ð)Ð)Ø�X‰X�a‰[œG¤E¨:°tÓ<Ñ<Ø˜J˜<Ð(Ð(Ø�X‰X�a‰[œG¤H¨j¸$Ó?Ñ?Ø˜z˜lÐ+Ð+Ü˜Ÿ™ ™¤U§Z¡Z×%:Ñ%:Ô;Ü�t—x‘x ‘{Ó#Ð#àÐr;   c                óÈ   — | j                   t        u rd}n"| j                   dk7  rd| j                   › d�}nd}| j                  j                  › d| j	                  «       › |› d�S )Nz
, MULTIPLEr*   r¬   r­   Ú ú()r³   rg   rŸ   rL   rv  )rQ   Úcomma_userss     r9   r¯   z_TargetExpr.__repr__o  s^   € Ø�:‰:œÑ!Ø&‰KØ�Z‰Z˜1Š_Ø˜tŸz™z˜l¨!Ð,‰KàˆKØ—.‘.×)Ñ)Ð*¨!¨D¯M©M«OÐ+<¸[¸MÈÐKÐKr;   c                óX   — t        | j                  t        «      xs | j                  dkD  S )Nr*   )rD   r³   re   ri   s    r9   r!  z_TargetExpr.has_multiple_usersx  s    € Ü˜$Ÿ*™*¤hÓ/ÒA°4·:±:À±>ÐAr;   c                ó   — t         ‚rN   ©ÚNotImplementedErrorr0  s      r9   r2  z_TargetExpr.find_anchor_nodes{  s
   € ô "Ð!r;   c                ó²   — t        |t        j                  j                  «      xr2 |j                  | j                  k(  xr t        |«      | j                  v S rN   )rD   rs   rt   rÒ   rn  Úextract_targetrg  )rQ   rÎ   s     r9   Ú
_match_fnsz_TargetExpr._match_fns€  sD   € ä�tœUŸX™XŸ]™]Ó+ò 5Ø—‘˜4Ÿ7™7Ñ"ò5ä˜tÓ$¨¯©Ð4ð	
r;   c                óŽ   — | |j                   v xs6 | j                  t        u xs" t        |j                  «      | j                  k(  S rN   )r¸   r³   rg   rÈ   r'  s      r9   Ú_match_usersz_TargetExpr._match_users‡  s=   € à�C—K‘KÐò -Ø�z‰zœXÐ%ò-ä�4—:‘:‹ $§*¡*Ñ,ð	
r;   c                óø   •— t        j                  t        |«      }t        ‰| �  |«      xrO | j
                  |j
                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rN   )rX  rY  r   r�   r4  rn  rf  r³   rZ  s     €r9   r4  z_TargetExpr.pattern_eqŽ  sf   ø€ Ü—‘œD %Ó(ˆä‰GÑ˜uÓ%ò *Ø—‘˜5Ÿ8™8Ñ#ò*à—‘˜EŸI™IÑ%ò*ð —
‘
˜eŸk™kÑ)ð		
r;   )r*   )rf  zFnsType | Sequence[FnsType]r³   zMultiple | intr=   rl   r  r  r7  ©rÎ   rå   r=   rE   )rÎ   rå   rš   r™   r=   rE   r9  )rL   rW   rX   r  rY   rj   r  r   rn  rv  r¯   r!  r2  r�  rƒ  r4  r  r  s   @r9   re  re  F  s”   ø… ñð 
ÓØ Ó ð IJðØ.ðØ7Eðà	õð ØÚó ó àóó LóBð"Øð"Ø+Dð"à	4ó"ó

ó
÷
ñ 
r;   re  .c                  ó°   ‡ — e Zd ZdZddœ	 	 	 	 	 	 	 	 	 dˆ fd„Ze	 	 	 	 	 	 dd„«       Ze	 	 	 	 	 	 dd„«       Zdd„Zdd„Z	dd	„Z
	 	 	 	 	 	 dd
„Zdˆ fd„Zˆ xZS )Ú_TargetArgsExprzE
    Base class for filtering match by node.{target,args,kwargs}
    r*   )Ú_usersc               ój  •— t         ‰| �  ||«       t        |«      | _        t	        |«      | _        t        d„ t        j                  ||j                  «       «      D «       «      r| j                  | _        n| j                  | _        | j                  | j                  | j
                  «      | _        y )Nc              3  óR   K  — | ]  }t        |t        t        t        f«      –— Œ! y ­wrN   )rD   r  rž   r©   ©rx   Úxs     r9   r{   z+_TargetArgsExpr.__init__.<locals>.<genexpr>ª  s&   è ø€ ò 
àô �qœ4¤¤uÐ-×.ñ
ùs   ‚%')r�   rj   r©   rR   r  rS   ÚanyÚ	itertoolsÚchainÚvaluesÚpytree_flattenÚflattenÚsimple_flattenÚflat_args_kwargs)rQ   rf  rˆ  rR   rS   rŸ   s        €r9   rj   z_TargetArgsExpr.__init__   s‡   ø€ ô 	‰Ñ˜˜fÔ%Ü˜$“KˆŒ	Ü˜6“lˆŒÜñ 
ä—_‘_ T¨6¯=©=«?Ó;ô
ô 
ð  ×.Ñ.ˆD�Là×.Ñ.ˆDŒLØ $§¡¨T¯Y©Y¸¿¹Ó DˆÕr;   c                ón   — g | ¢|j                  «       ¢­}t        | «      g|j                  «       ¢­}||fS rN   )r�  rÈ   r£   )rR   rS   r�  Úspecs       r9   r“  z_TargetArgsExpr.simple_flatten³  s:   € ð +�4Ð*˜&Ÿ-™-›/Ñ*ˆÜ�D“	Ð*˜FŸK™K›MÑ*ˆØ�tˆ|Ðr;   c                óÆ   ‡‡— t         t        t        t        t        t        iŠdˆˆfd„Št        j                  ‰| |fˆfd„¬«      }t        j                  |«      \  }}||fS )Nc                ó†   •— t        | «      }‰j                  |«      }|�!t        j                  ‰ || «      ˆfd„¬«      S | S )Nc                ó   •— t        | «      ‰v S rN   ©Útype©rŒ  Útype_mappings    €r9   r×   zF_TargetArgsExpr.pytree_flatten.<locals>.convert_type.<locals>.<lambda>Ì  s   ø€ ¤d¨1£g°Ð&=€ r;   ©Úis_leaf)r›  rA   Úpytreerî   )rŒ  ÚclsÚ
convert_fnÚconvert_typer�  s      €€r9   r£  z4_TargetArgsExpr.pytree_flatten.<locals>.convert_typeÅ  sG   ø€ Ü�q“'ˆCØ%×)Ñ)¨#Ó.ˆJØÐ%Ü—‘Ø Ù˜q“MÛ=ôð ð
 ˆHr;   c                ó   •— t        | «      ‰v S rN   rš  rœ  s    €r9   r×   z0_TargetArgsExpr.pytree_flatten.<locals>.<lambda>Ó  s   ø€ œd 1›g¨Ð5€ r;   rž  )rŒ  r   r=   r   )r   r©   rž   r   r  r   rî   Útree_flatten)rR   rS   Únormalized_args_treeÚflatr–  r£  r�  s        @@r9   r‘  z_TargetArgsExpr.pytree_flatten»  s_   ù€ ô
 œEÜ”%ÜœDð*
ˆö		ô  &Ÿ™ØØ�6ˆNÛ5ô 
Ðô
 ×(Ñ(Ð)=Ó>‰
ˆˆdØ�TˆzÐr;   c                óÀ  — | j                  «       gt        t        | j                  «      ¢| j                  j                  «       D ��cg c]  \  }}|› d|› �‘Œ c}}¢}| j                  t        u r|j                  d«       n-| j                  dk7  r|j                  d| j                  › �«       | j                  j                  › ddj                  |«      › d�S c c}}w )Nú=ú_users=MULTIPLEr*   ú_users=ry  r¬   r­   )rv  ÚmapÚreprrR   rS   rŠ   r³   rg   r†   rŸ   rL   Újoin)rQ   ry   rz   rR   s       r9   r¯   z_TargetArgsExpr.__repr__Ø  s¾   € à�M‰M‹Oð
ä”�t—y‘yÓ!ð
ð &*§[¡[×%6Ñ%6Ó%8×9™T˜Q ���1�Q�CŠjÓ9ð
ˆð
 �:‰:œÑ!Ø�K‰KÐ)Õ*Ø�Z‰Z˜1Š_Ø�K‰K˜' $§*¡* Ð.Ô/Ø—.‘.×)Ñ)Ð*¨!¨D¯I©I°d«OÐ+<¸AÐ>Ð>ùó :s   ÁCc           
     óÚ  ‡— | j                  «       gˆfd„| j                  D «       ¢| j                  j                  «       D ��cg c]  \  }}|› d‰j	                  |«      › �‘Œ c}}¢}| j
                  t        u r|j                  d«       n-| j
                  dk7  r|j                  d| j
                  › �«       d}| j                  j                  › d|j                  |«      › d�S c c}}w )	Nc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrN   )rG  )rx   rŒ  rF  s     €r9   r{   z/_TargetArgsExpr.pretty_print.<locals>.<genexpr>ç  s   øè ø€ Ò4 Qˆb�o‰o˜a× Ñ4ùs   ƒr©  rª  r*   r«  r¬   ry  r­   )rv  rR   rS   rŠ   rG  r³   rg   r†   rŸ   rL   r®  )rQ   rF  ry   rz   rR   Ú
joiner_strs    `    r9   rG  z_TargetArgsExpr.pretty_printä  sÏ   ø€ à�M‰M‹Oð
ã4¨$¯)©)Ô4ð
ð 7;·k±k×6GÑ6GÓ6I×J©d¨a°���1�R—_‘_ QÓ'Ð(Ò)ÓJð
ˆð
 �:‰:œÑ!Ø�K‰KÐ)Õ*Ø�Z‰Z˜1Š_Ø�K‰K˜' $§*¡* Ð.Ô/àˆ
Ø—.‘.×)Ñ)Ð*¨!¨J¯O©O¸DÓ,AÐ+BÀ!ÐDÐDùó Ks   Á C'c                ót  — | j                  |«      r+t        |j                  «      t        | j                  «      k7  rt        d|| «      S | j	                  ||«      st        d| «      S |j                  }|j
                  }t        |«      t        | j
                  «      k  rËddlm} t        |j                  «      sJ ‚ ||j                  |j                  |j
                  «      }|€t        d|| «      S |\  }}t        |«      t        | j                  «      k(  rDt        |«      t        | j
                  «      k\  r#|D �ci c]  }|| j
                  v sŒ|||   “Œ }}n/t        d|| «      S |D �ci c]  }|| j
                  v sŒ|||   “Œ }}| j                  ||«      \  }}	| j                  \  }
}|	|k7  rt        d|	|«      S t        |«      t        |
«      k(  sJ ‚t        || «      }t        |
|«      D ]‚  \  }}t        |t        «      r3|j!                  ||«      }t#        |«      s|c S |j%                  |«       ŒIt        |t&        j(                  j*                  «      s||k7  sŒst        d|||¬«      c S  |j,                  j/                  |«       |j                  |j0                  | <   |S c c}w c c}w )Nz&function_mismatch: node={}, pattern={}zmultiple_users {}r   )Únormalize_functionzargs_structure {} {}z#constant_args: {} {!r}!={pattern!r})r“   )r�  rÈ   rR   r¤   rƒ  rS   Útorch.fx.operator_schemasr³  ri  rÉ   r’  r”  r‘   rð   rD   r’   r  r  r¥   rs   rt   rÒ   r—   r†   r˜   )rQ   rÎ   rš   Ú_argsÚ_kwargsr³  Únormalized_args_and_kwargsÚiÚ
node_itemsÚ	node_specÚ
self_itemsÚ	self_specr  r“   Ú
child_nodeÚchild_matchs                   r9   r  z_TargetArgsExpr._matchò  sm  € Ø�‰˜tÔ$¬¨D¯I©I«¼#¸d¿i¹i».Ò(HÜÐGÈÈtÓTÐTà× Ñ   sÔ+ÜÐ2°DÓ9Ð9à—	‘	ˆØ—+‘+ˆÜˆw‹<œ#˜dŸk™kÓ*Ò*ÝDä˜DŸK™KÔ(Ð(Ð(Ù);Ø—‘˜TŸY™Y¨¯©ó*Ð&ð *Ð1Ü"Ð#KÈTÐSWÓXÐXà!;‘��wÜ�u“:¤ T§Y¡Y£Ò/´C¸³LÄCÈÏÉÓDTÒ4TØ6=ÖR°ÀÀdÇkÁkÒAQ˜q '¨!¡*™}ÐR�GÑRä&Ø@À$Èóð ð /6ÖJ¨¸¸d¿k¹kÒ9I�q˜' !™*‘}ÐJˆGÐJà $§¡¨U°GÓ <Ñˆ
�IØ $× 5Ñ 5Ñˆ
�IØ˜	Ò!ÜÐ5°yÀ)ÓLÐLÜ�:‹¤# j£/Ò1Ð1Ð1ä�#�tÓˆÜ#& z°:Ó#>ò 	ÑˆG�ZÜ˜'¤;Ô/Ø!Ÿi™i¨°Ó<�Ü Ô,Ø&Ò&Ø—‘˜Õ%Ü˜J¬¯©¯©Ô6¸*ÈÓ:OÜ"Ø9ØØØ#ô	ò ð	ð 	
�‰�‰�tÔØŸ+™+ˆ�	‰	�$‰Øˆùò= Sùò Ks   Å J0ÅJ0Å0J5ÆJ5c              #  óˆ  K  — | |j                   v r|j                   |    –— y| j                  d   D ]Œ  }t        |t        «      sŒ|j	                  ||«      D ]d  }t        |t
        j                  j                  «      sŒ(|j                  D ].  }||vsŒ| j                  |«      sŒ|–— |j                  |«       Œ0 Œf ŒŽ y­w)a  
        This is used when we are matching a pattern with multiple outputs.
        There is a partial match (stored in ctx) and we want to walk
        this pattern to find a connection to an already-matched node.

        Yields candidate nodes that `self._match` might like.
        Nr   )r¹   r”  rD   r’   r2  rs   rt   rÒ   r³   r�  Úadd)rQ   rš   r1  r“   Ú
other_noderÎ   s         r9   r2  z!_TargetArgsExpr.find_anchor_nodes(  s¹   è ø€ ð �3×&Ñ&Ñ&Ø×%Ñ% dÑ+Ò+Øà×,Ñ,¨QÑ/ò 		3ˆGÜ˜'¤;Õ/Ø")×";Ñ";¸CÀÓ"Jò 3�JÜ% j´%·(±(·-±-Ô@Ø Ø *× 0Ñ 0ò 3˜Ø xÒ/Ø#Ÿ™¨tÕ4Ø&*¢
Ø (§¡¨TÕ 2ñ	3ñ3ñ		3ùs   ‚ACÁACÂCÂ&Cc                ó  •— t        j                  t        |«      }t        ‰| �  |«      xrW | j
                  d   |j
                  d   k(  xr6 t        d„ t        | j
                  d   |j
                  d   «      D «       «      S )Nr*   c              3  ón   K  — | ]-  \  }}t        |t        «      r|j                  |«      n||k(  –— Œ/ y ­wrN   ©rD   r’   r4  ©rx   ÚaÚbs      r9   r{   z-_TargetArgsExpr.pattern_eq.<locals>.<genexpr>F  ó6   è ø€ ò á�A�qô $.¨a´Ô#=�—‘˜Q”À1ÈÁ6ÓIñùó   ‚35r   )rX  rY  r   r�   r4  r”  r5   rð   rZ  s     €r9   r4  z_TargetArgsExpr.pattern_eqA  s€   ø€ Ü—‘œD %Ó(ˆä‰GÑ˜uÓ%ò Ø×%Ñ% aÑ(¨E×,BÑ,BÀ1Ñ,EÑEòäñ ä × 5Ñ 5°aÑ 8¸%×:PÑ:PÐQRÑ:SÓTôó ð	
r;   )
rf  z*torch.fx.node.Target | str | Sequence[Any]rR   r   rˆ  zint | MultiplerS   r   r=   rl   )rR   r  rS   zMapping[Any, Any]r=   z3tuple[Sequence[Any], _SimpleSpec | pytree.TreeSpec]r  rH  r5  r7  r9  )rL   rW   rX   r  rj   Ústaticmethodr“  r‘  r¯   rG  r  r2  r4  r  r  s   @r9   r‡  r‡  ›  sØ   ø„ ñð "#ñ	Eà7ðEð ðEð ð	Eð
 ðEð 
õEð& ðØðØ%6ðà	<òó ðð ðØðØ%6ðà	<òó ðó8
?óEó4ðl3Øð3Ø+Dð3à	4ó3÷2	
ñ 	
r;   r‡  c                  ó   — e Zd ZdZdZy)ÚCallFunctionzR
    Matches a call_function node in the FX graphs: `fns[i](*args, **kwargs)`
    Úcall_functionN©rL   rW   rX   r  rn  rO   r;   r9   rÌ  rÌ  M  s   „ ñð 
�Br;   rÌ  c                  ó   — e Zd ZdZdZy)Ú
CallMethodzW
    Matches a call_method node in the FX graphs: `fns[i].method(*args, **kwargs)`
    Úcall_methodNrÎ  rO   r;   r9   rÐ  rÐ  U  ó   „ ñð 
�Br;   rÐ  c                  ó   — e Zd ZdZdZy)Ú
CallModulezP
    Matches a call_module node in the FX graphs: `module(*args, **kwargs)`
    Úcall_moduleNrÎ  rO   r;   r9   rÔ  rÔ  ]  rÒ  r;   rÔ  c                  ó   — e Zd ZdZdd„Zy)Ú_TargetExprVarArgsz[
    Matches a call_function node with any arguments which are passed into the pattern
    c                óŒ  — | j                  |«      st        d«      S | j                  ||«      st        d«      S t        || «      }|j                  j                  |«       |j                  |j                  | <   |j                  j                  |j                  «       |j                  j                  |j                  «       |S )NÚfunction_mismatchÚmultiple_users)r�  r¤   rƒ  r‘   r—   r†   rÉ   r˜   rR   r¥   rS   rˆ   )rQ   rÎ   rš   r  s       r9   r  z_TargetExprVarArgs._matchj  s�   € Ø�‰˜tÔ$ÜÐ2Ó3Ð3à× Ñ   sÔ+ÜÐ/Ó0Ð0ä�#�tÓˆØ	�‰�‰�tÔØŸ+™+ˆ�	‰	�$‰Ø	�‰�‰�d—i‘iÔ Ø	�‰�‰˜Ÿ™Ô$Øˆr;   Nr5  r?  rO   r;   r9   r×  r×  e  s   „ ñôr;   r×  c                  ó   — e Zd ZdZy)ÚCallFunctionVarArgsrÍ  N©rL   rW   rX   rn  rO   r;   r9   rÜ  rÜ  y  s   „ Ø	�Br;   rÜ  c                  ó   — e Zd ZdZy)ÚCallMethodVarArgsrÑ  NrÝ  rO   r;   r9   rß  rß  }  ó   „ Ø	�Br;   rß  c                  ó   — e Zd ZdZy)ÚCallModuleVarArgsrÕ  NrÝ  rO   r;   r9   râ  râ  �  rà  r;   râ  c                  óB   ‡ — e Zd ZdZddˆ fd„Zdd„Zd	d„Zd
ˆ fd„Zˆ xZS )ÚListOfz$
    Matches a repeated pattern
    c                ób   •— t         ‰| �  «        t        |t        «      sJ ‚|| _        || _        y rN   )r�   rj   rD   r’   r“   rê   )rQ   r“   rê   rŸ   s      €r9   rj   zListOf.__init__Š  s,   ø€ Ü‰ÑÔÜ˜'¤;Ô/Ð/Ð/ØˆŒØˆ�r;   c                óN   — | j                   j                  › d| j                  › d�S ©Nry  r­   )rŸ   rL   r“   ri   s    r9   r¯   zListOf.__repr__�  ó$   € Ø—.‘.×)Ñ)Ð*¨!¨D¯L©L¨>¸Ð;Ð;r;   c                ó(  — t        |t        t        f«      rt        |«      dk(  rt	        d«      S t        || «      }|j                  «       }d}t        |«      D ]›  \  }}t        |j                  ||j                  ¬«      }|j                  | j                  |«      }	|j                  «       }t        |	«      s| j                  st	        d||	«      c S Œ{d}|j                  |	j!                  «       «       Œ� |st	        d«      S |j!                  «       S )Nr   Únon_listFr*  zlist[{}]: {}Tzlist: no_match)rD   rž   r©   rÈ   r¤   r‘   r"  Ú	enumerater™   r¸   r¡   r  r“   r  rê   r¥   rª   )
rQ   rÎ   rš   r  r¹   Úmatchedr¸  r½  Ú	child_ctxr¾  s
             r9   r  zListOf._match“  sô   € Ü˜$¤¤u Ô.´#°d³)¸q².Ü˜zÓ*Ð*Ü�#�tÓˆð ×8Ñ8Ó:ˆØˆÜ& t›_ò 	+‰MˆAˆzÜ$Ø—‘˜_°J×4DÑ4DôˆIð $Ÿ/™/¨$¯,©,¸
ÓCˆKØ'×BÑBÓDˆOÜ˜KÔ(Ø—|’|Ü& ~°q¸+ÓFÒFØØˆGØ�H‰H�[×'Ñ'Ó)Õ*ð	+ñ ÜÐ/Ó0Ð0Ø�x‰x‹zÐr;   c                óÚ   •— t        j                  t        |«      }t        ‰| �  |«      xr@ | j
                  j	                  |j
                  «      xr | j                  |j                  k(  S rN   )rX  rY  r   r�   r4  r“   rê   rZ  s     €r9   r4  zListOf.pattern_eq«  sU   ø€ Ü—‘œD %Ó(ˆä‰GÑ˜uÓ%ò .Ø—‘×'Ñ'¨¯©Ó6ò.à—‘ §¡Ñ-ð	
r;   ©F)r“   r’   rê   rE   r=   rl   r  )rÎ   r–   rš   r™   r=   r$  r9  r]  r  s   @r9   rä  rä  …  s!   ø„ ñöó<ó÷0
ñ 
r;   rä  c                  ó~   ‡ — e Zd ZU ded<   dˆ fd„Zedd„«       Zdd„Zdd„Zdd„Z		 	 	 	 	 	 dd„Z
dd	„Zdˆ fd
„Zˆ xZS )ÚMultiOutputPatternr  r¸   c                óÆ   •— t         ‰| �  «        t        |d   t        «      sJ ‚t	        d„ |D «       «      sJ |«       ‚t        |«      | _        |d   j                  | _        y )Nr   c              3  óH   K  — | ]  }|d u xs t        |t        «      –— Œ y ­wrN   )rD   r’   r‹  s     r9   r{   z.MultiOutputPattern.__init__.<locals>.<genexpr>º  s#   è ø€ ÒL¸q�1˜�9Ò:¤
¨1¬kÓ :Ó:ÑLùs   ‚ ")r�   rj   rD   re  r5   rž   r¸   rn  )rQ   r¸   rŸ   s     €r9   rj   zMultiOutputPattern.__init__·  sU   ø€ Ü‰ÑÔÜ˜' !™*¤kÔ2Ð2Ð2ÜÑLÀGÔLÔLÐUÈgÓUÐLÜ˜G“}ˆŒØ˜!‘*—-‘-ˆ�r;   c                óh   — t        j                  t        | j                  d   «      }|j                  S ©Nr   )rX  rY  re  r¸   rf  )rQ   Úoutputs     r9   rf  zMultiOutputPattern.fns¾  s&   € ô —‘œ[¨$¯,©,°q©/Ó:ˆØ�z‰zÐr;   c                óN   — | j                   j                  › d| j                  › d�S rç  )rŸ   rL   r¸   ri   s    r9   r¯   zMultiOutputPattern.__repr__Ä  rè  r;   c                óÈ   — | j                   D �cg c]  }|j                  |«      ‘Œ }}dd› �}| j                  j                  › d|j	                  |«      › �}|› d�}|S c c}w )Nz,
z  z([z
]))r¸   rG  rŸ   rL   r®  )rQ   rF  rŒ  rR   r±  Ústr_outs         r9   rG  zMultiOutputPattern.pretty_printÇ  sh   € Ø,0¯L©LÖ9 q�—‘ Õ"Ð9ˆÐ9Ø˜4˜&�\ˆ
Ø—^‘^×,Ñ,Ð-¨R°
·±ÀÓ0EÐ/FÐGˆØ�I˜TÐ"ˆØˆùò	 :s   �Ac                ó$  — t        j                  t        | j                  d   «      }|j	                  ||«      }t        |«      s|S | j                  dd  D ]7  }|€Œ| j                  ||«      }t        |«      s|c S |j                  |«       Œ9 |S ©Nr   r*   )rX  rY  re  r¸   r  r  Ú_match_from_anchorsr¥   )rQ   rÎ   rš   rö  r  r“   r¾  s          r9   r  zMultiOutputPattern._matchÎ  s‹   € Ü—‘œ[¨$¯,©,°q©/Ó:ˆØ�I‰I�f˜dÓ#ˆÜ˜Œ{ØˆHà—|‘| A BÐ'ò 	"ˆGØˆØØ×2Ñ2°7¸CÓ@ˆKÜ˜KÔ(Ø"Ò"Ø�H‰H�[Õ!ð	"ð ˆr;   c                óæ   — t        |j                  «      }t        d«      }|j                  |t	        «       «      D ]3  }|j                  ||«      }t        |«      r|c S t        |«      |_        Œ5 |S )Nzno anchor found)r  r¹   r¤   r2  r    r  r  )rQ   r“   rš   Úpriorr  rÎ   s         r9   rü  z&MultiOutputPattern._match_from_anchorsÞ  sl   € ô �S×(Ñ(Ó)ˆÜ$Ð%6Ó7ˆØ×-Ñ-¨c´:³<Ó@ò 	.ˆDØ—	‘	˜' 4Ó(ˆAÜ˜Œ{Ø’ä"& u£+ˆCÕð	.ð ˆr;   c                ó–   — 	 t        | j                  |j                  ¬«      j                  | |«      S # t        $ r}|cY d }~S d }~ww xY wr)  )r™   r¸   r¡   r  r¤   r+  s      r9   r  zMultiOutputPattern.matchë  s>   € ð	Ü §¡°D·J±JÔ?×EÑEÀdÈDÓQÐQøÜò 	Ø�Hûð	ús   ‚03 ³	A¼A½AÁAc                ó  •— t        j                  t        |«      }t        ‰| �  |«      xr] t        | j                  «      t        |j                  «      k(  xr0 t        d„ t        | j                  |j                  «      D «       «      S )Nc              3  ón   K  — | ]-  \  }}t        |t        «      r|j                  |«      n||k(  –— Œ/ y ­wrN   rÄ  rÅ  s      r9   r{   z0MultiOutputPattern.pattern_eq.<locals>.<genexpr>ö  rÈ  rÉ  )	rX  rY  r   r�   r4  rÈ   r¸   r5   rð   rZ  s     €r9   r4  zMultiOutputPattern.pattern_eqñ  sm   ø€ Ü—‘œD %Ó(ˆä‰GÑ˜uÓ%ò Ü�D—L‘LÓ!¤S¨¯©Ó%7Ñ7òäñ ä §¡¨e¯m©mÓ<ôó ð	
r;   )r¸   zSequence[PatternExpr | None]r=   rl   )r=   z(Callable[..., Any] | str | Sequence[Any]r  rH  r5  )r“   r’   rš   r™   r=   r$  r6  r9  )rL   rW   rX   rY   rj   r  rf  r¯   rG  r  rü  r  r4  r  r  s   @r9   rñ  rñ  ´  s]   ø… Ø%Ó%õ ð òó ðó
<óóð Ø"ðØ)5ðà	óó÷	
ñ 	
r;   rñ  c                  óJ   ‡ — e Zd ZdZdˆ fd„Zedd„«       Zdd„Zd	ˆ fd„Zˆ xZ	S )
ÚRepeatedExprzp
    Checks for a repeated pattern. Useful for repeated operations after a node such as `split` or `unbind`
    c                óR   •— t         ‰| �  «        || _        |j                  | _        y rN   )r�   rj   Úinner_patternrn  )rQ   r  rŸ   s     €r9   rj   zRepeatedExpr.__init__  s#   ø€ Ü‰ÑÔØ*ˆÔØ×"Ñ"ˆ�r;   c                ó.   — | j                   j                  S rN   )r  rf  ri   s    r9   rf  zRepeatedExpr.fns  s   € à×!Ñ!×%Ñ%Ð%r;   c                óœ  — |j                  | j                  |«      }t        |«      s|S |j                  j	                  | j                  «       | j                  j                  |t        |g«      «      D ]T  }t        | g|j                  ¬«      j                  | j                  |«      }t        |«      s|c S |j                  |«       ŒV |S r)  )
r  r  r  r¹   Úpopr2  r    r™   r¡   r¥   )rQ   rÎ   rš   r  Úanchor_nodeÚanchor_ms         r9   r  zRepeatedExpr._match  s»   € Ø�I‰I�d×(Ñ(¨$Ó/ˆÜ˜Œ{ØˆHØ×Ñ×ÑØ×Ñô	
ð  ×-Ñ-×?Ñ?Ø”˜T˜FÓ#ó
ò 	ˆKô $ T F°$·*±*Ô=×CÑCØ×"Ñ" KóˆHô ˜HÔ%Ø’Ø�H‰H�XÕð	ð ˆr;   c                ó¤   •— t        j                  t        |«      }t        ‰| �  |«      xr% | j
                  j	                  |j
                  «      S rN   )rX  rY  r   r�   r4  r  rZ  s     €r9   r4  zRepeatedExpr.pattern_eq  sF   ø€ Ü—‘œD %Ó(ˆÜ‰wÑ! %Ó(ò 
¨T×-?Ñ-?×-JÑ-JØ×Ñó.
ð 	
r;   )r  re  r=   rl   )r=   zSequence[FnsType]r5  r9  )
rL   rW   rX   r  rj   r  rf  r  r4  r  r  s   @r9   r  r  ý  s0   ø„ ñõ#ð
 ò&ó ð&ó÷&
ñ 
r;   r  c                  óZ   — e Zd ZdZdd„Zeej                  dd	d„«       «       Zd
d„Z	dd„Z
y)rI  z˜
    Serializes Patterns to executable python.
    XXX: currently only used and tested for fuse attention patterns. May not cover
    all patterns.
    c                óz   — t         j                  j                  j                  «       | _        i | _        i | _        y rN   )rs   rt   r¡   Ú
_NamespaceÚ	namespaceÚmemoized_objs_namesÚmemoized_objs_ppri   s    r9   rj   zPatternPrettyPrinter.__init__,  s*   € ÜŸ™Ÿ™×2Ñ2Ó4ˆŒØ;=ˆÔ Ø8:ˆÕr;   c                ó  — t        «       }t        | d«      sJ ‚| j                  |¬«      }|j                  D �cg c]#  }|j                  |   › d|j                  |   › �‘Œ% }}|j                  |› d|› �«       dj                  |«      S c c}w )zU
        Serializes obj to python code with obj written out to `output_name`
        rG  )rF  z = ú
)rI  ÚhasattrrG  r  r  r†   r®  )ÚobjÚoutput_namerF  Úout_strr§   rö  s         r9   ÚrunzPatternPrettyPrinter.run1  s¤   € ô "Ó#ˆÜ�s˜NÔ+Ð+Ð+Ø×"Ñ" bÐ"Ó)ˆð ×-Ñ-ö
àð ×%Ñ% cÑ*Ð+¨3¨r×/BÑ/BÀ3Ñ/GÐ.HÒIð
ˆð 
ð
 	�‰˜˜ S¨¨	Ð2Ô3à�y‰y˜Ó Ð ùò
s   ¹(B
c                óÒ   — t        |t        «      r0| j                  j                  |«      x}r|S | j	                  |«      S t        |d«      r|j                  | «      S t        |«      S )NrG  )rD   r‡  r  rA   Úmemoizer  rG  r­  )rQ   r  Úmemoized_names      r9   rG  z!PatternPrettyPrinter.pretty_printE  sb   € Ü�cœ?Ô+Ø $× 8Ñ 8× <Ñ <¸SÓ AÐAˆ}ÐAØ$Ð$à—|‘| CÓ(Ð(Ü�3˜Ô'Ø×#Ñ# DÓ)Ð)ä�C‹yÐr;   c                óî   — |j                  | «      }|j                  «       }dD ]  }|j                  |d«      }Œ | j                  j	                  |d «      }|| j
                  |<   || j                  |<   |S )N)zaten.rq  zprims.rx  )rG  rv  Úreplacer  Úcreate_namer  r  )rQ   r  Úobj_strÚobj_nameÚprefixÚtmp_names         r9   r  zPatternPrettyPrinter.memoizeP  s{   € Ø×"Ñ" 4Ó(ˆØ—<‘<“>ˆØ3ò 	4ˆFØ×'Ñ'¨°Ó3‰Hð	4ð —>‘>×-Ñ-¨h¸Ó=ˆØ(0ˆ× Ñ  Ñ%Ø%,ˆ×Ñ˜cÑ"Øˆr;   Nrk   )rö  )r  r’   r  rK   r=   rK   )r  r   r=   rK   )r  r‡  r=   rK   )rL   rW   rX   r  rj   rÊ  ré   Úcacher  rG  r  rO   r;   r9   rI  rI  %  s6   „ ñó;ð
 Ø‡_�_ó!ó ó ð!ó$	ô	r;   rI  c                  ó   — e Zd Z	 	 	 	 dd„Zy)Ú_PassDictsTypec                 ó   — y rN   rO   )rQ   ry   s     r9   Ú__getitem__z_PassDictsType.__getitem__]  s   € à r;   N)ry   ú tuple[str, torch.fx.node.Target]r=   úlist[PatternEntry])rL   rW   rX   r'  rO   r;   r9   r%  r%  \  s   „ ð!Ø1ð!à	ô!r;   r%  c                  óF   — e Zd ZU ded<   ded<   dd„Z	 	 d		 	 	 	 	 	 	 d
d„Zy)ÚPatternEntryr’   r“   úCallable[[Match], bool]Úextra_checkc                ó   — t         ‚rN   r}  ©rQ   r  r¡   rÎ   s       r9   ÚapplyzPatternEntry.applyg  s   € Ü!Ð!r;   Nc                ó  — |€Ht        | j                  d«      sJ ‚| j                  j                  D ]  }| j                  |||¬«       Œ y t	        |t
        t        f«      rqt        | j                  d«      sJ ‚|r,|| j                  j                  |f   j                  d| «       y || j                  j                  |f   j                  | «       y t        j                  t        t           |«      }|D ]  }| j                  |||¬«       Œ y )Nrf  ©Úprependrn  r   )r  r“   rf  ÚregisterrD   r  ÚPatternMatcherPassrn  Úinsertr†   rX  rY  r   r%  )rQ   Ú
pass_dictsrÉ   r3  ra   rŒ  s         r9   r4  zPatternEntry.registerj  sç   € ð ˆ>Ü˜4Ÿ<™<¨Ô/Ð/Ð/Ø—l‘l×&Ñ&ò ?�Ø—‘˜j¨"°g�Õ>ñ?ä˜
¤TÔ+=Ð$>Ô?Ü˜4Ÿ<™<¨Ô.Ð.Ð.ÙØ˜DŸL™LŸO™O¨VÐ4Ñ5×<Ñ<¸QÀÕEà˜DŸL™LŸO™O¨VÐ4Ñ5×<Ñ<¸TÕBäŸ™¤X¬nÑ%=¸zÓJˆJØò :�Ø—‘˜a °�Õ9ñ:r;   ©r  r‘   r¡   r   rÎ   rå   r=   rl   r  )r7  ú)_PassDictsType | Sequence[_PassDictsType]rÉ   ztorch.fx.node.Target | Noner3  rE   r=   rl   )rL   rW   rX   rY   r0  r4  rO   r;   r9   r+  r+  b  sF   … àÓØ(Ó(ó"ð /3Øð	:à=ð:ð ,ð:ð ð	:ð
 
ô:r;   r+  c                  ó    — e Zd ZU ded<   dd„Zy)ÚLoweringPatternEntryúCallable[..., Any]Úhandlerc                óÊ  —  t        j                  | j                  «      t        j                  | j                  |«      «      }|j	                  |«      5  |j                  |t        |j                  «      |j                  «      }t        |j                  |«       |j                  |«       d d d «       |j                  d   |u sJ ‚|j                  «        y # 1 sw Y   Œ-xY w)Néÿÿÿÿ)ré   Úwrapsr=  rê   Úinserting_beforerÍ  r©   rR   rS   r�   r‰   Úreplace_all_uses_withr—   r¶   )rQ   r  r¡   rÎ   r=  rý   s         r9   r0  zLoweringPatternEntry.apply„  s³   € Ø/”)—/‘/ $§,¡,Ó/´	×0AÑ0AÀ$Ç,Á,ÐPUÓ0VÓWˆØ×#Ñ# DÓ)ñ 	4Ø×-Ñ-¨g´u¸U¿Z¹ZÓ7HÈ%Ï,É,ÓWˆKÜ˜;×+Ñ+¨TÔ2Ø×&Ñ& {Ô3÷	4ð �{‰{˜2‰ $Ñ&Ð&Ð&Ø×ÑÕ÷	4ð 	4ús   ÁACÃC"Nr8  )rL   rW   rX   rY   r0  rO   r;   r9   r;  r;  €  s   … àÓôr;   r;  c                  ó$   — e Zd ZU dZded<   dd„Zy)ÚGraphPatternEntryz8
    A pattern that runs a function on the FX graph
    r<  r=  c                ó¤   — |j                  |«      5   | j                  |g|j                  ¢­i |j                  ¤Ž d d d «       y # 1 sw Y   y xY wrN   )rA  r=  rR   rS   r/  s       r9   r0  zGraphPatternEntry.apply–  sE   € Ø×#Ñ# DÓ)ñ 	=ØˆD�L‰L˜Ð< §¡Ò<¨u¯|©|Ò<÷	=÷ 	=ñ 	=ús   ’+AÁANr8  )rL   rW   rX   r  rY   r0  rO   r;   r9   rD  rD  Ž  s   … ñð  Óô=r;   rD  c                  ó^   — e Zd ZU dZded<   dZded<   e	 d		 	 	 	 	 	 	 	 	 	 	 d
d„«       Zdd„Zy)rÁ   z/
    The replacement pattern for the graph
    zCallable[..., list[Any]]Únormalize_argsNr0   Úpattern_namec           	     ó  ‡‡‡‡‡‡‡— g Š G ˆˆˆfd„dt         j                  j                  «      }| j                  «       }t	        |«      dk(  r|d   }n�|d   sJ ‚t        |d   j                  j                  «      }|D �	cg c]9  }	t        |	t         j                  j                  «      r|j                  |	«      |	f‘Œ; }
}	t        |
t        j                  d«      ¬«      d   }	 	 	 	 	 	 	 	 	 	 d
d„Š‰j                  |«      5  t        |t         j                  j                  «      sJ ‚  ||«      j                   ‰Ž }t        |t         j                  j                  «      r|g}dd„Š	 	 	 	 	 	 dˆˆˆˆˆˆˆfd„Št	        |«      t	        |«      k(  rt#        ||«      D ]  \  }} ‰||«       Œ nt	        |«      dk(  sJ ‚ ‰|d   |«       d	d	d	«       | j%                  «        t'        ‰«      D ]`  }|j(                  rŒ|j+                  «       rŒ!t        |j,                  t         j.                  j0                  «      rŒP‰j3                  |«       Œb ‰D �cg c]  }|j4                  rŒ|‘Œ c}S c c}	w # 1 sw Y   Œ©xY wc c}w )zT
        Inserts the replacement graph into the toplevel graph at the match
        c                  ó4   •‡ — e Zd ZdZdZdZdˆ ˆˆˆfd„Zˆ xZS )ú<ReplacementPatternEntry.replace_with_graph.<locals>.ReplacerNc                óª  •— |j                   dv rt        ‰| �	  |«      S |j                  }| j	                  |«      \  }}|j                   dk(  ryt        |«      sJ ‚‰j                  |||«      }‰j                  |«       t        |j                  |‰xs d¬«       d|j                  v r|j                  d   |j                  d<   |S |j                   dk(  rñddl
m} t        ‰| �1  |||«      }t        |t        j                  j                   «      st#        d	|› d
|› d�«      ‚‰j$                  €J ‚d }‰j$                  j'                  «       D ]  \  }	}
||
u sŒ|	} n |€Dt        |t(        «      sJ ‚ |‰j$                  |«      \  }}‰j$                  j+                  ||«       ‰j                  |«      }‰j                  |«       |S t#        d|› �«      ‚)N)Úplaceholderrö  rÍ  rx  rä   rÇ   Úget_attrr   )Úunique_graph_name_with_rootzNYI: replacement_graph.z is not a graph module. Got ú.z
unhandled )rn  r�   Úrun_noderÉ   Úfetch_args_kwargs_from_envri  rÍ  r†   r�   r‰   Útorch._higher_order_ops.utilsrO  rN  rD   rs   rt   ÚGraphModuler~  Úowning_moduleÚnamed_modulesrK   Úregister_module)rQ   rÎ   rÉ   rR   rS   ÚresultrO  Úsub_gmÚ
graph_namerµ   ÚmodÚ_Úgetattr_noderŸ   Úadded_replacement_nodesr¡   r�   s                €€€€r9   rQ  zEReplacementPatternEntry.replace_with_graph.<locals>.Replacer.run_node·  sã  ø€ Ø—7‘7Ð7Ñ7Ü ™7Ñ+¨DÓ1Ð1ØŸ™�Ø#×>Ñ>¸tÓD‘��fØ—7‘7˜oÒ-Ü# FÔ+Ð+Ð+Ø"×0Ñ0°¸¸vÓF�FØ+×2Ñ2°6Ô:Ü"Ø!'§¡Ø!%Ø"+¢/¨rõð *¨T¯Y©YÑ6Ø:>¿)¹)ÐDVÑ:W˜Ÿ™Ð$6Ñ7Ø!�MØ—7‘7˜jÒ(õô #™WÑ-¨f°d¸FÓC�FÜ% f¬e¯h©h×.BÑ.BÔCÜ1Ø5°f°XÐ=YÐZ`ÐYaÐabÐcóð ð !×.Ñ.Ð:Ð:Ð:Ø!%�JØ"'×"5Ñ"5×"CÑ"CÓ"Eò "™˜˜3Ø! Sš=Ø)*˜JÙ!ð"ð "Ð)Ü)¨&´#Ô6Ð6Ð6Ù(Cà!×/Ñ/Ø"ó)™˜˜:ð ×+Ñ+×;Ñ;¸JÈÔOà#(§>¡>°*Ó#=�LØ+×2Ñ2°<Ô@Ø'Ð'ä)¨J°t°fÐ*=Ó>Ð>r;   ©rÎ   rå   r=   r   )rL   rW   rX   rÑ  rÕ  rN  rQ  r  )rŸ   r^  r¡   r�   s   @€€€r9   ÚReplacerrK  ²  s   ù„ ØˆKØˆKØˆH÷5?ô 5?r;   r`  r*   r   )r§   c                ó  — | g}t        t        j                  j                     «       }|rc|j	                  «       }||vrK||vrGt        |d«      r;|j                  |«       ||j                  |<   |j                  |j                  «       |rŒby y )Nr‰   )
r    rs   rt   rÒ   r  r  rÀ  r‰   r¥   Úall_input_nodes)rÎ   Útag_nameÚ	tag_valueÚinput_stopsÚqueueÚvisitedrÖ   s          r9   Úpercolate_tagszBReplacementPatternEntry.replace_with_graph.<locals>.percolate_tagsü  sy   € ð �FˆEÜ ¤§¡§¡Ñ/Ó1ˆGáØ—i‘i“k�à˜wÑ&Ø ;Ñ.Ü  VÔ,à—K‘K Ô$Ø)2�C—H‘H˜XÑ&Ø—L‘L ×!4Ñ!4Ô5ô r;   c                ó°   — | j                   dk7  ry | j                  t        j                  k7  ry t	        | j
                  «      dk(  sJ ‚| j
                  d   S )NrÍ  r!   r*   )rn  rÉ   rs  ÚgetitemrÈ   rR   ©rÎ   s    r9   Úmaybe_getitemzAReplacementPatternEntry.replace_with_graph.<locals>.maybe_getitem  sJ   € Ø—7‘7˜oÒ-ØØ—;‘;¤(×"2Ñ"2Ò2ØÜ˜4Ÿ9™9“~¨Ò*Ð*Ð*Ø—y‘y ‘|Ð#r;   c           	     óH  •— dˆ	fd„}| €|�J ‚y t        | t        j                  j                  «      sJ ‚|€=| j	                  d |¬«       t        | j                  «      dk(  r‰j                  | «       y t        |t        j                  j                  «      r¨t        |j                  | ‰xs d¬«       t        j                  ‰
«      \  }}dD ]2  }|| j                  v sŒ ‰||| j                  |   t        |«      «       Œ4 | j	                  ||¬«       t        | j                  «      dk(  r‰j                  | «       y t        | j                  j                  «       «      }|D ]*  } ‰|«      }|€| j	                  |«       Œ ‰|||   «       Œ, ‰j                  | «       y )Nc                ó   •— | ‰vS rN   rO   )rÎ   r^  s    €r9   Ú!filter_nodes_in_newly_added_nodeszfReplacementPatternEntry.replace_with_graph.<locals>.replace.<locals>.filter_nodes_in_newly_added_nodes"  s   ø€ ð  Ð'>Ð>Ð>r;   )Údelete_user_cbr   rx  ©r�   )Ú	recomputeÚac_graph_idr…  )rD   rs   rt   rÒ   rB  rÈ   r³   r´   r�   r‰   r   r¥  r    rž   r£   )ÚoldÚnewro  Úargs_setr\  rc  Úold_usesÚuserÚidxr^  rR   r¡   rl  r�   rh  r  s            €€€€€€€r9   r  z;ReplacementPatternEntry.replace_with_graph.<locals>.replace  s�  ø€ õ?ð
 �;Ø˜;Ð&˜;ØÜ! #¤u§x¡x§}¡}Ô5Ð5Ð5Ø�;Ø×-Ñ-ØØ'Hð .ô ô ˜3Ÿ9™9“~¨Ò*Ø×(Ñ(¨Ô-ØÜ˜c¤5§8¡8§=¡=Ô1Ü" 3§8¡8¨S¸IºOÈÕLô
 #)×"5Ñ"5°dÓ";‘K�H˜að %Aò ˜Ø# s§x¡xÒ/Ù*Ø # X¨s¯x©x¸Ñ/AÄ:ÈhÓCWõðð ×-Ñ-ØÐ,Mð .ô ô ˜3Ÿ9™9“~¨Ò*Ø×(Ñ(¨Ô-Øô:   §	¡	§¡Ó 0Ó1�Ø$ò 0�DÙ'¨Ó-�CØ�{ð ×1Ñ1°#Õ6á  c¨#¡hÕ/ð0ð × Ñ  Õ%r;   N)
rÎ   rå   rc  rK   rd  rK   re  r8  r=   rl   r_  )rt  ztorch.fx.Node | Noneru  z.torch.fx.Node | Sequence[torch.fx.Node] | Noner=   rl   )rs   rt   ÚInterpreterr»   rÈ   rž   r¡   r—   rD   rÒ   ÚindexÚminrs  Ú
itemgetterrA  rT  r  rð   r¶   r±   r³   Ú	is_impurerÉ   rj  ÚHigherOrderOperatorr´   r²   )r  r¡   r›   rR   r�   r`  r»   Ú	last_noder—   rµ   Úindicesrý   rt  ru  rÎ   r^  rl  rh  r  s    ` ``          @@@@r9   rÂ   z*ReplacementPatternEntry.replace_with_graph¤  s„  þ€ ð 8:Ð÷:	?ð :	?”u—x‘x×+Ñ+ô :	?ðx ×)Ñ)Ó+ˆäˆ|Ó Ò!Ø$ Q™‰Ià ’?Ð"�?Ü˜ a™×.Ñ.×4Ñ4Ó5ˆEð &öàÜ˜a¤§¡§¡Ô/ð —‘˜Q“ Ò#ðˆGð ô
 ˜G¬×)<Ñ)<¸QÓ)?Ô@ÀÑCˆIð	6Øð	6àð	6ð ð	6ð 3ð		6ð
 ó	6ð( ×#Ñ# IÓ.ñ g	6ÜÐ/´·±×1EÑ1EÔFÐFÐFØ9™(Ð#4Ó5×9Ñ9¸4Ð@ˆKÜ˜+¤u§x¡x§}¡}Ô5Ø*˜m�ó$ðR&Ø)ðR&àCðR&ð ÷R&ó R&ôh �<Ó ¤C¨Ó$4Ò4Ü # L°+Ó >ò &‘H�C˜Ù˜C Õ%ñ&ô ˜<Ó(¨AÒ-Ð-Ð-Ù˜ Q™¨Ô5÷Og	6ðR 	×ÑÔô Ð4Ó5ò 	'ˆDà—J“JØŸ™Õ(Ü" 4§;¡;´·
±
×0NÑ0NÕOà× Ñ  Õ&ð	'ð "9ÖM˜ÀÇÃ’ÒMÐMùòa÷6g	6ð g	6üòj Ns   Â>I1ÄC
I6ÉJÉ*JÉ6I?c           
     óÄ   — |j                   €J ‚| j                  |||j                    | j                  |j                  i |j                  ¤Ž| j
                  xs d¬«       y )NrÂ   rq  )r›   rÂ   rG  rR   rS   rH  r/  s       r9   r0  zReplacementPatternEntry.apply‡  sb   € Ø×&Ñ&Ð2Ð2Ð2Ø×ÑØØØ×#Ñ#ØˆD×Ñ §¡Ð<¨u¯|©|Ñ<Ø×'Ñ'Ò?Ð+?ð 	 õ 	
r;   rN   )r  r‘   r¡   r   r›   z%torch.fx.Graph | torch.fx.GraphModulerR   úSequence[torch.fx.Node]r�   r0   r=   r–   r8  )	rL   rW   rX   r  rY   rH  rÊ  rÂ   r0  rO   r;   r9   rÁ   rÁ   ›  s   … ñð -Ó,Ø#€L�*Ó#àð !%ð`NØð`Nàð`Nð Að`Nð &ð	`Nð
 ð`Nð 
ò`Nó ð`NôD
r;   rÁ   c                 ó   — yr  rO   )r  s    r9   Ú_return_truer…  ’  s   € Ør;   c                óF   — t         j                  d| j                  |«       y )Nz@Replacement pattern %s failed to apply due to shape mismatch: %s)ÚlogÚinforL   )Ú	search_fnr,  s     r9   Úlog_trace_failurerŠ  –  s   € Ü‡H�HØJØ×ÑØ	õr;   T)Úfrozenc                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y)	Ú_TraceArgInfoú	list[str]ÚargnamesÚflat_argnamesr•   Ú	arg_specszdict[str, list[str]]Úarg_flat_namesN©rL   rW   rX   rY   rO   r;   r9   r�  r�  ž  s   … àÓØÓØÓØ(Ô(r;   r�  úOrderedSet[str]c                ó˜   — | |vr|j                  | «       | S d}| › d|› �|v r|dz  }| › d|› �|v rŒ| › d|› �} |j                  | «       | S )Nr   r\  r*   )rÀ  )rO  Ú
used_namesr¸  s      r9   Ú_unique_argnamer—  ¦  so   € Ø�:ÑØ�‰�tÔØˆà	€AØˆF�!�A�3ˆ-˜:Ñ
%Ø	ˆQ‰ˆð ˆF�!�A�3ˆ-˜:Ò
%àˆV�1�Q�Cˆ=€DØ‡N�N�4ÔØ€Kr;   c                ó€   — g }d}| D ]4  }||v r|j                  ||   «       Œ|j                  ||   «       |dz  }Œ6 |S rû  )r†   )r�  Úexample_inputsÚscalar_workaroundÚ
trace_argsÚ	input_idxÚargnames         r9   Ú_trace_args_for_initial_tracerž  ³  s^   € ð
 €JØ€IØò ˆØÐ'Ñ'Ø×ÑÐ/°Ñ8Õ9à×Ñ˜n¨YÑ7Ô8Ø˜‰N‰Iðð Ðr;   c           	     ó¤  — g }i }i }t        «       }t        | |«      D ]•  \  }}t        j                  |«      \  }}	|	||<   t	        |«      dk(  rg }
nLt	        |«      dk(  rt        ||«      g}
n0t        t	        |«      «      D �cg c]  }t        |› d|› �|«      ‘Œ }
}|j                  |
«       |
||<   Œ— t        t        | «      |||¬«      S c c}w )Nr   r*   r\  )r�  r�  r‘  r’  )
r    rð   r   r¥  rÈ   r—  Úranger¥   r�  rž   )r�  rR   r�  r‘  r’  r–  r�  rÖ   Ú	flat_argsr–  Únamesr¸  s               r9   Ú_trace_arg_infor£  Ã  sô   € Ø!€MØ "€IØ+-€NÜ",£,€Jä˜H dÓ+ò (‰ˆ�Ü ×-Ñ-¨cÓ2‰ˆ	�4Ø!ˆ	�'ÑÜˆy‹>˜QÒØ!‰EÜ�‹^˜qÒ Ü$ W¨jÓ9Ð:‰Eô œs 9›~Ó.öàô   7 )¨1¨Q¨CÐ 0°*Õ=ðˆEð ð 	×Ñ˜UÔ#Ø"'ˆ�wÒð(ô Ü�h“Ø#ØØ%ô	ð ùòs   ÂCc                ó  — t        | «      } i }|j                  D ]Ç  }|j                  |   }|D �cg c]	  }|| v sŒ|‘Œ }}t        |«      t        |«      k7  r<|�||v r|s	||   ||<   ŒN|D �cg c]	  }|| vsŒ|‘Œ }}t	        d|› d|› d|› d| › �«      ‚g }	|D ]"  }|	j                  | j                  |«      «       Œ$ t        j                  |	|j                  |   «      ||<   ŒÉ |j                  | «       |S c c}w c c}w )Nz^Not all inputs to pattern found in match.kwargs. Perhaps one of the inputs is unused? argname=z, flat_argnames=z, missing_argnames=z, match.kwargs=)r  r�  r’  rÈ   r  r†   r  r   Útree_unflattenr‘  rˆ   )
rS   Úarg_infoÚdefaultsrX  r�  Ú
flat_namesÚ	flat_nameÚfound_namesÚmissing_namesÚflat_valuess
             r9   Ú_unflatten_match_kwargsr­  à  sL  € ô
 �&‹\€FØ€Fà×$Ñ$ò 
ˆØ×,Ñ,¨WÑ5ˆ
Ø2<ÖT YÀ	ÈVÒ@S’yÐTˆÐTÜˆ{Óœs :›Ò.ØÐ#¨°8Ñ(;ÁKØ"*¨7Ñ"3��w‘Øà+5öØ'¸È&Ò9P’	ðˆMð ô ð4Ø4;°9ð =!Ø!+ Ð,?À¸ð O Ø &˜xð)óð ð ˆØ#ò 	6ˆIØ×Ñ˜vŸz™z¨)Ó4Õ5ð	6ä ×/Ñ/Ø˜×+Ñ+¨GÑ4ó
ˆˆwŠð)
ð0 ‡M�M�&ÔØ€Mùò/ Uùò
s   °	C7ºC7Á,	C<Á6C<c                óZ   — d| j                   v r| j                   d   S | j                   d   S rÜ   rÙ   rk  s    r9   Ú_get_match_node_valuer¯    s,   € Ø�—	‘	ÑØ�y‰y˜ÑÐØ�9‰9�_Ñ%Ð%r;   Fc                óp  ‡‡— t         j                  | «      Š|j                  ‰«      }|s'|‰   j                  |rt	        |«      «       yd«       y|€|ryt        j                  dˆfd„«       t	        |«      }|D ]&  Š|‰k7  rŒ	|r yt        j                  dˆˆfd„«       Œ( |j                  |«       y)aB  
    Check if a pattern is a duplicate. Because we ignore certain types in searching, but not
    in matching, use the graph to distinguish equivalent search patterns.

    Returns True if a duplicate is found and `skip_duplicates=True` is passed in. Errors if
    `skip_duplicates` is False and a duplicate is found.
    NFTc                 ó   •— d‰ › d�S )NúDuplicate pattern: z with no graphrO   )Úpattern_reprs   €r9   r×   z1check_and_add_duplicate_pattern.<locals>.<lambda>#  s   ø€ Ð)¨,¨°~ÐF€ r;   c                 ó   •— d‰› d‰ › d�S )Nr²  z with duplicated match graph ú rO   )Ú	graph_strr³  s   €€r9   r×   z1check_and_add_duplicate_pattern.<locals>.<lambda>.  s   ø€ Ð)¨,¨Ð7TÐU^ÐT_Ð_`Ða€ r;   )rI  r  rA   r†   rK   rs   Ú_check)r“   r¡   Úseen_patternsÚskip_duplicatesÚequiv_pattern_reprsÚnew_graph_strr¶  r³  s         @@r9   Úcheck_and_add_duplicate_patternr¼  
  s¿   ù€ ô (×+Ñ+¨GÓ4€LØ'×+Ñ+¨LÓ9ÐÙØ�lÑ#×*Ñ*¹¬3¨u«:ÔIØð EIÔIØà€}ÙØÜ�‰ØÛFô	
ô
 ˜“J€MØ(ò 
ˆ	Ø˜IÒ%ØÙÙÜ�‰ØÜaõ	
ð
ð ×Ñ˜}Ô-Ør;   rO   c                ó$  ‡ ‡‡‡‡‡‡‡‡‡‡— g t        j                  ‰ «      j                  j                  «       ¢Št        j                  ‰ «      rt        ‰ ‰«      Š t        j                  ‰«      r;g t        j                  ‰«      j                  j                  «       ¢}t        ‰|«      Št        |t        t        f«      st        dt        |«      › �«      ‚‰xs i Št        ‰|‰«      }t        ‰|«      Št        j                  d„ |«      Šdˆˆˆˆˆˆˆˆˆ ˆˆfd„}dˆˆfd„}‰t        u rt!        j"                  «       ryt%        j&                  d¬«      5  ‰€t)        ‰ |‰‰‰‰¬«      \  }}n‰}d}t        |t*        «      r|n|gD ]D  }t        |t,        «      sŒt/        ||r|j0                  nd|j2                  |	¬	«      sŒ< ddd«       y t5        ||||
¬
«      }|j7                  |«       |j8                  cddd«       S # 1 sw Y   yxY w)a  
    Create a replacement rule based on example functions that get traced
    to create patterns.  This supports both training and inference when
    run on a joint forward+backward graph.

    Args:
        search_fn: traced to give original pattern
        replace_fn: traced to give replacement graph
        example_inputs: example inputs for initial trace
        trace_fn: fwd_only or joint_fwd_bwd
        pass_dict: dict of passes to register to
        extra_check: additional check to run on match(using real shapes)
    z,example_inputs must be a list or tuple, got c                óR   — t        | t        j                  «      xr | j                  S rN   )rD   rs   ÚTensorÚrequires_grad)rŒ  s    r9   r×   z&register_replacement.<locals>.<lambda>b  s   € ”*˜Q¤§¡Ó-ÒA°!·/±/€ r;   c           
     óÂ  •‡‡‡‡— t        | j                  ‰«      }t        t        j                  j                  ‰D �cg c]  }||   ‘Œ	 c}t        «      «      Šg Št        j                  j                  j                  ‰«      }|€J ‚|5  dŠt        t        j                  ‰«      «      Šdˆˆˆfd„}t        j                  |‰«      Š‰r
	 ddd«       y‰ }t        ‰‰«      }|j                  }|�sO‰�r1dˆˆfd„}	  ‰!|‰‰z   ‰¬«      }	g }|	j$                  j&                  D �cg c]  }|j(                  dk(  sŒ|‘Œ }}t+        |dt-        ‰«      t-        |«      z    «      D ]º  \  }}|t-        ‰«      k  r|j/                  |j0                  «       Œ0|	j$                  j3                  |«      5  |	j$                  j5                  ||t-        ‰«      z
     «      }|j6                  |_        |j9                  |«       |	j$                  j;                  |«       ddd«       Œ¼ ||z   }n	  ‰!‰‰‰¬«      }	t=        |	|‰‰¬«      }| j?                  «       d   }|€J ‚|jA                  |«      }tC        |j6                  «      r#tD        jG                  d	||jH                  ||«       tK        |«      rt        |j                  ||¬
«      |_        tK        |«      r‹ ‰|«      rƒ ‰!‰‰‰¬«      | _&        || _        t-        | j&                  «      dk(  rJ| jL                  j$                  j&                  D ]'  }tO        |jP                  | j&                  d   d¬«       Œ) 	 ddd«       y	 ddd«       yc c}w # t         $ r}
t#        ‰|
«       Y d}
~
ddd«       yd}
~
ww xY wc c}w # 1 sw Y   �ŒDxY w# t         $ r}
t#        ‰|
«       Y d}
~
ddd«       yd}
~
ww xY w# 1 sw Y   yxY w)z°
        Often shapes get burned into the pattern, so our initial match ran with
        `ignore_types=(int, ...)`.

        Recheck the match with the correct shapes.
        NFc                ó
  •‡— t        ‰«      }t        | t        j                  «      s| S |rt	        | j
                  «      rdŠ| S t        j                  | j                  «       | j                  «       | j
                  | j                  |¬«      }t        j                  |j                  |j                  «       «      D ]C  Št        ‰t        j                  «      sŒt        ˆfd„‰D «       «      sŒ3‰j                  ‰«       ŒE |S )NT)ÚdtypeÚdevicerÀ  c              3  ó:   •K  — | ]  }t        ‰|k7  «      –— Œ y ­wrN   )r   )rx   rÆ  rz   s     €r9   r{   zNregister_replacement.<locals>.check_fn.<locals>.refresh_arg.<locals>.<genexpr>‘  s    øè ø€ ò ;Ø:;Ô-¨a°1©f×5ñ;ùs   ƒ)r¾   rD   rs   r¿  r   rÃ  Úempty_stridedÚsizeÚstriderÄ  rŽ  r�  ÚshapeÚSymIntr5   r†   )rÖ   ÚgradÚrefreshed_argrz   Úinvalid_argsÚrequires_grad_valuesÚsym_argss      @€€€r9   Úrefresh_argz;register_replacement.<locals>.check_fn.<locals>.refresh_arg  sÐ   ù€ äÐ0Ó1�Ü! #¤u§|¡|Ô4Ø�JáÔ,¨S¯Y©YÔ7Ø#'�LØ�Jä %× 3Ñ 3Ø—H‘H“JØ—J‘J“LØŸ)™)ØŸ:™:Ø"&ô!�ô #Ÿ™¨×)<Ñ)<¸m×>RÑ>RÓ>TÓUò +�AÜ! !¤U§\¡\Õ2´só ;Ø?Gô;õ 8ð !Ÿ™¨Õ*ð	+ð
 %Ð$r;   c                 ó>   •—  ‰| t        | «      t        ‰«      z
  d  Ž S rN   )rÈ   )Úargs_newr\  rR   r‰  s     €€r9   Úsearch_fn_newz=register_replacement.<locals>.check_fn.<locals>.search_fn_new«  s#   ø€ Ù(¨(´3°x³=Ä3ÀtÃ9Ñ3LÐ3NÐ*OÐPÐPr;   ©Úget_decomp_fnrM  )r�  Úexclusive_arg_namesrš  r   z"Specific pattern match: %s%s %s %s)r§  r*   rý   rä   T)rÖ   r   r=   r   )rÒ  r   r\  r   r=   r   ))r­  rS   rž   rs   rt   rï   r¯  rñ   rì   rò   Úiterr   Útree_leavesrî   r£  r�  r  rŠ  r¡   r—   rn  rë  rÈ   r†   rÉ   Úinserting_afterrM  rO  rB  r´   Úfx_to_patternr»   r  rH   r‡  ÚwarningrR   r  r›   r�   r‰   )"r  Ústructured_match_kwargsrO  rá   rÐ  Úspecific_patternÚspecific_arg_infoÚspecific_argnamesrÓ  Úspecific_graphr,  Úsym_arg_namesrµ   Úplaceholdersr¸  rM  rþ   rÎ   Úspecific_pattern_matchrR   rÍ  rÎ  rÏ  Úargnames_staticrÖ  r-  rÕ  Úinitial_arg_infoÚ
replace_fnrÀ  rš  r‰  Úsearch_fn_patternrõ   s"                      @@@@€€€€€€€€€€€r9   Úcheck_fnz&register_replacement.<locals>.check_fnf  s  ü€ ô #:Ø�L‰LÐ*ó#
Ðô Ü�H‰H×ÑØ;JÖK°4Ð(¨Ó.ÒKÜ%óó
ˆð (*ˆÜ—M‘M×'Ñ'×8Ñ8¸Ó>ˆ	ØÐ$Ð$Ð$Øñ D	Ø ˆLÜ#'¬×(:Ñ(:¸=Ó(IÓ#JÐ ÷%ô0 —?‘? ;°Ó5ˆDÙØ÷=D	ð D	ðF  1ÐÜ /°ÀÓ FÐØ 1× ?Ñ ?Ðâ#ÚöQð%Ù)1Ø)Ø$ t™OØ*7ô*˜ð %'�Mà#1×#7Ñ#7×#=Ñ#=ö$ØÀÇÁÈÓAVšð$�Lð $ô +4Ø$Ð%M¤s¨8£}´sÐ;LÓ7MÑ'MÐNó+ò I™˜˜;ð œs 8›}Ò,Ø)×0Ñ0°×1CÑ1CÔDØ$à+×1Ñ1×AÑAÀ+ÓNñ IØ'5×';Ñ';×'GÑ'GØ 1°!´c¸(³mÑ2CÑ Dó(˜Hð /7¯m©m˜HœOØ'×=Ñ=¸hÔGØ*×0Ñ0×;Ñ;¸KÔH÷Ið IðIð )6Ð8IÑ(IÑ%ð%Ù)1Ø% t¸=ô*˜ô $1Ø"Ø.Ø(;Ø&7ô	$Ð ð ×%Ñ%Ó'¨Ñ*ˆDØÐ#Ð#Ð#Ø%5×%;Ñ%;¸DÓ%AÐ"ä! $§)¡)Ô,Ü—‘Ø8ØØ—I‘IØ*Ø$ôô Ð.Ô/Ü0GØ*×1Ñ1Ø%Ø4ô1Ð&Ô-ô Ð.Ô/±KÐ@VÔ4Wá*2Ø °Mô+�Ô'ð  7�”Ü�u—{‘{Ó# qÒ(Ø"×4Ñ4×:Ñ:×@Ñ@ò ˜Ü&Ø%&§V¡VØ%*§[¡[°¡^Ø&3öðð ÷GD	ð D	ðH ÷ID	ð D	ùò LøôB (ò %Ü)¨)°QÔ7Û$÷wD	ð D	ûðr%üò$÷Iñ Iûô (ò %Ü)¨)°QÔ7Û$÷sD	ð D	ûðn%ú÷oD	ð D	úsŸ   ¾M*ÂAOÃ'OÃ>M/ÄOÄ&NÄ;NÄ?A0OÆ/A(NÈOÈ(N+È3D$OÍ OÍ/	NÍ8NÎOÎNÎOÎN(Î#OÎ+	OÎ4OÏ OÏOÏOÏOc                 ó”  •‡ — t        ˆ fd„‰D «       «      st        ‰ ‰«      Š ‰D �cg c]  }‰ j                  |«      ‘Œ }}g }|D ]&  }|j                  t	        j
                  |«      «       Œ( t        dt        ‰ «      dz   «      D ].  }d|› �‰ vr n%|j                  ‰ j                  d|› �«      «       Œ0 ‰ r
J d‰ ›�«       ‚|S c c}w )Nc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   rO   )rx   rO  rS   s     €r9   r{   z?register_replacement.<locals>.normalize_args.<locals>.<genexpr>  s   øè ø€ Ò> d�4˜6”>Ñ>ùs   ƒr*   Ú	tangents_zleftover kwargs: )	r5   r­  r  r¥   r   rØ  r   rÈ   r†   )rS   rO  Ústructured_argsrR   rÖ   r¸  rä  rå  s   `     €€r9   rG  z,register_replacement.<locals>.normalize_args  sÓ   ù€ ô Ó>¨oÔ>Ô>Ü,¨VÐ5EÓFˆFØ8GÖH°˜6Ÿ:™: dÕ+ÐHˆÐHØˆØ"ò 	1ˆCØ�K‰Kœ×*Ñ*¨3Ó/Õ0ð	1ä�qœ#˜f›+¨™/Ó*ò 	5ˆAØ˜1˜#ˆ fÑ,ÙØ�K‰K˜Ÿ
™
 Y¨q¨c ?Ó3Õ4ð	5ñ Ð9Ð.¨v¨jÐ9Ó9ˆzØˆùò Is   §CF©Úfunctionalize_rng_opsNrÔ  )r¹  )r“   r-  rG  rH  ©r  r‘   r=   rE   )rS   r   r=   r”   )ÚinspectÚ	signatureÚ
parametersr£   ÚismethodÚ_wrap_bound_methodrD   rž   r©   Ú	TypeErrorr›  rž  r£  r   rî   Újoint_fwd_bwdrs   Úis_inference_mode_enabledÚfunctorch_configÚpatchÚgen_pattern_and_search_gmr   r5  r¼  r¡   r¸  rÁ   r4  r“   )r‰  ræ  r™  rõ   r7  r-  rš  rÖ  rç  r¹  rH  rÕ  Úreplace_argnamesÚinitial_trace_argsrè  rG  r“   ÚgmÚpattern_matcher_passrä  rå  rÀ  s   `` ` ````  `       @@@r9   Úregister_replacementrÿ  4  s  ÿú€ ð6 Hœ×)Ñ)¨)Ó4×?Ñ?×DÑDÓFÐG€Oä×Ñ˜	Ô"Ü& y°/ÓBˆ	ä×Ñ˜
Ô#ØMœW×.Ñ.¨zÓ:×EÑE×JÑJÓLÐMÐÜ'¨
Ð4DÓEˆ
ä�n¤t¬U mÔ4ÜØ:¼4ÀÓ;OÐ:PÐQó
ð 	
ð *Ò/¨RÐÜ6Ø˜Ð):óÐô ' Ð8JÓKÐÜ—O‘OÙAØó€M÷
Y÷ Yövð  ”=Ñ ô ×*Ñ*Ô,Øô 
×	Ñ	°eÔ	<ñ !ØÐ$Ü3ØØØØ!Ø#Ø+ô‰KˆG‘Rð (ˆGØˆBô % Z´Ô:‰JÀÀò
	!Ð ô Ð.Ô0BÕCÜ2ØÙ "�B—H’H¨Ø(×6Ñ6Ø$3ö	ð !÷1!ð !ð
	!ô *ØØ Ø)Ø%ô	
ˆð 	×Ñ˜Ô$Ø�‰÷C!÷ !ò !ús   ÅAHÆ'HÇHÇ,HÈHÚ_serialized_patternsc                óV  — dd„}t         j                  «       st        dt         › �«      ‚|j                  }ddlm}  |j                  d¬«      5  t        ||||«      }d d d «       t        j                  | ¬«      }	|t        vrd}
t        j                  |«       nd	}
 |«       }t        t         |› d
�z  |
«      5 }|
dk(  r|j                  |«       n|j                  d«       |j                  |	«       |j                  d«       d d d «       |S # 1 sw Y   Œ´xY w# 1 sw Y   |S xY w)Nc                 óÚ  — t        j                  d«      } t        j                  d«      j                  | ¬«      }g }t        t        j
                  j                  «      D ]^  }t        t        j
                  j                  |«      }	 t        |t        «      r't        |t        t        f«      r|j                  |«       Œ` dj                  |«      }d|› d�}|› |› �S # t        $ r Y Œ‰w xY w)NzÁ            # This is an auto-generated file. Please do not modify it by hand.
            # To re-generate, run:
            # cd ~/pytorch && python torchgen/fuse/gen_patterns.py
            a               # mypy: ignore-errors

            # noqa: F401, E501
            {msg}
            import torch
            import torch._inductor
            import operator

            aten = torch.ops.aten
            prims = torch.ops.prims

            )Úmsgz,
   z1from torch._inductor.pattern_matcher import (
   z,
)
)ÚtextwrapÚdedentr  Údirrs   Ú	_inductorÚpattern_matcherrr  rD   r›  Ú
issubclassr’   re  r†   rõ  r®  )Úauto_generated_msgÚfile_templateÚpattern_matcher_importsrO  ÚattrÚformatted_importss         r9   Úget_file_templatez-_serialize_pattern.<locals>.get_file_templateF  só   € Ü%Ÿ_™_ðó
Ðô !Ÿ™ðó
÷ ‰&Ð'ˆ&Ó
(ð 	ð  #%ÐÜœŸ™×7Ñ7Ó8ò 		ˆDÜœ5Ÿ?™?×:Ñ:¸DÓAˆDðÜ˜d¤DÔ)¬jØœ;¬Ð4ô/ð ,×2Ñ2°4Ô8øð		ð %ŸM™MÐ*AÓBÐØPÐQbÐPcÐciÐjÐØ�Ð!2Ð 3Ð4Ð4øô ò Ùðús   Â7CÃ	C*Ã)C*z0Could not find serialized patterns directory at r   r"   Frí  )r  ÚwrÆ  z.pyz

r  r  )ÚSERIALIZED_PATTERN_PATHÚis_dirr  rL   Útorch._functorchr#   rù  Úgen_patternrI  r  r   rÀ  ÚopenÚwrite)Úunique_namer‰  r™  rõ   rš  r  rH  rø  r“   Úserialized_patternÚ
write_moder  Úfs                r9   Ú_serialize_patternr  ?  s)  € ó'5ôR #×)Ñ)Ô+ÜØ>Ô?VÐ>WÐXó
ð 	
ð ×%Ñ%€Lå;à	Ð	×	Ñ	°eÔ	<ñ VÜ˜i¨¸ÐCTÓUˆ÷Vô .×1Ñ1°'À{Ð1ÓSÐØÔ/Ñ/Øˆ
Ü× Ñ  Õ.àˆ
á%Ó'€Mä	Ô%¨<¨.¸Ð(<Ñ<¸jÓ	Ið ÈQØ˜ÒØ�G‰G�MÕ"à�G‰G�FŒOØ	�‰Ð"Ô#Ø	�‰�Œ÷ð €N÷)Vð Vú÷ð €Nús   ÁDÂ=ADÄDÄD(Ú	fx_passesÚserialized_patternszvlist[tuple[Any, Iterable[Any], Callable[[Callable[..., Any], Iterable[Any]], torch.fx.GraphModule], Any, PatternExpr]]Ú_known_precompiled_patternsc                óæ  — t        |«      }dt        j                  v rt        | ||||«      }nT|j                  }t        j                  d|› �«      }|rt        || «      st        j                  d| «       t        || «      }t        j                  |«      D ]'  }t        |t        «      sŒ|j                  €Œ!d |_        Œ) t         j#                  |||||f«       t%        ||||||||||	| |
¬«       y )NÚPYTORCH_GEN_PATTERNSz.torch._inductor.fx_passes.serialized_patterns.zDPrecompiled pattern %r not found. Run torchgen/fuse/gen_patterns.py.)rç  r¹  rH  rÕ  )r©   r?   r@   r  rL   Ú	importlibÚimport_moduler  r‡  rÛ  rr  r   Ú	tree_iterrD   r'   Úconstantr  r†   rÿ  )r  r‰  ræ  r™  rõ   r7  r-  rš  rÖ  r¹  rÕ  ÚpatrH  r  rÖ   s                  r9   Úgen_register_replacementr&  Ÿ  s  € ô ˜>Ó*€Nà¤§¡Ñ+Ü Ø˜ N°HÐ>Oó
‰ð !×)Ñ)ˆÜ×#Ñ#Ø<¸\¸NÐKó
ˆñ œ  ;Ô/Ü�K‰KØVØôô �a˜Ó%ˆä×Ñ Ó/ò  ˆÜ�cœ:Õ&¨3¯<©<Ñ+Cð
  ˆC�Lð ô  ×&Ñ&Ø	�N HÐ.?ÀÐEôô ØØØØØØØØØØ'Ø Ø#ör;   rí  c                óF  — g t        j                  | «      j                  j                  «       ¢}|xs i }t	        |||«      }t        ||«      } || ||¬«      }	t        |	t        t        t        t        j                  t        j                  f|j                  ||¬«      |	fS )NrÔ  )Úignore_typesr�  rš  rÖ  )rð  rñ  rò  r£   rž  r£  rÚ  ÚintÚfloatrž   rs   rÄ  rÃ  r�  )
r‰  r™  rõ   rš  rÖ  rÕ  r�  Úflat_inputsr¦  Ú	search_gms
             r9   rú  rú  Ú  s¡   € ð A”×"Ñ" 9Ó-×8Ñ8×=Ñ=Ó?Ð@€Hà)Ò/¨RÐÜ/Ø�.Ð"3ó€Kô ˜x¨Ó5€Há˜ K¸}ÔM€IäØÜœu¤d¬E¯L©L¼%¿+¹+ÐFØ×+Ñ+Ø/Ø 3ô	
ð 	ð	ð 	r;   c                ó&   — t        | ||||«      d   S rõ  )rú  )r‰  r™  rõ   rš  rÖ  s        r9   r  r  ø  s&   € ô %Ø�> 8Ð->Ð@Sóàñ	ð 	r;   r2  c               ó    ‡ ‡‡‡— dˆˆˆ ˆfd„}|S )zº
    Register an aten to inductor IR replacement pattern.  The decorated
    function is saved and then called a lowering time allowing direct
    pattern to inductor IR conversion.
    c                ón   •— t        | «      sJ ‚t        ‰‰| ¬«      j                  ‰‰¬«       d| _        | S )N©r“   r-  r=  r2  T)ri  r;  r4  Ú_inductor_lowering_function©r=  r-  Ú	pass_dictr“   r3  s    €€€€r9   Ú	decoratorz,register_lowering_pattern.<locals>.decorator  s;   ø€ Ü˜Ô Ð Ð ÜØ¨¸gô	
ç
‰(�9 gˆ(Ô
.Ø.2ˆÔ+Øˆr;   ©r=  r<  r=   r<  rO   ©r“   r-  r3  r3  r4  s   ```` r9   Úregister_lowering_patternr7    s   û€ ÷ð ð Ðr;   c               ó    ‡ ‡‡‡— dˆˆˆ ˆfd„}|S )zk
    Register a pattern that runs a function on the FX graph, allowing
    custom transformation code.
    c                ó`   •— t        | «      sJ ‚t        ‰‰| ¬«      j                  ‰‰¬«       | S )Nr0  r2  )ri  rD  r4  r2  s    €€€€r9   r4  z)register_graph_pattern.<locals>.decorator(  s3   ø€ Ü˜Ô Ð Ð ÜØ¨¸gô	
ç
‰(�9 gˆ(Ô
.Øˆr;   r5  rO   r6  s   ```` r9   Úregister_graph_patternr:    s   û€ ÷ð ð Ðr;   c                óB   — |t        t        | j                  «      «      u S rN   )r¾   r×  r—   )r¡   rÎ   s     r9   Úis_start_of_fx_graphr<  2  s   € à”4œ˜UŸ[™[Ó)Ó*Ð*Ð*r;   z6(?<!_)(_$|_[.]|(\b|_)(set|enter|exit|seed)(\b|_))(?!_)c                ó„   — | j                   dk7  ry| t        j                  j                  j                  j
                  fv S )Nr.   F)r  rs   rÊ   r.   Úresize_storage_bytes_Údefault)rn  s    r9   Ú"fixme_incorrect_inductor_schema_opr@  <  s7   € Ø	‡|�|�zÒ!Øð ”%—)‘)×$Ñ$×:Ñ:×BÑBÐDÐDÐDr;   c                óª  — t        | j                  t        j                  j                  «      r5t        | j                  «      s | j                  j                  j                  S t        | j                  t        j                  j                  j                  «      ry| j                  dk(  rAt        | j                  «      sJ ‚t        j                  | j                  j                  «      rLy| j                  dk(  r<t        | j                  t         «      sJ ‚t        j                  | j                  «      ry| j"                  j%                  d«      d uS )NFrÍ  TrÑ  Úout)rD   rÉ   rs   rj  rt  r@  Ú_schemaÚ
is_mutableÚ_higher_order_opsÚauto_functionalizeÚAutoFunctionalizedrn  ri  Ú_mutation_op_reÚsearchrL   rK   rS   rA   rk  s    r9   Úis_mutation_oprJ  E  sí   € ÜØ�‰”U—Z‘Z×*Ñ*ôä0°·±Ô=Ø�{‰{×"Ñ"×-Ñ-Ð-Ü	Ø�‰”U×,Ñ,×?Ñ?×RÑRô
ð Ø‡w�w�/Ò!Ü˜Ÿ™Ô$Ð$Ð$Ü×!Ñ! $§+¡+×"6Ñ"6Ô7ØØ	�‰�MÒ	!Ü˜$Ÿ+™+¤sÔ+Ð+Ð+Ü×!Ñ! $§+¡+Ô.ØØ�;‰;�?‰?˜5Ó!¨Ð-Ð-r;   c                ó€   — d| j                   v sJ ‚d|j                   v sJ ‚| j                   d   |j                   d   k(  S ©NÚmutation_region_idrÙ   )rÆ  rÇ  s     r9   Úsame_mutation_regionsrN  Y  sE   € Ø 1§6¡6Ñ)Ð)Ð)Ø 1§6¡6Ñ)Ð)Ð)Ø�6‰6Ð&Ñ'¨1¯6©6Ð2FÑ+GÑGÐGr;   c                ó,  — |}d|j                   vr3t        | |«      s'|j                  }d|j                   vrt        | |«      sŒ'|j                   j                  dd«      }||ur0|j                  }t        |«      r|dz  }||j                   d<   ||urŒ0|S )NrM  r   r*   )r‰   r<  ÚprevrA   r¾   rJ  )r¡   rÎ   rµ   rM  s       r9   Úget_mutation_region_idrQ  _  s™   € Ø€AØ
 a§f¡fÑ
,Ô5IÈ%ÐQRÔ5SØ�F‰Fˆð  a§f¡fÑ
,Ô5IÈ%ÐQRÕ5SàŸ™Ÿ™Ð$8¸!Ó<ÐØ
�4‰-Ø�F‰FˆÜ˜!ÔØ !Ñ#ÐØ'9ˆ�‰Ð#Ñ$ð	 �4Š-ð
 Ðr;   c                óV   — dt        t        | j                  «      «      j                  vS rL  )r¾   r×  r—   r‰   r*  s    r9   Ú"should_compute_mutation_region_idsrS  l  s!   € Ø¤t¬D°·±Ó,=Ó'>×'CÑ'CÐCÐCr;   c                óh   — d}| j                   D ]!  }t        |«      r|dz  }||j                  d<   Œ# y )Nr   r*   rM  )r—   rJ  r‰   )r¡   rM  Únds      r9   Úcompute_mutation_region_idsrV  p  s=   € ØÐØ�k‰kò ;ˆÜ˜"ÔØ !Ñ#ÐØ(:ˆ�‰Ð$Ò%ñ;r;   c                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y)Ú_MutationRegionRefreshrå   ÚanchorÚstopr)  rM  Úmutation_countNr“  rO   r;   r9   rX  rX  x  s   … àÓØ
ÓØÓØÔr;   rX  c                  óT   — e Zd ZU  ej                  e¬«      Zded<   dZded<   d	d„Z	y)
Ú_GraphMutationTracker)Údefault_factoryr–   Úcreated_nodesFrE   Úerased_mutation_nodec                óH   — | j                   xs t        | j                  «      S rN   )r`  Ú_contains_mutation_opr_  ri   s    r9   Úchanged_mutation_regionsz._GraphMutationTracker.changed_mutation_regions…  s   € Ø×(Ñ(ÒUÔ,AÀ$×BTÑBTÓ,UÐUr;   Nr  )
rL   rW   rX   ÚdataclassesÚfieldrž   r_  rY   r`  rc  rO   r;   r9   r]  r]  €  s+   … à):¨×):Ñ):È4Ô)P€MÐ&ÓPØ!&Ð˜$Ó&ôVr;   r]  c              #  óv  ‡‡‡	K  — t        «       Š	| j                  Š| j                  Št        «       }| j                  }|j                  d|«      }|j                  d|«      }dˆˆ	fd„}dˆˆ	fd„}||d<   ||d<   	 ‰	–— ||u r|d= n||d<   ||u r|d= y ||d<   y # ||u r|d= n||d<   ||u r|d= w ||d<   w xY w­w)NÚcreate_noder´   c                 óN   •—  ‰| i |¤Ž}‰j                   j                  |«       |S rN   )r_  r†   )rR   rS   Úcreated_noderg  Útrackers      €€r9   Útracked_create_nodez6_track_graph_mutation_ops.<locals>.tracked_create_node•  s,   ø€ Ù" DÐ3¨FÑ3ˆØ×Ñ×$Ñ$ \Ô2ØÐr;   c                óP   •— | j                   st        | «      rd‰_         ‰| «      S r  )r²   rJ  r`  )Úto_eraser´   rj  s    €€r9   Útracked_erase_nodez5_track_graph_mutation_ops.<locals>.tracked_erase_nodeš  s&   ø€ Ø×Ò¤N°8Ô$<Ø+/ˆGÔ(Ù˜(Ó#Ð#r;   )rR   r   rS   r   r=   rå   )rm  rå   r=   r   )r]  rg  r´   ÚobjectÚ__dict__rA   )
r¡   ÚsentinelÚ
graph_dictÚcreate_node_attrÚerase_node_attrrk  rn  rg  r´   rj  s
          @@@r9   Ú_track_graph_mutation_opsru  ‰  sí   úè ø€ ô $Ó%€GØ×#Ñ#€KØ×!Ñ!€JÜ‹x€HØ—‘€JØ!—~‘~ m°XÓ>ÐØ —n‘n \°8Ó<€Oöö
$ð
 !4€Jˆ}ÑØ1€Jˆ|Ñð
7ØŠà˜xÑ'Ø˜=Ñ)à(8ˆJ�}Ñ%Ø˜hÑ&Ø˜<Ñ(à'6ˆJ�|Ò$øð ˜xÑ'Ø˜=Ñ)à(8ˆJ�}Ñ%Ø˜hÑ&Ø˜<Ñ(à'6ˆJ�|Ò$üs   …A5B9Á;B Á?B9ÂB6Â6B9c                óz   — d}| }||ur2|j                   dk7  sJ ‚t        |«      r|dz  }|j                  }||urŒ2|S )Nr   Úrootr*   )rn  rJ  r¾   )ÚstartrZ  r[  rU  s       r9   Ú_count_mutation_ops_untilry  ®  sO   € Ø€NØ	€BØ
�D‰.Ø�u‰u˜ŠÐˆÜ˜"ÔØ˜aÑˆNØ�W‰Wˆð	 �DŠ.ð
 Ðr;   c                ó&   — t        d„ | D «       «      S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrN   )rJ  )rx   rU  s     r9   r{   z(_contains_mutation_op.<locals>.<genexpr>º  s   è ø€ Ò2 bŒ~˜b×!Ñ2ùs   ‚)r�  )r—   s    r9   rb  rb  ¹  s   € ÜÑ2¨EÔ2Ó2Ð2r;   c                óž   — |j                   €J ‚t        |j                  «      xs) t        |j                   j                  j                  «      S rN   )r›   rb  r—   r¡   )Úentryr  s     r9   Ú%_replacement_changes_mutation_regionsr~  ½  sI   € ð ×"Ñ"Ð.Ð.Ð.Ü  §¡Ó-ò Ô1FØ×Ñ×%Ñ%×+Ñ+ó2ð r;   c           	     ó:  — |r/t        |«      }t        |«      }|j                  }|j                  }n,t        t	        | j
                  «      «      }|j                  }|}|j                  dk(  rdnt        | |«      }t        |||t        |j                  |«      «      S )Nrw  r   )
r|  ÚmaxrP  r¾   r×  r—   rn  rQ  rX  ry  )r¡   r—   Úfirst_matched_nodeÚlast_matched_noderY  rZ  Ú
first_noderM  s           r9   Ú_mutation_region_refreshr„  Æ  s—   € ñ Ü  ›ZÐÜ ›JÐØ#×(Ñ(ˆØ ×%Ñ%‰äœ$˜uŸ{™{Ó+Ó,ˆ
Ø—‘ˆØˆð �Y‰Y˜&Ò ‰Ô&<¸UÀFÓ&Kð ô "ØØØÜ! &§+¡+¨tÓ4ó	ð r;   c                óB  — |j                   j                  s|j                  j                  rt        | «       y |j                   j                  }|j
                  }d}||j                  urZ|j                  dk(  rt        | «       y t        |«      r
|dz  }|dz  }||j                  d<   |j                  }||j                  urŒZ||j                  k(  ry |j                  dk7  r<t        |«      r|dz  }||j                  d<   |j                  }|j                  dk7  rŒ;y y )Nr   rw  r*   rM  )
rY  r²   rZ  rV  r¾   rM  rn  rJ  r‰   r[  )r¡   ÚrefreshrU  rM  r[  s        r9   Ú_refresh_mutation_region_idsr‡  ß  s  € ð ‡~�~×Ò §¡×!5Ò!5Ü# EÔ*Øà	�‰×	Ñ	€BØ ×3Ñ3ÐØ€NØ
�G—L‘LÑ
 Ø�5‰5�FŠ?Ü'¨Ô.ØÜ˜"ÔØ !Ñ#ÐØ˜aÑˆNØ(:ˆ�‰Ð$Ñ%Ø�W‰Wˆð �G—L‘LÒ
 ð ˜×/Ñ/Ò/Øà
�%‰%�6Š/Ü˜"ÔØ !Ñ#ÐØ(:ˆ�‰Ð$Ñ%Ø�W‰Wˆð	 �%‰%�6�/r;   c                óÈ   ‡ — dˆ fd„}|D �cg c]0  }t        j                  |t         j                  j                  «      ‘Œ2 }}t        j                  |«      |_        |S c c}w )zQ
    Wrap a bound method to remove 'self' from its signature for FX tracing.
    c                 ó   •—  ‰| i |¤ŽS rN   rO   )rR   rS   ra   s     €r9   Úwrapperz#_wrap_bound_method.<locals>.wrapper	  s   ø€ Ù�4Ð"˜6Ñ"Ð"r;   rV   )rð  Ú	ParameterÚPOSITIONAL_OR_KEYWORDÚ	SignatureÚ__signature__)ra   r�  rŠ  rO  Úparamss   `    r9   rô  rô  þ  s_   ø€ õ
#ð
 öàô 	×Ñ˜$¤× 1Ñ 1× GÑ GÕHð€Fð ô $×-Ñ-¨fÓ5€GÔØ€Nùòs   Œ5Ac                  óL   ‡ — e Zd ZdZ	 	 d	 	 	 	 	 dˆ fd„Zdd„Zd	d„Zd
d„Zˆ xZS )r5  zA
    Registry of patterns to match and replace in FX graphs.
    c                óŽ   •— t         ‰| �  «        t        t        «      | _        || _        || _        t        t        «      | _        y rN   )r�   rj   r   rž   Úpatternsr�   Ú	subsystemr¸  )rQ   r�   r“  rŸ   s      €r9   rj   zPatternMatcherPass.__init__	  sA   ø€ ô
 	‰ÑÔô œÓð 	Œð #ˆŒØ"ˆŒô ;FÄdÓ:KˆÕr;   c                ó    — | j                   |   S rN   )r’  )rQ   Úitems     r9   r'  zPatternMatcherPass.__getitem__%	  s   € Ø�}‰}˜TÑ"Ð"r;   c                óê	  — | j                   syt        |t        j                  j                  «      r|j
                  }nJt        |t        j                  j                  «      r|}|j                  }nt        dt        |«      › �«      ‚t        |«      rt        |«       t        j                  t        |«      }d}g }d}| j                   D ]0  \  }}|dk(  rd}Œ|j                  |j!                  ||d¬«      «       Œ2 |r"|j                  |j!                  dd¬«      «       | j"                  �| j"                  nd	}	t        |t        j                  j                  «      sJ ‚t%        ||	| j&                  «      5  t)        t*        j,                  j/                  |«      d¬
«      D �](  }
t1        |
«      }|
j2                  dk(  r|
j2                  |f| j                   vrŒ9t5        |
d¬«      rŒG| j                   |
j2                  |f   D �]Ã  }|
j6                  r Œt|j8                  j;                  |
«      }t=        |«      r,t?        tA        tC        ||jD                  «      «      «      dk7  rŒdt=        |«      r)t?        tA        d„ |jD                  D «       «      «      dk7  rŒ˜tG        |
jH                  «      r-tJ        jM                  d|
|
jN                  ||j8                  «       t=        |«      sŒætQ        |jS                  |«      «      s�Œ|dz  }t        |tT        «      r%tW        ||«      rtY        ||jD                  «      nd}n)t        |tZ        «      rd}ntY        ||jD                  «      }t        |tZ        «      rCt]        |«      5 }|j_                  |||
«       ddd«       ja                  «       rAt        |«       n5|� |j_                  |||
«       tc        ||«       n|j_                  |||
«       td        tf           dxx   dz  cc<   td        tf           dxx   t?        |jD                  «      z  cc<   th        jj                  jm                  d«      s�ŒQto        |dd«      r|jp                  }n<|j8                  jr                  jt                  }tw        |
jx                  «      }|› d|› �}tf        › d�}td        |   |xx   dz  cc<   �ŒÆ �Œ+ 	 ddd«       |S # 1 sw Y   �ŒCxY w# 1 sw Y   |S xY w)zLApply all registered patterns to the graph, returning the number of matches.r   zJThe input to PatternMatcherPass must be a GraphModule or a Graph, but got FrÕ  T)rn  rÉ   Úsort)rn  r—  Nr  )Úreverse)Úallow_cpu_inputsr*   c              3  ót   K  — | ]0  }|j                   j                  d i «      j                  dd«      –— Œ2 y­w)ÚcustomÚstreamr   N)r‰   rA   )rx   rµ   s     r9   r{   z+PatternMatcherPass.apply.<locals>.<genexpr>d	  s4   è ø€ ò 'à$%ð !"§¡§
¡
¨8°RÓ 8× <Ñ <¸XÀq× Iñ'ùs   ‚68z
%s%s %s %sÚpattern_matcher_countÚpattern_matcher_nodesr<   rH  r\  Ú_pattern_matcher_per_pattern)=r’  rD   rs   rt   rT  r¡   ÚGraphrU  r  r›  rS  rV  ré   rê   rQ  r†   Ú
find_nodesr�   r   r“  ÚsortedrŽ  r�  Úfrom_iterabler€  rn  r,   r²   r“   r  r  rÈ   r    r¬  r—   rH   rO  r‡  rÛ  rR   r   r-  rÁ   r~  r„  rD  ru  r0  rc  r‡  r   Úbackendr?   r@   rA   rr  rH  rŸ   rL   rK   rÉ   )rQ   rý  r¡   Úget_mutation_region_id_partialÚcountr—   Úhas_call_modulern  rÉ   r�   rÎ   r}  r  Úmutation_region_refreshÚmutation_trackerrH  Úpattern_classÚpattern_keys                     r9   r0  zPatternMatcherPass.apply(	  s_  € à�}Š}ØÜ�bœ%Ÿ(™(×.Ñ.Ô/Ø—H‘H‰EÜ˜œEŸH™HŸN™NÔ+ØˆEØ×$Ñ$‰BäØ\Ô]aÐbdÓ]eÐ\fÐgóð ô .¨eÔ4Ü'¨Ô.Ü)2×):Ñ):Ü" Eó*
Ð&ð ˆØˆØˆØŸ-™-ò 	Q‰JˆB�Ø�]Ò"Ø"&‘à—‘˜U×-Ñ-°¸FÈÐ-ÓOÕPð		Qñ
 Ø�L‰L˜×)Ñ)¨]ÀÐ)ÓGÔHØ&*§n¡nÐ&@�D—N’NÐFWˆ	Ü˜"œeŸh™h×2Ñ2Ô3Ð3Ð3Ü# B¨	°4·>±>ÓBñ O	EÜœyŸ™×<Ñ<¸UÓCÈTÔRó NE�Ü'¨Ó-�Ø—7‘7˜mÒ+ØŸ™ Ð(°·±Ñ=Ø ô
 9¸ÐPUÕVØà!Ÿ]™]¨D¯G©G°VÐ+<Ñ=ó BE�EØ—|’|ÙØŸ™×+Ñ+¨DÓ1�Aô ! œÜÜ&¤sÐ+IÈ1Ï7É7Ó'SÓTóð òð
 !ô ! œÜÜ&ñ 'à)*¯©ô'ó óð òð !Ü)¨$¯)©)Ô4ÜŸ™ L°$¸¿	¹	À1ÀeÇmÁmÔTä •{¤~°e×6GÑ6GÈÓ6JÖ'KØ ™
˜Ü% eÔ-DÔEô $IÈÐPQÔ#Rô !9¸ÀÇÁÔ Hà%)ñ 4ô
 (¨Ô/@ÔAØ6:Ñ3ä6NØ % q§w¡wó7Ð3ô & eÔ->Ô?Ü!:¸5Ó!Að <ÐEUØ %§¡¨A¨u°dÔ ;÷<à/×HÑHÔJÜ ;¸EÕ BØ4Ð@Ø!ŸK™K¨¨5°$Ô7Ü8¸Ð@WÕXà!ŸK™K¨¨5°$Ô7Ü ¤Ñ)Ð*AÓBÀaÑGÓBÜ ¤Ñ)Ð*AÓBÄcÈ!Ï'É'ÃlÑRÓBô Ÿ:™:Ÿ>™>Ð*MÖNÜ& u¨n¸dÔCØ/4×/AÑ/A¡ð 16·±×0GÑ0G×0PÑ0P Ü),¨T¯[©[Ó)9 Ø2?°ÀÀ&ÀÐ/J ä-4¨IÐ5QÐ*R˜KÜ$ [Ñ1°,Ó?À1ÑDÕ?òEBEñNE÷O	Eð` ˆ÷1<ñ <ú÷qO	Eð` ˆús:   Å9E2S(Ë,S(ÌA>S(ÎS	ÎB;S(ÑA9S(ÓS%Ó S(Ó(S2c                ó8   — | j                   j                  «        y rN   )r’  Úclearri   s    r9   r­  zPatternMatcherPass.clear˜	  s   € Ø�‰×ÑÕr;   rÿ   )r�   r0   r“  r0   r=   rl   )r•  r(  r=   r)  )rý  ú%torch.fx.GraphModule | torch.fx.Graphr=   r)  rk   )	rL   rW   rX   r  rj   r'  r0  r­  r  r  s   @r9   r5  r5  	  sF   ø„ ñð !%Ø $ðLàðLð ðLð 
õ	Ló$#ón÷`r;   r5  c                 ó   — t         ‚rN   r}  r®   s     r9   Ú_not_implementedr°  œ	  s   € Ü
Ðr;   c                ó  ‡‡‡‡	‡
‡— |xs i }|j                  «       D ��ci c]  \  }}||“Œ
 c}}Š
t        ‰
«      t        |«      k(  sJ ‚	 d	 	 	 	 	 dˆˆ
fd„Št        j                  «       Š	 G ˆˆ	ˆˆˆfd„dt        j
                  j                  «      }t        | t        j
                  j                  «      sJ ‚ || «      j                  «       }t        |t        «      st        t        j                  |«      «      S |S c c}}w )z–
    Convert an FX graph into a PatternExpr.  This is useful for simple
    patterns that can only match single functions and fixed-length lists.
    c                óî   •— |�|n‰}t        | t        t        f«      r| ‰v rt        ‰|    «      S t	        | «      |v r
t        «       S t        | t        «      rt        d„ | D «       «      r| r
t        «       S | S )Nc              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wrN   )rD   rA  )rx   Úys     r9   r{   z5fx_to_pattern.<locals>.process_arg.<locals>.<genexpr>»	  s   è ø€ Ò&IÀ!¤z°!´W×'=Ñ&Iùs   ‚)rD   r*  r)  rK  r›  rA  rž   r5   )rŒ  Úignore_types_overrideÚcurrent_ignore_typesr(  Úinv_scalar_workarounds      €€r9   Úprocess_argz"fx_to_pattern.<locals>.process_arg±	  sy   ø€ ð &;Ð%FÑ!ÈLð 	ô �aœ%¤˜Ô&¨1Ð0EÑ+EÜÐ3°AÑ6Ó7Ð7Ü�‹7Ð*Ñ*Ü“9ÐÜ�aœÔ¤3Ñ&IÀqÔ&IÔ#IÉaÜ“9ÐØˆr;   c                  ól   •‡ — e Zd ZeZeZeZ	 	 	 	 	 	 	 	 dˆˆˆfd„Z	 	 	 	 	 	 	 	 dˆˆfd„Zdˆ fd„Z	ˆ xZ
S )ú fx_to_pattern.<locals>.Converterc                óØ   •— t        ‰«      }|t        ‰«      k  r‰|   }n1‰r|j                  d«      sJ ‚|}nt        j                  dd|«      }|}|‰v rt        |«      S t        |«      S )NÚtangentz_\d+$rx  )r¾   rÈ   Ú
startswithÚreÚsubr_  rK  )	rQ   rÉ   rR   rS   rµ   rO  r�  ÚargnumrÖ  s	         €€€r9   rM  z,fx_to_pattern.<locals>.Converter.placeholderÊ	  su   ø€ ô �V“ˆAØ”3�x“=Ò Ø ‘{‘ÙØ×(Ñ(¨Ô3Ð3Ð3Ø‘äŸ™ ¨"¨fÓ5�Ø�ØÐ*Ñ*Ü*¨4Ó0Ð0ä! $Ó'Ð'r;   c                ó`  •— ‰	}|t         j                  u rt        d„ ‰D «       «      f	 	 	 	 	 dˆ	fd„}|}t        j                  |||f«      \  }}t
        ‰v r>|D �cg c]
  } ||«      ‘Œ }}|j                  «       D ��ci c]  \  }}| ||«      “Œ }}}t        |g|¢­i |¤ŽS c c}w c c}}w )Nc              3  ó2   K  — | ]  }|t         usŒ|–— Œ y ­wrN   )r)  )rx   Úts     r9   r{   zAfx_to_pattern.<locals>.Converter.call_function.<locals>.<genexpr>ë	  s   è ø€ ò NØ°1¼C²<œñNùs   ‚�c                ó   •—  ‰| |«      S rN   rO   )rŒ  rµ  r¸  s     €r9   Úprocess_arg_fn_implzKfx_to_pattern.<locals>.Converter.call_function.<locals>.process_arg_fn_implé	  s   ø€ ñ ' qÐ*?Ó@Ð@r;   ©rŒ  rc   rµ  zSequence[type[Any]] | Noner=   zT | KeywordArg | Ignored)rs  rj  r©   r   rî   rž   rŠ   rÌ  )
rQ   rÉ   rR   rS   Úprocess_arg_fnrÅ  rÆ  ry   r(  r¸  s
           €€r9   rÍ  z.fx_to_pattern.<locals>.Converter.call_functionß	  sÚ   ø€ ð )ˆNàœ×)Ñ)Ñ)ô INñ NØ#/ôNó IðAØðAà+EðAð
 .õAð "5�ä!Ÿ?™?¨>¸DÀ&¸>ÓJ‰LˆD�&Ü�|Ñ#à37Ö8¨a™ qÕ)Ð8�Ð8Ø;A¿<¹<»>×J±4°1°a˜!™^¨AÓ.Ñ.ÐJ�ÑJÜ Ð8¨Ò8°Ñ8Ð8ùò 9ùÛJs   ÁB%Â B*c                ól  •— t         ‰| �  |«      }|j                  dk(  rzt        |t        «      rj|j
                  d   }t        |t        «      sJ ‚t        |«      t        |«      k(  sJ ‚t        ||«      D ]  \  }}t        |j                  «      |_	        Œ! |S t        |j                  «      |_	        |S )Nrö  r   )
r�   rQ  rn  rD   r©   rR   r   rÈ   rð   r³   )rQ   rµ   ÚrvrR   ÚrrÖ   rŸ   s         €r9   rQ  z)fx_to_pattern.<locals>.Converter.run_nodeú	  sŸ   ø€ Ü‘Ñ! !Ó$ˆBØ�t‰t�xÒ¤J¨r´5Ô$9Ø—v‘v˜a‘y�Ü! $¬
Ô3Ð3Ð3Ü˜2“w¤# d£)Ò+Ð+Ð+Ü! " d›mò -‘F�A�sä! #§)¡)›n�A•Gð-ð
 ˆIô ˜qŸw™w›<�”ØˆIr;   )rÉ   rK   rR   r  rS   úMapping[str, Any]r=   z ExclusiveKeywordArg | KeywordArg)rÉ   rK   rR   r  rS   rË  r=   r’   )rµ   rå   r=   r   )rL   rW   rX   r°  rÑ  rÕ  rN  rM  rÍ  rQ  r  )rŸ   r�  rÀ  rÖ  r(  r¸  s   @€€€€€r9   Ú	Converterrº  Á	  sr   ù„ à&ˆà&ˆà#ˆð	(àð	(ð  ð	(ð &ð		(ð
 .÷	(ð*	9àð	9ð  ð	9ð &ð		9ð
 ö	9÷6	ñ 	r;   rÌ  rN   rÆ  )rŠ   rÈ   rŽ  r¦  rs   rt   rz  rD   rT  r  r’   rñ  r   rØ  )rý  r(  r�  rš  rÖ  ry   rz   rÌ  r“   rÀ  r·  r¸  s    `` `    @@@r9   rÚ  rÚ   	  s÷   ý€ ð *Ò/¨RÐØ.?×.EÑ.EÓ.G×H¡d a¨˜Q ™TÓHÐÜÐ$Ó%¬Ð->Ó)?Ò?Ð?Ð?ð CGðØðØ%?ðà	!öô �_‰_Ó€F÷Dò D”E—H‘H×(Ñ(ô DôL �bœ%Ÿ(™(×.Ñ.Ô/Ð/Ð/Ù˜‹m×ÑÓ!€GÜ�gœ{Ô+Ü!¤&×"4Ñ"4°WÓ"=Ó>Ð>Ø€Nùó{ Is    D)rÐ   rÕ  c               ó6  — t        «       5  t        «       5   t        |  |«       d¬«      |Ž }ddd«       ddd«       ddlm} |r, |j
                  «       |j
                  j                  «        j                  «        |S # 1 sw Y   ŒWxY w# 1 sw Y   Œ[xY w)z>Build a normalized inference graph, for use with fx_to_patternÚreal)Útracing_modeNr*   ©Úremove_noop_ops)r   r   r   Úfx_passes.post_gradrÑ  r¡   Úeliminate_dead_codeÚ	recompile)ra   rR   rÐ   rÕ  rý  rÑ  s         r9   rë   rë   
  s�   € ô 
"Ó	#ñ FÔ%7Ó%9ñ FØ>ŒW�R™›°vÔ>ÀÐEˆ÷F÷ Fõ 5áÙ˜Ÿ™Ô!ð 	�‰×$Ñ$Ô&à‡L�L„NØ€I÷%Fð Fú÷ Fð Fús!   ‹B–B­BÂB	ÂBÂBrÔ  c          
     ó   ‡— dŠ	 	 	 	 	 	 	 	 d
ˆfd„}t         j                  j                  d«      5   t        | d„ | |«       dd¬«      |Ž  ddd«       ‰sJ ‚ddlm}  |‰j                  «       dd	lm} |j                  ‰j                  «       t         j                  j                  j                  «       ‰j                  _        ‰j                  j                  «        ‰j                  «        ‰S # 1 sw Y   Œ©xY w)z=Build a normalized training graph, for use with fx_to_patternNc                ó<   •— ‰rJ ‚t        | «      Št        | |fi |¤ŽS rN   )Úclone_graphr&   )Újoint_graphÚinputsrS   rý  s      €r9   Úrecord_joint_graphz)joint_fwd_bwd.<locals>.record_joint_graph7
  s(   ø€ ñ ˆˆvÜ˜Ó%ˆÜ  ¨fÑ?¸Ñ?Ð?r;   c                ó   — t        | «      S rN   )r%   )rý  r™  s     r9   r×   zjoint_fwd_bwd.<locals>.<lambda>C
  s   € ¤°rÓ':€ r;   TF)Úpartition_fnÚdecompositionsÚkeep_inference_input_mutationsÚ
enable_logr*   rÐ  )Úearly_patterns)rØ  rb   rÙ  r  rS   r   r=   z1tuple[torch.fx.GraphModule, torch.fx.GraphModule])rs   Ú_guardsÚtracingr$   rÒ  rÑ  r¡   Úfx_passes.joint_graphrà  r0  rt   ÚCodeGenÚ_codegenrÓ  rÔ  )ra   rR   rÕ  rÚ  rÑ  rà  rý  s         @r9   rö  rö  -
  sñ   ø€ ð '+€Bð@Ø)ð@Ø3@ð@ØLOð@à	:õ@ô 
�‰×	Ñ	˜tÓ	$ñ 	ð	
ŒØá:Ø+Ù(›?Ø+/Øô	
ð ñ	÷	ñ €Iˆ2å4á�B—H‘HÔå5à×Ñ˜Ÿ™Ô"ô Ÿ™Ÿ™×.Ñ.Ó0€B‡H�HÔØ‡H�H× Ñ Ô"Ø‡L�L„NØ€I÷1	ð 	ús   ±C4Ã4C=c                óŠ   — g }t         j                  j                  | j                  | j                  f|j
                  «       |S rN   )rs   rt   rï   rR   rS   r†   )rµ   rR   s     r9   rµ  rµ  Z
  s1   € Ø)+€DÜ	‡H�H×Ñ�a—f‘f˜aŸh™hÐ'¨¯©Ô5Ø€Kr;   c                óT  — t        t        | j                  «      «      }t        t        j
                  j                     «       }t        t         «      }d }|r¨|j                  «       }t        |«      D �cg c]	  }||vsŒ|‘Œ }}|r||d      j                  |«       n^|j                  |«       |r|j                  |ur|j                  |«       |}|j                  t        |j                  |d«      «      «       |rŒ¨|s!t        |«      t        | j                  «      k(  sJ ‚y c c}w )Nr?  rO   )rž   r±   r—   r    rs   rt   rÒ   r   r  rµ  r†   rÀ  r¾   r¥   rÈ   )r¡   ÚpendingÚreadyÚwaitingÚcursorrÎ   rŒ  Úwaiting_fors           r9   Ústable_topological_sortrí  `
  sý   € ô ”8˜EŸK™KÓ(Ó)€Gô ”u—x‘x—}‘}Ñ%Ó'€Eô œ$Ó€Gð €FÙ
Ø�{‰{‹}ˆÜ"'¨£+Ö@˜Q°¸%²’qÐ@ˆÐ@Ùð �K ‘OÑ$×+Ñ+¨DÕ1à�I‰I�dŒOÙ˜&Ÿ+™+¨TÑ1Ø—‘˜dÔ#ØˆFð �N‰Nœ8 G§K¡K°°bÓ$9Ó:Ô;ò ñ  œ3˜u›:¬¨U¯[©[Ó)9Ò9Ð9Ð9Ð9ùò As   Á4	D%Á>D%c                óÄ   ‡ ‡— t        j                  ‰ «      j                  Št        j                  t        j
                  ‰ «      dt        f	 	 	 	 	 dˆˆ fd„«       «       }|S )z0Wrapper around lazy init functions in fx_passes/Nc                ót  •— t         t           j                  «       }i }d‰v r| |d<   d‰v r||d<   t        j                  j                  d «      5  t        «       5  t        «       5   ‰di |¤Ž}d d d «       d d d «       d d d «       |t         t        <   S # 1 sw Y   Œ(xY w# 1 sw Y   Œ,xY w# 1 sw Y   Œ0xY w)NÚinput_devicerÕ  rO   )r   r¤  r…   rs   rá  râ  r   r(   )rð  rÕ  Úcounters_refrS   rX  Ú
_fn_paramsra   s        €€r9   Ú	lazy_initz%init_once_fakemode.<locals>.lazy_init‰
  s¹   ø€ ô  ¤Ñ(×-Ñ-Ó/ˆà!#ˆØ˜ZÑ'Ø%1ˆF�>Ñ"Ø˜jÑ(Ø&3ˆF�?Ñ#ä�]‰]×"Ñ" 4Ó(ñ 	"Ô*@Ó*Bñ 	"ÄNÓDTñ 	"Ù‘\˜&‘\ˆF÷	"÷ 	"÷ 	"ð )Œ”Ñàˆ÷	"ð 	"ú÷ 	"ð 	"ú÷ 	"ð 	"ús<   ÁB.ÁB"Á&	BÁ/B"Á7B.ÂBÂB"Â"B+	Â'B.Â.B7)rð  z
Any | NonerÕ  ú,Callable[..., dict[Any, Callable[..., Any]]]r=   r   )rð  rñ  rò  ré   r#  r@  r+   )ra   ró  rò  s   ` @r9   Úinit_once_fakemoderõ  „
  sn   ù€ ô ×"Ñ" 2Ó&×1Ñ1€Jä‡_�_Ü‡_�_�RÓà#'ô  ð	Ø ðð
ðð
 
õó ó ðð, Ðr;   c                ó   ‡ — dˆ fd„}|S )z2Function for extra_check to put pass behind a flagc                ó$   •— t        t        ‰«      S rN   )rr  r#   )r  rO  s    €r9   Ú
flag_checkzconfig_flag.<locals>.flag_check§
  s   ø€ Ü”v˜tÓ$Ð$r;   )r  r‘   r=   r   rO   )rO  rø  s   ` r9   Úconfig_flagrù  ¤
  s   ø€ õ%ð Ðr;   c                óL   —  G d„ dt         «      } || «      j                  «       S )Nc                  ó    ‡ — e Zd Zdˆ fd„Zˆ xZS )úclone_graph.<locals>.CopyGraphc                óJ  •— t         ‰| �  |«      }t        |t        j                  j
                  «      rn|j                  j                  j                  |j                  «       | j                  j                  j                  |j                  d «      |j                  _        |S rN   )r�   rQ  rD   rs   rt   ÚProxyrÎ   r‰   rˆ   Ú	new_graphÚ_graph_namespacer  rO  )rQ   rŒ   rþ   rŸ   s      €r9   rQ  z'clone_graph.<locals>.CopyGraph.run_node¯
  sq   ø€ Ü‘wÑ'¨Ó1ˆHÜ˜(¤E§H¡H§N¡NÔ3Ø—‘×"Ñ"×)Ñ)¨(¯-©-Ô8Ø%)§^¡^×%DÑ%D×%PÑ%PØ—M‘M 4ó&�—‘Ô"ð ˆOr;   )rŒ   rå   r=   rå   )rL   rW   rX   rQ  r  r  s   @r9   Ú	CopyGraphrü  ®
  s   ø„ ÷	ñ 	r;   r  )r)   Ú	transform)Úinput_graphr  s     r9   r×  r×  ­
  s$   € ô	”Kô 	ñ �[Ó!×+Ñ+Ó-Ð-r;   Ú_seen_patternsc                óŒ   — t        | j                  «      |kD  r| j                  |   S |€y | j                  j                  |«      S rN   )rÈ   rR   rS   rA   )rÎ   Ú
arg_numberÚ
kwarg_names      r9   Úget_arg_valuer  À
  s?   € ô ˆ4�9‰9ƒ~˜
Ò"Ø�y‰y˜Ñ$Ð$Ø	Ð	Øà�{‰{�‰˜zÓ*Ð*r;   c                óÖ   — |g}t        |t        j                  j                  «      r|j	                  |j                  «       «       | D �cg c]  }|j                  |v sŒ|‘Œ c}S c c}w rN   )rD   rs   rj  rk  r¥   rl  rÉ   )r—   ra   rf  rÎ   s       r9   Úfilter_nodesr
  Ë
  sO   € Øˆ$€CÜ�"”e—j‘j×1Ñ1Ô2Ø�
‰
�2—?‘?Ó$Ô%à"Ö9�T d§k¡k°SÒ&8ŠDÒ9Ð9ùÒ9s   ÁA&ÁA&c                ó  — | j                   dk(  rqt        | j                  t        «      sJ ‚| j                  j
                  €t        d«      ‚t        | j                  j
                  | j                  «      j                  S | j                  S )z©For call_function and call_method, we directly use the target function;
    For call_module, the target is string, and we treat the module class
     as a function.
    rÕ  z)node.graph.owning_module must not be None)	rn  rD   rÉ   rK   r¡   rU  ÚAssertionErrorr   rŸ   rk  s    r9   r€  r€  Ó
  sk   € ð
 ‡w�w�-ÒÜ˜$Ÿ+™+¤sÔ+Ð+Ð+Ø�:‰:×#Ñ#Ð+Ü Ð!LÓMÐMÜ˜Ÿ™×1Ñ1°4·;±;Ó?×IÑIÐIØ�;‰;Ðr;   )rF   rK   r=   rE   )rx  )r‹   r•   rŒ   rå   r�   rK   r=   rl   )r  r$  r=   zTypeIs[Match]rï  )r‰  r<  r,  r  r=   rl   )rO  rK   r–  r”  r=   rK   )r�  úSequence[str]r™  r  rš  zdict[str, float | int]r=   r”   )r�  r  rR   r  r=   r�  rN   )rS   rË  r¦  r�  r§  zMapping[str, Any] | Noner=   r•   r_  rï  )
r“   r’   r¡   ztorch.fx.Graph | Noner¸  zdict[str, list[str | None]]r¹  rE   r=   rE   )r‰  rJ   ræ  r[   r™  zlist[Any] | tuple[Any, ...]rõ   r_   r7  r9  r-  r,  rš  údict[str, float | int] | NonerÖ  r  rç  zPatternExpr | Noner¹  rE   rH  r0   rÕ  rô  r=   rE   )r  rK   r‰  rJ   r™  r  rõ   r_   rš  r  r=   r’   )r  rK   r‰  rJ   ræ  r[   r™  zIterable[Any]rõ   r_   r7  r9  r-  r,  rš  r  rÖ  r  r¹  rE   rÕ  rô  r=   rl   )r‰  rJ   r™  r  rõ   r_   rš  r  rÖ  r  rÕ  rô  r=   z(tuple[PatternExpr, torch.fx.GraphModule])NrO   )r‰  rJ   r™  r  rõ   r_   rš  r  rÖ  r  r=   r’   )
r“   r’   r-  r,  r3  r%  r3  rE   r=   z2Callable[[Callable[..., Any]], Callable[..., Any]])r¡   r   rÎ   rå   r=   rE   )rn  ztorch._ops.OpOverloadr=   rE   r…  )rÆ  rå   rÇ  rå   r=   rE   )r¡   r   rÎ   rå   r=   r)  )r¡   r   r=   rE   )r¡   r   r=   rl   )r¡   r   r=   z,Generator[_GraphMutationTracker, None, None])rx  rå   rZ  rå   r=   r)  )r—   úIterable[torch.fx.Node]r=   rE   )r}  rÁ   r  r‘   r=   rE   )r¡   r   r—   rƒ  r=   rX  )r¡   r   r†  rX  r=   rl   )ra   r   r�  rŽ  r=   r   )rR   r   rS   r   r=   r   )rO   rO   NrO   )rý  r®  r(  zSequence[type[Any]]r�  r  rš  r  rÖ  r  r=   r’   )
ra   r<  rR   r  rÐ   rE   rÕ  r<  r=   rb   )ra   r<  rR   r  rÕ  r<  r=   rb   )rµ   rå   r=   zlist[torch.fx.node.Argument])ra   r<  r=   r<  )rO  rK   r=   zCallable[[Match], Any])r  rb   r=   rb   )rÎ   rå   r  r)  r  r0   r=   r   )r—   r  ra   r   r=   r–   )rÎ   rå   r=   ztorch.fx.node.Target)Ér  Ú
__future__r   rç   rd  ré   r!  rð  rŽ  Úloggingrs  r?   r¾  r  rX  Úabcr   r   Úcollectionsr   Úcollections.abcr   r   r	   r
   r   r   Úpathlibr   r   r   r   r   Útyping_extensionsr   r   rs   Útorch._guardsÚtorch.fxÚtorch.utils._pytreerì   rí   r   Útorch._dispatch.pythonr   Útorch._dynamo.utilsr   Útorch._prims_commonr   Útorch._subclasses.fake_tensorr   Ú"torch.fx.experimental.proxy_tensorr   Ú%torch.fx.experimental.symbolic_shapesr   r   Útorch.fx.graph_moduler   Útorch.fx.immutable_collectionsr   r   Ú(torch.fx.passes.graph_transform_observerr   r‚   r   Útorch.utils._ordered_setr    Ú
_functorchr#   rø  Ú_functorch.aot_autogradr$   r%   Ú_functorch.partitionersr&   Ú_subclassesr'   r(   rt   r)   rx  Údecompositionr+   Úloweringr,   Ú	getLoggerrL   r‡  rÊ   ÚatenÚprimsÚConstantrÒ   r#  r@   rA   r¤  r/   rY   r1   rH   rJ   r[   r_   rc   rÎ   ÚTargetrK   ÚFnsTypere   rg   r�   r‘   r  r¤   r$  r  r™   r’   r;  rA  rK  r_  re  r©   Ú_SimpleSpecr‡  rÌ  rÐ  rÔ  r×  rÜ  rß  râ  rä  rñ  r  rI  r%  Ú	dataclassr+  r;  rD  rÁ   r…  rŠ  r�  r—  rž  r£  r­  r¯  r¼  rÿ  r   r  Ú__file__Úparentr  r  r&  rù  rú  r  r7  r:  r<  ÚcompilerH  r@  rJ  rN  rQ  rS  rV  rX  r]  Úcontextmanagerru  ry  rb  r~  r„  r‡  rô  r5  r°  rÚ  Úno_gradrë   Úenable_gradrö  rµ  rí  rõ  rù  r×  r  r  r
  r€  rO   r;   r9   ú<module>r8     s�	  ðò!õF #ã Û Û Û Û Û Û Û Û 	Û 	Û Û ß #Ý #ß X× XÝ ß 3Ó 3ß *ã Û Û ß $Ð $Ý ;Ý (Ý 0Ý @Ý 6ß WÝ +ß IÝ KÝ 1Ý /å 3ß CÝ 7ß 4Ý Ý Ý .Ý ;ð €g×Ñ˜Ó!€Ø‡y�y‡~�~€Ø�	‰	�‰€à€Ø˜EŸH™HŸM™MÑ)€à
�*‰*�.‰.Ð>À
Ó
K€ð 59Ð Ð1Ó 8Ø+/Ð ˜jÓ /ó$ô4>ˆxô >ô>�ô >ô#ˆhô #ñ ˆCƒL€ð �(‰(�-‰-×
Ñ
 Ñ
$€÷?ñ ?ñ ‹:€ð IKð?Øð?Ø(5ð?ØBEð?à	ó?÷BLñ Lô^�,ô ð8 �kÑ!€ó÷'
ñ '
ôT 1�#ô  1ôF-ˆ+ô -ôˆkô ôE�ô Eô(E˜+ô Eô4O
�+ô O
ðd �C˜�H‰o€ôo
�kô o
ôd�?ô ô�ô ô�ô ô˜ô ô(Ð,ô ôÐ*ô ôÐ*ô ô,
ˆ[ô ,
ô^F
˜ô F
ôR%
�;ô %
÷P4ñ 4ôn!�Xô !ð ×Ò÷:ð :ó ð:ð: ×Òô
˜<ó 
ó ð
ð ×Òô	=˜ó 	=ó ð	=ð ×Òôs
˜ló s
ó ðs
ólóð €×Ò˜dÔ#÷)ð )ó $ð)ó
ðØðà!ðð .ðð ó	ó ð@ *.ð!Øð!àð!ð 'ð!ð ó	!óH&ð "ð	'Øð'à ð'ð /ð'ð ð	'ð
 
ó'ð` ,8Ø7;Ø)+Ø,0Ø!Ø#ØBUðEØðEàðEð 0ðEð ð	Eð
 :ðEð )ðEð 5ðEð 'ðEð *ðEð ðEð ðEð @ðEð 
óEñP )3«Ð �oÓ 4ðMØðMàðMð "ðMð ð	Mð
 5ðMð óMñ` ˜x›.×/Ò/°+Ñ=Ð@UÑUÐ ð ð ð ó ð$ ,8Ø7;Ø)+Ø!ØBUð8Øð8àð8ð ð8ð "ð	8ð
 ð8ð :ð8ð )ð8ð 5ð8ð 'ð8ð ð8ð @ð8ð 
ó8ðv Ð×Ò¨eÔ4ð
 8<Ø)+ØBUðØðà!ðð ðð 5ð	ð
 'ðð @ðð .òó 5ððB 8<Ø)+ð		Øð		à!ð		ð ð		ð 5ð			ð
 'ð		ð ó		ð ,8ðð
 ñØðà(ðð ð	ð
 ðð 8óð4 ,8ðð
 ñØðà(ðð ð	ð
 ðð 8óó,+ð �"—*’*ÐVÓW€óEó.ó(Hó
óDó;ð €×Ò˜dÔ#÷ð ó $ðð ×Ò÷Vð Vó ðVð ×Òð!7Øð!7à1ò!7ó ð!7óHó3ðØ"ðØ+0ðà	óðØðà"ðð óð2Øðà#ðð 
óó>÷ Kñ Kó\ð )+Ø Ø7;Ø)+ðkØ-ðkà%ðkð ðkð 5ð	kð
 'ðkð ókð\ €‡‚ƒð
 #'Ø(;ñØðà
ðð  ð	ð
 &ðð òó ðð< €×ÒÓð
 )<ñ	)Øð)à
ð)ð &ð	)ð
 ò)ó ð)óXó!:óHó@ó.ñ  #-£,€�Ó .ð DHð+Ø
ð+Ø%(ð+Ø6@ð+àó+ó:ô
r;   