§
    ŠŠtjj—  ã                   óÔ  — U d dl Z d dlmZmZ d dlmZmZ d dlmZm	Z	 d dl
Zg d¢Z e j        e¦  «        Z ed¦  «        Z e	d¦  «        Zeeef         Zeeef         Ze G d„ d	¦  «        ¦   «         Zeeeee         gee         f         Ze G d
„ d¦  «        ¦   «         Z e¦   «         Zeed<   i aeeeef         ej        j         f         ed<   i Z!ee"ef         ed<   eeeef         ee         f         Z#i a$e#ed<   eeeeeef                  f         Z%i a&e%ed<   i a'e%ed<   i a(e%ed<   d a)e*ed<    e+h d£¦  «        Z,e+e         ed<   deee         z  dz  deee         z  dz  deee         z  dz  de-eeef                  fd„Z.ddœdeddfd„Z/i Z0eeej        j         f         ed<    e-¦   «         Z1e-e         ed <   i Z2eeeef         ej        j         f         ed!<   d"edej        j         fd#„Z3d$edej        j         fd%„Z4d&ed$ed'eddfd(„Z5d&ed$eddfd)„Z6d&edd*fd+„Z7d&edefd,„Z8d-ed&eddfd.„Z9d/ej        j         d0ed$eddfd1„Z:d2eee         z  dz  dee         fd3„Z;dddd4œd5eee         z  dz  d6eee         z  dz  d7eee         z  dz  ddfd8„Z<dddd9œd:eee         z  dz  d;eee         z  dz  d<eee         z  dz  ddfd=„Z=d>edee         fd?„Z>d>ed&ed$ed@eeef         ddf
dA„Z?dBe"dCe"defdD„Z@dddEœdFedGed&ed$edHedz  dIedJedKeddfdL„ZAddMœdNee         dOee         dPedefdQ„ZBddRœd&ed$edSee         dTedz  ddf
dU„ZCddddVœdWedXe-eeef                  dz  dYedTedz  ddf
dZ„ZD	 dgd[edee"ef         fd\„ZEddRœd&ed$edSee         dTedz  ddf
d]„ZFdhd^„ZGdd_œd`edYeddfda„ZHdd_œdbeeeegef         dYeddfdc„ZIdd_œddeeegef         deedYeddfdf„ZJdS )ié    N)ÚCallableÚIterable)Ú	dataclassÚfield)Ú	ParamSpecÚTypeVar)ÚUserOrderingFnÚregister_op_overrideÚ!reorder_graphs_from_user_functionÚreenable_op_overridesÚderegister_op_overridesÚget_dsl_operationsÚnative_decomp_tableÚPÚRc                   ól   — e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   dZe	ed	<   d
Z
e	ed<   dS )Ú_OverrideNodezTrack function override data.Údsl_nameÚ	op_symbolÚdispatch_keyÚcond_fnÚimpl_fnÚnode_idFÚunconditional_overrideTÚactiveN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__Ú	_OpCondFnÚ	_OpImplFnr   Úboolr   © ó    úT/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_native/registry.pyr   r      sz   € € € € € € à'Ð'à€M€M�MØ€N€N�NØÐÐÑØÐÐÑØÐÐÑð
 €L€L�LØ#(Ð˜DÐ(Ð(Ñ(Ø€FˆDÐÐÑÐÐr&   r   c                   óJ  — e Zd ZU dZ ee¬¦  «        Zee         ed<    ee¬¦  «        Z	ee         ed<    ee¬¦  «        Z
ee         ed<   dedefd„Z	 dd
eee         z  dz  deee         z  dz  deee         z  dz  deddf
d„Zdeeeef                  fd„Zdefd„ZdS )Ú_FilterStatez+Manages filtering state for override nodes.)Údefault_factoryÚ
_dsl_namesÚ_op_symbolsÚ_dispatch_keysÚnodeÚreturnc                 óf   — |j         | j        v rdS |j        | j        v rdS |j        | j        v rdS dS )zå
        Check if a node is enabled based on current filter state.

        Args:
            node: The override node to check

        Returns:
            bool: True if the node should be enabled, False if filtered out
        FT)r   r+   r   r,   r   r-   )Úselfr.   s     r'   Úcheck_enabledz_FilterState.check_enabled9   sH   € ð Œ=˜DœOÐ+Ð+Ø�5àŒ>˜TÔ-Ð-Ð-Ø�5àÔ Ô 3Ð3Ð3Ø�5àˆtr&   FÚ	dsl_namesNÚ
op_symbolsÚdispatch_keysÚremove_keysc                 ó  — |r€| xj         t          t          |¦  «        ¦  «        z  c_         | xj        t          t          |¦  «        ¦  «        z  c_        | xj        t          t          |¦  «        ¦  «        z  c_        dS | xj         t          t          |¦  «        ¦  «        z  c_         | xj        t          t          |¦  «        ¦  «        z  c_        | xj        t          t          |¦  «        ¦  «        z  c_        dS )aó  
        Update filter sets as (current | new) or (current ~ new).

        Args:
            dsl_names: DSL names to add/remove from filter
            op_symbols: Operation symbols to add/remove from filter
            dispatch_keys: Dispatch keys to add/remove from filter
            remove_keys: If True, remove keys from filter; if False, add them

        Note:
            Uses set.discard as it doesn't raise an exception if the element
            wasn't in the set to begin with.
        N)r+   ÚsetÚ_resolve_iterabler,   r-   )r1   r3   r4   r5   r6   s        r'   Úupdatez_FilterState.updateN   sï   € ð( ð 	IØˆOŒO�sÕ#4°YÑ#?Ô#?Ñ@Ô@Ñ@ˆOŒOØÐÔ¥Õ$5°jÑ$AÔ$AÑ BÔ BÑBÐÔØÐÔ¥3Õ'8¸Ñ'GÔ'GÑ#HÔ#HÑHÐÔÐÐàˆOŒO�sÕ#4°YÑ#?Ô#?Ñ@Ô@Ñ@ˆOŒOØÐÔ¥Õ$5°jÑ$AÔ$AÑ BÔ BÑBÐÔØÐÔ¥3Õ'8¸Ñ'GÔ'GÑ#HÔ#HÑHÐÔÐÐr&   c                 óB   — t          | j        | j        | j        ¦  «        S )z¯
        Build a set of dictionary keys based on the current filter state.

        Returns:
            set[tuple[str, str]]: Set of (op_symbol, dispatch_key) tuples
        )Ú_build_key_setr+   r,   r-   )r1   s    r'   Úbuild_disable_key_setz"_FilterState.build_disable_key_setk   s'   € õ ØŒOØÔØÔñ
ô 
ð 	
r&   c                 ó  — d}|dz  }|dz  }t          | j        ¦  «        D ]\  }}|d|› d|› d�z  }Œ|dz  }t          | j        ¦  «        D ]\  }}|d|› d|› d�z  }Œ|dz  }t          | j        ¦  «        D ]\  }}|d|› d|› d�z  }Œ|S )	z-Return string representation of filter state.Ú zFilter State:
z  === DSL: ===
ú    z: ú
z  === OP SYMBOL: ===
z  === DISPATCH KEYS: ===
)Ú	enumerater+   r,   r-   )r1   ÚsÚiÚdslÚopÚkeys         r'   Ú__str__z_FilterState.__str__x   sñ   € àˆØ	ÐÑˆØ	ÐÑˆÝ ¤Ñ0Ô0ð 	%ð 	%‰FˆAˆsØÐ$˜Ð$Ð$˜SÐ$Ð$Ð$Ñ$ˆAˆAØ	Ð%Ñ%ˆÝ˜tÔ/Ñ0Ô0ð 	$ð 	$‰EˆAˆrØÐ#˜Ð#Ð#˜RÐ#Ð#Ð#Ñ#ˆAˆAØ	Ð)Ñ)ˆÝ Ô 3Ñ4Ô4ð 	%ð 	%‰FˆAˆsØÐ$˜Ð$Ð$˜SÐ$Ð$Ð$Ñ$ˆAˆAàˆr&   ©F)r   r   r   r   r   r8   r+   r    r!   r,   r-   r   r$   r2   r   r:   Útupler=   rH   r%   r&   r'   r)   r)   1   sf  € € € € € € à5Ð5à ˜5°Ð5Ñ5Ô5€J��C”Ð5Ð5Ñ5Ø!˜E°#Ð6Ñ6Ô6€K��S”Ð6Ð6Ñ6Ø$˜u°SÐ9Ñ9Ô9€N�C˜”HÐ9Ð9Ñ9ð -ð °Dð ð ð ð ð4 "ðIð Ià˜ #œÑ&¨Ñ-ðIð ˜( 3œ-Ñ'¨$Ñ.ðIð ˜X cœ]Ñ*¨TÑ1ð	Ið
 ðIð 
ðIð Ið Ið Ið:
 s¨5°°c°¬?Ô';ð 
ð 
ð 
ð 
ð˜ð ð ð ð ð ð r&   r)   Ú_filter_stateÚ_libsÚ_native_decomp_overridesÚ_graphsÚ_dsl_name_to_lib_graphÚ_dispatch_key_to_lib_graphÚ_op_symbol_to_lib_graphÚ_node_id_counter>   ÚMetaÚCompositeExplicitAutogradÚCompositeImplicitAutogradÚ_DISALLOWED_DISPATCH_KEYSr3   r4   r5   r/   c                 óâ   ‡— t          ¦   «         Šdt          t          t                   z  dz  dt          ddfˆfd„} || t          ¦  «          ||t
          ¦  «          ||t          ¦  «         ‰S )aK  
    Build a set of dictionary keys based on filter criteria.

    Args:
        dsl_names: DSL names to include in key set
        op_symbols: Operation symbols to include in key set
        dispatch_keys: Dispatch keys to include in key set

    Returns:
        set[tuple[str, str]]: Set of (op_symbol, dispatch_key) tuples
    ÚentriesNÚgraph_lib_dictr/   c                 óx   •— t          | ¦  «        }|D ]&}||v r ||         D ]}‰                     |¦  «         ŒŒ'dS )z;Helper to add matching keys from graph_lib_dict to key_set.N)r9   Úadd)rX   rY   Úresolved_entriesÚentryrG   Úkey_sets        €r'   Ú_append_to_setz&_build_key_set.<locals>._append_to_setÓ   sa   ø€ õ -¨WÑ5Ô5Ðà%ð 	%ð 	%ˆEØ˜Ð&Ð&Ø)¨%Ô0ð %ð %�CØ—K’K Ñ$Ô$Ð$Ð$øð	%ð 	%r&   )r8   r    r   Ú_MappingTyperO   rQ   rP   )r3   r4   r5   r_   r^   s       @r'   r<   r<   Á   s’   ø€ õ  %(¡E¤E€Gð	%Ý•x¥”}Ñ$ tÑ+ð	%Ý=Ið	%à	ð	%ð 	%ð 	%ð 	%ð 	%ð 	%ð €N�9Õ4Ñ5Ô5Ð5Ø€N�:Õ6Ñ7Ô7Ð7Ø€N�=Õ"<Ñ=Ô=Ð=à€Nr&   F)Úprint_inactivera   c                 ó  — t                                ¦   «         D ]n\  \  }}}t          d|›d|›�¦  «         t          |¦  «        D ]A\  }}|j        s| r3d|› d|j        ›d|j        ›�}| r|d|j        ›�z  }t          |¦  «         ŒBŒodS )z~
    Print all override graphs for debugging purposes.

    Args:
        print_inactive: Whether to print inactive nodes
    zop=z, key=r@   z: node.dsl_name=z, node.unconditional_override=z node.active=N)rN   ÚitemsÚprintrB   r   r   r   )ra   rF   rG   Ú	node_listrD   r.   rC   s          r'   Ú_print_override_graphsrf   å   sÉ   € õ !(§¢¡¤ð 	ð 	Ñ‰	ˆˆS�9ÝÐ�ÐÐ˜ÐÐÑÔÐå  Ñ+Ô+ð 	ð 	‰GˆAˆtØŒ{ð ˜nð ØU ÐUÐU T¤]ÐUÐU°tÔ7RÐUÐU�Ø!ð ,ØÐ+˜Tœ[Ð+Ð+Ñ+�Aå�a‘”�øð	ð	ð 	r&   Ú	_def_libsÚ_defined_native_opsÚ_aten_override_libsÚ	namespacec                 ó~   — | t           vr(t          j                             | d¦  «        t           | <   t           |          S )NÚFRAGMENT)rg   ÚtorchÚlibraryÚLibrary)rj   s    r'   Ú_get_def_libraryrp     s4   € Ø�	Ð!Ð!Ý$œ}×4Ò4°YÀ
ÑKÔK�	�)ÑÝ�YÔÐr&   r   c                 óˆ   — d| f}|t           vr)t          j                             dd| ¦  «        t           |<   t           |         S )z‘
    Get or create the _native IMPL library for a given dispatch key.

    One library per dispatch key is shared across all overridden ops.
    Ú_nativeÚIMPL)rL   rm   rn   ro   )r   rG   s     r'   Ú_get_or_create_libraryrt   
  s@   € ð �lÐ
#€CØ
•%ÐÐÝ”]×*Ò*¨9°f¸lÑKÔK�ˆc‰
å�Œ:Ðr&   r   Úkernelc                 óø   — | |f}t                                |d¦  «        }|�|                     ¦   «          t          j                             dd|¦  «        }|                     | ||d¬¦  «         |t           |<   dS )a  
    Install (or replace) an aten kernel at (op_symbol, dispatch_key).

    Creates a fresh Library per (op, key) so we can tear down just this
    one override via `_destroy_aten_override` without affecting any other
    override at the same dispatch key.
    NÚatenrs   T)Úwith_keyset)ri   ÚpopÚ_destroyrm   rn   ro   Úimpl)r   r   ru   rG   ÚexistingÚlibs         r'   Ú_install_aten_overrider~     s�   € ð �lÐ
#€Cõ #×&Ò& s¨DÑ1Ô1€HØÐØ×ÒÑÔÐå
Œ-×
Ò
 ¨°Ñ
=Ô
=€CØ‡H‚HˆY˜ ¸$€HÑ?Ô?Ð?Ø"Õ˜ÑÐÐr&   c                 óp   — t                                | |fd¦  «        }|�|                     ¦   «          dS dS )zATear down the aten override at (op_symbol, dispatch_key), if any.N)ri   ry   rz   )r   r   r}   s      r'   Ú_destroy_aten_overrider€   .  s9   € å
×
!Ò
! 9¨lÐ";¸TÑ
BÔ
B€CØ
€Ø�Š‰Œˆˆˆð €r&   ztorch._ops.OpOverload | Nonec                 ó¾   — |                       d¦  «        \  }}}|pd}	 t          t          j        j        |¦  «        }t          ||¦  «        S # t
          $ r Y dS w xY w)u4  
    Resolve `op_symbol` to a concrete OpOverload on `torch.ops.aten`.

    Accepts bare names ("bmm" â†’ aten.bmm.default) and overload-qualified
    names ("add_.Tensor" â†’ aten.add_.Tensor). Returns None if the op is not
    registered (e.g. a test-only op_symbol that never hit the C++ dispatcher).
    ú.ÚdefaultN)Ú	partitionÚgetattrrm   Úopsrw   ÚAttributeError)r   ÚnameÚ_Úoverload_nameÚpackets        r'   Ú_resolve_aten_overloadrŒ   5  sr   € ð '×0Ò0°Ñ5Ô5Ñ€Dˆ!ˆ]Ø!Ð. Y€MðÝ�œœ¨Ñ.Ô.ˆÝ�v˜}Ñ-Ô-Ð-øÝð ð ð Øˆtˆtðøøøs   Ÿ.A Á
AÁAc                 óÞ   — t          | ¦  «        }|€t          d| ›�¦  «        ‚t          |j        ¦  «        }|                     dd¦  «        \  }}|                     dd¦  «        \  }}d|› �S )uÎ   Return the schema of at::<op_symbol> with the `aten::<name>` prefix stripped.

    Accepts bare names ("bmm" â†’ aten.bmm.default) and overload-qualified
    names ("add_.Tensor" â†’ aten.add_.Tensor).
    Nz aten op not found for op_symbol=z::é   ú()rŒ   r‡   r    Ú_schemaÚsplit)r   ÚoverloadrC   r‰   ÚrestÚargss         r'   Ú_aten_schema_tailr•   F  sx   € õ & iÑ0Ô0€HØÐÝÐMÀ	ÐMÐMÑNÔNÐNÝˆHÔÑÔ€Aà�gŠg�d˜AÑÔ�G€A€tØ�jŠj˜˜aÑ Ô �G€A€tØˆtˆ:ˆ:Ðr&   rˆ   c                 ó0  — | t           v rd S t          d¦  «                             | › t          |¦  «        › �¦  «         t	          |¦  «        }t          j                             d| › �¦  «        |dœd„¦  «         t                                | ¦  «         d S )Nrr   z	_native::)Ú_aten_overloadc                 ó   —  | |i |¤ŽS ©Nr%   )r—   r”   Úkwargss      r'   ú<lambda>z(_define_native_op_once.<locals>.<lambda>d  s   € ¸n¸nØð?
Øð?
ð ?
€ r&   )	rh   rp   Údefiner•   rŒ   rm   rn   Úregister_faker[   )rˆ   r   Úaten_overloads      r'   Ú_define_native_op_oncerŸ   V  s²   € ð Õ"Ð"Ð"ØˆÝ�YÑÔ×&Ò&¨$Ð'NÕ0AÀ)Ñ0LÔ0LÐ'NÐ'NÑOÔOÐOõ +¨9Ñ5Ô5€MÝ	„M×ÒÐ 2¨DÐ 2Ð 2Ñ3Ô3Ø%2ð 	
ð 	
ð 	
ð 	
ñô ð õ ×Ò˜DÑ!Ô!Ð!Ð!Ð!r&   r}   r.   c                 óÐ   — |j         s t          d|j        ›d|j        ›d�¦  «        ‚t	          |j         |j        ¦  «         |                      |j         |j        |dd¬¦  «         dS )zà
    Register a single node implementation with the library.

    Args:
        lib: The torch.library.Library instance
        node: The override node to register
        dispatch_key: The dispatch key for registration
    zJ_OverrideNode must have a non-empty node_id before registration (dsl_name=z, op_symbol=ú)FT)rx   Úallow_overrideN)r   Ú
ValueErrorr   r   rŸ   r{   r   )r}   r.   r   s      r'   Ú_register_node_implr¤   r  sœ   € ð Œ<ð 
ÝðJØœðJð JØ6:´nðJð Jð Jñ
ô 
ð 	
õ ˜4œ<¨¬Ñ8Ô8Ð8Ø‡H‚HØŒØŒØØØð ñ ô ð ð ð r&   Úiterablec                 óh   — | €g S t          | t          ¦  «        rt          | t          ¦  «        r| fS | S )zÌ
    Resolve various input types to a consistent iterable of strings.

    Args:
        iterable: String, iterable of strings, or None

    Returns:
        Iterable[str]: Consistent iterable output
    )Ú
isinstancer   r    )r¥   s    r'   r9   r9   Œ  s?   € ð ÐØˆ	å�h¥Ñ)Ô)ð ­Z¸Å#Ñ-FÔ-Fð Øˆ{Ðà€Or&   )Úenable_dsl_namesÚenable_op_symbolsÚenable_dispatch_keysr¨   r©   rª   c                 ó
  — t                                d| ||¦  «         t                               | ||d¬¦  «         t	          | ||¦  «        }|D ]3}|\  }}|t
          v r#t          ||t
          |         t          ¬¦  «         Œ4dS )as  
    Re-enable overrides by removing them from filter state and reregistering.

    Args:
        enable_dsl_names: DSL names to re-enable
        enable_op_symbols: Operation symbols to re-enable
        enable_dispatch_keys: Dispatch keys to re-enable

    Note:
        This function uses reverse filter state management (removing from
        filters to enable).
    z>Re-registering ops by dsl: %s, op_symbol: %s, dispatch_key: %sT)r6   ©Úfilter_stateN)ÚlogÚinforK   r:   r<   rN   Ú_register_overrides_from_graph)r¨   r©   rª   r^   rG   r   r   s          r'   r   r   Ÿ  sÀ   € õ$ ‡H‚HØHØØØñ	ô ð õ ×ÒØØØØð	 ñ ô ð õ %3ØØØñ%ô %€Gð ð ð ˆØ"%Ñˆ	�<à•'ˆ>ˆ>õ +Ø˜<­°¬ÅMðñ ô ð øðð r&   )Údisable_dsl_namesÚdisable_op_symbolsÚdisable_dispatch_keysr±   r²   r³   c                 ó  — t                                d| ||¦  «         t                               | ||¦  «         t                               ¦   «         }|D ]3}|\  }}|t
          v r#t          ||t
          |         t          ¬¦  «         Œ4dS )ag  
    De-register overrides by updating filter state and reregistering graphs.

    Args:
        disable_dsl_names: DSL names to disable
        disable_op_symbols: Operation symbols to disable
        disable_dispatch_keys: Dispatch keys to disable

    Note:
        This function uses filter state management to selectively disable
        operations.
    z>De-registering ops by dsl: %s, op_symbol: %s, dispatch_key: %sr¬   N)r®   r¯   rK   r:   r=   rN   Ú_cleanup_and_reregister_graph)r±   r²   r³   r^   rG   r   r   s          r'   r   r   Ô  s¬   € õ$ ‡H‚HØHØØØñ	ô ð õ ×ÒÐ*Ð,>Ð@UÑVÔVÐVõ %2×$GÒ$GÑ$IÔ$I€Gð ð 	ð 	ˆØ"%Ñˆ	�<à•'ˆ>ˆ>Ý)ØØÝ˜”Ý*ð	ñ ô ð øð		ð 	r&   r   c                 óÎ   — t          ¦   «         }t                               ¦   «         D ]/\  \  }}}|D ]$}|j        | k    r|                     |¦  «          nŒ%Œ0t          |¦  «        S )z¼Get list of operations registered by a specific DSL.

    Args:
        dsl_name: Name of the DSL to query.

    Returns:
        Sorted list of operation names registered by the DSL.
    )r8   rN   rc   r   r[   Úsorted)r   Ú
operationsr   r‰   Únodesr.   s         r'   r   r      sv   € õ ‘”€JÝ!(§¢¡¤ð ð Ñ‰ˆ�A˜Øð 	ð 	ˆDØŒ} Ò(Ð(Ø—’˜yÑ)Ô)Ð)Ø�ð )øõ �*ÑÔÐr&   rG   c                 ó*  — dt           t          t          t          t          t          f                  f         dt          dt          t          t          f         ddfd„} |t          | |¦  «          |t
          ||¦  «          |t          ||¦  «         dS )zÖ
    Update the registration mapping dictionaries.

    Args:
        dsl_name: The DSL name
        op_symbol: The operation symbol
        dispatch_key: The dispatch key
        key: The dictionary key tuple
    ÚregistrationÚsymbolrG   r/   Nc                 ór   — |                       |¦  «        }|€
|g}|| |<   dS |                     |¦  «         dS )z;Helper to add key to registration list or create new entry.N)ÚgetÚappend)r»   r¼   rG   Ú
entry_lists       r'   Ú_get_new_entry_or_appendz;_update_registration_maps.<locals>._get_new_entry_or_append%  sN   € ð "×%Ò% fÑ-Ô-ˆ
àÐØ˜ˆJØ#-ˆL˜Ñ Ð Ð à×Ò˜cÑ"Ô"Ð"Ð"Ð"r&   )Údictr    ÚlistrJ   rO   rQ   rP   )r   r   r   rG   rÁ   s        r'   Ú_update_registration_mapsrÄ     s£   € ð&#Ý�3¥¥U­3µ¨8¤_Ô 5Ð5Ô6ð#åð#õ •3��8Œ_ð#ð 
ð	#ð #ð #ð #ð ÐÕ3°X¸sÑCÔCÐCØÐÕ4°iÀÑEÔEÐEØÐÕ7¸ÀsÑKÔKÐKÐKÐKr&   r”   rš   c                  ó   — dS )NTr%   )r”   rš   s     r'   Ú_always_truerÆ   8  s   € Øˆ4r&   )Úallow_multiple_overrider   ÚbackendÚ
lib_symbolÚcondr{   rÇ   r   c                óÌ  — |dk    rt          d|› d�¦  «        ‚|t          v rt          d|›d�¦  «        ‚|€|st          d¦  «        ‚t          }||f}t                               |g ¦  «        }	|                     dd	¦  «        }
|
› d	| › d	t          › �}t          d
z  a|	                     t          | ||||||¬¦  «        ¦  «         |	t          |<   t          | |||¬¦  «         dS )a�  
    Register a passed override function to the dispatcher.

    Actually a graph-building operation; real registration happens later.

    Args:
        backend: The backend name (DSL name)
        lib_symbol: Library you're overriding symbols in (must be "aten")
        op_symbol: Name of the operation you're overriding
        dispatch_key: Dispatch key to override
        cond: Predicate choosing whether `impl` applies to a given call. May
            be None if `unconditional_override=True`.
        impl: Implementation function for the override
        allow_multiple_override: Allow overriding an existing override
        unconditional_override: Implementation doesn't have a fallback and
            doesn't require torch.DispatchKeySet as the first argument. When
            True, a trivially-True predicate is supplied for the router if
            `cond` is None.

    Raises:
        ValueError: If lib_symbol is not "aten", if dispatch_key is in
            _DISALLOWED_DISPATCH_KEYS (Meta / CompositeImplicitAutograd /
            CompositeExplicitAutograd), or if cond is None without
            unconditional_override=True.
    rw   z.Unsupported lib_symbol (must be "aten", got: "ú"zdispatch_key=z¡ is not supported. Overrides must be installed at a backend key (e.g. CPU, CUDA, XPU); the router's fake kernel redispatches to aten and would recurse otherwise.Nz8cond must be provided unless unconditional_override=Truer‚   r‰   rŽ   )r   r   r   r   r   r   r   )rG   )
r£   rV   rÆ   rN   r¾   ÚreplacerR   r¿   r   rÄ   )rÈ   rÉ   r   r   rÊ   r{   rÇ   r   rG   Úop_graphÚ
_sanitizedr   s               r'   r
   r
   <  sH  € ðH �VÒÐÝÐWÈ*ÐWÐWÐWÑXÔXÐXàÕ0Ð0Ð0ÝðH˜Lð Hð Hð Hñ
ô 
ð 	
ð €|Ø%ð 	YÝÐWÑXÔXÐXÝˆà�lÐ
#€Cõ �{Š{˜3 Ñ#Ô#€Hð ×"Ò" 3¨Ñ,Ô,€JØÐ:Ð:˜gÐ:Ð:Õ(8Ð:Ð:€GÝ˜ÑÐà‡O‚OÝØØØ%ØØØ#9Øð	
ñ 	
ô 	
ñ
ô 
ð 
ð …GˆC�Lå˜g y°,ÀCÐHÑHÔHÐHÐHÐHr&   ©Úforce_reregisterÚoriginal_graphÚ	new_graphrÑ   c                ó   — |rdS | |k    S )aG  
    Determine if a graph needs reregistration based on changes.

    Args:
        original_graph: The original graph before modification
        new_graph: The graph after modification
        force_reregister: If True, always reregister regardless of changes

    Returns:
        bool: True if reregistration is needed
    Tr%   )rÒ   rÓ   rÑ   s      r'   Ú_should_reregister_graphrÕ   Œ  s   € ð" ð Øˆtð ˜YÒ&Ð&r&   r¬   Úgraphr­   c                ó,   — t          | |||¬¦  «         dS )a‹  
    Reregister a graph's routes from scratch.

    Used by reorder / deregister / reenable. Libraries are intentionally
    long-lived singletons; we rebuild the per-op router closure here.

    Args:
        op_symbol: The operation symbol
        dispatch_key: The dispatch key
        graph: The graph to register
        filter_state: Optional filter state for conditional registration
    r¬   N)r°   )r   r   rÖ   r­   s       r'   rµ   rµ   ¤  s1   € õ& #ØØØØ!ð	ñ ô ð ð ð r&   )Úkeys_to_processÚreregister_overridesr­   Útransformation_fnrØ   rÙ   c                ó¶  — |�|n%t          t                               ¦   «         ¦  «        }t          |¦  «        D �]\  }}||ft          vrŒt          t          ||f         ¦  «        }	  | |||¦  «        }nh# t          t
          t          t          f$ r! t           	                    d||d¬¦  «         Y Œzt          $ r t                               d||¦  «         Y Œ¡w xY wt          |t          ¦  «        s0t           	                    dt          |¦  «        j        ||¦  «         Œê|t          ||f<   |r%t          ||d¬¦  «        rt!          ||||¬	¦  «         �ŒdS )
a”  
    Apply a transformation function to graphs and optionally reregister.

    This is the core pattern used by reorder_graphs_from_user_function and
    can be reused for other graph transformation operations.

    Args:
        transformation_fn: Function to transform each graph
        keys_to_process: Keys to process, or None for all graphs
        reregister_overrides: Whether to reregister changed graphs
        filter_state: Optional filter state for conditional registration

    Note:
        If transformation_fn raises an exception for a specific graph, that graph
        will be skipped and processing will continue with remaining graphs.
    NúAGraph transformation failed for %s/%s. Preserving original graph.T©Úexc_infoúNUnexpected error in graph transformation for %s/%s. Preserving original graph.zbGraph transformation returned invalid type %s for %s/%s. Expected list. Preserving original graph.FrÐ   r¬   )r8   rN   ÚkeysrÃ   Ú	TypeErrorr£   r‡   ÚRuntimeErrorr®   ÚwarningÚ	ExceptionÚ	exceptionr§   Útyper   rÕ   rµ   )	rÚ   rØ   rÙ   r­   Útarget_keysr   r   rÒ   rÓ   s	            r'   Ú_apply_graph_transformationrè   ¿  sÀ  € ð6 +Ð6ˆˆ½CÅÇÂÁÄÑ<OÔ<Oð õ
 $(¨Ñ#4Ô#4ð /ñ /Ñˆ	�<Ø�|Ð$­GÐ3Ð3Øå�g y°,Ð&?Ô@ÑAÔAˆð	Ø)Ð)¨)°\À>ÑRÔRˆIˆIøÝ�:¥~µ|ÐDð 	ð 	ð 	Ý�KŠKØSØØØð	 ñ ô ð ð ˆHÝð 	ð 	ð 	Ý�MŠMØ`ØØñô ð ð
 ˆHð	øøøõ ˜)¥TÑ*Ô*ð 	Ý�KŠKØtÝ�Y‘”Ô(ØØñ	ô ð ð ð .7��˜LÐ)Ñ*ð  ð 	Õ$<Ø˜I¸ð%
