ó
    EñiIL ã                  ón
  • % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKJrJr  SSKJr  SSKJrJrJrJrJrJr  SSKJr  SSKJrJrJrJ r J!r!J"r"  SS	K#J$r$J%r%  SSK&r&SSK'r&SSK(r&SSK)J*s  J+r,  SS
K-J.r.  SSK/J0r0  SSK1J2r2  SSK3J4r4  SSK5J6r6  SSK7J8r8J9r9  SSK:J;r;  SSK<J=r=J>r>  SSK?J@r@  SSKAJBrB  SSKCJDrD  SSKEJFrG  SSKHJIrIJJrJ  SSKKJLrL  SSKMJNrNJOrO  SSKPJQrQ  SSKRJFrF  SSKSJTrT  SSKUJVrV  \	R®                  " \X5      rY\&R´                  R¶                  r[\&R´                  R¸                  r\\r]\"\]\&R                   R¼                  4   r_\RÀ                  RÃ                  SS5      rb " S  S!\ 5      rc " S" S#\ 5      rd " S$ S%\ 5      re\!" S&5      rf\"\&R                   RÎ                  RÐ                  \i4   rj " S' S(5      rk\k" 5       rl SŽ       S�S) jjrm " S* S+5      rn " S, S-\o5      rp\"\n\p4   rqS�S. jrr " S/ S05      rs " S1 S2\5      rt " S3 S4\t5      ru " S5 S6\t5      rv " S7 S8\t5      rw " S9 S:\t5      rx " S; S<\t5      ry\z\S=4   r{ " S> S?\y5      r| " S@ SA\|5      r} " SB SC\|5      r~ " SD SE\|5      r " SF SG\y5      r€ " SH SI\€5      r� " SJ SK\€5      r‚ " SL SM\€5      rƒ " SN SO\t5      r„ " SP SQ\t5      r… " SR SS\t5      r† " ST SU5      r‡ " SV SW\ 5      rˆ\GR                   " SX SY5      5       rŠ\GR                   " SZ S[\Š5      5       r‹\GR                   " S\ S]\Š5      5       rŒ\GR                   " S^ S_\Š5      5       r�S‘S` jrŽS’Sa jr� S“         S”Sc jjr�\ŽSSdSSb4                     S•Se jjr‘\D" 5       r’Sf\“Sg'               S–Sh jr”\" \•5      GR,                  Si-  Sj-  r—/ r˜Sk\“Sl'   \ŽSSdSb4                     S—Sm jjr™\GGR4                  " SbSn9  S˜           S™So jj5       r›  S˜           SšSp jjrœ\Ž4SbSq.         S›Sr jjjr�\Ž4SbSq.         S›Ss jjjržSœSt jrŸ\GR@                  " Su5      r¡S�Sv jr¢SžSw jr£SŸSx jr¤S Sy jr¥S¡Sz jr¦S¢S{ jr§S£S| jr¨ " S} S~5      r©S¤S jrª    S¥           S¦S€ jjr«\&GRX                  " 5       S�SS‚.         S§Sƒ jj5       r­\&GR\                  " 5       S¨S„ j5       r¯S©S… jr°S¢S† jr±SªS‡ jr²S«Sˆ jr³S¬S‰ jr´\D" 5       rµSf\“SŠ'    S­       S®S‹ jjr¶S¯SŒ jr·S°S� jr¸g)±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ÚOptionalÚProtocolÚTypeVarÚUnion)Ú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Úinductorc                  ó*   • \ rS rSr% S\S'   SS jrSrg)ÚSearchFné]   ÚstrÚ__name__c                ó   • g ©N© ©ÚselfÚargsÚkwargss      Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/pattern_matcher.pyÚ__call__ÚSearchFn.__call__`   ó   € ¸#ó    r8   N©r;   r   r<   r   Úreturnr   )r5   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r>   Ú__static_attributes__r8   rA   r=   r2   r2   ]   s
   ‡ ØƒMç=rA   r2   c                  ó   • \ rS rSrSS jrSrg)Ú	ReplaceFnéc   c                ó   • g r7   r8   r9   s      r=   r>   ÚReplaceFn.__call__d   r@   rA   r8   NrB   ©r5   rD   rE   rF   r>   rH   r8   rA   r=   rJ   rJ   c   s   † ß=rA   rJ   c                  ó.   • \ rS rSr        SS jrSrg)ÚTraceFnég   c                ó   • g r7   r8   )r:   Úfnr;   r<   s       r=   r>   ÚTraceFn.__call__h   s   € à"rA   r8   N)rS   zUnion[SearchFn, ReplaceFn]r;   r   r<   r   rC   útorch.fx.GraphModulerN   r8   rA   r=   rP   rP   g   s'   † ð#Ø,ð#Ø58ð#ØDGð#à	÷#rA   rP   ÚTc                  ó   • \ rS rSrSS jrSrg)ÚMultipleés   c                ó8   • S[        5       ;  d  U [        L d   eg g )NÚMULTIPLE)Úglobalsr[   ©r:   s    r=   Ú__init__ÚMultiple.__init__t   s   € à¤£Ó*¨d´hÒ.>Ð>Ð>Ð.>Ð*rA   r8   N©rC   ÚNone)r5   rD   rE   rF   r^   rH   r8   rA   r=   rX   rX   s   s   † ÷?rA   rX   c                óä  • SSK JnJn  [        R                  R
                  S:X  aw  U R                  S/ 5      R                  5       nUR                  U" XUR                  5      5        U R                  S UR                  R                  5        5       5        XPS'   O0U R                  S UR                  R                  5        5       5        SUR                  ;   a  UR                  S   U S'   g g )Nr   )Ú
NodeSourceÚNodeSourceActionr,   Ú	from_nodec              3  ó€   #   • U  H4  u  pU[         R                  R                  R                  ;   d  M/  X4v •  M6     g 7fr7   ©ÚtorchÚfxÚproxyÚ_COPY_META_FIELDS©Ú.0ÚkÚvs      r=   Ú	<genexpr>Ú!_transfer_meta.<locals>.<genexpr>‰   ó3   é € ð 
â-‘�Ø”E—H‘H—N‘N×4Ñ4Ñ4ó ˆQ�FÚ-ùó   ‚.>´
>c              3  ó€   #   • U  H4  u  pU[         R                  R                  R                  ;   d  M/  X4v •  M6     g 7fr7   rg   rl   s      r=   rp   rq   �   rr   rs   Ústack_trace)Útorch.fx.tracebackrc   rd   r%   ÚtraceÚprovenance_tracking_levelÚgetÚcopyÚappendÚREPLACEÚupdateÚmetaÚitems)Únew_metaÚold_nodeÚ	pass_namerc   rd   Únew_from_nodes         r=   Ú_transfer_metar„   }   sÍ   € ÷ @ô
 ‡|�|×-Ñ-°Ó2à Ÿ™ [°"Ó5×:Ñ:Ó<ˆØ×Ñ™Z¨Ð=M×=UÑ=UÓVÔWØ�‰ñ 
à Ÿ™×+Ñ+Ô-ó
ô 	
ð
 !.�Òà�‰ñ 
à Ÿ™×+Ñ+Ô-ó
ô 	
ð
 ˜Ÿ™Ó%Ø"*§-¡-°Ñ">ˆ�Òð &rA   c                  ó  ^ • \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   S\S'     S         SU 4S jjjr\SS j5       rSS jr	S S jr
S!S jrS"S jrS#S jrS$S jr      S%S jr  S&         S'S jjrSrU =r$ )(ÚMatché™   ao  
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]r;   údict[str, Any]r<   úlist[torch.fx.Node]Únodesz'dict[_TargetExpr, torch.fx.node.Target]ÚtargetsÚMatchContextÚctxzOptional[torch.fx.GraphModule]Úreplacement_graphc                ó¶   >• [         TU ]  5         X l        [        U=(       d    / 5      U l        U=(       d    0 U l        / U l        0 U l        Xl        S U l	        g r7   )
Úsuperr^   r‰   Úlistr;   r<   r�   rŽ   r�   r‘   )r:   r�   r‰   r;   r<   Ú	__class__s        €r=   r^   ÚMatch.__init__­   sK   ø€ ô 	‰ÑÔØŒä˜Ÿ Ó$ˆŒ	Ø—l ˆŒàˆŒ
àˆŒØŒØ!%ˆÕrA   c                ó.   • U R                   R                  $ r7   )r�   Úgraphr]   s    r=   r˜   ÚMatch.graphÀ   s   € à�x‰x�~‰~ÐrA   c                óB  • U R                   (       az  [        U R                   R                  5       5      [        UR                   R                  5       5      -   H/  nU R                   U   UR                   U   :w  d  M%  [        SU5      e   U R                  R                  UR                  5        U R                  R                  UR                  5        U R                   R                  UR                   5        U R                  R                  UR                  5        g )Nzkwarg mismatch: {})	r<   r"   ÚkeysÚFailedMatchr;   Úextendr�   r}   rŽ   )r:   ÚotherÚkeys      r=   r�   ÚMatch.extendÄ   s¿   € Ø�;�;Ü! $§+¡+×"2Ñ"2Ó"4Ó5¼
À5Ç<Á<×CTÑCTÓCVÓ8WÔW�Ø—;‘;˜sÑ# u§|¡|°CÑ'8Õ8Ü%Ð&:¸CÓ@Ð@ñ Xð 	�	‰	×Ñ˜Ÿ™Ô$Ø�
‰
×Ñ˜%Ÿ+™+Ô&Ø�‰×Ñ˜5Ÿ<™<Ô(Ø�‰×Ñ˜EŸM™MÕ*rA   c                óp   • U R                   (       a  [        U R                   5      /U l         U $ / U l         U $ r7   )r;   Útupler]   s    r=   ÚbundleÚMatch.bundleÎ   s.   € à*.¯)¯)”U˜4Ÿ9™9Ó%Ð&ˆŒ	Øˆð :<ˆŒ	ØˆrA   c                ó<   • SU R                    SU R                   S3$ )NzMatch(..., ú, Ú)©r;   r<   r]   s    r=   Ú__repr__ÚMatch.__repr__Ó   s   € Ø˜TŸY™Y˜K r¨$¯+©+¨°aÐ8Ð8rA   c                óÂ   • U R                   n[        U R                  5       H:  nUR                  (       a  M  UR                  (       a  M)  UR                  U5        M<     g r7   )r˜   Úreversedr�   Ú_erasedÚusersÚ
erase_node)r:   r˜   Úns      r=   Úerase_nodesÚMatch.erase_nodesÖ   s=   € Ø—
‘
ˆÜ˜$Ÿ*™*Ö%ˆAØ—9—9‘9 Q§W§W¡WØ× Ñ  Ö#ò &rA   c                ó’   • U R                   R                   Vs/ s H!  nUb  U R                   R                  U   OS PM#     sn$ s  snf r7   )r�   ÚoutputsÚpattern_to_node)r:   Úps     r=   Úoutput_nodesÚMatch.output_nodesÜ   sK   € ð —X‘X×%Ò%ó
â%�ð -.©MˆT�X‰X×%Ñ% aÒ(¸tÒCÙ%ñ
ð 	
ùò 
s   ™(Ac                óB   • [        S U R                  5        5       5      $ )Nc              3  ó6   #   • U  H  o(       d  M  Uv •  M     g 7fr7   r8   )rm   r¶   s     r=   rp   Ú$Match.output_node.<locals>.<genexpr>ã   s   é € Ð8Ò2˜!³a—A‘AÒ2ùs   ‚
�	)Únextr·   r]   s    r=   Úoutput_nodeÚMatch.output_nodeâ   s   € ÜÑ8˜t×0Ñ0Ô2Ó8Ó8Ð8rA   c                óX   • [         R                  X R                  R                  X5        g r7   )ÚReplacementPatternEntryÚreplace_with_graphr�   r˜   )r:   r‘   r;   s      r=   rÁ   ÚMatch.replace_with_graphå   s    € ô 	 ×2Ñ2Ø—(‘(—.‘.Ð"3õ	
rA   c                ó¦  ^• SSK JnJn  [        UR                  U5      (       a  UR                  c  UR                  O[
        R                  " 5       nSS jnU   Uc  [        R                  " [        US9nU" U R                  5      (       Ga}  0 mU R                  S   R                  S   u  pš0 U
En
[        U R                  5      U R                  pËSU4S jjn[        R                   R"                  R%                  XÛU4Xš45        [        R&                  R)                  UU4S j5      nU" X5      n[        R&                  R)                  US	 5      nU" Xþ5      n[+        UR,                  R                  5      [+        UR,                  R                  5      :X  d   e[/        UR,                  R                  UR,                  R                  5       H4  u  nnSUR                  ;   d  M  UR                  S   UR                  S'   M6     O)[        R&                  R)                  US
 5      nU" X5      n[+        U R                  5      S:X  a?  UR,                  R                   H%  n[1        UR                  U R                  S   SS9  M'     [2        R5                  U U R6                  R,                  UU5        SSS5        g! , (       d  f       g= f)zá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                óP  • [        U 5      S:w  a  gU S   nSUR                  ;  a  gUR                  [        [        R
                  R                  R                  [        R
                  R                  R                  [        R
                  R                  R                  /5      ;   $ )Nr,   Fr   Úeager_input_vals)
Úlenr~   Útargetr"   rh   ÚopsÚhigher_orderÚ triton_kernel_wrapper_functionalÚauto_functionalizedÚauto_functionalized_v2)r�   Únodes     r=   Ú!should_propagate_eager_input_valsÚCMatch.replace_by_example.<locals>.should_propagate_eager_input_vals  s~   € Ü�5‹z˜Q‹ØØ˜‘8ˆDØ!¨¯©Ó2ØØ—;‘;¤*ä—I‘I×*Ñ*×KÑKÜ—I‘I×*Ñ*×>Ñ>Ü—I‘I×*Ñ*×AÑAðó#ñ ð rA   )Úrun_functional_passesrÇ   c                ód   >• [        U [        R                  R                  5      (       a  UTU '   g g r7   )Ú
isinstancerh   ri   ÚNode)rÏ   ÚvalÚnode_to_vals     €r=   ÚrecordÚ(Match.replace_by_example.<locals>.record&  s'   ø€ Ü! $¬¯©¯©×6Ñ6Ø,/˜ DÒ)ð 7rA   c                ó   >• TU    $ r7   r8   )Úargr×   s    €r=   Ú<lambda>Ú*Match.replace_by_example.<locals>.<lambda>.  s
   ø€ À+ÈcÒBRrA   c                ó    • U R                   S   $ ©NrÖ   ©r~   ©rÛ   s    r=   rÜ   rÝ   4  s   € À#Ç(Á(È5Â/rA   c                ó^   • SU R                   ;   a  U R                   S   $ U R                   S   $ )NrÖ   Úexample_valuerà   rá   s    r=   rÜ   rÝ   J  s1   € Ø §¡Ó(ð !$§¡¨¡ð !3àŸ™ /Ñ2ð!3rA   r,   Úreplace_by_example©r€   r�   r‚   )r�   rŒ   rC   Úbool)rÏ   útorch.fx.NoderÖ   r   rC   ra   )Útorch._inductor.virtualizedrÄ   rÅ   rÔ   Ú	fake_modeÚ
contextlibÚnullcontextÚ	functoolsÚpartialÚfwd_onlyr�   r~   r¢   r;   r<   rh   ÚutilsÚ_pytreeÚtree_mapri   Úmap_argrÈ   r˜   Úzipr„   rÀ   rÁ   r�   )r:   Úreplacement_fnr;   Útrace_fnrÒ   rÄ   rÅ   ÚcontextrÐ   Ú	fake_argsÚfake_kwargsÚ
match_argsÚmatch_kwargsrØ   Úexample_valsÚgraph_with_eager_valsÚreplacementr�   Únew_noder°   r×   s                       @r=   rä   ÚMatch.replace_by_exampleì   s`  ø€ ÷ 	?ô ˜qŸ{™{¨K×8Ñ8¸Q¿[¹[Ñ=Pð �KŠKä×'Ò'Ó)ð 	ô	ò ØÑÜ$×,Ò,ÜÐ4Iñ�ñ 1°·±×<Ò<ð !�à)-¯©°A©×);Ñ);Ð<NÑ)OÑ&�	Ø- ˜o�Ü+0°·±Ó+;¸T¿[¹[˜L÷0ô —‘×#Ñ#×,Ñ,Ø¨Ð6¸Ð8Pôô  %Ÿx™x×/Ñ/°Ô6RÓS�ñ )1°Ó(NÐ%ô  %Ÿx™x×/Ñ/°Ñ6QÓR�á&Ð'<ÓK�ô Ð0×6Ñ6×<Ñ<Ó=ÄØ×%Ñ%×+Ñ+óBó ð ð ô +.Ø)×/Ñ/×5Ñ5°{×7HÑ7H×7NÑ7Nö+Ñ&�H˜hð *¨X¯]©]Õ:Ø<D¿M¹MØ.ñ=˜Ÿ™Ð&8Ó9ò	+ô  %Ÿx™x×/Ñ/Øñ3ó �ñ ' ~ÓD�Ü�4—:‘:‹ !Ó#Ø$×*Ñ*×0Ô0�AÜ"Ø!"§¡Ø!%§¡¨A¡Ø"6ôñ 1ô $×6Ñ6ØØ—‘—‘ØØô	÷K �WŽWús   ÁFKÇ+CKË
K)r;   r�   r<   r�   r‰   r‘   rŽ   ©NN)
r�   r�   r‰   rˆ   r;   zOptional[Sequence[Any]]r<   zOptional[dict[str, Any]]rC   ra   )rC   útorch.fx.Graph)rž   r†   rC   ra   )rC   r†   ©rC   r4   r`   )rC   zlist[Optional[torch.fx.Node]])rC   rç   )r‘   r  r;   úSequence[Any]rC   ra   ©NT)
rô   rJ   r;   r  rõ   zOptional[TraceFn]rÒ   ræ   rC   ra   )r5   rD   rE   rF   Ú__doc__rG   r^   Úpropertyr˜   r�   r£   r©   r±   r·   r½   rÁ   rä   rH   Ú__classcell__©r•   s   @r=   r†   r†   ™   s  ø‡ ñ	ð ÓØ
ƒOØÓØÓØ4Ó4Ø	ÓØ5Ó5ð )-Ø+/ð&àð&ð ð&ð &ð	&ð
 )ð&ð 
