ó
    Eñi�B  ã                   óä  • S SK r S SKrS SKJrJrJrJr  S SKrS SKJ	r	  S SK
Jr  \R                  " \5      r " S S5      r " S S5      r " S	 S
\5      r " S S5      r\" 5       rS rS\R*                  S\4S jrS\S\\\R*                  4   4S jrS S\\   4S jjrS rS\4S jrS\\   4S jrS\S\4S jrS\S\4S jrS\S\ \\4   4S jr!S\R*                  S\4S jr"Sr#S\4S jr$g)!é    N)ÚAnyÚOptionalÚProtocolÚUnion©Úparse_namespace©Ú_disable_current_modesc                   ó^   ^ • \ rS rSrS\S\S\\R                     4S jr	U 4S jr
S rSrU =r$ )	ÚFakeScriptObjecté   Úwrapped_objÚscript_class_nameÚxc                 ó‚  • [         R                  U SU5        [         R                  U SU5         [        5          [        R                  " U5      nS S S 5        [         R                  U SW5        g ! , (       d  f       N&= f! [
        [        4 a,  n[        R                  SU[        U5      5        Un S nAN`S nAff = f)Nr   r   z¦Unable to deepcopy the custom object %s due to %s. Defaulting to the user given object. This might be dangerous as side effects may be directly applied to the object.Úreal_obj)
ÚobjectÚ__setattr__r
   ÚcopyÚdeepcopyÚRuntimeErrorÚ	TypeErrorÚlogÚwarningÚstr)Úselfr   r   r   r   Úes         Ú_/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_library/fake_class_registry.pyÚ__init__ÚFakeScriptObject.__init__   s�   € ô 	×Ñ˜4 °Ô<Ü×Ñ˜4Ð!4Ð6GÔHð	Ü'Õ)ÜŸ=š=¨Ó+�÷ *ô 	×Ñ˜4 ¨XÕ6÷ *Õ)ûäœiÐ(ó 		Ü�K‰Kð!ð "Ü�A“ôð �Hûð		ús4   °
B ºA1ÁB Á1
A?Á;B Á?B ÂB>Â"B9Â9B>c                 óh   >•  [         TU ]  U5      $ ! [         a  n[        SU S35      UeS nAff = f)Nz%Tried to call __getattr__ with attr 'aE  ' on a FakeScriptObject, implying that you are calling this inside of a fake kernel. The fake kernel should not depend on the contents of the OpaqueObject at all, so we're erroring out. If this attr is a method or constant attribute, you can allow this member access by registering it via `register_opaque_type(members=...)`.)ÚsuperÚ__getattribute__ÚAttributeError)r   Únamer   Ú	__class__s      €r   r#   Ú!FakeScriptObject.__getattribute__$   sM   ø€ ð
	Ü‘7Ñ+¨DÓ1Ð1øÜó 	Ü Ø7¸°vð >Jð Jóð ðûð	ús   ƒ ’
1œ,¬1c                 ó    • [        SU S35      e)Nz%Tried to call __setattr__ with attr 'a3  ' on a FakeScriptObject, implying that you are calling this inside of a fake kernel. The fake kernel should not depend on the contents of the OpaqueObject at all, so we're erroring out. If you need thisfunctionality, consider creating a custom TorchBind Object instead(but note that this is more difficult).)r$   )r   r%   Úvalues      r   r   ÚFakeScriptObject.__setattr__1   s    € ÜØ3°D°6ð :6ð 6ó
ð 	
ó    © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r   ÚtorchÚScriptObjectr   r#   r   Ú__static_attributes__Ú__classcell__)r&   s   @r   r   r      s:   ø† ð7Øð7Ø36ð7Ø;CÀE×DVÑDVÑ;Wô7õ*÷
ð 
r+   r   c                   óJ   • \ rS rSrS\S\S\\R                     4S jr	S r
Srg)	ÚFakeScriptMethodé<   Úself_fake_objÚmethod_nameÚschemac                 ó(   • Xl         X l        X0l        g ©N)r8   r9   r:   )r   r8   r9   r:   s       r   r   ÚFakeScriptMethod.__init__=   s   € ð +ÔØ&ÔØ�r+   c                 óP   • SSK Jn  U" U R                  U R                  /UQ70 UD6$ )Nr   )Úcall_torchbind)Ú!torch._higher_order_ops.torchbindr?   r8   r9   )r   ÚargsÚkwargsr?   s       r   Ú__call__ÚFakeScriptMethod.__call__G   s(   € ÝDá˜d×0Ñ0°$×2BÑ2BÐTÀTÒTÈVÑTÐTr+   )r9   r:   r8   N)r-   r.   r/   r0   r   r   r   r1   ÚFunctionSchemar   rC   r3   r,   r+   r   r6   r6   <   s4   † ðà'ðð ðð ˜×-Ñ-Ñ.ô	õUr+   r6   c                   ó@   • \ rS rSr\S\R                  4S j5       rSrg)ÚHasStaticMethodFromRealéM   r   c                 ó   • g r<   r,   )Úclsr   s     r   Ú	from_realÚ!HasStaticMethodFromReal.from_realN   s   € àr+   r,   N)	r-   r.   r/   r0   Úclassmethodr1   r2   rK   r3   r,   r+   r   rG   rG   M   s!   † Øð ×!3Ñ!3ó ó ór+   rG   c                   ó†   • \ rS rSrSS jrS\S\4S jrS\S\4S jr	SS\SS4S jjr
S\S\4S	 jrSS
 jrS\SS4S jrSrg)ÚFakeClassRegistryéS   ÚreturnNc                 ó   • 0 U l         g r<   ©Ú_registered_class©r   s    r   r   ÚFakeClassRegistry.__init__T   s
   € Ø13ˆÕr+   Úfull_qualnamec                 ó   • XR                   ;   $ r<   rS   ©r   rW   s     r   Úhas_implÚFakeClassRegistry.has_implW   s   € Ø× 6Ñ 6Ñ6Ð6r+   c                 óB   • U R                  U5        U R                  U   $ r<   )Ú_check_registeredrT   rY   s     r   Úget_implÚFakeClassRegistry.get_implZ   s!   € Ø×Ñ˜}Ô-Ø×%Ñ% mÑ4Ð4r+   c                 óz   • U R                  U5      (       a  [        R                  SUU5        X R                  U'   g )NzE%s is already registered. Previous fake class is overridden with  %s.)rZ   r   r   rT   )r   rW   Ú
fake_classs      r   ÚregisterÚFakeClassRegistry.register^   s6   € Ø�=‰=˜×'Ñ'Ü�K‰KØWØØôð
 1;×Ñ˜}Ò-r+   c                 ó’   • U R                  U5      (       d  [        R                  SU5        g U R                  R	                  U5      $ )NziCannot deregister %s. Please use register_fake_class to register it first. Or do you dereigster it twice?)rZ   r   r   rT   ÚpoprY   s     r   Ú
deregisterÚFakeClassRegistry.deregisterg   s>   € Ø�}‰}˜]×+Ñ+Ü�K‰Kð2àõð ×)Ñ)×-Ñ-¨mÓ<Ð<r+   c                 ó8   • U R                   R                  5         g r<   )rT   ÚclearrU   s    r   ri   ÚFakeClassRegistry.clearq   s   € Ø×Ñ×$Ñ$Õ&r+   c                 ó>   • XR                   ;  a  [        U S35      eg )NzH is not registered. Please use register_fake_class to register it first.)rT   r   rY   s     r   r]   Ú#FakeClassRegistry._check_registeredt   s+   € Ø× 6Ñ 6Ó6ÜØ �/Ð!iÐjóð ð 7r+   rS   )rQ   Nr<   )r-   r.   r/   r0   r   r   ÚboolrZ   r   r^   rb   rf   ri   r]   r3   r,   r+   r   rO   rO   S   sk   † ô4ð7 cð 7¨dô 7ð5 cð 5¨cô 5ñ; cð ;¸tõ ;ð=¨ð =°ô =ô'ð¨sð °t÷ r+   rO   c                 óú   • [        U [        5      (       d  [        S5      eU  HU  n[        U[        5      (       d  [        S5      e[        U5      S:X  a  [        US   [        5      (       a  ML  [        S5      e   g )NzExpect flat x to be a tuple.z&Expect flat x to be a tuple of tuples.é   r   zXExpect element of flat x to be a tuple of two elements with first element being a string)Ú
isinstanceÚtupler   Úlenr   )Úflat_xÚtps     r   Ú_check_valid_flat_script_objru      si   € Ü�fœe×$Ñ$ÜÐ9Ó:Ð:ãˆÜ˜"œe×$Ñ$ÜÐGÓHÐHä�2‹w˜!‹|¤:¨b°©e´S×#9Ó#9ÜØjóð ò r+   r   rQ   c                 ó¬   • [        U S5      (       d  gU R                  5       S;  a  [        SU R                  5        35      eU R                  5       S:H  $ )NÚtracing_modeF)ÚrealÚfakez0tracing_mode can be either real or fake but got rx   )Úhasattrrw   ÚAssertionError)r   s    r   Útracing_with_realr|   �   sU   € Ü�1�n×%Ñ%Øà‡~�~ÓÐ/Ó/ÜØ>¸q¿~¹~Ó?OÐ>PÐQó
ð 	
ð �>‰>Ó˜vÑ%Ð%r+   c           
      óÌ  • SS K Js  Jn  SSKJn  [        U5      (       a  U$ SSKJnJnJ	nJ
nJn  SSKJn	  [        U5      n
U" U
5      (       až  Uc  UOU" U
5      n[        U" 5       X±5      nU" U
5      nUc  [!        SU
 S35      eUR"                   HT  nU	" 5          [%        X5      (       d  ['        SU SU S	35      e[(        R+                  XÎ[-        X5      5        S S S 5        MV     U$ U" 5          UR/                  5       nS S S 5        [1        W5        U    SS
KJn  [7        U5       VVs0 s H0  u  nn[9        U[:        R<                  5      (       d  M'  U" U5      U_M2     nnn[7        U5       VVs0 s HD  u  nn[9        U[:        R<                  5      (       d  M'  UU" U5         U:w  d  M8  UUU" U5         _MF     nnn[?        U5      S:”  a  [@        RC                  SUUU5        URE                  [:        R<                  S U5      nS S S 5        [G        U5      RI                  W5      n[        UURK                  5       RM                  5       U5      nURO                  5        Hµ  n[-        UUS 5      nUb  [Q        U5      (       d  [S        SU SU S35      e[-        UU5      nS n[9        U[:        RT                  5      (       a  URV                  n[(        R+                  UU[Y        UUU5      5        M’  1 SknUU;  d  Mž  [@        RC                  SUU5        M·     U$ ! , (       d  f       GM¡  = f! , (       d  f       GN9= fs  snnf s  snnf ! , (       d  f       GNN= f)Nr   r	   )ÚFakeOpaqueObjectÚget_opaque_obj_infoÚget_opaque_type_nameÚis_opaque_typeÚOpaqueTypeStr)Úunset_fake_temporarilyzopaque_info for type z must not be NonezOpaque object of type 'z ' was specified to have member 'z1', but this doesn't actually exist in the object.)Ú_tensor_storagez¯Detected script object %s has aliasing relationship among its tensors. Flattened obj: %s. Aliasing tensor indices: %s. This is not supported and may cause unexpected behavior.c           	      ó¼   • [         R                  " U R                  5       U R                  5       U R                  U R
                  U R                  U R                  S9$ )N)ÚdeviceÚdtypeÚrequires_gradÚlayout)r1   Úempty_stridedÚsizeÚstrider†   r‡   rˆ   r‰   )Úts    r   Ú<lambda>Ú#maybe_to_fake_obj.<locals>.<lambda>ç   s=   € œ%×-Ò-Ø—F‘F“HØ—H‘H“JØŸ8™8ØŸ'™'Ø"#§/¡/ØŸ8™8òr+   zExpect z to be a callable but got Ú.>   Ú__getstate__Ú__setstate__Ú__obj_flatten__z.fake object of %s doesn't implement method %s.)-Útorch.utils._pytreeÚutilsÚ_pytreeÚtorch.utils._python_dispatchr
   r|   Útorch._library.opaque_objectr~   r   r€   r�   r‚   Útorch._subclasses.fake_tensorrƒ   Útyper   r{   Úmembersrz   r   r   r   Úgetattrr“   ru   Útorch._higher_order_ops.utilsr„   Ú	enumeraterp   r1   ÚTensorrr   r   r   Útree_map_onlyÚ"_find_fake_class_for_script_objectÚ__obj_unflatten__Ú_typeÚqualified_nameÚ_method_namesÚcallabler   ÚScriptMethodr:   r6   )Ú	fake_moder   Úpytreer
   r~   r   r€   r�   r‚   rƒ   Úx_typeÚ	type_nameÚfake_x_wrappedÚopaque_infoÚ	attr_namers   r„   ÚiÚinpÚstorage_mapÚ	alias_mapÚfake_flattenedÚfake_xr%   ÚattrÚ	real_attrÚmethod_schemaÚoverride_skip_lists                               r   Úmaybe_to_fake_objr¹   ˜   sD  € ÷ )Ð(ÝCô ˜×ÑØˆ÷õ õ Eä�!‹W€FÙ�f×ÑØ%&¡Y‘MÑ4HÈÓ4Pˆ	Ü)Ñ*:Ó*<¸iÓKˆñ *¨&Ó1ˆØÑÜ Ð#8¸¸Ð@QÐ!RÓSÐSØ$×,Ô,ˆIÙ'Õ)Ü˜q×,Ñ,Ü#Ø1°)°ð =Ø%˜;Ð&WðYóð ô ×"Ñ" >¼gÀaÓ>SÔT÷ *Ñ)ñ -ð Ðñ $Õ%Ø×&Ñ&Ó(ˆF÷ &ô 	% VÔ,âÝEô (¨Ô/ôâ/‘F�A�sÜ˜c¤5§<¡<×0ó (‘ Ó$ aÒ'Ù/ð ñ ô (¨Ô/ôâ/‘F�A�sÜ˜c¤5§<¡<×0ó 5ð  ¡°Ó 4Ñ5¸Ñ:ó 5��;™¨sÓ3Ñ4Ò4Ù/ð ñ ô �9‹~ Ó!Ü—‘ðOð ØØôð $×1Ñ1Ü—‘ñð óˆN÷7 ôP 4°AÓ6×HÑHÈÓXˆä% f¨a¯g©g«i×.FÑ.FÓ.HÈ!ÓL€Nà—‘Ö!ˆÜ�v˜t TÓ*ˆØÑÜ˜D—>‘>Ü" W¨T¨FÐ2LÈTÈFÐRSÐ#TÓUÐUä  4Ó(ˆIð =AˆMÜ˜)¤U×%7Ñ%7×8Ñ8Ø )× 0Ñ 0�ô ×ÑØØÜ  °°}ÓEöò "UÐØÐ-Õ-Ü—‘ÐLÈaÐQUÖVñ- "ð. Ð÷m *×)ú÷ &Ö%üóùó
÷ ŽYúsV   ÂAL#Ã3L6ÄMÄ.&MÅMÅ%MÅ6&MÆ MÆ1MÇAMÌ#
L3	Ì6
MÍMÍ
M#ra   c                 ó:   ^ • S[         4U 4S jjnUc  U$ U" U5      $ )aÐ	  Register a fake implementation for this class.

It's in the same spirit of registering a fake implementation for
an operator but with the difference that it
associates a fake class with the original torch bind class (registered
with torch::class_). In this way, torch.compile can handle them properly
in components such as Dynamo and AOTAutograd.

This API may be used as a decorator (see example). For the fake class, users
are required to provide a from_real classmethod that takes a real object and
returns an instance of the fake class. All tensors in the fake object should also
be properly fakified with to_fake_tensor() in from_real.


Examples:
    # For a custom class Foo defined in test_custom_class_registration.cpp:

    TORCH_LIBRARY(_TorchScriptTesting, m) {
      m.class_<TensorQueue>("_TensorQueue")
        .def(torch::init<at::Tensor>())
        .def("push", &TensorQueue::push)
        .def("pop", &TensorQueue::pop)
        .def("top", &TensorQueue::top)
        .def("size", &TensorQueue::size)
        .def("clone_queue", &TensorQueue::clone_queue)
        .def("__obj_flatten__", &TensorQueue::__obj_flatten__)
        .def_pickle(
            // __getstate__
            [](const c10::intrusive_ptr<TensorQueue>& self)
                -> c10::Dict<std::string, at::Tensor> {
              return self->serialize();
            },
            // __setstate__
            [](c10::Dict<std::string, at::Tensor> data)
                -> c10::intrusive_ptr<TensorQueue> {
              return c10::make_intrusive<TensorQueue>(std::move(data));
            });
        };
    # We could register a fake class FakeTensorQueue in Python as follows:
    import torch

    @torch._library.register_fake_class("_TorchScriptTesting::_TensorQueue")
    class FakeTensorQueue:
        def __init__(self, queue):
            self.queue = queue

        @classmethod
        def __obj_unflatten__(cls, flattened_ctx):
            return cls(**dict(ctx))

        def push(self, x):
            self.queue.append(x)

        def pop(self):
            return self.queue.pop(0)

        def size(self):
            return len(self.queue)

In this example, the original TensorQeue need to add a __obj_flatten__ method
to the class TensorQueue and the flattened result is passed into FakeTensorQueue's
__obj_unflatten__ as inputs to create a fake class. This protocol allows pytorch to look
at the contents of the script object and properly handle them in the subsystems
like dynamo, aot_aotugrad or more.
ra   c                 óh  >• [        T5      u  p[        R                  R                  X5        [	        U [
        S 5      nU(       d  [        U  S[
         S35      e[        U R                  [
           [        5      (       d  [        [
         S35      e[        R                  [        T5      U 5        U $ )Nz doesn't define a classmethod r�   z method is not a classmethod.)r   r1   Ú_CÚ _get_custom_class_python_wrapperrœ   Ú_CONVERT_FROM_REAL_NAMEr   rp   Ú__dict__rM   Úglobal_fake_class_registryrb   Ú_full_qual_class_name)ra   Únsr%   Úfrom_methodÚqualnames       €r   ÚinnerÚ"register_fake_class.<locals>.innerS  s¨   ø€ Ü" 8Ó,‰ˆô 	�‰×1Ñ1°"Ô;ä˜jÔ*AÀ4ÓHˆÞÜØ�,Ð<Ô=TÐ<UÐUVÐWóð ô ˜*×-Ñ-Ô.EÑFÌ×TÑTÜÜ*Ð+Ð+HÐIóð ô 	#×+Ñ+Ô,AÀ(Ó,KÈZÔXØÐr+   )rG   )rÄ   ra   rÅ   s   `  r   Úregister_fake_classrÇ     s)   ø€ ðFÔ1÷ ð( ÑØˆÙ�ÓÐr+   c                 ó>   • [         R                  [        U 5      5      $ r<   )rÀ   rf   rÁ   )rÄ   s    r   Úderegister_fake_classrÉ   l  s   € Ü%×0Ñ0Ô1FÀxÓ1PÓQÐQr+   c                 ó,   • [         R                  U 5      $ r<   )rÀ   rZ   ©rW   s    r   Úhas_fake_classrÌ   p  s   € Ü%×.Ñ.¨}Ó=Ð=r+   c                 óN   • [        U 5      (       d  g [        R                  U 5      $ r<   )rÌ   rÀ   r^   rË   s    r   Úfind_fake_classrÎ   t  s!   € Ü˜-×(Ñ(ØÜ%×.Ñ.¨}Ó=Ð=r+   rÄ   c                 ó2   • [        U 5      u  pSU-   S-   U-   $ )Nz__torch__.torch.classes.r�   r   )rÄ   rÂ   r%   s      r   rÁ   rÁ   z  s#   € Ü˜xÓ(�H€BØ%¨Ñ*¨SÑ0°4Ñ7Ð7r+   Úobjc                 óž   • [        U [        R                  5      =(       a-    U R                  5       R	                  5       R                  S5      $ )Nz__torch__.torch.classes)rp   r1   r2   r£   r¤   Ú
startswith)rÐ   s    r   Ú_is_script_objectrÓ     s?   € ÜØŒU×Ñó÷ à
�)‰)‹+×
$Ñ
$Ó
&×
1Ñ
1Ø!óðr+   rW   c                 ót   • U R                  S5      n[        U5      S:w  a  [        SU < S35      eUu  p#pEnXV4$ )Nr�   é   zCould not split full_qualname=z, expected 5 parts)Úsplitrr   r{   )rW   ÚsplitsÚ_torchÚ	_torch_nsÚ_classesrÂ   Ú
class_names          r   Ú_ns_and_class_namerÜ   ˆ  sI   € Ø× Ñ  Ó%€FÜ
ˆ6ƒ{�aÓÜÐ>°Ñ/?Ð?QÐRÓSÐSØ28Ñ/€F�x ZØˆ>Ðr+   c                 ó°   • U R                  5       R                  5       n[        U5      u  p#[        U5      nUc  [	        SU SU SU S[
         S3	5      eU$ )Nz ScriptObject's zA haven't registered a fake class. Please use register_fake_class(z::a‚  ) to annotate a fake class for the script obj. Specifically, create a python class that implements a fake version for all the methods that're used in the program and put annotated class in the program e.g. after loading the library. The fake methods can be written in the same way as a meta kernel for an operator but need to additionally simulate the object's states. Be sure to add a z; classmethod to enable creating a fake obj from a real one.)r£   r¤   rÜ   rÎ   r   r¾   )r   rW   rÂ   rÛ   ra   s        r   r¡   r¡   �  sy   € Ø—G‘G“I×,Ñ,Ó.€MÜ'¨Ó6�N€BÜ  Ó/€JØÑÜØ˜}˜oð ./Ø/1¨d°"°Z°Lð A?ô @WÐ>Wð X>ð?ó
ð 	
ð Ðr+   r¢   c                 óz  ^• [        U5      n[        U[        S 5      nU(       d  [        U S[         S35      e[        R
                  R                  R                  U S 5      m[        R
                  R                  R                  U4S j5         UR                  U5      sS S S 5        $ ! , (       d  f       g = f)Nz must define a classmethod z2 that converts the real object to the fake object.c                  ó   >• T $ r<   r,   )Úctxs   €r   rŽ   Ú%_fake_obj_from_real.<locals>.<lambda>°  s   ø€ ¹r+   )
r¡   rœ   r¾   r   r1   Ú_libraryÚ	fake_implÚFakeImplCtxÚset_ctx_getterrK   )r¨   r   ra   Úfrom_real_methodrà   s       @r   Ú_fake_obj_from_realrç   ¤  s”   ø€ Ü3°AÓ6€Jä˜zÔ+BÀDÓIÐÞÜØˆlÐ5Ô6MÐ5NØ@ðBó
ð 	
ô �.‰.×
"Ñ
"×
.Ñ
.¨y¸$Ó
?€CÜ	�‰×	!Ñ	!×	0Ñ	0´Õ	=Ø×#Ñ# AÓ&÷ 
>×	=×	=ús   ÂB,Â,
B:r<   )%r   ÚloggingÚtypingr   r   r   r   r1   Útorch._library.utilsr   r—   r
   Ú	getLoggerr-   r   r   r6   rG   rO   rÀ   ru   r2   rm   r|   r¹   rÇ   rÉ   rÌ   rÎ   r   rÁ   rÓ   rq   rÜ   r¡   r¾   rç   r,   r+   r   Ú<module>rì      sT  ðã Û ß 1Ó 1ã Ý 0Ý ?ð ×Ò˜Ó!€÷+
ñ +
÷\Uñ Uô"˜hô ÷%ñ %ñP /Ó0Ð òð&˜×+Ñ+ð &°ô &ðuà
ðuð Ð˜U×/Ñ/Ð/Ñ0ôuñpY¨hÐ7NÑ.Oõ YòxRð> Tô >ð> h¨s¡mô >ð8 Cð 8¨Cô 8ð
˜3ð  4ô ð cð ¨e°C¸°H©oô ð¨%×*<Ñ*<ð Àô ð" .Ð ð'¨õ 'r+   