ñ %
ô %
ð 	õ *ØØØØ)ð	ñ ô ð ùðU/ð /s   Á)A7Á7;CÂ4%CÃCÚoverrides_onlyc                 ó~   — | ri }nddl m} t           |¦   «         ¦  «        }|                     t          ¦  «         |S )aÌ  
    Return a decomposition table suitable for passing to
    ``ExportedProgram.run_decompositions`` or to Inductor / Dynamo as a
    decomposition set for ``torch.compile``.

    This is the canonical way to apply native overrides outside of eager.
    Callers opt in explicitly -- the registry does **not** install into any
    global compile/export decomp table on its own. This preserves three
    properties:

      * ``import torch._native`` doesn't transitively import inductor /
        dynamo / triton.
      * No other consumer (ONNX, tests, third-party backends) accidentally
        picks up our overrides.
      * Scoping is up to the caller: pass the table only where routing is
        desired.

    By default, the returned table contains
    ``torch.export.default_decompositions()`` with native-registered
    overrides layered on top -- matching typical "run the usual
    decompositions, plus my overrides" intent. The override entries win
    over any same-op default, because they're merged last.

    Example:

        ep = torch.export.export(model, args)
        ep = ep.run_decompositions(
            torch._native.registry.native_decomp_table()
        )

    Args:
        overrides_only: If True, return only the native-registered overrides
            and no default aten decompositions. Useful for inspection /
            debugging, or when composing tables manually.

    Returns:
        A dict mapping ``OpOverload`` to decomposition callable.
    r   )Údefault_decompositions)Útorch.exportrë   rÂ   r:   rM   )ré   Útablerë   s      r'   r   r     sW   € ðR ð /Ø(*ˆˆð 	8Ð7Ð7Ð7Ð7Ð7åÐ+Ð+Ñ-Ô-Ñ.Ô.ˆà	‡L‚LÕ)Ñ*Ô*Ð*Ø€Lr&   c                óJ  ‡‡‡— t          |¦  «        }g Š|D ]^}d}|r|                     |¦  «        }|r:t          |||¦  «         ‰                     |j        |j        f¦  «         d|_        ŒWd|_        Œ_t          | ¦  «        }t          | |¦  «         ‰s|�t           
                    |d¦  «         dS t          j                             d| › �|¦  «        }t          ¦   «         Šdt          fˆˆfd„Š|dœˆˆfd„
}	ˆˆfd	„}
t!          | ||	¦  «         |�|
t          |<   dS dS )
a  
    Register all overrides in a single graph.

    Args:
        op_symbol: The operation symbol
        dispatch_key: The dispatch key
        graph: List of override nodes to register
        filter_state: Optional filter state for conditional registration
    TFNzaten::Úswallow_cond_exceptionsc                 ó¤   •— ‰D ]K\  }}	  || i |¤Ž}n# t           $ r |s‚ Y Œw xY w|r' t          t          j        j        |¦  «        | i |¤Žc S ŒL‰S r™   )rä   r…   rm   r†   rr   )r”   rš   rï   rÊ   Ú	impl_nameÚmatchedÚ	_NO_MATCHÚ	cond_impls         €€r'   Ú	_dispatchz1_register_overrides_from_graph.<locals>._dispatchŽ  sŸ   ø€ Ø(ð 	Nð 	N‰OˆD�)ðØ˜$ Ð/¨Ð/Ð/��øÝð ð ð Ø.ð ØØ�ðøøøð ð NØ<•w�uœyÔ0°)Ñ<Ô<¸dÐMÀfÐMÐMÐMÐMÐMðNàÐs   Š“#¢#)Ú	_fallbackc                óN   •—  ‰||d¬¦  «        }|‰u r |j         | g|¢R i |¤ŽS |S )NF©rï   )Ú