÷&ð &ð& óó ðô+ôô
9ô$ô
ô9ð
Ø!/ð
Ø7Dð
à	ô
ð '+Ø&*ðpà!ðpð ðpð $ð	pð
  $ðpð 
÷pó prA   r†   c                  óB   • \ rS rSr% SrS\S'   S
S jrSS jrSS jrSr	g	)rœ   i_  zs
Represents a unsuccessful match.

The `FailedMatch` object is returned to represent a failure to match a
pattern.
r4   Úformat_stringc                ób   • Xl         [        U5      S:”  a  [        SU 35      eX l        X0l        g )NéÈ   zUFormat string too long - use lazy construction of strings instead. Format string is
 )r
  rÈ   ÚRuntimeErrorr;   r<   )r:   r
  r;   r<   s       r=   r^   ÚFailedMatch.__init__i  s<   € Ø*Ôô ˆ}Ó Ó#ÜØhÐivÐhwÐxóð ð Œ	Ø�rA   c                ób   • U R                   R                  " U R                  0 U R                  D6$ r7   )r
  Úformatr;   r<   r]   s    r=   Ú__str__ÚFailedMatch.__str__t  s&   € Ø×!Ñ!×(Ò(¨$¯)©)ÐC°t·{±{ÑCÐCrA   c                ó   • g©NFr8   r]   s    r=   Ú__bool__ÚFailedMatch.__bool__w  ó   € ØrA   )r;   r
  r<   N)r
  r4   r;   r   r<   r   rC   ra   r  ©rC   ræ   )
r5   rD   rE   rF   r  rG   r^   r  r  rH   r8   rA   r=   rœ   rœ   _  s   ‡ ñð Óô	ôD÷rA   rœ   c                ó   • [        U 5      $ )zp
TypeIs cannot act on `self`. Thus this function exists to let mypy
recognize FailedMatch.__bool__ as a TypeIs.
)ræ   )Úms    r=   Úis_matchr  ~  s   € ô
 �‹7€NrA   c                  ót   • \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'    S       SS jjrSS jrSS jrSr	g)r�   i†  z;
Internal state needed while running PatternExpr._match().
úlist[Optional[PatternExpr]]r´   z*dict[PatternExpr, Optional[torch.fx.Node]]rµ   r  r˜   zlist[NodeOrConstant]Úexclusive_node_setNc               óT   • Xl         Uc  0 O
[        U5      U l        X0l        / U l        g r7   )r´   Údictrµ   r˜   r  )r:   r´   rµ   r˜   s       r=   r^   ÚMatchContext.__init__�  s*   € ð ŒØ%4Ñ%<™rÄ$ÀÓBWˆÔØŒ
Ø"$ˆÕrA   c                óê   • XR                   ;   a)  U R                   U   U:X  a  [        X5      $ [        S5      $ UR                  X 5      nXR                   ;  d   eU(       a  UOSU R                   U'   U$ )z)wrapper to check reused nodes in patternszrepeated pattern differsN)rµ   r†   rœ   Ú_match)r:   r‰   rÏ   r  s       r=   ÚmatchÚMatchContext.matchœ  sq   € à×*Ñ*Ó*Ø×#Ñ# GÑ,°Ó4Ü˜TÓ+Ð+ä"Ð#=Ó>Ð>Ø�N‰N˜4Ó&ˆØ×2Ñ2Ó2Ð2Ð2Þ01©°tˆ×Ñ˜WÑ%ØˆrA   c                ó¤   • U R                   R                  5        VVs0 s H#  u  pUR                  5       (       d  M  Uc  M!  X_M%     snn$ s  snnf r7   )rµ   r   Úhas_multiple_users)r:   r‰   rÏ   s      r=   Úfilter_multi_user_patternsÚ'MatchContext.filter_multi_user_patterns¨  sR   € ð "&×!5Ñ!5×!;Ñ!;Ô!=ô
â!=‘�Ø×)Ñ)×+ó à04ó ˆGŠMÙ!=ò
ð 	
ùó 
s   žA½AÁA)r  r˜   r´   rµ   r7   )r´   r  rµ   z*Optional[dict[PatternExpr, torch.fx.Node]]r˜   r  rC   ra   )r‰   rˆ   rÏ   ÚNodeOrConstantrC   ÚMatchResult)rC   z dict[PatternExpr, torch.fx.Node])
r5   rD   rE   rF   r  rG   r^   r$  r(  rH   r8   rA   r=   r�   r�   †  s^   ‡ ñð )Ó(Ø?Ó?ØÓØ,Ó,ð
 GKð
%à,ð
%ð Dð
%ð
 ð
%ð 
õ
%ô
÷
rA   r�   c                  ój   • \ rS rSrSr\SS j5       rSS jrSS jrSS jr	      SS jr
SS jrS	rg
)rˆ   i°  z#
Base class for types of patterns.
c                ó   • g r7   r8   ©r:   rÏ   r�   s      r=   r#  ÚPatternExpr._matchµ  s   € ØMPrA   c                ó~   •  [        U /UR                  S9R                  X5      $ ! [         a  nUs S nA$ S nAff = f©N©r˜   )r�   r˜   r$  rœ   ©r:   rÏ   Úes      r=   r$  ÚPatternExpr.match¸  s:   € ð	Ü  ¨d¯j©jÑ9×?Ñ?ÀÓKÐKøÜó 	Ø�Hûð	ús   ‚#& ¦
<°7±<·<c                ó   • gr  r8   r]   s    r=   r'  ÚPatternExpr.has_multiple_users¾  r  rA   c                ó4   • U R                   R                  S-   $ )Nz())r•   r5   r]   s    r=   r©   ÚPatternExpr.__repr__Á  s   € Ø�~‰~×&Ñ&¨Ñ-Ð-rA   c              #  óN   #   • XR                   ;   a  UR                   U    v •  g g 7fr7   )rµ   ©r:   r�   Úsearcheds      r=   Úfind_anchor_nodesÚPatternExpr.find_anchor_nodesÄ  s)   é € ð ×&Ñ&Ó&Ø×%Ñ% dÑ+Ó+ð 'ùs   ‚#%c                ó,   • [        XR                  5      $ )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).
)rÔ   r•   )r:   rž   s     r=   Ú
pattern_eqÚPatternExpr.pattern_eqÊ  s   € ô ˜%§¡Ó0Ð0rA   r8   N©rÏ   rç   r�   r�   rC   r+  ©rÏ   rç   rC   r+  r  r  ©r�   r�   r<  úOrderedSet[torch.fx.Node]rC   z.Generator[Optional[torch.fx.Node], None, None]©rž   r   rC   ræ   )r5   rD   rE   rF   r  r   r#  r$  r'  r©   r=  r@  rH   r8   rA   r=   rˆ   rˆ   °  sH   † ñð ÛPó ØPôôô.ð,Øð,Ø+Dð,à	7ô,÷1rA   rˆ   c                  ó"   • \ rS rSrSrSS jrSrg)ÚArgiÓ  zb
Capture an arg which will become an input to the handler.  Args are
passed in depth first order.
c                ó   • [        X U/S9$ )N)r;   ©r†   r.  s      r=   r#  Ú
Arg._matchÙ  s   € Ü�S d VÑ,Ð,rA   r8   N©rÏ   r*  r�   r�   rC   r+  ©r5   rD   rE   rF   r  r#  rH   r8   rA   r=   rH  rH  Ó  s   † ñ÷
-rA   rH  c                  ó6   • \ rS rSrSrSS jrS	S jrS
S jrSrg)ÚIgnorediÝ  z,
Match an arg, but don't pass it to handler
c                ó   • [        X 5      $ r7   rJ  r.  s      r=   r#  ÚIgnored._matchâ  s   € Ü�SÓÐrA   c                ó   • g)NÚ*r8   r]   s    r=   r©   ÚIgnored.__repr__å  s   € ØrA   c                ó   • g)Nz	Ignored()r8   )r:   Úpps     r=   Úpretty_printÚIgnored.pretty_printè  s   € ØrA   r8   NrL  r  ©rV  ÚPatternPrettyPrinterrC   r4   )	r5   rD   rE   rF   r  r#  r©   rW  rH   r8   rA   r=   rO  rO  Ý  s   † ñô ô÷rA   rO  c                  óT   ^ • \ rS rSrSrSU 4S jjrS	S jrS
S jrSU 4S jjrSr	U =r
$ )Ú
KeywordArgiì  ú<
Capture a kwarg which will become an input to the handler.
c                ó.   >• [         TU ]  5         Xl        g r7   ©r“   r^   Úname©r:   r`  r•   s     €r=   r^   ÚKeywordArg.__init__ñ  ó   ø€ Ü‰ÑÔØ�	rA   c                ó$   • SU R                   < S3$ )NzKeywordArg(r§   ©r`  r]   s    r=   r©   ÚKeywordArg.__repr__õ  s   € Ø˜TŸY™Y™M¨Ð+Ð+rA   c                ó.   • [        X U R                  U0S9$ )N©r<   )r†   r`  r.  s      r=   r#  ÚKeywordArg._matchø  s   € Ü�S¨¯	©	°4Ð'8Ñ9Ð9rA   c                ó˜   >• [         R                  " [        U5      n[        TU ]  U5      =(       a    U R
                  UR
                  :H  $ r7   ©ÚtypingÚcastr   r“   r@  r`  ©r:   rž   r•   s     €r=   r@  ÚKeywordArg.pattern_eqû  ó5   ø€ Ü—’œD %Ó(ˆÜ‰wÑ! %Ó(×D¨T¯Y©Y¸%¿*¹*Ñ-DÐDrA   re  ©r`  r4   rC   ra   r  rL  rF  ©r5   rD   rE   rF   r  r^   r©   r#  r@  rH   r  r  s   @r=   r\  r\  ì  s#   ø† ñ÷ô,ô:÷Eõ ErA   r\  c                  ó`   ^ • \ rS rSr% SrS\S'   S
U 4S jjrSS jrSS jrSU 4S jjr	S	r
U =r$ )ÚExclusiveKeywordArgi   r]  r4   r`  c                ó.   >• [         TU ]  5         Xl        g r7   r_  ra  s     €r=   r^   ÚExclusiveKeywordArg.__init__  rc  rA   c                ó$   • SU R                   < S3$ )NzExclusiveKeywordArg(r§   re  r]   s    r=   r©   ÚExclusiveKeywordArg.__repr__  s   € Ø% d§i¡i¡]°!Ð4Ð4rA   c                ó˜   • XR                   ;   a  [        S5      $ UR                   R                  U5        [        X U R                  U0S9$ )Nzexclusive arg appears twicerh  )r  rœ   r{   r†   r`  r.  s      r=   r#  ÚExclusiveKeywordArg._match  sD   € Ø×)Ñ)Ó)ÜÐ<Ó=Ð=à×Ñ×%Ñ% dÔ+Ü�S¨¯	©	°4Ð'8Ñ9Ð9rA   c                ó˜   >• [         R                  " [        U5      n[        TU ]  U5      =(       a    U R
                  UR
                  :H  $ r7   rk  rn  s     €r=   r@  ÚExclusiveKeywordArg.pattern_eq  rp  rA   re  rq  r  rL  rF  )r5   rD   rE   rF   r  rG   r^   r©   r#  r@  rH   r  r  s   @r=   rt  rt     s*   ø‡ ñð ƒI÷ô5ô:÷Eõ ErA   rt  c                  óÌ   ^ • \ rS rSr% SrS\S'   S\S'    S     SU 4S jjjr\\SS j5       5       r	SS	 jr
SS
 jrSS jr      SS jrSS jrSS jrSU 4S jjrSrU =r$ )Ú_TargetExpri  z/