call_boxed)Úkeysetrö   r”   rš   Úresultró   rõ   s        €€r'   Úeager_routerz4_register_overrides_from_graph.<locals>.eager_routerš  sL   ø€ Ø�˜4 ÀÐGÑGÔGˆØ�YÐÐØ'�9Ô'¨Ð@°Ð@Ð@Ð@¸Ð@Ð@Ð@Øˆr&   c                  ó:   •—  ‰| |d¬¦  «        }|‰u rt           S |S )NTrø   )ÚNotImplemented)r”   rš   rû   ró   rõ   s      €€r'   Úcompile_routerz6_register_overrides_from_graph.<locals>.compile_router   s/   ø€ Ø�˜4 ÀÐFÑFÔFˆØ�YÐÐÝ!Ð!Øˆr&   )rt   r2   r¤   r¿   r   r   r   rŒ   r€   rM   ry   rm   rn   Ú
get_kernelÚobjectr$   r~   )r   r   rÖ   r­   r}   r.   Úenabler’   Úfallback_kernelrü   rÿ   ró   rõ   rô   s              @@@r'   r°   r°   F  s´  øøø€ õ  ! Ñ
.Ô
.€Cà-/€Ið
 ð 
 ð 
 ˆØˆØð 	6Ø!×/Ò/°Ñ5Ô5ˆFàð 	 Ý  T¨<Ñ8Ô8Ð8Ø×Ò˜dœl¨D¬LÐ9Ñ:Ô:Ð:ØˆDŒKˆKàˆDŒKˆKå% iÑ0Ô0€Hõ ˜9 lÑ3Ô3Ð3ð ð ØÐÝ$×(Ò(¨°4Ñ8Ô8Ð8Øˆõ ”m×.Ò.Ð/C¸	Ð/CÐ/CÀ\ÑRÔR€Oõ ‘”€Ið
½ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð />ð ð ð ð ð ð ð ð ðð ð ð ð ð õ ˜9 l°LÑAÔAÐAð ÐØ-;Õ  Ñ*Ð*Ð*ð Ðr&   c                  óp   — t                                ¦   «         D ]\  } }| \  }}t          |||¦  «         ŒdS )zO
    Perform all registration calls from previously-built override graphs.
    N)rN   rc   r°   )rG   rÖ   r   r   s       r'   Ú_register_all_overridesr  ±  sS   € õ —m’m‘o”oð 