Base class for filtering match by node.target
zlist[FnsType]ÚfnszOrderedSet[FnsType]Úfns_setc                ó|  >^• [         TU ]  5         [        U5      (       d  [        U[        5      (       a  U/O
[        U5      nU HW  m[        T[        R                  R                  5      (       d  M.  UR                  U4S jTR                  5        5       5        MY     Xl        [        U5      U l        X l        g )Nc              3  ó<   >#   • U  H  n[        TU5      v •  M     g 7fr7   )Úgetattr)rm   ÚoverloadrS   s     €r=   rp   Ú'_TargetExpr.__init__.<locals>.<genexpr>)  s   øé € ÐPÂ°Xœ7 2 x×0Ð0Âùs   ƒ)r“   r^   ÚcallablerÔ   r4   r”   rh   Ú_opsÚOpOverloadPacketr�   Ú	overloadsr  r"   r€  r®   )r:   r  r®   rS   r•   s      @€r=   r^   Ú_TargetExpr.__init__"  s�   ù€ ô 	‰ÑÔÜ —}‘}¬
°3¼×(<Ñ(<ˆs‰eÄ$ÀsÃ)ˆÛˆBÜ˜"œeŸj™j×9Ñ9×:Ó:Ø—
‘
ÔPÀÇÁÄÓPÖPñ ð ŒÜ! #“ˆŒØ�
rA   c                ó   • g r7   r8   r]   s    r=   ÚopÚ_TargetExpr.op/  s   € àrA   c                óØ  • U R                   S   n[        U[        5      (       d  UR                  n[	        U R                   5      S:”  a  SU S3$ U R                   S   [        [        US 5      L a  SU 3$ U R                   S   [        [        US 5      L a  SU 3$ [        U R                   S   [        R                  R                  5      (       a  [        U R                   S   5      $ U$ )Nr   r,   Ú[z, ...]útorch.z	operator.)
r  rÔ   r4   r5   rÈ   rƒ  rh   Úoperatorr‡  Ú
OpOverload)r:   Ú
first_reprs     r=   Úfns_reprÚ_TargetExpr.fns_repr3  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 ‘{Ó#Ð#àÐrA   c                óÌ   • U R                   [        L a  SnO#U R                   S:w  a  SU R                    S3nOSnU R                  R                   SU R	                  5        U S3$ )Nz
, MULTIPLEr,   r¦   r§   Ú Ú()r®   r[   r•   r5   r”  )r:   Úcomma_userss     r=   r©   Ú_TargetExpr.__repr__C  s^   € Ø�:‰:œÒ!Ø&‰KØ�Z‰Z˜1‹_Ø˜tŸz™z˜l¨!Ð,‰KàˆKØ—.‘.×)Ñ)Ð*¨!¨D¯M©M«OÐ+<¸[¸MÈÐKÐKrA   c                ób   • [        U R                  [        5      =(       d    U R                  S:„  $ )Nr,   )rÔ   r®   rX   r]   s    r=   r'  Ú_TargetExpr.has_multiple_usersL  s    € Ü˜$Ÿ*™*¤hÓ/×A°4·:±:À±>ÐArA   c                ó   • [         er7   ©ÚNotImplementedErrorr;  s      r=   r=  Ú_TargetExpr.find_anchor_nodesO  s
   € ô "Ð!rA   c                óÈ   • [        U[        R                  R                  5      =(       a8    UR                  U R                  :H  =(       a    [        U5      U R                  ;   $ r7   )rÔ   rh   ri   rÕ   rŒ  Úextract_targetr€  )r:   rÏ   s     r=   Ú
_match_fnsÚ_TargetExpr._match_fnsT  sD   € ä�tœUŸX™XŸ]™]Ó+÷ 5Ø—‘˜4Ÿ7™7Ñ"÷5ä˜tÓ$¨¯©Ñ4ð	
rA   c                ó¢   • XR                   ;   =(       d;    U R                  [        L =(       d"    [        UR                  5      U R                  :H  $ r7   )r´   r®   r[   rÈ   r.  s      r=   Ú_match_usersÚ_TargetExpr._match_users[  s;   € à—K‘KÑ÷ -Ø�z‰zœXÐ%÷-ä�4—:‘:‹ $§*¡*Ñ,ð	
rA   c                ó  >• [         R                  " [        U5      n[        TU ]  U5      =(       aY    U R
                  UR
                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r7   )rl  rm  r   r“   r@  rŒ  r  r®   rn  s     €r=   r@  Ú_TargetExpr.pattern_eqb  sf   ø€ Ü—’œD %Ó(ˆä‰GÑ˜uÓ%÷ *Ø—‘˜5Ÿ8™8Ñ#÷*à—‘˜EŸI™IÑ%÷*ð —
‘
˜eŸk™kÑ)ð		
rA   )r  r€  r®   )r,   )r  z!Union[FnsType, Sequence[FnsType]]r®   zUnion[Multiple, int]rC   ra   r  r  rD  ©rÏ   rç   rC   ræ   )rÏ   rç   r�   r�   rC   ræ   rF  )r5   rD   rE   rF   r  rG   r^   r  r   rŒ  r”  r©   r'  r=  r£  r¦  r@  rH   r  r  s   @r=   r~  r~    s™   ø‡ ñð 
ÓØ Ó ð UVðØ4ðØ=Qðà	÷ð ð ØÛó ó àôô LôBð"Øð"Ø+Dð"à	7ô"ô

ô
÷
õ 
rA   r~  .c                  óÎ   ^ • \ rS rSrSrSS.         SU 4S jjjr\      SS j5       r\      SS j5       rSS jr	SS	 jr
SS
 jr      SS jrSU 4S jjrSrU =r$ )Ú_TargetArgsExprio  z=
Base class for filtering match by node.{target,args,kwargs}
r,   )Ú_usersc               ór  >• [         TU ]  X5        [        U5      U l        [	        U5      U l        [        S [        R                  " X4R                  5       5       5       5      (       a  U R                  U l        OU R                  U l        U R                  U R                  U R
                  5      U l        g )Nc              3  óX   #   • U  H   n[        U[        [        [        45      v •  M"     g 7fr7   )rÔ   r   r”   r¢   ©rm   Úxs     r=   rp   Ú+_TargetArgsExpr.__init__.<locals>.<genexpr>~  s(   é € ð 
â;�ô �qœ4¤¤uÐ-×.Ð.Ú;ùs   ‚(*)r“   r^   r¢   r;   r   r<   ÚanyÚ	itertoolsÚchainÚvaluesÚpytree_flattenÚflattenÚsimple_flattenÚflat_args_kwargs)r:   r  r­  r;   r<   r•   s        €r=   r^   Ú_TargetArgsExpr.__init__t  sˆ   ø€ ô 	‰Ñ˜Ô%Ü˜$“KˆŒ	Ü˜6“lˆŒÜñ 
ä—_’_ T¯=©=«?Ô;ó
÷ 
ñ 
ð  ×.Ñ.ˆD�Là×.Ñ.ˆDŒLØ $§¡¨T¯Y©Y¸¿¹Ó DˆÕrA   c                ól   • / U QUR                  5       Q7n[        U 5      /UR                  5       Q7nX#4$ r7   )r¶  rÈ   r›   )r;   r<   r¶  Úspecs       r=   r¹  Ú_TargetArgsExpr.simple_flatten‡  s8   € ð +�4Ð*˜&Ÿ-™-›/Ñ*ˆÜ�D“	Ð*˜FŸK™K›MÑ*ˆØˆ|ÐrA   c                óÄ   ^^• [         [        [        [        [        [        0mSUU4S jjm[
        R                  " TX4U4S jS9n[
        R                  " U5      u  p4X44$ )Nc                ó†   >• [        U 5      nTR                  U5      nUb   [        R                  " TU" U 5      U4S jS9$ U $ )Nc                ó    >• [        U 5      T;   $ r7   ©Útype©r±  Útype_mappings    €r=   rÜ   ÚF_TargetArgsExpr.pytree_flatten.<locals>.convert_type.<locals>.<lambda>   s   ø€ ¤d¨1£g°Ò&=rA   ©Úis_leaf)rÃ  ry   Úpytreerñ   )r±  ÚclsÚ
convert_fnÚconvert_typerÅ  s      €€r=   rÌ  Ú4_TargetArgsExpr.pytree_flatten.<locals>.convert_type™  sG   ø€ Ü�q“'ˆCØ%×)Ñ)¨#Ó.ˆJØÑ%Ü—’Ø Ù˜q“MÜ=ñð ð
 ˆHrA   c                ó    >• [        U 5      T;   $ r7   rÂ  rÄ  s    €r=   rÜ   Ú0_TargetArgsExpr.pytree_flatten.<locals>.<lambda>§  s   ø€ œd 1›g¨Ò5rA   rÇ  )r±  r   rC   r   )r   r¢   r”   r   r   rÉ  rñ   Útree_flatten)r;   r<   Únormalized_args_treeÚflatr½  rÌ  rÅ  s        @@r=   r·  Ú_TargetArgsExpr.pytree_flatten�  s^   ù€ ô
 œEÜ”%ÜœDð*
ˆ÷		ð 		ô  &ŸšØØˆNÜ5ñ 
Ðô
 ×(Ò(Ð)=Ó>‰
ˆØˆzÐrA   c                óÈ  • U R                  5       /[        [        U R                  5      QU R                  R                  5        VVs/ s H  u  pU SU 3PM     snnQnU R                  [        L a  UR                  S5        O.U R                  S:w  a  UR                  SU R                   35        U R                  R                   SSR                  U5       S3$ s  snnf )NÚ=ú_users=MULTIPLEr,   ú_users=r˜  r¦   r§   )r”  ÚmapÚreprr;   r<   r   r®   r[   r{   r•   r5   Újoin)r:   rn   ro   r;   s       r=   r©   Ú_TargetArgsExpr.__repr__¬  sÂ   € à�M‰M‹Oð
ä”�t—y‘yÓ!ð
ð &*§[¡[×%6Ñ%6Ô%8Ô9Ò%8™T˜Q���1�Q�C‹jÑ%8Ò9ð
ˆð
 �:‰:œÒ!Ø�K‰KÐ)Õ*Ø�Z‰Z˜1‹_Ø�K‰K˜' $§*¡* Ð.Ô/Ø—.‘.×)Ñ)Ð*¨!¨D¯I©I°d«OÐ+<¸AÐ>Ð>ùó :s   ÁCc           
     óä  ^• U R                  5       /U4S jU R                   5       QU R                  R                  5        VVs/ s H  u  p#U STR	                  U5       3PM     snnQnU R
                  [        L a  UR                  S5        O.U R
                  S:w  a  UR                  SU R
                   35        SnU R                  R                   SUR                  U5       S3$ s  snnf )	Nc              3  óF   >#   • U  H  nTR                  U5      v •  M     g 7fr7   )rW  )rm   r±  rV  s     €r=   rp   Ú/_TargetArgsExpr.pretty_print.<locals>.<genexpr>»  s   øé € Ð4ª) Qˆb�o‰o˜a× Ð ª)ùs   ƒ!rÕ  rÖ  r,   r×  r¦   r˜  r§   )r”  r;   r<   r   rW  r®   r[   r{   r•   r5   rÚ  )r:   rV  rn   ro   r;   Ú
joiner_strs    `    r=   rW  Ú_TargetArgsExpr.pretty_print¸  sÓ   ø€ à�M‰M‹Oð
ä4¨$¯)ª)Ó4ð
ð 7;·k±k×6GÑ6GÔ6IÔJÒ6I©d¨a���1�R—_‘_ QÓ'Ð(Ó)Ñ6IÒJð
ˆð
 �:‰:œÒ!Ø�K‰KÐ)Õ*Ø�Z‰Z˜1‹_Ø�K‰K˜' $§*¡* Ð.Ô/àˆ
Ø—.‘.×)Ñ)Ð*¨!¨J¯O©O¸DÓ,AÐ+BÀ!ÐDÐDùó Ks   Á"C,c                ó²  • U R                  U5      (       a,  [        UR                  5      [        U R                  5      :w  a  [        SX5      $ U R	                  X5      (       d  [        SU 5      $ UR                  nUR
                  n[        U5      [        U R
                  5      :  aÔ  SSKJn  [        UR                  5      (       d   eU" UR                  UR                  UR
                  5      nUc  [        SX5      $ Uu  p4[        U5      [        U R                  5      :X  aI  [        U5      [        U R
                  5      :¼  a'  U Vs0 s H  owU R
                  ;   d  M  XtU   _M     nnO2[        SX5      $ U Vs0 s H  owU R
                  ;   d  M  XtU   _M     nnU R                  X45      u  p‰U R                  u  p«X›:w  a  [        SX›5      $ [        U5      [        U
5      :X  d   e[        X 5      n[        X¨5       HŽ  u  pÞ[        U[        5      (       a8  UR!                  XÞ5      n[#        U5      (       d  Us  $ UR%                  U5        MR  [        U[&        R(                  R*                  5      (       d  Xí:w  d  M‚  [        SUUUS9s  $    UR,                  R/                  U5        UR                  UR0                  U '   U$ s  snf s  snf )Nz&function_mismatch: node={}, pattern={}zmultiple_users {}r   )Únormalize_functionzargs_structure {} {}z#constant_args: {} {!r}!={pattern!r})r‰   )r£  rÈ   r;   rœ   r¦  r<   Útorch.fx.operator_schemasrâ  r†  rÉ   r¸  rº  r†   ró   rÔ   rˆ   r$  r  r�   rh   ri   rÕ   r�   r{   rŽ   )r:   rÏ   r�   Ú_argsÚ_kwargsrâ  Únormalized_args_and_kwargsÚiÚ
node_itemsÚ	node_specÚ
self_itemsÚ	self_specr  r‰   Ú
child_nodeÚchild_matchs                   r=   r#  Ú_TargetArgsExpr._matchÆ  s[  € Ø�‰˜t×$Ñ$¬¨D¯I©I«¼#¸d¿i¹i».Ó(HÜÐGÈÓTÐTà× Ñ  ×+Ñ+ÜÐ2°DÓ9Ð9à—	‘	ˆØ—+‘+ˆÜˆw‹<œ#˜dŸk™kÓ*Ó*ÝDä˜DŸK™K×(Ñ(Ð(Ð(Ù);Ø—‘˜TŸY™Y¨¯©ó*Ð&ð *Ñ1Ü"Ð#KÈTÓXÐXà!;‘�Ü�u“:¤ T§Y¡Y£Ó/´C¸³LÄCÈÏÉÓDTÓ4TÙ6=ÓR²g°ÀdÇkÁkÑAQ›}˜q¨!¡*š}±g�GÐR�Gä&Ø@À$óð ñ /6ÓJªg¨¸d¿k¹kÑ9I“}�q !™*’}©gˆGÐJà $§¡¨UÓ <Ñˆ
Ø $× 5Ñ 5Ñˆ
ØÓ!ÜÐ5°yÓLÐLÜ�:‹¤# j£/Ó1Ð1Ð1ä�#ÓˆÜ#& zÖ#>ÑˆGÜ˜'¤;×/Ñ/Ø!Ÿi™i¨Ó<�Ü ×,Ñ,Ø&Ò&Ø—‘˜Ö%Ü˜J¬¯©¯©×6Ñ6¸*Õ:OÜ"Ø9ØØØ#ñ	ò ñ $?ð 	
�‰�‰�tÔØŸ+™+ˆ�	‰	�$‰Øˆùò= Sùò Ks   ÅKÅ'	KÆKÆ	Kc              #  ó¼  #   • XR                   ;   a  UR                   U    v •  gU R                  S    H¤  n[        U[        5      (       d  M  UR	                  X5       Hu  n[        U[
        R                  R                  5      (       d  M.  UR                   H7  nXR;  d  M
  U R                  U5      (       d  M"  Uv •  UR                  U5        M9     Mw     M¦     g7f)zö
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º  rÔ   rˆ   r=  rh   ri   rÕ   r®   r£  Úadd)r:   r�   r<  r‰   Ú
other_noderÏ   s         r=   r=  Ú!_TargetArgsExpr.find_anchor_nodesü  s­   é € ð ×&Ñ&Ó&Ø×%Ñ% dÑ+Ò+Øà×,Ñ,¨QÔ/ˆGÜ˜'¤;×/Ó/Ø")×";Ñ";¸CÖ"J�JÜ% j´%·(±(·-±-×@Ñ@Ù Ø *× 0Ô 0˜ØÕ/Ø#Ÿ™¨t×4Ó4Ø&*¢
Ø (§¡¨TÖ 2ó	 !1ó #Kò 0ùs   ‚ACÁACÂ"CÂ:"Cc                ó  >• [         R                  " [        U5      n[        TU ]  U5      =(       a\    U R
                  S   UR
                  S   :H  =(       a6    [        S [        U R
                  S   UR
                  S   5       5       5      $ )Nr,   c              3  óz   #   • U  H1  u  p[        U[        5      (       a  UR                  U5      OX:H  v •  M3     g 7fr7   ©rÔ   rˆ   r@  ©rm   ÚaÚbs      r=   rp   Ú-_TargetArgsExpr.pattern_eq.<locals>.<genexpr>  s4   é € ð âT‘D�Aô $.¨a´×#=Ñ#=�—‘˜Q”À1Á6ÔIÚTùó   ‚9;r   )rl  rm  r   r“   r@  rº  Úallró   rn  s     €r=   r@  Ú_TargetArgsExpr.pattern_eq  s€   ø€ Ü—’œD %Ó(ˆä‰GÑ˜uÓ%÷ Ø×%Ñ% aÑ(¨E×,BÑ,BÀ1Ñ,EÑE÷äñ ä × 5Ñ 5°aÑ 8¸%×:PÑ:PÐQRÑ:SÔTóó ð	
rA   )r;   rº  r¸  r<   )
r  z/Union[torch.fx.node.Target, str, Sequence[Any]]r;   r   r­  zUnion[int, Multiple]r<   r   rC   ra   )r;   r  r<   zMapping[Any, Any]rC   z9tuple[Sequence[Any], Union[_SimpleSpec, pytree.TreeSpec]]r  rY  rB  rD  rF  )r5   rD   rE   rF   r  r^   Ústaticmethodr¹  r·  r©   rW  r#  r=  r@  rH   r  r  s   @r=   r¬  r¬  o  sÞ   ø† ñð ()ñ	Eà<ðEð ðEð %ð	Eð
 ðEð 
÷Eð Eð& ðØðØ%6ðà	Bóó ðð ðØðØ%6ðà	Bóó ðô8
?ôEô4ðl3Øð3Ø+Dð3à	7ô3÷2	
õ 	
rA   r¬  c                  ó   • \ rS rSrSrSrSrg)ÚCallFunctioni!  zJ
Matches a call_function node in the FX graphs: `fns[i](*args, **kwargs)`
Úcall_functionr8   N©r5   rD   rE   rF   r  rŒ  rH   r8   rA   r=   rÿ  rÿ  !  s   † ñð 
ƒBrA   rÿ  c                  ó   • \ rS rSrSrSrSrg)Ú
CallMethodi)  zO
Matches a call_method node in the FX graphs: `fns[i].method(*args, **kwargs)`
Úcall_methodr8   Nr  r8   rA   r=   r  r  )  ó   † ñð 
ƒBrA   r  c                  ó   • \ rS rSrSrSrSrg)Ú
CallModulei1  zH
Matches a call_module node in the FX graphs: `module(*args, **kwargs)`
Úcall_moduler8   Nr  r8   rA   r=   r  r  1  r  rA   r  c                  ó"   • \ rS rSrSrSS jrSrg)Ú_TargetExprVarArgsi9  zS
Matches a call_function node with any arguments which are passed into the pattern
c                óœ  • U R                  U5      (       d  [        S5      $ U R                  X5      (       d  [        S5      $ [        X 5      nUR                  R                  U5        UR                  UR                  U '   UR                  R                  UR                  5        UR                  R                  UR                  5        U$ )NÚfunction_mismatchÚmultiple_users)r£  rœ   r¦  r†   r�   r{   rÉ   rŽ   r;   r�   r<   r}   )r:   rÏ   r�   r  s       r=   r#  Ú_TargetExprVarArgs._match>  s’   € Ø�‰˜t×$Ñ$ÜÐ2Ó3Ð3à× Ñ  ×+Ñ+ÜÐ/Ó0Ð0ä�#ÓˆØ	�‰�‰�tÔØŸ+™+ˆ�	‰	�$‰Ø	�‰�‰�d—i‘iÔ Ø	�‰�‰˜Ÿ™Ô$ØˆrA   r8   NrB  rM  r8   rA   r=   r
  r
  9  s   † ñ÷rA   r
  c                  ó   • \ rS rSrSrSrg)ÚCallFunctionVarArgsiM  r   r8   N©r5   rD   rE   rF   rŒ  rH   r8   rA   r=   r  r  M  s   † Ø	ƒBrA   r  c                  ó   • \ rS rSrSrSrg)ÚCallMethodVarArgsiQ  r  r8   Nr  r8   rA   r=   r  r  Q  ó   † Ø	ƒBrA   r  c                  ó   • \ rS rSrSrSrg)ÚCallModuleVarArgsiU  r  r8   Nr  r8   rA   r=   r  r  U  r  rA   r  c                  óX   ^ • \ rS rSrSrSS	U 4S jjjrS
S jrSS jrSU 4S jjrSr	U =r
$ )ÚListOfiY  z
Matches a repeated pattern
c                óh   >• [         TU ]  5         [        U[        5      (       d   eXl        X l        g r7   )r“   r^   rÔ   rˆ   r‰   rí   )r:   r‰   rí   r•   s      €r=   r^   ÚListOf.__init__^  s+   ø€ Ü‰ÑÔÜ˜'¤;×/Ñ/Ð/Ð/ØŒØ�rA   c                óN   • U R                   R                   SU R                   S3$ ©Nr˜  r§   )r•   r5   r‰   r]   s    r=   r©   ÚListOf.__repr__d  ó$   € Ø—.‘.×)Ñ)Ð*¨!¨D¯L©L¨>¸Ð;Ð;rA   c                óJ  • [        U[        [        45      (       a  [        U5      S:X  a  [	        S5      $ [        X 5      nUR                  5       nSn[        U5       H¡  u  pg[        UR                  XGR                  S9nUR                  U R                  U5      n	UR                  5       n[        U	5      (       d!  U R                  (       d  [	        SXi5      s  $ M€  SnUR                  U	R!                  5       5        M£     U(       d  [	        S5      $ UR!                  5       $ )Nr   Únon_listFr2  zlist[{}]: {}Tzlist: no_match)rÔ   r”   r¢   rÈ   rœ   r†   r(  Ú	enumerater�   r´   r˜   r$  r‰   r  rí   r�   r£   )
r:   rÏ   r�   r  rµ   Úmatchedrç  rì  Ú	child_ctxrí  s
             r=   r#  ÚListOf._matchg  sí   € Ü˜$¤¤u ×.Ñ.´#°d³)¸q³.Ü˜zÓ*Ð*Ü�#Óˆð ×8Ñ8Ó:ˆØˆÜ& tž_‰MˆAÜ$Ø—‘˜_×4DÑ4DñˆIð $Ÿ/™/¨$¯,©,¸
ÓCˆKØ'×BÑBÓDˆOÜ˜K×(Ñ(Ø—|—|Ü& ~°qÓFÒFÙØˆGØ�H‰H�[×'Ñ'Ó)Ö*ñ -ö ÜÐ/Ó0Ð0Ø�x‰x‹zÐrA   c                óð   >• [         R                  " [        U5      n[        TU ]  U5      =(       aE    U R
                  R	                  UR
                  5      =(       a    U R                  UR                  :H  $ r7   )rl  rm  r   r“   r@  r‰   rí   rn  s     €r=   r@  ÚListOf.pattern_eq  sU   ø€ Ü—’œD %Ó(ˆä‰GÑ˜uÓ%÷ .Ø—‘×'Ñ'¨¯©Ó6÷.à—‘ §¡Ñ-ð	
rA   )rí   r‰   ©F)r‰   rˆ   rí   ræ   rC   ra   r  )rÏ   rŒ   r�   r�   rC   r+  rF  rr  r  s   @r=   r  r  Y  s&   ø† ñ÷ñ ô<ô÷0
õ 
rA   r  c                  óš   ^ • \ rS rSr% S\S'   SU 4S jjr\SS j5       rSS jrSS jr	SS jr
      SS	 jrSS
 jrSU 4S jjrSrU =r$ )ÚMultiOutputPatterniˆ  r  r´   c                óÚ   >• [         TU ]  5         [        US   [        5      (       d   e[	        S U 5       5      (       d   U5       e[        U5      U l        US   R                  U l        g )Nr   c              3  óV   #   • U  H  oS L =(       d    [        U[        5      v •  M!     g 7fr7   )rÔ   rˆ   r°  s     r=   rp   Ú.MultiOutputPattern.__init__.<locals>.<genexpr>Ž  s!   é € ÐLÂG¸q˜�9×:¤
¨1¬kÓ :Ô:ÂGùs   ‚'))r“   r^   rÔ   r~  rû  r”   r´   rŒ  )r:   r´   r•   s     €r=   r^   ÚMultiOutputPattern.__init__‹  s[   ø€ Ü‰ÑÔÜ˜' !™*¤k×2Ñ2Ð2Ð2ÜÑLÁGÓL×LÑLÐUÈgÓUÐLÜ˜G“}ˆŒØ˜!‘*—-‘-ˆ�rA   c                ój   • [         R                  " [        U R                  S   5      nUR                  $ ©Nr   )rl  rm  r~  r´   r  )r:   Úoutputs     r=   r  ÚMultiOutputPattern.fns’  s&   € ô —’œ[¨$¯,©,°q©/Ó:ˆØ�z‰zÐrA   c                óN   • U R                   R                   SU R                   S3$ r  )r•   r5   r´   r]   s    r=   r©   ÚMultiOutputPattern.__repr__˜  r  rA   c                óÌ   • U R                    Vs/ s H  o!R                  U5      PM     nnSS 3nU R                  R                   SUR	                  U5       3nU S3nU$ s  snf )Nz,
z  z([z
]))r´   rW  r•   r5   rÚ  )r:   rV  r±  r;   rß  Ústr_outs         r=   rW  ÚMultiOutputPattern.pretty_print›  sg   € Ø,0¯LªLÓ9ªL q—‘ Ö"©LˆÐ9Ø˜4˜&�\ˆ
Ø—^‘^×,Ñ,Ð-¨R°
·±ÀÓ0EÐ/FÐGˆØ�I˜TÐ"ˆØˆùò	 :s   �A!c                ó>  • [         R                  " [        U R                  S   5      nUR	                  X15      n[        U5      (       d  U$ U R                  SS   H>  nUc  M  U R                  XR5      n[        U5      (       d  Us  $ UR                  U5        M@     U$ )Nr   r,   )rl  rm  r~  r´   r$  r  Ú_match_from_anchorsr�   )r:   rÏ   r�   r0  r  r‰   rí  s          r=   r#  ÚMultiOutputPattern._match¢  s‡   € Ü—’œ[¨$¯,©,°q©/Ó:ˆØ�I‰I�fÓ#ˆÜ˜�{‰{ØˆHà—|‘| A BÓ'ˆGØ‰ÙØ×2Ñ2°7Ó@ˆKÜ˜K×(Ñ(Ø"Ò"Ø�H‰H�[Ö!ñ (ð ˆrA   c                óò   • [        UR                  5      n[        S5      nUR                  U[	        5       5       H8  nUR                  X5      n[        U5      (       a  Us  $ [        U5      Ul        M:     U$ )Nzno anchor found)r   rµ   rœ   r=  r"   r$  r  )r:   r‰   r�   Úpriorr  rÏ   s         r=   r8  Ú&MultiOutputPattern._match_from_anchors²  sh   € ô �S×(Ñ(Ó)ˆÜ$Ð%6Ó7ˆØ×-Ñ-¨c´:³<Ö@ˆDØ—	‘	˜'Ó(ˆAÜ˜�{‰{Ø’ä"& u£+ˆCÖñ Að ˆrA   c                ó�   •  [        U R                  UR                  S9R                  X5      $ ! [         a  nUs S nA$ S nAff = fr1  )r�   r´   r˜   r$  rœ   r3  s      r=   r$  ÚMultiOutputPattern.match¿  s<   € ð	Ü §¡°D·J±JÑ?×EÑEÀdÓQÐQøÜó 	Ø�Hûð	ús   ‚,/ ¯
A¹A ºAÁ Ac                ó*  >• [         R                  " [        U5      n[        TU ]  U5      =(       ab    [        U R                  5      [        UR                  5      :H  =(       a0    [        S [        U R                  UR                  5       5       5      $ )Nc              3  óz   #   • U  H1  u  p[        U[        5      (       a  UR                  U5      OX:H  v •  M3     g 7fr7   rõ  rö  s      r=   rp   Ú0MultiOutputPattern.pattern_eq.<locals>.<genexpr>Ê  s4   é € ð â<‘D�Aô $.¨a´×#=Ñ#=�—‘˜Q”À1Á6ÔIÚ<ùrú  )	rl  rm  r   r“   r@  rÈ   r´   rû  ró   rn  s     €r=   r@  ÚMultiOutputPattern.pattern_eqÅ  sm   ø€ Ü—’œD %Ó(ˆä‰GÑ˜uÓ%÷ Ü�D—L‘LÓ!¤S¨¯©Ó%7Ñ7÷äñ ä §¡¨e¯m©mÔ<óó ð	
rA   )rŒ  r´   )r´   zSequence[Optional[PatternExpr]]rC   ra   )rC   z-Union[Callable[..., Any], str, Sequence[Any]]r  rY  rB  )r‰   rˆ   r�   r�   rC   r+  rC  rF  )r5   rD   rE   rF   rG   r^   r  r  r©   rW  r#  r8  r$  r@  rH   r  r  s   @r=   r)  r)  ˆ  s]   ø‡ Ø(Ó(÷ ð óó ðô
<ôôð Ø"ðØ)5ðà	ôô÷	
õ 	
rA   r)  c                  ó^   ^ • \ rS rSrSrSU 4S jjr\S	S j5       rS
S jrSU 4S jjr	Sr
U =r$ )ÚRepeatedExpriÑ  zh
Checks for a repeated pattern. Useful for repeated operations after a node such as `split` or `unbind`
c                óP   >• [         TU ]  5         Xl        UR                  U l        g r7   )r“   r^   Úinner_patternrŒ  )r:   rF  r•   s     €r=   r^   ÚRepeatedExpr.__init__Ö  s!   ø€ Ü‰ÑÔØ*ÔØ×"Ñ"ˆ�rA   c                ó.   • U R                   R                  $ r7   )rF  r  r]   s    r=   r  ÚRepeatedExpr.fnsÛ  s   € à×!Ñ!×%Ñ%Ð%rA   c                ó®  • UR                  U R                  U5      n[        U5      (       d  U$ UR                  R	                  U R                  5        U R                  R                  U[        U/5      5       HW  n[        U /UR                  S9R                  U R                  U5      n[        U5      (       d  Us  $ UR                  U5        MY     U$ r1  )
r$  rF  r  rµ   Úpopr=  r"   r�   r˜   r�   )r:   rÏ   r�   r  Úanchor_nodeÚanchor_ms         r=   r#  ÚRepeatedExpr._matchß  s»   € Ø�I‰I�d×(Ñ(¨$Ó/ˆÜ˜�{‰{ØˆHØ×Ñ×ÑØ×Ñô	
ð  ×-Ñ-×?Ñ?Ø”˜T˜FÓ#ö
ˆKô $ T F°$·*±*Ñ=×CÑCØ×"Ñ" KóˆHô ˜H×%Ñ%Ø’Ø�H‰H�XÖñ
ð ˆrA   c                ó°   >• [         R                  " [        U5      n[        TU ]  U5      =(       a%    U R
                  R	                  UR
                  5      $ r7   )rl  rm  r   r“   r@  rF  rn  s     €r=   r@  ÚRepeatedExpr.pattern_eqò  sF   ø€ Ü—’œD %Ó(ˆÜ‰wÑ! %Ó(÷ 
¨T×-?Ñ-?×-JÑ-JØ×Ñó.
ð 	
rA   )rF  rŒ  )rF  r~  rC   ra   )rC   zSequence[FnsType]rB  rF  )r5   rD   rE   rF   r  r^   r  r  r#  r@  rH   r  r  s   @r=   rD  rD  Ñ  s0   ø† ñ÷#ð
 ó&ó ð&ô÷&
õ 
rA   rD  c                  ól   • \ rS rSrSrS	S jr\\R                  S
SS jj5       5       r	SS jr
SS jrSrg)rZ  iù  zˆ
Serializes Patterns to executable python.
XXX: currently only used and tested for fuse attention patterns. May not cover
all patterns.
c                óz   • [         R                  R                  R                  5       U l        0 U l        0 U l        g r7   )rh   ri   r˜   Ú
_NamespaceÚ	namespaceÚmemoized_objs_namesÚmemoized_objs_ppr]   s    r=   r^   ÚPatternPrettyPrinter.__init__   s*   € ÜŸ™Ÿ™×2Ñ2Ó4ˆŒØ;=ˆÔ Ø8:ˆÕrA   c                ó(  • [        5       n[        U S5      (       d   eU R                  US9nUR                   Vs/ s H$  nUR                  U    SUR                  U    3PM&     nnUR                  U SU 35        SR                  U5      $ s  snf )zE
Serializes obj to python code with obj written out to `output_name`
rW  )rV  z = Ú
)rZ  ÚhasattrrW  rU  rV  r{   rÚ  )ÚobjÚoutput_namerV  Úout_strrŸ   r0  s         r=   ÚrunÚPatternPrettyPrinter.run  sª   € ô "Ó#ˆÜ�s˜N×+Ñ+Ð+Ð+Ø×"Ñ" bÐ"Ð)ˆð ×-Ò-ó
â-�ð ×%Ñ% cÑ*Ð+¨3¨r×/BÑ/BÀ3Ñ/GÐ.HÓIÙ-ð 	ð 
ð
 	�‰˜˜ S¨¨	Ð2Ô3à�y‰y˜Ó Ð ùò
s   »+Bc                óð   • [        U[        5      (       a5  U R                  R                  U5      =n(       a  U$ U R	                  U5      $ [        US5      (       a  UR                  U 5      $ [        U5      $ )NrW  )rÔ   r¬  rU  ry   ÚmemoizerZ  rW  rÙ  )r:   r[  Úmemoized_names      r=   rW  Ú!PatternPrettyPrinter.pretty_print  sh   € Ü�cœ?×+Ñ+Ø $× 8Ñ 8× <Ñ <¸SÓ AÐAˆ}ÕAØ$Ð$à—|‘| CÓ(Ð(Ü�3˜×'Ñ'Ø×#Ñ# DÓ)Ð)ä�C‹yÐrA   c                óî   • UR                  U 5      nUR                  5       nS H  nUR                  US5      nM     U R                  R	                  US 5      nXPR
                  U'   X R                  U'   U$ )N)zaten.r�  zprims.r—  )rW  r”  ÚreplacerT  Úcreate_namerU  rV  )r:   r[  Úobj_strÚobj_nameÚprefixÚtmp_names         r=   ra  ÚPatternPrettyPrinter.memoize$  sr   € Ø×"Ñ" 4Ó(ˆØ—<‘<“>ˆÛ3ˆFØ×'Ñ'¨°Ó3ŠHñ 4ð —>‘>×-Ñ-¨h¸Ó=ˆØ(0× Ñ  Ñ%Ø%,×Ñ˜cÑ"ØˆrA   )rU  rV  rT  Nr`   )r0  )r[  rˆ   r\  r4   rC   r4   )r[  r   rC   r4   )r[  r¬  rC   r4   )r5   rD   rE   rF   r  r^   rý  rì   Úcacher^  rW  ra  rH   r8   rA   r=   rZ  rZ  ù  s6   † ñô;ð
 Ø‡_�_õ!ó ó ð!ô$	÷	rA   rZ  c                  ó&   • \ rS rSr    SS jrSrg)Ú_PassDictsTypei0  c                ó   • g r7   r8   )r:   rn   s     r=   Ú__getitem__Ú_PassDictsType.__getitem__1  s   € à rA   r8   N)rn   ú tuple[str, torch.fx.node.Target]rC   úlist[PatternEntry])r5   rD   rE   rF   rp  rH   r8   rA   r=   rn  rn  0  s   † ð!Ø1ð!à	÷!rA   rn  c                  óT   • \ rS rSr% S\S'   S\S'   S
S jr  S       SS jjrS	rg)ÚPatternEntryi6  rˆ   r‰   úCallable[[Match], bool]Úextra_checkc                ó   • [         er7   rž  ©r:   r$  r˜   rÏ   s       r=   ÚapplyÚPatternEntry.apply;  s   € Ü!Ð!rA   Nc                ó>  • UcK  [        U R                  S5      (       d   eU R                  R                   H  nU R                  XUS9  M     g [	        U[
        [        45      (       ay  [        U R                  S5      (       d   eU(       a+  XR                  R                  U4   R                  SU 5        g XR                  R                  U4   R                  U 5        g [        R                  " [        [           U5      nU H  nU R                  XRUS9  M     g )Nr  ©ÚprependrŒ  r   )rZ  r‰   r  ÚregisterrÔ   r   ÚPatternMatcherPassrŒ  Úinsertr{   rl  rm  r   rn  )r:   Ú
pass_dictsrÉ   r~  rS   r±  s         r=   r  ÚPatternEntry.register>  sÞ   € ð ‰>Ü˜4Ÿ<™<¨×/Ñ/Ð/Ð/Ø—l‘l×&Ô&�Ø—‘˜j°g�Ó>ò 'ä˜
¤TÔ+=Ð$>×?Ñ?Ü˜4Ÿ<™<¨×.Ñ.Ð.Ð.ÞØŸL™LŸO™O¨VÐ4Ñ5×<Ñ<¸QÀÕEàŸL™LŸO™O¨VÐ4Ñ5×<Ñ<¸TÕBäŸš¤X¬nÑ%=¸zÓJˆJÛ�Ø—‘˜a°�Ó9ò  rA   r8   ©r$  r†   r˜   r  rÏ   rç   rC   ra   r  )r‚  ú/Union[_PassDictsType, Sequence[_PassDictsType]]rÉ   z!Union[torch.fx.node.Target, None]r~  ræ   rC   ra   )r5   rD   rE   rF   rG   rz  r  rH   r8   rA   r=   ru  ru  6  sK   ‡ àÓØ(Ó(ô"ð 59Øð	:àCð:ð 2ð:ð ð	:ð
 
÷:ð :rA   ru  c                  ó*   • \ rS rSr% S\S'   SS jrSrg)ÚLoweringPatternEntryiT  úCallable[..., Any]Úhandlerc                óø  • [         R                  " U R                  5      " [         R                  " U R                  U5      5      nUR	                  U5         UR                  U[        UR                  5      UR                  5      nUR                  R                  UR                  5        UR                  U5        S S S 5        UR                  S   UL d   eUR                  5         g ! , (       d  f       N3= f)Néÿÿÿÿ)rì   Úwrapsr‰  rí   Úinserting_beforer   r¢   r;   r<   r~   r}   Úreplace_all_uses_withr�   r±   )r:   r$  r˜   rÏ   r‰  rý   s         r=   rz  ÚLoweringPatternEntry.applyX  s²   € Ü—/’/ $§,¡,Ô/´	×0AÒ0AÀ$Ç,Á,ÐPUÓ0VÓWˆØ×#Ñ# DÕ)Ø×-Ñ-¨g´u¸U¿Z¹ZÓ7HÈ%Ï,É,ÓWˆKØ×Ñ×#Ñ# D§I¡IÔ.Ø×&Ñ& {Ô3÷ *ð �{‰{˜2‰ $Ò&Ð&Ð&Ø×ÑÕ÷ *Õ)ús   ÁA'C+Ã+
C9r8   Nr„  )r5   rD   rE   rF   rG   rz  rH   r8   rA   r=   r‡  r‡  T  s   ‡ àÓ÷rA   r‡  c                  ó.   • \ rS rSr% SrS\S'   SS jrSrg)	ÚGraphPatternEntryib  z0
A pattern that runs a function on the FX graph
rˆ  r‰  c                ó®   • UR                  U5         U R                  " U/UR                  Q70 UR                  D6  S S S 5        g ! , (       d  f       g = fr7   )r�  r‰  r;   r<   ry  s       r=   rz  ÚGraphPatternEntry.applyj  s:   € Ø×#Ñ# DÕ)Ø�LŠL˜Ð< §¡Ò<¨u¯|©|Ò<÷ *×)Ö)ús   ’+AÁ
Ar8   Nr„  )r5   rD   rE   rF   r  rG   rz  rH   r8   rA   r=   r‘  r‘  b  s   ‡ ñð  Ó÷=rA   r‘  c                  óV   • \ rS rSr% SrS\S'   \          S	S j5       rS
S jrSr	g)rÀ   io  z'
The replacement pattern for the graph
zCallable[..., list[Any]]Únormalize_argsc                ó0  ^^^^^^• / m " UU4S jS[         R                  R                  5      nU R                  5       n[	        U5      S:X  a  US   nO�US   (       d   e[        US   R                  R                  5      nU Vs/ s HA  n[        U[         R                  R                  5      (       d  M.  UR                  U5      U4PMC     n	n[        U	[        R                  " S5      S9S   n          S
S jmTR                  U5         [        U[         R                  R                  5      (       d   eU" U5      R                   " T6 n
[        U
[         R                  R                  5      (       a  U
/n
SS jm      SUUUUUU4S jjm[	        U5      [	        U
5      :X  a  [#        XZ5       H  u  p¼T" X¼5        M     O[	        U5      S:X  d   eT" US   U
5        S	S	S	5        U R%                  5         g	s  snf ! , (       d  f       N$= f)zD
Inserts the replacement graph into the toplevel graph at the match
c                  ó>   >^ • \ rS rSrSrSrSrSU UU4S jjrSrU =r	$ )Ú<ReplacementPatternEntry.replace_with_graph.<locals>.Replaceri„  Nc                óð  >• UR                   S;   a  [        TU ]	  U5      $ UR                  nU R	                  U5      u  p4UR                   S:X  Ga  [        U5      (       d   eTR                  X#U5      nTR                  U5        [        UR                  USS9  SUR                  ;   a  UR                  S   UR                  S'   SUR                  ;   a†  SUR                  ;  av  UR                  S   UR                  S'   [        UR                  S   [        R                  5      (       a.  SUR                  ;   d   eUR                  S   UR                  S'   U$ UR                   S:X  aû  S	S
KJn  [        TU ]=  X#U5      n[        U[        R                   R"                  5      (       d  [%        SU SU S35      eTR&                  c   eS nTR&                  R)                  5        H  u  pšXzL d  M  U	n  O   UcG  [        U[*        5      (       d   eU" TR&                  U5      u  p¸TR&                  R-                  X‡5        TR                  U5      nTR                  U5        U$ [%        SU 35      e)N)Úplaceholderr0  r   ÚInterpreter_Replacerrå   rÇ   rÖ   Útensor_metaÚget_attrr   )Úunique_graph_name_with_rootzNYI: replacement_graph.z is not a graph module. Got Ú.z
unhandled )rŒ  r“   Úrun_noderÉ   Úfetch_args_kwargs_from_envr†  r   r{   r„   r~   rÔ   rh   ÚTensorÚtorch._higher_order_ops.utilsrž  r�  ri   ÚGraphModulerŸ  Úowning_moduleÚnamed_modulesr4   Úregister_module)r:   rÏ   rÉ   r;   r<   Úresultrž  Úsub_gmÚ
graph_namer°   ÚmodÚ_Úgetattr_noder•   Úadded_replacement_nodesr˜   s                €€€r=   r   ÚEReplacementPatternEntry.replace_with_graph.<locals>.Replacer.run_node‰  sG  ø€ Ø—7‘7Ð7Ó7Ü ™7Ñ+¨DÓ1Ð1ØŸ™�Ø#×>Ñ>¸tÓD‘�Ø—7‘7˜oÔ-Ü# F×+Ñ+Ð+Ð+Ø"×0Ñ0°¸vÓF�FØ+×2Ñ2°6Ô:Ü"Ø!'§¡Ø!%Ø"8òð *¨T¯Y©YÓ6Ø:>¿)¹)ÐDVÑ:W˜Ÿ™Ð$6Ñ7Ø §	¡	Ó)¨e¸6¿;¹;Ó.FØ-1¯Y©Y°uÑ-=˜Ÿ™ EÑ*Ü% d§i¡i°Ñ&6¼¿¹×EÑEØ#0°D·I±IÓ#=Ð=Ð#=Ø9=¿¹À=Ñ9Q˜FŸK™K¨Ñ6Ø!�MØ—7‘7˜jÓ(õô #™WÑ-¨f¸FÓC�FÜ% f¬e¯h©h×.BÑ.B×CÑCÜ1Ø5°f°XÐ=YÐZ`ÐYaÐabÐcóð ð !×.Ñ.Ñ:Ð:Ð:Ø!%�JØ"'×"5Ñ"5×"CÑ"CÖ"E™˜Ø!œ=Ø)*˜JÙ!ñ #Fð "Ñ)Ü)¨&´#×6Ñ6Ð6Ð6Ù(Cà!×/Ñ/Ø"ó)™˜ð ×+Ñ+×;Ñ;¸JÔOà#(§>¡>°*Ó#=�LØ+×2Ñ2°<Ô@Ø'Ð'ä)¨J°t°fÐ*=Ó>Ð>rA   r8   ©rÏ   rç   rC   r   )
r5   rD   rE   rF   r  r  r�  r   rH   r  )r•   r®  r˜   s   @€€r=   ÚReplacerr˜  „  s   ù† ØˆKØˆKØˆH÷9?÷ 9?rA   r±  r,   r   )rŸ   c                óB  • U /n[         [        R                  R                     " 5       nU(       ao  UR	                  5       nXe;  aP  Xc;  aK  [        US5      (       a:  UR                  U5        X&R                  U'   UR                  UR                  5        U(       a  Mn  g g )Nr~   )
r"   rh   ri   rÕ   rK  rZ  rð  r~   r�   Úall_input_nodes)rÏ   Útag_nameÚ	tag_valueÚinput_stopsÚqueueÚvisitedrÛ   s          r=   Úpercolate_tagsÚBReplacementPatternEntry.replace_with_graph.<locals>.percolate_tagsÒ  sx   € ð �FˆEÜ ¤§¡§¡Ò/Ó1ˆGæØ—i‘i“k�àÓ&ØÓ.Ü  V×,Ñ,à—K‘K Ô$Ø)2—H‘H˜XÑ&Ø—L‘L ×!4Ñ!4Ô5÷ ’%rA   c                ó¶   • U R                   S:w  a  g U R                  [        R                  :w  a  g [	        U R
                  5      S:X  d   eU R
                  S   $ )Nr   r#   r,   )rŒ  rÉ   r‘  ÚgetitemrÈ   r;   ©rÏ   s    r=   Úmaybe_getitemÚAReplacementPatternEntry.replace_with_graph.<locals>.maybe_getitemì  sJ   € Ø—7‘7˜oÓ-ØØ—;‘;¤(×"2Ñ"2Ó2ØÜ˜4Ÿ9™9“~¨Ó*Ð*Ð*Ø—y‘y ‘|Ð#rA   c           	     ój  >• SU4S jjnU c  Ub   eg [        U [        R                  R                  5      (       d   eUc;  U R	                  S US9  [        U R                  5      S:X  a  T	R                  U 5        g [        U[        R                  R                  5      (       a©  SUR                  ;  a%  UR                  R                  U R                  5        S H4  nX0R                  ;   d  M  T" XU R                  U   [        T5      5        M6     U R	                  XS9  [        U R                  5      S:X  a  T	R                  U 5        g [        U R                  R                  5       5      nU H,  nT
" U5      nUc  U R	                  U5        M!  T" XQU   5        M.     T	R                  U 5        g )Nc                ó   >• U T;  $ r7   r8   )rÏ   r®  s    €r=   Ú!filter_nodes_in_newly_added_nodesÚfReplacementPatternEntry.replace_with_graph.<locals>.replace.<locals>.filter_nodes_in_newly_added_nodesø  s   ø€ ð  Ð'>Ñ>Ð>rA   )Údelete_user_cbr   rÖ   )Ú	recomputeÚac_graph_idrª  )rÔ   rh   ri   rÕ   rŽ  rÈ   r®   r¯   r~   r}   r"   r”   r›   )ÚoldÚnewrÂ  r´  Úold_usesÚuserÚidxr®  r;   r˜   r¾  r¹  re  s          €€€€€€r=   re  Ú;ReplacementPatternEntry.replace_with_graph.<locals>.replaceô  sy  ø€ ÷?ð
 ‘;Ø™;Ð&˜;ØÜ! #¤u§x¡x§}¡}×5Ñ5Ð5Ð5Ø‘;Ø×-Ñ-ØØ'Hð .ñ ô ˜3Ÿ9™9“~¨Ó*Ø×(Ñ(¨Ô-ØÜ˜c¤5§8¡8§=¡=×1Ñ1Ø C§H¡HÓ,ØŸ™Ÿ™¨¯©Ô1ó %A˜Ø#§x¡xÕ/Ù*Ø #¨s¯x©x¸Ñ/AÄ:ÈdÓCSöñ %Að ×-Ñ-Øð .ñ ô ˜3Ÿ9™9“~¨Ó*Ø×(Ñ(¨Ô-Øô:   §	¡	§¡Ó 0Ó1�Û$�DÙ'¨Ó-�CØ‘{ð ×1Ñ1°#Ö6á ¨#¡hÖ/ñ %ð × Ñ  Õ%rA   N)
rÏ   rç   r´  r4   rµ  r4   r¶  rE  rC   ra   r°  )rÇ  zUnion[torch.fx.Node, None]rÈ  z3Union[torch.fx.Node, Sequence[torch.fx.Node], None]rC   ra   )rh   ri   ÚInterpreterr·   rÈ   r”   r˜   r�   rÔ   rÕ   ÚindexÚminr‘  Ú
itemgetterr�  r¤  r^  ró   r±   )r$  r˜   r‘   r;   r±  r·   Ú	last_noder�   r°   Úindicesrý   rÇ  rÈ  r®  r¾  r¹  re  s    ` `         @@@@r=   rÁ   Ú*ReplacementPatternEntry.replace_with_graphw  s
  ý€ ð 8:Ð÷>	?ð >	?”u—x‘x×+Ñ+ô >	?ð@ ×)Ñ)Ó+ˆäˆ|Ó Ó!Ø$ Q™‰Ià —?Ð"�?Ü˜ a™×.Ñ.×4Ñ4Ó5ˆEñ &óâ%�AÜ˜a¤§¡§¡×/ó $�—‘˜Q“ Ó#Ù%ð ð ô
 ˜G¬×)<Ò)<¸QÓ)?Ñ@ÀÑCˆIð	6Øð	6àð	6ð ð	6ð 3ð		6ð
 ô	6ð( ×#Ñ# IÕ.ÜÐ/´·±×1EÑ1E×FÑFÐFÐFÙ"Ð#4Ó5×9Ò9¸4Ð@ˆKÜ˜+¤u§x¡x§}¡}×5Ñ5Ø*˜m�ô$ðR&Ø/ðR&àHðR&ð ÷R&ô R&ôh �<Ó ¤C¨Ó$4Ó4Ü # LÖ >‘H�CÙ˜CÖ%ò !?ô ˜<Ó(¨AÓ-Ð-Ð-Ù˜ Q™¨Ô5÷O /ðR 	×ÑÕùòI÷6 /Õ.ús   Â-HÂ8HÄCHÈ
Hc           
     ó¦   • UR                   c   eU R                  UUUR                   U R                  " UR                  0 UR                  D65        g r7   )r‘   rÁ   r•  r;   r<   ry  s       r=   rz  ÚReplacementPatternEntry.applyQ  sL   € Ø×&Ñ&Ñ2Ð2Ð2Ø×ÑØØØ×#Ñ#Ø×Ò §¡Ð<¨u¯|©|Ñ<õ		
rA   r8   N)
r$  r†   r˜   r  r‘   z+Union[torch.fx.Graph, torch.fx.GraphModule]r;   zSequence[torch.fx.Node]rC   ra   r„  )
r5   rD   rE   rF   r  rG   rý  rÁ   rz  rH   r8   rA   r=   rÀ   rÀ   o  s]   ‡ ñð -Ó,àðWØðWàðWð GðWð &ð	Wð
 
óWó ðW÷r
rA   rÀ   c                ó   • gr  r8   )r$  s    r=   Ú_return_truer×  [  s   € ØrA   c                óF   • [         R                  SU R                  U5        g )Nz@Replacement pattern %s failed to apply due to shape mismatch: %s)ÚlogÚinfor5   )Ú	search_fnr4  s     r=   Úlog_trace_failurerÜ  _  s   € Ü‡H�HØJØ×ÑØ	õrA   Fc                ó   ^^• [         R                  U 5      mUR                  T5      nU(       d'  UT   R                  U(       a  [	        U5      OS5        gUc#  U(       a  g[
        R                  " SU4S j5        [	        U5      nU H0  mUT:w  a  M  U(       a    g[
        R                  " SUU4S j5        M2     UR                  U5        g)a.  
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                 ó   >• ST  S3$ )NúDuplicate pattern: z with no graphr8   )Úpattern_reprs   €r=   rÜ   Ú1check_and_add_duplicate_pattern.<locals>.<lambda>€  s   ø€ Ð)¨,¨°~ÑFrA   c                 ó   >• ST ST  S3$ )Nrß  z with duplicated match graph Ú r8   )Ú	graph_strrà  s   €€r=   rÜ   rá  ‹  s   ø€ Ð)¨,¨Ð7TÐU^ÐT_Ð_`ÑarA   )rZ  r^  ry   r{   r4   rh   Ú_check)r‰   r˜   Úseen_patternsÚskip_duplicatesÚequiv_pattern_reprsÚnew_graph_strrä  rà  s         @@r=   Úcheck_and_add_duplicate_patternrê  g  s¯   ù€ ô (×+Ñ+¨GÓ4€LØ'×+Ñ+¨LÓ9ÐÞØ�lÑ#×*Ñ*¾¬3¨u¬:ÀDÔIØà�}ÞØÜ�ŠØÜFô	
ô
 ˜“J€MÛ(ˆ	Ø˜IÓ%ÙÞÙÜ�ŠØÝaö	
ñ )ð ×Ñ˜}Ô-ØrA   r8   c
           
     ó.  ^ ^^^^^^^^• / [         R                  " T 5      R                  R                  5       Qm[         R                  " T 5      (       a  [        T T5      m [         R                  " T5      (       a<  / [         R                  " T5      R                  R                  5       Qn
[        TU
5      mSUUUUUUU UU4	S jjnS	U4S jjnT[        L a  [        R                  " 5       (       a  g[        R                  " SS9   U Vs/ s H0  n[        U[        R                  5      =(       a    UR                  PM2     snmTc  [        T UTTT5      u  pïOTnSn[        U[        5      (       a  UOU/ HR  n[        U[         5      (       d  M  [#        UU(       a  UR$                  OSUR&                  U	S9(       d  MJ    SSS5        g   [)        UUUS9nUR+                  U5        UR,                  sSSS5        $ s  snf ! , (       d  f       g= f)
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)
c           
     ó¾	  >	^^• [        T5      nU H-  nX R                  ;  d  M  [        SU SU R                   35      e   [        [        R                  R                  U Vs/ s H  o R                  U   PM     snS 5      5      m/ n[        R                  R                  R                  T5      nUc   eU   [        T5       GH9  u  pV[        TU   [        R                  5      (       d  M*  U(       a'  [        TU   R                  5      (       a
    SSS5        g[        R                  " TU   R                  5       TU   R!                  5       TU   R                  TU   R"                  US9TU'   [$        R&                  " TU   R(                  TU   R!                  5       5       HQ  m[        T[        R*                  5      (       d  M$  [-        U4S jU 5       5      (       d  M@  UR/                  T5        MS     GM<     TnU(       Gd7  U(       Ga  SUU4S jjn T" XƒT-   5      n	/ n[3        [5        [7        U5      [7        T5      -   5      U	R8                  R:                  5       H»  u  p\U[7        U5      :  a  UR/                  UR<                  5        M1  U	R8                  R?                  U5         U	R8                  RA                  X[7        U5      -
     5      nURB                  Ul        URE                  U5        U	R8                  RG                  U5        SSS5        M½     X±-   nO
 T" TT5      n	[I        U	UTTS	9nU RK                  5       S
   nUc   eURM                  U5      n[N        RP                  RS                  S5      URB                  :X  a#  [T        RW                  SUURX                  UU5        [[        U5      (       a‡  T" U5      (       az  T" TT5      U l.        [7        U R:                  5      S:X  aI  U R\                  R8                  R:                   H%  n[_        UR`                  U R:                  S
   SS9  M'      SSS5        g SSS5        gs  snf ! [         a  n
[1        TU
5         Sn
A
SSS5        gSn
A
ff = f! , (       d  f       GM4  = f! [         a  n
[1        TU
5         Sn
A
SSS5        gSn
A
ff = f! , (       d  f       g= f)z�
Often shapes get burned into the pattern, so our initial match ran with
`ignore_types=(int, ...)`.

Recheck the match with the correct shapes.
z_Not all inputs to pattern found in match.kwargs. Perhaps one of the inputs is unused? argnames=z, match.kwargs=c                ó    • U R                   S   $ rß   rà   )r°   s    r=   rÜ   Ú8register_replacement.<locals>.check_fn.<locals>.<lambda>Ä  s   € ÀQÇVÁVÈEÂ]rA   NF)ÚdtypeÚdeviceÚrequires_gradc              3  ó@   >#   • U  H  n[        TU:g  5      v •  M     g 7fr7   )r   )rm   r÷  ro   s     €r=   rp   Ú9register_replacement.<locals>.check_fn.<locals>.<genexpr>ß  s!   øé € ð ?ÚCK¸aÔ1°!°q±&×9Ð9Â8ùs   ƒc                 ó>   >• T" U [        U 5      [        T5      -
  S  6 $ r7   )rÈ   )Úargs_newr;   rÛ  s    €€r=   Úsearch_fn_newÚ=register_replacement.<locals>.check_fn.<locals>.search_fn_newò  s#   ø€ Ù(¨(´3°x³=Ä3ÀtÃ9Ñ3LÐ3NÐ*OÐPÐPrA   )ÚargnamesÚexclusive_arg_namesÚscalar_workaroundr   Ú!TORCHINDUCTOR_PATTERN_MATCH_DEBUGz"Specific pattern match: %s%s %s %sr,   rý   rå   T)rõ  r   rC   r   )1r”   r<   r  rh   ri   rò   Ú_dynamorï   Údetect_fake_moder!  rÔ   r¢  r   rï  Úempty_stridedÚsizeÚstriderð  r´  rµ  ÚshapeÚSymIntrû  r{   rÜ  ró   ÚrangerÈ   r˜   r�   rÉ   Úinserting_afterrš  r`  rŽ  r¯   Úfx_to_patternr·   r$  ÚosÚenvironry   rÙ  Úwarningr;   r  r‘   r„   r~   )r$  rø  r`  Úsym_argsré   rç  ÚgradÚspecific_patternrö  Úspecific_graphr4  Úsym_arg_namesrš  rþ   rÏ   Úspecific_pattern_matchr°   r;   ro   Úargnames_staticrù  rw  Ú
replace_fnrñ  rú  rÛ  Úsearch_fn_patternrõ   s                    @@€€€€€€€€€r=   Úcheck_fnÚ&register_replacement.<locals>.check_fn³  s?  ú€ ô ˜Ó(ˆÛˆDØŸ<™<Õ'Ü"ð9Ø9A¸
À/ÐRW×R^ÑR^ÐQ_ðaóð ñ ô Ü�H‰H×ÑÙ08Ó9²¨—‘˜dÔ#±Ñ9Ñ;Róó
ˆð (*ˆÜ—M‘M×'Ñ'×8Ñ8¸Ó>ˆ	ØÑ$Ð$Ð$ÚÜ$ ]×3‘�Ü˜d 1™g¤u§|¡|×4Ó4æÔ 0°°a±·±× ?Ñ ?Ø$÷ ˆYô $×1Ò1à˜Q™Ÿ™›à˜Q™Ÿ™Ó(à" 1™gŸm™mà# A™wŸ~™~Ø&*ñ
�D˜‘Gô 'Ÿ_š_¨T°!©W¯]©]¸DÀ¹G¿N¹NÓ<LÖM˜Ü% a¬¯©×6Ó6¼3ô ?ÙCKó?÷ <ó <ð %ŸO™O¨AÖ.ô	 Nñ% 4ð6  1Ðç#ß÷Qð Qð%á)1°-ÈDÁÓ)Q˜ð %'�MÜ*-Üœc (›m¬c°$«iÑ7Ó8Ø&×,Ñ,×2Ñ2ö+™˜ð œs 8›}Ó,Ø)×0Ñ0°×1CÑ1CÔDÙ$à+×1Ñ1×AÑAÀ+ÕNØ'5×';Ñ';×'GÑ'GØ (¬S°«]Ñ):Ñ ;ó(˜Hð /7¯m©m˜HœOØ'×=Ñ=¸hÔGØ*×0Ñ0×;Ñ;¸KÔH÷ OÑNñ+ð   -Ñ7‘Hð%Ù)1°)¸TÓ)B˜ô
 $1Ø"Ø%Ø(;Ø&7ñ	$Ð ð ×%Ñ%Ó'¨Ñ*ˆDØÑ#Ð#Ð#Ø%5×%;Ñ%;¸DÓ%AÐ"ä�z‰z�~‰~ÐAÓBÀdÇiÁiÓOÜ—‘Ø8ØØ—I‘IØ*Ø$ôô Ð.×/Ñ/±KÐ@V×4WÑ4Wá*2°:¸tÓ*D�Ô'Ü�u—{‘{Ó# qÓ(Ø"×4Ñ4×:Ñ:×@Ô@˜Ü&Ø%&§V¡VØ%*§[¡[°¡^Ø&3ôñ Að ÷S ˆYðT ÷U ˆYùò :øôh (ó %Ü)¨)°QÔ7Û$÷_ ˆYûðZ%ú÷ O×Nûô (ó %Ü)¨)°QÔ7Û$÷S ˆYûðN%ú÷O �Yús    Á$Q Â;2SÃ1%SÄB,SÇSÇ+5SÈ!Q%È,BSÊ8A'RÌSÌ1	R#Ì:DSÑSÑ%
RÑ/RÑ;SÒRÒSÒ
R Ò	SÒ#
SÒ-SÒ9SÓSÓSÓ
Sc                 ó  >• T Vs/ s H  oR                  U5      PM     nn[        S[        U 5      S-   5       H1  nSU 3U ;  a    O'UR                  U R                  SU 35      5        M3     U (       a   SU < 35       eU$ s  snf )Nr,   Ú	tangents_zleftover kwargs: )rK  r  rÈ   r{   )r<   r`  r;   rç  r  s       €r=   r•  Ú,register_replacement.<locals>.normalize_args7  s„   ø€ Ù-<Ó=ª_ T—
‘
˜4Ö ©_ˆÐ=Ü�qœ#˜f›+¨™/Ö*ˆAØ˜1˜#ˆ fÓ,ÙØ�K‰K˜Ÿ
™
 Y¨q¨c ?Ó3Ö4ñ +ö Ð9Ð.¨v©jÐ9Ó9ˆzØˆùò >s   †BF©Úfunctionalize_rng_opsN)rç  )r‰   rw  r•  ©r$  r†   rC   ræ   )r<   r   rC   rŠ   )ÚinspectÚ	signatureÚ
parametersr›   ÚismethodÚ_wrap_bound_methodÚjoint_fwd_bwdrh   Úis_inference_mode_enabledÚfunctorch_configÚpatchrÔ   r¢  rñ  Úgen_pattern_and_search_gmr   r€  rê  r˜   ræ  rÀ   r  r‰   )rÛ  r  Úexample_inputsrõ   r‚  rw  rú  rù  r  rç  Úreplace_argnamesr  r•  r±  r‰   ÚgmÚpattern_matcher_passr  rñ  s   `` ` ````        @@r=   Úregister_replacementr(  ‘  s×  ÿø€ ð2 Hœ×)Ò)¨)Ó4×?Ñ?×DÑDÓFÐG€Oä×Ò˜	×"Ñ"Ü& y°/ÓBˆ	ä×Ò˜
×#Ñ#ØMœW×.Ò.¨zÓ:×EÑE×JÑJÓLÐMÐÜ'¨
Ð4DÓEˆ
÷B÷ B÷Hð ”=Ò ô ×*Ò*×,Ñ,Øô 
×	Ò	°eÓ	<áESó%
ÚESÀŒJ�qœ%Ÿ,™,Ó'×;¨A¯O©OÒ;Á^ñ%
ˆð Ñ$Ü3ØØØØ!Ø#ó‰KˆG�Rð (ˆGØˆBô % Z´×:Ñ:‰JÀÀÒLð !ô Ð.Ô0B×CÓCÜ2ØÞ "�B—H’H¨Ø(×6Ñ6Ø$3÷	ñ ð !÷5 
=Ð	<ñ" Mô *ØØ Ø)ñ
ˆð
 	×Ñ˜Ô$Ø�‰÷E 
=Ñ	<ùò%
÷ 
=Õ	<ús1   ÄHÄ7HÅAHÆ,HÇHÇ)HÈHÈ
HzOrderedSet[str]Ú_serialized_patternsc                ól  • SS jn[         R                  5       (       d  [        S[          35      eUR                  nSSKJn  UR                  " SS9   [        XX45      nS S S 5        [        R                  WU S9n	U[        ;  a  Sn
[        R                  U5        OS	n
U" 5       n[        [         U S
3-  U
5       nU
S:X  a  UR                  U5        OUR                  S5        UR                  U	5        UR                  S5        S S S 5        U$ ! , (       d  f       N¹= f! , (       d  f       U$ = f)Nc                 óü  • [         R                  " S5      n [         R                  " S5      R                  U S9n/ n[        [        R
                  R                  5       Hm  n[        [        R
                  R                  U5      n [        U[        5      (       a0  [        U[        [        45      (       a  UR                  U5        Mk  Mm  Mo     SR                  U5      nSU S3nU U 3$ ! [         a     M›  f = f)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  Údirrh   Ú	_inductorÚpattern_matcherrƒ  rÔ   rÃ  Ú
issubclassrˆ   r~  r{   Ú	TypeErrorrÚ  )Úauto_generated_msgÚfile_templateÚpattern_matcher_importsr`  ÚattrÚformatted_importss         r=   Úget_file_templateÚ-_serialize_pattern.<locals>.get_file_templatev  sý   € Ü%Ÿ_š_ðó
Ðô !Ÿšðó
÷ ‰&Ð'ˆ&Ð
(ð 	ð  #%ÐÜœŸ™×7Ñ7Ö8ˆDÜœ5Ÿ?™?×:Ñ:¸DÓAˆDðÜ˜d¤D×)Ñ)¬jØœ;¬Ð4÷/ñ /ð ,×2Ñ2°4Ö8ñ	/Ñ)ñ 9ð %ŸM™MÐ*AÓBÐØPÐQbÐPcÐciÐjÐØ�Ð!2Ð 3Ð4Ð4øô ó Úðús   ÂAC-Ã-
C;Ã:C;z0Could not find serialized patterns directory at r   r$   Fr  )r\  Úwr÷  z.pyz

rY  r  )ÚSERIALIZED_PATTERN_PATHÚis_dirr  r5   Útorch._functorchr%   r"  Úgen_patternrZ  r^  r)  rð  ÚopenÚwrite)Úunique_namerÛ  r$  rõ   rú  r9  Úpattern_namer!  r‰   Úserialized_patternÚ
write_moder5  Úfs                r=   Ú_serialize_patternrG  o  s  € ô'5ôR #×)Ñ)×+Ñ+ÜØ>Ô?VÐ>WÐXó
ð 	
ð ×%Ñ%€Lå;à	×	Ò	°eÓ	<Ü˜i¸ÓUˆ÷ 
=ô .×1Ñ1°'À{Ð1ÐSÐØÔ/Ó/Øˆ
Ü× Ñ  Õ.àˆ
á%Ó'€Mä	Ô%¨<¨.¸Ð(<Ñ<¸jÔ	IÈQØ˜ÓØ�G‰G�MÕ"à�G‰G�FŒOØ	�‰Ð"Ô#Ø	�‰�Œ÷ 
Jð €N÷) 
=Õ	<ú÷ 
JÔ	Ið €Nús   ÁDÂ=AD$Ä
D!Ä$
D3Ú	fx_passesÚserialized_patternszvlist[tuple[Any, Iterable[Any], Callable[[Callable[..., Any], Iterable[Any]], torch.fx.GraphModule], Any, PatternExpr]]Ú_known_precompiled_patternsc
                ó   • [        U5      nS[        R                  ;   a  [        XX4U5      n
O]UR                  n[
        R                  " SU 35      nU(       a  [        XÀ5      (       d  [        R                  SU 5        [        XÀ5      n
[        R                  " U5       H0  n[        U[        5      (       d  M  UR                  c  M)  S Ul        M2     [         R#                  XXGU
45        [%        UUUUUUUUU
U	S9
  g )NÚPYTORCH_GEN_PATTERNSz.torch._inductor.fx_passes.serialized_patterns.zDPrecompiled pattern %r not found. Run torchgen/fuse/gen_patterns.py.)r  rç  )r¢   r  r  rG  r5   Ú	importlibÚimport_modulerZ  rÙ  r  rƒ  rÉ  Ú	tree_iterrÔ   r)   ÚconstantrJ  r{   r(  )rB  rÛ  r  r$  rõ   r‚  rw  rú  rù  rç  ÚpatrC  r  rÛ   s                 r=   Úgen_register_replacementrR  Ï  sö   € ô ˜>Ó*€Nà¤§¡Ó+Ü Ø NÐ>Oó
‰ð !×)Ñ)ˆÜ×#Ò#Ø<¸\¸NÐKó
ˆö œ ×/Ñ/Ü�K‰KØVØôô �aÓ%ˆä×Ò Ö/ˆÜ�cœ:×&Ó&¨3¯<©<Ó+Cð
  ˆCŽLñ 0ô  ×&Ñ&Ø	 HÀÐEôô ØØØØØØØØØØ'órA   r  c                ór  • / [         R                  " U 5      R                  R                  5       QnUc  0 n/ nSnU H5  nXƒ;   a  UR	                  X8   5        M  UR	                  X   5        US-  nM7     U" X5      n	[        U	[        [        [        [        R                  [        R                  4UUUS9U	4$ )Nr   r,   )Úignore_typesrø  rú  rù  )r  r  r  r›   r{   r  ÚintÚfloatr”   rh   rð  rï  )