ð 
‰
ˆˆUØ"%Ñˆ	�<å&ØØØñ	
ô 	
ð 	
ð 	
ð
ð 
r&   )rÙ   Úfnc                ó(   — t          | |¬¦  «         dS )a¶  
    Reorder override graphs using a user-provided ordering function.

    Args:
        fn: User-provided function that takes (op_symbol, dispatch_key, graph)
            and returns a reordered graph
        reregister_overrides: Whether to reregister graphs that have changed

    Note:
        This function uses the common graph transformation pattern and can serve
        as an example for other graph manipulation operations.
    ©rÚ   rÙ   N)rè   )r  rÙ   s     r'   r   r   ¿  s+   € õ"  ØØ1ðñ ô ð ð ð r&   Ú	filter_fnc          	      óš   ‡ — dt           dt           dt          t                   dt          t                   fˆ fd„}t          ||¬¦  «         dS )aø  
    Apply a filter function to remove nodes from graphs.

    This is a convenience function that uses the graph transformation pattern
    to filter out unwanted nodes.

    Args:
        filter_fn: Function that takes (op_symbol, dispatch_key, node) and
            returns True to keep the node, False to remove it
        reregister_overrides: Whether to reregister modified graphs

    Example:
        # Remove all nodes with "deprecated" in the DSL name
        _apply_graph_filter(
            lambda op, dk, node: "deprecated" not in node.dsl_name,
            reregister_overrides=True
        )

    Note:
        If filter_fn raises an exception for a specific graph, the original
        graph will be preserved and processing will continue.
    r   r   rÖ   r/   c                 ó  •‡ ‡— 	 ˆˆˆ fd„|D ¦   «         S # t           t          t          t          f$ r# t                               d‰ ‰d¬¦  «         |cY S t          $ r! t                               d‰ ‰¦  «         |cY S w xY w)z-Apply filter_fn to graph with error handling.c                 ó.   •— g | ]} ‰‰‰|¦  «        ¯|‘ŒS r%   r%   )Ú.0r.   r   r	  r   s     €€€r'   ú
<listcomp>zI_apply_graph_filter.<locals>.filtering_transformation.<locals>.<listcomp>÷  s-   ø€ ÐWÐWÐW˜T¨i¨i¸	À<ÐQUÑ.VÔ.VÐW�DÐWÐWÐWr&   rÜ   TrÝ   rß   ©rá   r£   r‡   râ   r®   rã   rä   rå   )r   r   rÖ   r	  s   `` €r'   Úfiltering_transformationz5_apply_graph_filter.<locals>.filtering_transformationò  s¼   øøø€ ð	ØWÐWÐWÐWÐWÐW UÐWÑWÔWÐWøÝ�:¥~µ|ÐDð 	ð 	ð 	Ý�KŠKØSØØØð	 ñ ô ð ð ˆLˆLˆLÝð 	ð 	ð 	Ý�MŠMØ`ØØñô ð ð
 ˆLˆLˆLð	øøøs   … •=A>Á'A>Á=A>r  N©r    rÃ   r   rè   )r	  rÙ   r  s   `  r'   Ú_apply_graph_filterr  Ö  st   ø€ ð8ÝðÝ&)ðÝ26µ}Ô2Eðå	�mÔ	ðð ð ð ð ð õ,  Ø2Ø1ðñ ô ð ð ð r&   Úcondition_fnÚordering_fnc          	      óž   ‡ ‡— dt           dt           dt          t                   dt          t                   fˆ ˆfd„}t          ||¬¦  «         dS )aE  
    Apply reordering only to graphs that match a condition.

    This allows for more targeted reordering operations.

    Args:
        condition_fn: Function that takes (op_symbol, dispatch_key) and
            returns True if the graph should be reordered
        ordering_fn: Ordering function to apply to matching graphs
        reregister_overrides: Whether to reregister modified graphs

    Example:
        # Only reorder CUDA operations
        _apply_selective_reordering(
            condition_fn=lambda op, dk: dk == "CUDA",
            ordering_fn=lambda op, dk, g: sorted(g, key=lambda n: n.dsl_name),
            reregister_overrides=True
        )

    Note:
        If condition_fn or ordering_fn raises an exception for a specific graph,
        the original graph will be preserved and processing will continue.
    r   r   rÖ   r/   c                 óô  •— 	  ‰| |¦  «        }nl# t           t          t          t          f$ r# t                               d| |d¬¦  «         |cY S t          $ r! t                               d| |¦  «         |cY S w xY w|rz	  ‰| ||¦  «        S # t           t          t          t          f$ r# t                               d| |d¬¦  «         |cY S t          $ r! t                               d| |¦  «         |cY S w xY w|S )z=Apply ordering_fn conditionally based on condition_fn result.rÜ   TrÝ   rß   r  )r   r   rÖ   Úshould_reorderr  r  s       €€r'   Úconditional_transformationz?_apply_selective_reordering.<locals>.conditional_transformation,  si  ø€ ð	Ø)˜\¨)°\ÑBÔBˆNˆNøÝ�:¥~µ|ÐDð 	ð 	ð 	Ý�KŠKØSØØØð	 ñ ô ð ð ˆLˆLˆLÝð 	ð 	ð 	Ý�MŠMØ`ØØñô ð ð
 ˆLˆLˆLð	øøøð ð 	ðØ"�{ 9¨l¸EÑBÔBÐBøÝ�z­>½<ÐHð ð ð Ý—’ØWØØ Ø!ð	 ñ ô ð ð ���Ýð ð ð Ý—’ØdØØ ñô ð ð
 ���ðøøøð ˆs-   ƒ �=A9Á'A9Á8A9Á?B Â=C5Ã'C5Ã4C5r  Nr  )r  r  rÙ   r  s   ``  r'   Ú_apply_selective_reorderingr    s{   øø€ ð<)Ýð)Ý&)ð)Ý26µ}Ô2Eð)å	�mÔ	ð)ð )ð )ð )ð )ð )ð )õV  Ø4Ø1ðñ ô ð ð ð r&   rI   )r/   N)KÚloggingÚcollections.abcr   r   Údataclassesr   r   Útypingr   r   Útorch.libraryrm   Ú__all__Ú	getLoggerr   r®   r   r   r$   r"   r#   r   r    rÃ   r	   r)   rK   r!   rL   rÂ   rJ   rn   ro   rM   r  Ú_GraphsTyperN   r`   rO   rP   rQ   rR   ÚintÚ	frozensetrV   r8   r<   rf   rg   rh   ri   rp   rt   r~   r€   rŒ   r•   rŸ   r¤   r9   r   r   r   rÄ   rÆ   r
   rÕ   rµ   rè   r   r°   r  r   r  r  r%   r&   r'   ú<module>r$     s
  ðØ €€€€Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à Ð Ð Ð ðð ð €ð €gÔ˜Ñ!Ô!€à€Iˆc�N„N€Ø€GˆC�L„L€à�Q˜�WÔ€	Ø�Q˜�TŒN€	ð ðð ð ð ð ñ ô ñ „ðð" ˜3  T¨-Ô%8Ð9¸4ÀÔ;NÐNÔO€ð ðTð Tð Tð Tð Tñ Tô Tñ „ðTðp +˜l™nœn€ˆ|Ð ,Ð ,Ñ ,ð 79€€tˆE�#�s�(ŒO˜Uœ]Ô2Ð2Ô3Ð 8Ð 8Ñ 8ð. 46Ð ˜$˜v xÐ/Ô0Ð 5Ð 5Ñ 5ð �5˜˜c˜”? D¨Ô$7Ð7Ô8€Ø€ˆÐ Ð Ñ à�C˜˜e C¨ HœoÔ.Ð.Ô/€ð (*Ð ˜Ð )Ð )Ñ )Ø+-Ð ˜LÐ -Ð -Ñ -Ø(*Ð ˜Ð *Ð *Ñ *ð
 Ð �#Ð Ð Ñ ð -6¨IØFÐFÐFñ-ô -Ð ˜9 Sœ>ð ð ñ ð