rÛ  r$  rõ   rú  rù  rø  Úflat_inputsÚ	input_idxÚargnameÚ	search_gms
             r=   r#  r#    sÀ   € ð A”×"Ò" 9Ó-×8Ñ8×=Ñ=Ó?Ð@€HàÑ ØÐØ€KØ€IãˆØÓ'Ø×ÑÐ0Ñ9Ö:à×Ñ˜~Ñ8Ô9Ø˜‰NŠIñ ñ ˜Ó0€IäØÜœu¤d¬E¯L©L¼%¿+¹+ÐFØØ/Ø 3ñ	
ð 	ð	ð 	rA   c                ó"   • [        XX#U5      S   $ r/  )r#  )rÛ  r$  rõ   rú  rù  s        r=   r?  r?  *  s!   € ô %Ø 8Ð@Sóàñ	ð 	rA   r}  c               ó$   ^ ^^^• SUUU U4S jjnU$ )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                ól   >• [        U 5      (       d   e[        TTU S9R                  TTS9  SU l        U $ )N©r‰   rw  r‰  r}  T)r†  r‡  r  Ú_inductor_lowering_function©r‰  rw  Ú	pass_dictr‰   r~  s    €€€€r=   Ú	decoratorÚ,register_lowering_pattern.<locals>.decoratorC  s>   ø€ Ü˜× Ñ Ð Ð ÜØ¨¸gñ	
ç
‰(�9 gˆ(Ñ
.Ø.2ˆÔ+ØˆrA   ©r‰  rˆ  rC   rˆ  r8   ©r‰   rw  ra  r~  rb  s   ```` r=   Úregister_lowering_patternrf  6  s   û€ ÷ò ð ÐrA   c               ó$   ^ ^^^• SUUU U4S jjnU$ )z_
Register a pattern that runs a function on the FX graph, allowing
custom transformation code.
c                ó^   >• [        U 5      (       d   e[        TTU S9R                  TTS9  U $ )Nr^  r}  )r†  r‘  r  r`  s    €€€€r=   rb  Ú)register_graph_pattern.<locals>.decoratorZ  s6   ø€ Ü˜× Ñ Ð Ð ÜØ¨¸gñ	
ç
‰(�9 gˆ(Ñ
.ØˆrA   rd  r8   re  s   ```` r=   Úregister_graph_patternrj  N  s   û€ ÷ò ð ÐrA   c                óB   • U[        [        U R                  5      5      L $ r7   )r¼   Úiterr�   )r˜   rÏ   s     r=   Úis_start_of_fx_graphrm  d  s   € à”4œ˜UŸ[™[Ó)Ó*Ð*Ð*rA   z6(?<!_)(_$|_[.]|(\b|_)(set|enter|exit|seed)(\b|_))(?!_)c                óâ   • U R                   S:w  a  gU [        R                  R                  R                  R
                  [        R                  R                  R                  R
                  4;   $ )Nr0   F)rT  rh   rÊ   r0   Úaccumulate_grad_ÚdefaultÚresize_storage_bytes_)rŒ  s    r=   Ú"fixme_incorrect_inductor_schema_oprr  n  sW   € Ø	‡|�|�zÓ!Øð Ü�	‰	×Ñ×+Ñ+×3Ñ3Ü�	‰	×Ñ×0Ñ0×8Ñ8ðñ ð rA   c                óö  • [        U R                  [        R                  R                  5      (       a:  [        U R                  5      (       d   U R                  R                  R                  $ [        U R                  [        R                  R                  R                  5      (       a  gU R                  S:X  aL  [        U R                  5      (       d   e[        R                  U R                  R                  5      (       a  gOVU R                  S:X  aF  [        U R                  [         5      (       d   e[        R                  U R                  5      (       a  gU R"                  R%                  S5      S L$ )NFr   Tr  Úout)rÔ   rÉ   rh   r‡  r’  rr  Ú_schemaÚ
is_mutableÚ_higher_order_opsÚauto_functionalizeÚAutoFunctionalizedrŒ  r†  Ú_mutation_op_reÚsearchr5   r4   r<   ry   r½  s    r=   Úis_mutation_opr|  z  s  € ÜØ�‰”U—Z‘Z×*Ñ*÷ñ ä0°·±×=Ñ=Ø�{‰{×"Ñ"×-Ñ-Ð-Ü	Ø�‰”U×,Ñ,×?Ñ?×RÑR÷
ñ 
ð Ø‡w�w�/Ó!Ü˜Ÿ™×$Ñ$Ð$Ð$Ü×!Ñ! $§+¡+×"6Ñ"6×7Ñ7Øð 8à	�‰�MÓ	!Ü˜$Ÿ+™+¤s×+Ñ+Ð+Ð+Ü×!Ñ! $§+¡+×.Ñ.ØØ�;‰;�?‰?˜5Ó!¨Ð-Ð-rA   c                óˆ   • SU R                   ;   d   eSUR                   ;   d   eU R                   S   UR                   S   :H  $ ©NÚmutation_region_idrà   )r÷  rø  s     r=   Úsame_mutation_regionsr€  Ž  sE   € Ø 1§6¡6Ó)Ð)Ð)Ø 1§6¡6Ó)Ð)Ð)Ø�6‰6Ð&Ñ'¨1¯6©6Ð2FÑ+GÑGÐGrA   c                óP  • UnSUR                   ;  a>  [        X5      (       d.  UR                  nSUR                   ;  a  [        X5      (       d  M.  UR                   R                  SS5      nX!La5  UR                  n[        U5      (       a  US-  nX2R                   S'   X!La  M5  U$ )Nr  r   r,   )r~   rm  Úprevry   r¼   r|  )r˜   rÏ   r°   r  s       r=   Úget_mutation_region_idrƒ  ”  s–   € Ø€AØ
 a§f¡fÓ
,Ô5IÈ%×5SÑ5SØ�F‰Fˆð  a§f¡fÓ
,Ô5IÈ%×5SÓ5SàŸ™Ÿ™Ð$8¸!Ó<ÐØ
Š-Ø�F‰FˆÜ˜!×ÑØ !Ñ#ÐØ'9�‰Ð#Ñ$ð	 Œ-ð
 ÐrA   c                óX   • S[        [        U R                  5      5      R                  ;  $ r~  )r¼   rl  r�   r~   r2  s    r=   Ú"should_compute_mutation_region_idsr…  ¡  s!   € Ø¤t¬D°·±Ó,=Ó'>×'CÑ'CÑCÐCrA   c                ót   • SnU R                    H&  n[        U5      (       a  US-  nXR                  S'   M(     g )Nr   r,   r  )r�   r|  r~   )r˜   r  Únds      r=   Úcompute_mutation_region_idsrˆ  ¥  s9   € ØÐØ�kŒkˆÜ˜"×ÑØ !Ñ#ÐØ(:�‰Ð$Ó%ò rA   c                óÖ   ^ • SU 4S jjnU Vs/ s H2  n[         R                  " U[         R                  R                  5      PM4     nn[         R                  " U5      Ul        U$ s  snf )zI
Wrap a bound method to remove 'self' from its signature for FX tracing.
c                 ó   >• T" U 0 UD6$ r7   r8   )r;   r<   rS   s     €r=   ÚwrapperÚ#_wrap_bound_method.<locals>.wrapper²  s   ø€ Ù�4Ð"˜6Ñ"Ð"rA   rB   )r  Ú	ParameterÚPOSITIONAL_OR_KEYWORDÚ	SignatureÚ__signature__)rS   rø  r‹  r`  Úparamss   `    r=   r  r  ­  sb   ø€ ÷
#ñ
 óâˆDô 	×Ò˜$¤× 1Ñ 1× GÑ GÖHÙð ð ô $×-Ò-¨fÓ5€GÔØ€Nùòs   Ž9A&c                  ó\   ^ • \ rS rSr  S     SU 4S jjjrS	S jrS
S jrSS jrSrU =r	$ )r€  i½  c                óŠ   >• [         TU ]  5         [        [        5      U l        Xl        X l        [        [        5      U l        g r7   )r“   r^   r   r”   Úpatternsr‚   Ú	subsystemræ  )r:   r‚   r•  r•   s      €r=   r^   ÚPatternMatcherPass.__init__¾  s=   ø€ ô
 	‰ÑÔô œÓð 	Œð #ŒØ"Œô >IÌÓ=NˆÕrA   c                ó    • U R                   U   $ r7   )r”  )r:   Úitems     r=   rp  ÚPatternMatcherPass.__getitem__Ð  s   € Ø�}‰}˜TÑ"Ð"rA   c                ó@  • U R                   (       d  g[        U[        R                  R                  5      (       a  UR
                  nOO[        U[        R                  R                  5      (       a  UnUR                  nO[        S[        U5       35      e[        U5      (       a  [        U5        [        R                  " [        U5      nSn/ nSnU R                    H.  u  pxUS:X  a  SnM  UR                  UR!                  XxSS95        M0     U(       a  UR                  UR!                  SSS95        U R"                  b  U R"                  OSn	[        U[        R                  R                  5      (       d   e[%        XU R&                  5         [)        [*        R,                  R/                  U5      SS	9 GHÃ  n
[1        U
5      nU
R2                  S:X  a  U
R2                  U4U R                   ;  a  M=  [5        U
SS
9(       a  MN  U R                   U
R2                  U4    GHU  nU
R6                  (       a    M�  UR8                  R;                  U
5      n[=        U5      (       a-  [?        [A        [C        X<RD                  5      5      5      S:w  a  Mp  [F        RH                  RK                  S5      U
RL                  :X  a+  [N        RQ                  SXªRR                  XËR8                  5        [=        U5      (       d  MÚ  [U        URW                  U5      5      (       d  Mû  US-  nURY                  XÂU
5        [Z        [\           S==   S-  ss'   [Z        [\           S==   [?        URD                  5      -  ss'   GMX     GMÆ     S S S 5        U$ ! , (       d  f       U$ = f)Nr   zJThe input to PatternMatcherPass must be a GraphModule or a Graph, but got Fr  T)rŒ  rÉ   Úsort)rŒ  r›  r1  )Úreverse)Úallow_cpu_inputsr,   rû  z
%s%s %s %sÚpattern_matcher_countÚpattern_matcher_nodes)/r”  rÔ   rh   ri   r¤  r˜   ÚGraphr¥  r  rÃ  r…  rˆ  rì   rí   rƒ  r{   Ú
find_nodesr‚   r    r•  Úsortedr´  rµ  Úfrom_iterabler¢  rŒ  r.   r­   r‰   r$  r  rÈ   r"   rØ  r�   r  r  ry   r`  rÙ  r  r;   r   rw  rz  r   Úbackend)r:   r&  r˜   Úget_mutation_region_id_partialÚcountr�   Úhas_call_modulerŒ  rÉ   r‚   rÏ   Úentryr  s                r=   rz  ÚPatternMatcherPass.applyÓ  sÏ  € Ø�}�}ØÜ�bœ%Ÿ(™(×.Ñ.×/Ñ/Ø—H‘H‰EÜ˜œEŸH™HŸN™N×+Ñ+ØˆEØ×$Ñ$‰BäØ\Ô]aÐbdÓ]eÐ\fÐgóð ô .¨e×4Ñ4Ü'¨Ô.Ü)2×):Ò):Ü" Eó*
Ð&ð ˆØˆØˆØŸ-œ-‰JˆBØ�]Ó"Ø"&’à—‘˜U×-Ñ-°ÈÐ-ÐOÖPñ	 (ö
 Ø�L‰L˜×)Ñ)¨]ÀÐ)ÐGÔHØ&*§n¡nÑ&@�D—N’NÐFWˆ	Ü˜"œeŸh™h×2Ñ2×3Ñ3Ð3Ð3Ü# B°4·>±>ÕBÜœyŸ™×<Ñ<¸UÓCÈTÕR�Ü'¨Ó-�Ø—7‘7˜mÓ+ØŸ™ Ð(°·±Ó=Ù ô
 9¸ÐPU×VÙà!Ÿ]™]¨D¯G©G°VÐ+<Õ=�EØ—|—|ÚØŸ™×+Ñ+¨DÓ1�Aô ! Ÿ™ÜÜ&¤sÐ+IÏ7É7Ó'SÓTóð óñ
 !Ü—z‘z—~‘~Ð&IÓJÈdÏiÉiÓWÜŸ™ L°$¿	¹	À1ÇmÁmÔTä —{“{¤~°e×6GÑ6GÈÓ6J×'KÓ'KØ ™
˜ØŸ™ A¨dÔ3Ü ¤Ñ)Ð*AÓBÀaÑGÓBÜ ¤Ñ)Ð*AÓBÄcÈ!Ï'É'ÃlÑRÖBô) >ñ S÷ CðD ˆ÷E CÔBðD ˆús   ÆE'NË?NÌ A$NÎ
Nc                ó8   • U R                   R                  5         g r7   )r”  Úclearr]   s    r=   r«  ÚPatternMatcherPass.clear  s   € Ø�‰×ÑÕrA   )r‚   r”  ræ  r•  r   )r‚   úOptional[str]r•  r­  rC   ra   )r˜  rr  rC   rs  )r&  ú+Union[torch.fx.GraphModule, torch.fx.Graph]rC   rU  r`   )
r5   rD   rE   rF   r^   rp  rz  r«  rH   r  r  s   @r=   r€  r€  ½  sK   ø† ð $(Ø#'ðOà ðOð !ðOð 
÷	Oð Oô$#ô?÷Bò rA   r€  c                 ó   • [         er7   rž  r¨   s     r=   Ú_not_implementedr°    s   € Ü
ÐrA   c                ó<  ^^^^	^
^• U=(       d    0 nUR                  5        VVs0 s H  u  pVXe_M	     snnm
[        T
5      [        U5      :X  d   e S     SUU
4S jjjm[        R                  " 5       m	 " UU	UUU4S jS[        R
                  R                  5      n[        U [        R
                  R                  5      (       d   eU" U 5      R                  5       n[        U[        5      (       d  [        [        R                  " U5      5      $ U$ s  snnf )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                ó   >• Ub  UOTn[        U [        [        45      (       a  U T;   a  [        TU    5      $ [	        U 5      U;   a
  [        5       $ [        U [        5      (       a(  [        S U  5       5      (       a  U (       a
  [        5       $ U $ )Nc              3  óB   #   • U  H  n[        U[        5      v •  M     g 7fr7   )rÔ   rO  )rm   Úys     r=   rp   Ú5fx_to_pattern.<locals>.process_arg.<locals>.<genexpr>7  s   é € Ð&IÂqÀ!¤z°!´W×'=Ð'=Âqùs   ‚)rÔ   rV  rU  r\  rÃ  rO  r”   rû  )r±  Úignore_types_overrideÚcurrent_ignore_typesrT  Úinv_scalar_workarounds      €€r=   Úprocess_argÚ"fx_to_pattern.<locals>.process_arg-  s‚   ø€ ð &;Ñ%FÑ!ÈLð 	ô �aœ%¤˜×&Ñ&¨1Ð0EÓ+EÜÐ3°AÑ6Ó7Ð7Ü�‹7Ð*Ó*Ü“9ÐÜ�aœ×Ñ¤3Ñ&IÁqÓ&I×#IÑ#IÎaÜ“9ÐØˆrA   c                  ó€   >^ • \ rS rSr\r\r\r        SUUU4S jjr        SUU4S jjr	SU 4S jjr
SrU =r$ )	Ú fx_to_pattern.<locals>.Converteri=  c                óô   >• [        T5      nU[        T5      :  a  TU   nO<T(       a  UR                  S5      (       d   eUnO[        R                  " SSU5      nUnUT;   a  [        U5      $ [        U5      $ )NÚtangentz_\d+$r—  )r¼   rÈ   Ú
startswithÚreÚsubrt  r\  )	r:   rÉ   r;   r<   r°   r`  rø  Úargnumrù  s	         €€€r=   rš  Ú,fx_to_pattern.<locals>.Converter.placeholderF  sx   ø€ ô �V“ˆAØ”3�x“=Ó Ø ‘{‘ÞØ×(Ñ(¨×3Ñ3Ð3Ð3Ø‘äŸš ¨"¨fÓ5�Ø�ØÐ*Ó*Ü*¨4Ó0Ð0ä! $Ó'Ð'rA   c                óp  >• T	nU[         R                  L a"  [        S T 5       5      4     SU	4S jjjnUn[        R                  " XBU45      u  p#[
        T;   aA  U Vs/ s H
  od" U5      PM     nnUR                  5        VVs0 s H  u  pvXt" U5      _M     nnn[        U/UQ70 UD6$ s  snf s  snnf )Nc              3  ó:   #   • U  H  o[         Ld  M  Uv •  M     g 7fr7   )rU  )rm   Úts     r=   rp   ÚAfx_to_pattern.<locals>.Converter.call_function.<locals>.<genexpr>g  s   é € ð QÚ#/˜a¼C°<Ÿ™¢<ùs   ‚’	c                ó   >• T" X5      $ r7   r8   )r±  r¶  r¹  s     €r=   Úprocess_arg_fn_implÚKfx_to_pattern.<locals>.Converter.call_function.<locals>.process_arg_fn_imple  s   ø€ ñ ' qÓ@Ð@rA   ©r±  rV   r¶  zOptional[Sequence[type[Any]]]rC   zUnion[T, KeywordArg, Ignored])r‘  r¼  r¢   rÉ  rñ   r”   r   rÿ  )
r:   rÉ   r;   r<   Úprocess_arg_fnrÉ  r÷  rn   rT  r¹  s
           €€r=   r   Ú.fx_to_pattern.<locals>.Converter.call_function[  sÜ   ø€ ð )ˆNàœ×)Ñ)Ò)ô LQñ QÙ#/óQó LðAØðAà+HðAð
 3÷Að Að "5�ä!Ÿ?š?¨>À&¸>ÓJ‰LˆDÜ�|Ó#á37Ó8²4¨a˜ qÖ)±4�Ð8Ø;A¿<¹<¼>ÔJº>±4°1˜!˜^¨AÓ.Ò.¹>�ÑJÜ Ð8¨Ò8°Ñ8Ð8ùò 9ùÛJs   Á!B-ÂB2c                ó„  >• [         TU ]  U5      nUR                  S:X  a…  [        U[        5      (       ap  UR
                  S   n[        U[        5      (       d   e[        U5      [        U5      :X  d   e[        X#5       H  u  pE[        UR                  5      Ul	        M!     U$ [        UR                  5      Ul	        U$ )Nr0  r   )
r“   r   rŒ  rÔ   r¢   r;   r   rÈ   ró   r®   )r:   r°   Úrvr;   ÚrrÛ   r•   s         €r=   r   Ú)fx_to_pattern.<locals>.Converter.run_nodev  sœ   ø€ Ü‘Ñ! !Ó$ˆBØ�t‰t�xÓ¤J¨r´5×$9Ñ$9Ø—v‘v˜a‘y�Ü! $¬
×3Ñ3Ð3Ð3Ü˜2“w¤# d£)Ó+Ð+Ð+Ü! "žm‘F�Aä! #§)¡)›n�A–Gñ ,ð
 ˆIô ˜qŸw™w›<�”ØˆIrA   r8   )rÉ   r4   r;   r  r<   úMapping[str, Any]rC   z&Union[ExclusiveKeywordArg, KeywordArg])rÉ   r4   r;   r  r<   rÒ  rC   rˆ   )r°   rç   rC   r   )r5   rD   rE   rF   r°  r  r  r�  rš  r   r   rH   r  )r•   rø  rÂ  rù  rT  r¹  s   @€€€€€r=   Ú	Converterr¼  =  s|   ù† à&ˆà&ˆà#ˆð	(àð	(ð  ð	(ð &ð		(ð
 4÷	(ñ 	(ð*	9àð	9ð  ð	9ð &ð		9ð
 ÷	9ð 	9÷6	õ 	rA   rÓ  r7   rË  )r   rÈ   r´  r¦  rh   ri   rÍ  rÔ   r¤  r^  rˆ   r)  rÉ  Útree_leaves)r&  rT  rø  rú  rù  rn   ro   rÓ  r‰   rÂ  r¸  r¹  s    `` `    @@@r=   r  r    s  ý€ ð *×/¨RÐØ.?×.EÑ.EÔ.GÔHÒ.G¡d a˜QšTÑ.GÒHÐÜÐ$Ó%¬Ð->Ó)?Ó?Ð?Ð?ð FJðØðØ%Bðà	&÷ñ ô �_Š_Ó€F÷Dó D”E—H‘H×(Ñ(ô DôL �bœ%Ÿ(™(×.Ñ.×/Ñ/Ð/Ð/Ù˜‹m×ÑÓ!€GÜ�gœ{×+Ñ+Ü!¤&×"4Ò"4°WÓ"=Ó>Ð>Ø€Nùó{ Is   ¥DT)rÒ   Úget_decomp_fnc               ój  • [        5          [        5          Ub  U" 5       O	[        5       n[        XSS9" U6 nSSS5        SSS5        SSKJn  U(       a,  U" WR                  5        UR                  R                  5         WR                  5         U$ ! , (       d  f       Na= f! , (       d  f       Nj= f)z>Build a normalized inference graph, for use with fx_to_patternNÚreal)Útracing_moder,   ©Úremove_noop_ops)	r   r!   r-   r   Úfx_passes.post_gradrÚ  r˜   Úeliminate_dead_codeÚ	recompile)rS   r;   rÒ   rÕ  Údecompositionsr&  rÚ  s          r=   rî   rî   Š  s„   € ô 
"Õ	#Ô%7Õ%9à,Ñ8‰MŒOÔ>QÓ>Sð 	ô �R°fÒ=¸tÐDˆ÷	 &:×	#õ 5æÙ˜Ÿ™Ô!ð 	�‰×$Ñ$Ô&à‡L�L„NØ€I÷+ &:Õ%9ú×	#Õ	#ús!   ‹B$–"B¸B$Â
B!	ÂB$Â$
B2c           
     ó  ^• Sm        S
U4S jjn[         R                  R                  S5         [        U S U[	        5       SSS9" U6   SSS5        T(       d   eSSKJn  U" TR                  5        SS	KJ	n  UR                  TR                  5        [         R                  R                  R                  5       TR                  l        TR                  R                  5         TR                  5         T$ ! , (       d  f       N³= f)z=Build a normalized training graph, for use with fx_to_patternNc                óD   >• T(       a   e[        U 5      m[        X40 UD6$ r7   )Úclone_graphr(   )Újoint_graphÚinputsr<   r&  s      €r=   Úrecord_joint_graphÚ)joint_fwd_bwd.<locals>.record_joint_graph±  s&   ø€ ö ˆˆvÜ˜Ó%ˆÜ  Ñ?¸Ñ?Ð?rA   c                ó   • [        U 5      $ r7   )r'   )r&  r$  s     r=   rÜ   Újoint_fwd_bwd.<locals>.<lambda>½  s	   € ¤°rÔ':rA   TF)Úpartition_fnrÞ  Úkeep_inference_input_mutationsÚ
enable_logr,   rÙ  )Úearly_patterns)râ  rU   rã  r  r<   r   rC   z1tuple[torch.fx.GraphModule, torch.fx.GraphModule])rh   Ú_guardsÚtracingr&   r-   rÛ  rÚ  r˜   Úfx_passes.joint_graphrë  rz  ri   ÚCodeGenÚ_codegenrÜ  rÝ  )rS   r;   rä  rÚ  rë  r&  s        @r=   r  r  ¬  sç   ø€ ð *.€Bð@Ø)ð@Ø3@ð@ØLOð@à	:÷@ô 
�‰×	Ñ	˜tÕ	$ÜØá:Ø+Ü.Ó0Ø+/Øò	
ð ñ	÷ 
%ö €Iˆ2å4á�B—H‘HÔå5à×Ñ˜Ÿ™Ô"ô Ÿ™Ÿ™×.Ñ.Ó0€B‡H�HÔØ‡H�H× Ñ Ô"Ø‡L�L„NØ€I÷1 
%Õ	$ús   ³C;Ã;
D	c                óŠ   • / n[         R                  R                  U R                  U R                  4UR
                  5        U$ r7   )rh   ri   rò   r;   r<   r{   )r°   r;   s     r=   rä  rä  Ô  s1   € Ø)+€DÜ	‡H�H×Ñ�a—f‘f˜aŸh™hÐ'¨¯©Ô5Ø€KrA   c                ó–  • [        [        U R                  5      5      n[        [        R
                  R                     " 5       n[        [         5      nS nU(       a½  UR                  5       n[        U5       Vs/ s H  ofU;  d  M
  UPM     nnU(       a  X7S      R                  U5        OdUR                  U5        U(       a   UR                  ULa  UR                  U5        UnUR                  [        UR                  US5      5      5        U(       a  M½  U(       d"  [        U5      [        U R                  5      :X  d   eg s  snf )Nr‹  r8   )r”   r¬   r�   r"   rh   ri   rÕ   r   rK  rä  r{   rð  r¼   r�   rÈ   )r˜   ÚpendingÚreadyÚwaitingÚcursorrÏ   r±  Úwaiting_fors           r=   Ústable_topological_sortrø  Ú  sü   € ô ”8˜EŸK™KÓ(Ó)€Gô ”u—x‘x—}‘}Ò%Ó'€Eô œ$Ó€Gð €FÞ
Ø�{‰{‹}ˆÜ"'¨¤+Ó@¢+˜Q¸%±—q¡+ˆÐ@Þð  ‘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   Á:	EÂEc                ót   ^ • [         R                  [         R                  " T 5      SSU 4S jjj5       5       nU$ )z0Wrapper around lazy init functions in fx_passes/c                ój  >• [         [           R                  5       n[        R                  R                  S 5         [        5          [        5          T" U 5      nS S S 5        S S S 5        S S S 5        U[         [        '   W$ ! , (       d  f       N-= f! , (       d  f       N6= f! , (       d  f       N?= fr7   )r   r¤  rz   rh   rì  rí  r   r*   )Úinput_deviceÚcounters_refr¨  rS   s      €r=   Ú	lazy_initÚ%init_once_fakemode.<locals>.lazy_init	  sv   ø€ ô  ¤Ñ(×-Ñ-Ó/ˆä�]‰]×"Ñ" 4Õ(Ô*@Õ*BÄNÕDTÙ˜Ó%ˆF÷ EU×*B×(ð )Œ”Ñàˆ÷ EUÕDTú×*BÕ*Bú×(Õ(ús;   ¼B$ÁBÁ	BÁBÁ#B$Â
BÂBÂ
B!	ÂB$Â$
B2r7   )rû  zOptional[torch.device]rC   r   )rì   rl  rŒ  )rS   rý  s   ` r=   Úinit_once_fakemoderÿ  þ  s9   ø€ ô ‡_�_Ü‡_‚_�RÓ÷	ð 	ó ó ð	ð ÐrA   c                ó   ^ • SU 4S jjnU$ )z2Function for extra_check to put pass behind a flagc                ó$   >• [        [        T5      $ r7   )rƒ  r%   )r$  r`  s    €r=   Ú
flag_checkÚconfig_flag.<locals>.flag_check	  s   ø€ Ü”v˜tÓ$Ð$rA   )r$  r†   rC   r   r8   )r`  r  s   ` r=   Úconfig_flagr  	  s   ø€ ÷%ð ÐrA   c                óL   •  " S S[         5      nU" U 5      R                  5       $ )Nc                  ó,   ^ • \ rS rSrSU 4S jjrSrU =r$ )Úclone_graph.<locals>.CopyGraphi	  c                óT  >• [         TU ]  U5      n[        U[        R                  R
                  5      (       an  UR                  R                  R                  UR                  5        U R                  R                  R                  UR                  S 5      UR                  l        U$ r7   )r“   r   rÔ   rh   ri   ÚProxyrÏ   r~   r}   Ú	new_graphÚ_graph_namespacerf  r`  )r:   r�   rþ   r•   s      €r=   r   Ú'clone_graph.<locals>.CopyGraph.run_node	  st   ø€ Ü‘wÑ'¨Ó1ˆHÜ˜(¤E§H¡H§N¡N×3Ñ3Ø—‘×"Ñ"×)Ñ)¨(¯-©-Ô8Ø%)§^¡^×%DÑ%D×%PÑ%PØ—M‘M 4ó&�—‘Ô"ð ˆOrA   r8   )r�   rç   rC   rç   )r5   rD   rE   rF   r   rH   r  r  s   @r=   Ú	CopyGraphr  	  s   ø† ÷	õ 	rA   r  )r+   Ú	transform)Úinput_graphr  s     r=   rá  rá  	  s$   € ô	”Kô 	ñ �[Ó!×+Ñ+Ó-Ð-rA   Ú_seen_patternsc                ó�   • [        U R                  5      U:”  a  U R                  U   $ Uc  g U R                  R                  U5      $ r7   )rÈ   r;   r<   ry   )rÏ   Ú