!Ø�X˜c”]Ñ" TÑ)ð!à�h˜s”mÑ# dÑ*ð!ð ˜ #œÑ&¨Ñ-ð!ð 	ˆˆs�CˆxŒÔð	!ð !ð !ð !ðH 6;ð ð ð ¨dð ¸tð ð ð ð ð( /1€	ˆ4��U”]Ô*Ð*Ô+Ð 0Ð 0Ñ 0à # ¡¤Ð �S˜”XÐ %Ð %Ñ %ð EGÐ �T˜%  S œ/¨5¬=Ô+@Ð@ÔAÐ FÐ FÑ Fð  ð  ¨¬Ô(=ð  ð  ð  ð  ð¨ð °´Ô1Fð ð ð ð ð# cð #¸ð #Àhð #ÐSWð #ð #ð #ð #ð* cð ¸ð Àð ð ð ð ð cð Ð.Lð ð ð ð ð" ð ¨ð ð ð ð ð " ð "°ð "¸ð "ð "ð "ð "ð8Ø	ŒÔ	ðØ&3ðØCFðà	ðð ð ð ð4  h¨s¤mÑ 3°dÑ :ð ¸xÈ¼}ð ð ð ð ð* 04Ø04Ø37ð	2ð 2ð 2à˜D œI‘o¨Ñ,ð2ð ˜T #œY‘¨Ñ-ð2ð   S¤	™/¨DÑ0ð	2ð
 