arg_numberÚ
kwarg_names      r=   Úget_arg_valuer  -	  s?   € ô ˆ4�9‰9ƒ~˜
Ó"Ø�y‰y˜Ñ$Ð$Ø	Ñ	Øà�{‰{�‰˜zÓ*Ð*rA   c           	     ó(  • U/n[        U[        R                  R                  5      (       a9  UR	                  UR                  5        Vs/ s H  n[        X5      PM     sn5        U  Vs/ s H  oDR                  U;   d  M  UPM     sn$ s  snf s  snf r7   )rÔ   rh   r‡  rˆ  r�   r‰  rƒ  rÉ   )r�   rS   r  r„  rÏ   s        r=   Úfilter_nodesr  8	  sm   € Øˆ$€CÜ�"”e—j‘j×1Ñ1×2Ñ2Ø�
‰
¸"¿,¹,¼.ÓIº.¨h”G˜BÖ)¹.ÑIÔJá"Ó9šU�T§k¡k°SÑ&8�D™UÑ9Ð9ùò Jùâ9s   Á
B
Á*BÂBc                óä   • U R                   S:X  aU  [        U R                  [        5      (       d   e[	        U R
                  R                  U R                  5      R                  $ U R                  $ )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  )rŒ  rÔ   rÉ   r4   r   r˜   r¥  r•   r½  s    r=   r¢  r¢  @	  sR   € ð
 ‡w�w�-ÓÜ˜$Ÿ+™+¤s×+Ñ+Ð+Ð+Ü˜Ÿ™×1Ñ1°4·;±;Ó?×IÑIÐIØ�;‰;ÐrA   )r—  )r€   r‹   r�   rç   r‚   r4   rC   ra   )r  r+  rC   zTypeIs[Match]r  )rÛ  rˆ  r4  r  rC   ra   r'  )
r‰   rˆ   r˜   zOptional[torch.fx.Graph]ræ  zdict[str, list[Optional[str]]]rç  ræ   rC   ræ   )rÛ  r2   r  rJ   r$  úIterable[Any]rõ   rP   r‚  r…  rw  rv  rú  ú)Union[dict[str, Union[float, int]], None]rù  úSequence[str]r  zUnion[PatternExpr, None]rç  ræ   rC   ræ   )rB  r4   rÛ  r2   r$  r  rõ   rP   rú  r  rC   rˆ   )rB  r4   rÛ  r2   r  rJ   r$  r  rõ   rP   r‚  r…  rw  rv  rú  r  rù  r  rç  ræ   rC   ra   )Nr8   )rÛ  r2   r$  r  rõ   rP   rú  r  rù  r  rC   z(tuple[PatternExpr, torch.fx.GraphModule])rÛ  r2   r$  r  rõ   rP   rú  r  rù  r  rC   rˆ   )
r‰   rˆ   rw  rv  ra  rn  r~  ræ   rC   z2Callable[[Callable[..., Any]], Callable[..., Any]])r˜   r  rÏ   rç   rC   ræ   )rŒ  ztorch._ops.OpOverloadrC   ræ   rª  )r÷  rç   rø  rç   rC   ræ   )r˜   r  rÏ   rç   rC   rU  )r˜   r  rC   ræ   )r˜   r  rC   ra   )rS   r   rø  z	list[str]rC   r   )r;   r   r<   r   rC   r   )r8   r8   Nr8   )r&  r®  rT  zSequence[type[Any]]rø  r  rú  r  rù  r  rC   rˆ   )
rS   rˆ  r;   r  rÒ   ræ   rÕ  zOptional[Callable[..., Any]]rC   rU   )rS   rˆ  r;   r  rC   rU   )r°   rç   rC   zlist[torch.fx.node.Argument])rS   rˆ  rC   zCallable[[], Any])r`  r4   rC   zCallable[[Match], Any])r  rU   rC   rU   r7   )rÏ   rç   r  rU  r  r­  rC   r   )r�   zIterable[torch.fx.Node]rS   r   rC   rŒ   )rÏ   rç   rC   ztorch.fx.node.Target)¹r  Ú
__future__r   rê   Údataclassesrì   rM  r  r´  Úloggingr‘  r  rÀ  r-  rl  Úabcr   r   Úcollectionsr   Úcollections.abcr   r   r	   r
   r   r   Úpathlibr   r   r   r   r   r   r   Útyping_extensionsr   r   rh   Ú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    rv   r!   Útorch.utils._ordered_setr"   Ú
_functorchr%   r!  Ú_functorch.aot_autogradr&   r'   Ú_functorch.partitionersr(   Ú_subclassesr)   r*   ri   r+   r—  Údecompositionr-   Úloweringr.   Ú	getLoggerr5   rÙ  rÊ   ÚatenÚprimsÚConstantrÕ   r*  r  ry   r¤  r2   rJ   rP   rV   rÏ   ÚTargetr4   ÚFnsTyperX   r[   r„   r†   r  rœ   r+  r  r�   rˆ   rH  rO  r\  rt  r~  r¢   Ú_SimpleSpecr¬  rÿ  r  r  r
  r  r  r  r  r)  rD  rZ  rn  Ú	dataclassru  r‡  r‘  rÀ   r×  rÜ  rê  r(  r)  rG   rG  Ú__file__Úparentr<  rJ  rR  r"  r#  r?  rf  rj  rm  Úcompilerz  rr  r|  r€  rƒ  r…  rˆ  r  r€  r°  r  Úno_gradrî   Úenable_gradr  rä  rø  rÿ  r  rá  r  r  r  r¢  r8   rA   r=   Ú<module>rC     s¸  ðò!õF #ã Û Û Û Û Û Û Û Û 	Û 	Û Û ß #Ý #ß X× XÝ ß D× Dß *ã Û Û ß $Ð $Ý ;Ý (Ý 0Ý @Ý 6ß WÝ +ß IÝ KÝ 1Ý /å 3ß CÝ 7ß 4Ý Ý Ý .Ý ;ð ×Ò˜Ó!€Ø‡y�y‡~�~€Ø�	‰	�‰€à€Ø�x §¡§¡Ð.Ñ/€à
�*‰*�.‰.Ð>À
Ó
K€ô>ˆxô >ô>�ô >ô#ˆhô #ñ ˆCƒL€ð �—‘—‘×$Ñ$ cÐ)Ñ
*€÷?ñ ?ñ ‹:€ð IKð?Øð?Ø(5ð?ØBEð?à	õ?÷8Cñ CôL�,ô ð8 �E˜;Ð&Ñ'€ô÷'
ñ '
ô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ô !ð ×Ò÷:ð :ó ð:ð: ×Òô
˜<ó 
ó ð
ð ×Òô	=˜ó 	=ó ð	=ð ×Òôh
˜ló h
ó ðh
ôVôð "ð	'Øð'à#ð'ð 2ð'ð ð	'ð
 
õ'ð` ,8ØCGØ)+Ø26Ø!ðXØðXàðXð "ðXð ð	Xð
 @ðXð )ðXð AðXð 'ðXð 0ðXð ðXð 