ð2ð 2ð 2ð 2ðn 15Ø15Ø48ð	)ð )ð )à˜T #œY‘¨Ñ-ð)ð ˜d 3œi™¨$Ñ.ð)ð   c¤™?¨TÑ1ð	)ð
 
ð)ð )ð )ð )ðX ð ¨¨c¬ð ð ð ð ð$#LØð#Làð#Lð ð#Lð 
ˆs�CˆxŒð	#Lð
 
ð#Lð #Lð #Lð #LðL˜ð ¨&ð °Tð ð ð ð ð %*Ø#(ðMIð MIð MIØðMIàðMIð ðMIð ð	MIð
 �dÑ
ðMIð ðMIð "ðMIð !ðMIð 
ðMIð MIð MIð MIðh #ð	'ð 'ð 'Ø˜Ô'ð'à�MÔ"ð'ð ð	'ð
 
ð'ð 'ð 'ð 'ð: )-ðð ð Øðàðð �Ôðð
  Ñ%ðð 
ðð ð ð ð< 48Ø!&Ø(,ðNð Nð NØ%ðNð ˜˜s C˜xœÔ)¨DÑ0ðNð ð	Nð
  Ñ%ðNð 
ðNð Nð Nð Nðd !ð3ð 3Øð3à	ˆ&�(Ð
Ôð3ð 3ð 3ð 3ðv )-ðh<ð h<ð h<Øðh<àðh<ð �Ôðh<ð
  Ñ%ðh<ð 
ðh<ð h<ð h<ð h<ðV
ð 
ð 
ð 
ð" "'ðð ð Øðð ðð 
ð	ð ð ð ð4 "'ð5ð 5ð 5Ø˜˜c =Ð1°4Ð7Ô8ð5ð ð5ð 
ð	5ð 5ð 5ð 5ðx "'ð	Lð Lð LØ˜C ˜: tÐ+Ô,ðLàðLð ð	Lð
 
ðLð Lð Lð Lð Lð Lr&   