õXñv )3«Ð �oÓ 4ðMØðMàðMð "ðMð ð	Mð
 AðMð ôMñ` ˜x›.×/Ò/°+Ñ=Ð@UÑUÐ ð ð ð ó ð$ ,8ØCGØ)+Ø!ð5Øð5àð5ð ð5ð "ð	5ð
 ð5ð @ð5ð )ð5ð Að5ð 'ð5ð ð5ð 
õ5ðp ×Ó¨eÑ4ð
 DHØ)+ðØðà!ðð ðð Að	ð
 'ðð .ôó 5ððL DHØ)+ð		Øð		à!ð		ð ð		ð Að			ð
 'ð		ð õ		ð ,8ðð
 ñØðà(ðð ð	ð
 ðð 8öð4 ,8ðð
 ñØðà(ðð ð	ð
 ðð 8öô,+ð —*“*ÐVÓW€ô	ô.ô(Hô
ôDô;ô÷ Xñ Xôvð )+Ø ØCGØ)+ðkØ3ðkà%ðkð ðkð Að	kð
 'ðkð õkð\ ‡ƒƒð
 #'Ø26ñØðà
ðð  ð	ð
 0ðð ôó ððB ×ÓÓó$ó ð$ôNô!:ôHô&ô.ñ  #-£,€�Ó .ð GKð+Ø
ð+Ø%(ð+Ø6Cð+àõ+ô:õrA   