§
    J�’j´P  ã                   óÖ  — d dl Z d dlZd dlmZmZ d dlZd dlmZ d dlm	Z	  ej
        e¦  «        Z G d„ d¦  «        Zdedefd	„Z G d
„ d¦  «        Z G d„ de¦  «        Z G d„ d¦  «        Z e¦   «         Zd„ Zdej        defd„Zdedeej        z  fd„Zd!dedz  fd„Zd„ Zdefd„Zdedz  fd„Zdedefd„Zdedefd„Zdedeeef         fd„Z dej        defd„Z!dZ"defd „Z#dS )"é    N)ÚAnyÚProtocol©Úparse_namespace)Ú_disable_current_modesc                   ó€   ‡ — e Zd Zdededej        dz  fd„Zˆ fd„Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zdeeef         dd fd„Zˆ xZS )ÚFakeScriptObjectÚwrapped_objÚscript_class_nameÚxNc                 óÚ  — t                                | d|¦  «         t                                | d|¦  «         ddlm} |} |t	          |¦  «        ¦  «        sv	 t          ¦   «         5  t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   n:# t          t          f$ r&}t                               d||¦  «         Y d }~nd }~ww xY wt                                | d|¦  «         d S )Nr
   r   r   )Úis_opaque_typez¦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__Útorch._library.opaque_objectr   Útyper   ÚcopyÚdeepcopyÚRuntimeErrorÚ	TypeErrorÚlogÚwarning)Úselfr
   r   r   r   r   Úes          úPC:\Projects\DSCons\.venv\Lib\site-packages\torch\_library\fake_class_registry.pyÚ__init__zFakeScriptObject.__init__   s]  € õ 	×Ò˜4 °Ñ<Ô<Ð<Ý×Ò˜4Ð!4Ð6GÑHÔHÐHà?Ð?Ð?Ð?Ð?Ð?ð
 ˆØˆ~�d 1™gœgÑ&Ô&ð 	ðÝ+Ñ-Ô-ð 0ð 0Ý#œ}¨QÑ/Ô/�Hð0ð 0ð 0ñ 0ô 0ð 0ð 0ð 0ð 0ð 0ð 0øøøð 0ð 0ð 0ð 0øøå ¥)Ð,ð ð ð Ý—’ð%ð &Øñô ð ð ð ð ð ð øøøøðøøøõ 	×Ò˜4 ¨XÑ6Ô6Ð6Ð6Ð6s<   ÁB Á(B	Á=B Â	BÂB ÂBÂB ÂCÂ&CÃCc                 ó”   •— 	 t          ¦   «                              |¦  «        S # t          $ r}t          d|› d�¦  «        |‚d }~ww xY w)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    z!FakeScriptObject.__getattribute__,   sp   ø€ ð
	Ý‘7”7×+Ò+¨DÑ1Ô1Ð1øÝð 	ð 	ð 	Ý ðJ¸ð Jð Jð Jñô ð ðøøøøð	øøøs   ƒ $ ¤
A®AÁAc                 ó(   — t          d|› d�¦  «        ‚)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   zFakeScriptObject.__setattr__9   s*   € Ýð6°Dð 6ð 6ð 6ñ
ô 
ð 	
ó    c                 ó   — | j         |         S ©N)r   )r   Úkeys     r   Ú__getitem__zFakeScriptObject.__getitem__C   s   € àŒ}˜SÔ!Ð!r&   c                 óÈ   — | |u rdS t                                | d¦  «        }t          |t          ¦  «        r't                                |d¦  «        }||u rdS ||k    S ||k    S )NTr   )r   r    Ú
isinstancer	   )r   ÚotherÚ	self_realÚ
other_reals       r   Ú__eq__zFakeScriptObject.__eq__G   ss   € Ø�5ˆ=ˆ=Ø�4å×+Ò+¨D°*Ñ=Ô=ˆ	Ý�eÕ-Ñ.Ô.ð 	+Ý×0Ò0°¸
ÑCÔCˆJà˜JÐ&Ð&Ø�tà 
Ò*Ð*à˜EÒ!Ð!r&   c                 ó.   — |                       |¦  «         S r(   )r0   )r   r-   s     r   Ú__ne__zFakeScriptObject.__ne__V   s   € Ø—;’;˜uÑ%Ô%Ð%Ð%r&   c                 ó–   — t                                | d¦  «        }	 t          |¦  «        S # t          $ r t	          |¦  «        cY S w xY w)Nr   )r   r    Úhashr   Úid)r   r   s     r   Ú__hash__zFakeScriptObject.__hash__Y   sU   € å×*Ò*¨4°Ñ<Ô<ˆð	 Ý˜‘>”>Ð!øÝð 	 ð 	 ð 	 å�h‘<”<ÐÐÐð	 øøøs   �, ¬AÁAÚmemoÚreturnc                 ó¢  — t          | ¦  «        |v r|t          | ¦  «                 S t                               t          ¦  «        }||t          | ¦  «        <   t                               |dt          j        | j        |¦  «        ¦  «         t                               |d| j        ¦  «         t          ¦   «         5  t          j        | j
        |¦  «        }t                               |d|¦  «         | j                             ¦   «         D ]«\  }}|dvr¢t          |t          ¦  «        r6t                               ||t          ||j        |j        ¦  «        ¦  «         ŒTt#          ||¦  «        r+t                               ||t%          ||¦  «        ¦  «         Œ�t                               |||¦  «         Œ¬	 d d d ¦  «         n# 1 swxY w Y   |S )Nr
   r   r   )r
   r   r   )r5   r	   Ú__new__r   r   r   r   r
   r   r   r   Ú__dict__Úitemsr,   ÚFakeScriptMethodÚmethod_nameÚschemaÚhasattrÚgetattr)r   r7   Únew_objÚnew_real_objr"   r%   s         r   Ú__deepcopy__zFakeScriptObject.__deepcopy__b   s  € Ýˆd‰8Œ8�tÐÐØ�˜4™œ”>Ð!Ý"×*Ò*Õ+;Ñ<Ô<ˆØ ˆ�R�‰XŒX‰Ý×ÒØ�]¥D¤M°$Ô2BÀDÑ$IÔ$Iñ	
ô 	
ð 	
õ 	×Ò˜7Ð$7¸Ô9OÑPÔPÐPõ
 $Ñ%Ô%ð 	Eð 	EÝœ=¨¬¸Ñ=Ô=ˆLÝ×Ò˜w¨
°LÑAÔAÐAØ#œ}×2Ò2Ñ4Ô4ð Eð E‘��eØÐOÐOÐOÝ! %Õ)9Ñ:Ô:ð EÝ×*Ò*Ø#Ø Ý,¨W°eÔ6GÈÌÑVÔVñô ð ð õ # <°Ñ6Ô6ð EÝ"×.Ò.Ø '¨­w°|ÀTÑ/JÔ/Jñô ð ð õ #×.Ò.¨w¸¸eÑDÔDÐDøðEð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð$ ˆs   Â;C<GÇGÇG)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚtorchÚScriptObjectr   r    r   r*   r0   r2   r6   ÚdictÚintrD   Ú__classcell__)r#   s   @r   r	   r	      sã   ø€ € € € € ð7Øð7Ø36ð7Ø;@Ô;MÐPTÑ;Tð7ð 7ð 7ð 7ð:ð ð ð ð ð
ð 
ð 
ð"ð "ð "ð"ð "ð "ð&ð &ð &ð ð  ð  ð  c¨3 h¤ð Ð4Fð ð ð ð ð ð ð ð r&   r	   Úobjr8   c                 ó>   — t          | t          ¦  «        r| j        S | S )z@If obj is a FakeScriptObject, return the underlying real object.)r,   r	   r   ©rN   s    r   Úmaybe_unwrap_fake_script_objectrQ   „   s"   € å�#Õ'Ñ(Ô(ð ØŒ|ÐØ€Jr&   c                   ó8   — e Zd Zdededej        dz  fd„Zd„ ZdS )r=   Úself_fake_objr>   r?   Nc                 ó0   — || _         || _        || _        d S r(   )rS   r>   r?   )r   rS   r>   r?   s       r   r   zFakeScriptMethod.__init__Œ   s   € ð +ˆÔØ&ˆÔØˆŒˆˆr&   c                 ó<   — ddl m}  || j        | j        g|¢R i |¤ŽS )Nr   )Úcall_torchbind)Ú!torch._higher_order_ops.torchbindrV   rS   r>   )r   ÚargsÚkwargsrV   s       r   Ú__call__zFakeScriptMethod.__call__–   s<   € ØDÐDÐDÐDÐDÐDàˆ~˜dÔ0°$Ô2BÐTÀTÐTÐTÐTÈVÐTÐTÐTr&   )	rE   rF   rG   r	   rH   rI   ÚFunctionSchemar   rZ   © r&   r   r=   r=   ‹   s`   € € € € € ðà'ðð ðð Ô$ tÑ+ð	ð ð ð ðUð Uð Uð Uð Ur&   r=   c                   ó4   — e Zd Zedej        fd„¦   «         ZdS )ÚHasStaticMethodFromRealr   c                 ó   — d S r(   r\   )Úclsr   s     r   Ú	from_realz!HasStaticMethodFromReal.from_real�   s   € àˆr&   N)rE   rF   rG   ÚclassmethodrI   rJ   ra   r\   r&   r   r^   r^   œ   s<   € € € € € Øð Ô!3ð ð ð ñ „[ðð ð r&   r^   c                   óp   — e Zd Zdd„Zdedefd„Zdedefd„Zddeddfd„Z	dedefd„Z
dd	„Zdeddfd
„ZdS )ÚFakeClassRegistryr8   Nc                 ó   — i | _         d S r(   ©Ú_registered_class©r   s    r   r   zFakeClassRegistry.__init__£   s   € Ø13ˆÔÐÐr&   Úfull_qualnamec                 ó   — || j         v S r(   rf   ©r   ri   s     r   Úhas_implzFakeClassRegistry.has_impl¦   s   € Ø Ô 6Ð6Ð6r&   c                 óF   — |                       |¦  «         | j        |         S r(   )Ú_check_registeredrg   rk   s     r   Úget_implzFakeClassRegistry.get_impl©   s$   € Ø×Ò˜}Ñ-Ô-Ð-ØÔ% mÔ4Ð4r&   c                 ó|   — |                       |¦  «        rt                               d||¦  «         || j        |<   d S )NzE%s is already registered. Previous fake class is overridden with  %s.)rl   r   r   rg   )r   ri   Ú
fake_classs      r   ÚregisterzFakeClassRegistry.register­   sJ   € Ø�=Š=˜Ñ'Ô'ð 	Ý�KŠKØWØØñô ð ð
 1;ˆÔ˜}Ñ-Ð-Ð-r&   c                 óš   — |                       |¦  «        st                               d|¦  «         d S | j                             |¦  «        S )NziCannot deregister %s. Please use register_fake_class to register it first. Or do you dereigster it twice?)rl   r   r   rg   Úpoprk   s     r   Ú
deregisterzFakeClassRegistry.deregister¶   sW   € Ø�}Š}˜]Ñ+Ô+ð 	=Ý�KŠKð2àñô ð ð ð ð Ô)×-Ò-¨mÑ<Ô<Ð<r&   c                 ó8   — | j                              ¦   «          d S r(   )rg   Úclearrh   s    r   rw   zFakeClassRegistry.clearÀ   s   € ØÔ×$Ò$Ñ&Ô&Ð&Ð&Ð&r&   c                 ó<   — || j         vrt          |› d�¦  «        ‚d S )NzH is not registered. Please use register_fake_class to register it first.)rg   r   rk   s     r   rn   z#FakeClassRegistry._check_registeredÃ   s6   € Ø Ô 6Ð6Ð6ÝØ ÐjÐjÐjñô ð ð 7Ð6r&   )r8   Nr(   )rE   rF   rG   r   rH   Úboolrl   r   ro   rr   ru   rw   rn   r\   r&   r   rd   rd   ¢   së   € € € € € ð4ð 4ð 4ð 4ð7 cð 7¨dð 7ð 7ð 7ð 7ð5 cð 5¨cð 5ð 5ð 5ð 5ð;ð ; cð ;¸tð ;ð ;ð ;ð ;ð=¨ð =°ð =ð =ð =ð =ð'ð 'ð 'ð 'ð¨sð °tð ð ð ð ð ð r&   rd   c                 ó  — t          | t          ¦  «        st          d¦  «        ‚| D ]c}t          |t          ¦  «        st          d¦  «        ‚t          |¦  «        dk    rt          |d         t          ¦  «        st          d¦  «        ‚Œdd S )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)r,   Útupler   ÚlenrH   )Úflat_xÚtps     r   Ú_check_valid_flat_script_objr€   Î   s™   € Ý�f�eÑ$Ô$ð ;ÝÐ9Ñ:Ô:Ð:àð ð ˆÝ˜"�eÑ$Ô$ð 	IÝÐGÑHÔHÐHå�2‰wŒw˜!Š|ˆ|¥:¨b°¬eµSÑ#9Ô#9ˆ|ÝØjñô ð ð ð	ð r&   r   c                 óÊ   — t          | d¦  «        sdS |                      ¦   «         dvr$t          d|                      ¦   «         › �¦  «        ‚|                      ¦   «         dk    S )NÚtracing_modeF)ÚrealÚfakez0tracing_mode can be either real or fake but got rƒ   )r@   r‚   ÚAssertionError)r   s    r   Útracing_with_realr†   Ü   sm   € Ý�1�nÑ%Ô%ð Øˆuà‡~‚~ÑÔÐ/Ð/Ð/ÝØQ¸q¿~º~Ñ?OÔ?OÐQÐQñ
ô 
ð 	
ð �>Š>ÑÔ˜vÒ%Ð%r&   c           
      óX  ‡‡— dd l mc m} t          |¦  «        r|S ddlm}m}m}m}m	} t          |¦  «        } ||¦  «        rÊ|€|n
 ||¦  «        }	t           |¦   «         |	|¦  «        }
 ||¦  «        }|€t          d|› d�¦  «        ‚|j        D ]x}t          ¦   «         5  t          ||¦  «        st!          d|	› d|› d�¦  «        ‚t"                               |
|t'          ||¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   Œy|
S t          ¦   «         5  |                     ¦   «         }d d d ¦  «         n# 1 swxY w Y   t+          |¦  «         | 5  ddlmŠ ˆfd	„t1          |¦  «        D ¦   «         Šˆˆfd
„t1          |¦  «        D ¦   «         }t3          |¦  «        dk    rt4                               d|||¦  «         |                     t:          j        d„ |¦  «        }d d d ¦  «         n# 1 swxY w Y   t?          |¦  «                              |¦  «        }t          || !                    ¦   «          "                    ¦   «         |¦  «        }
| #                    ¦   «         D ]½}t'          ||d ¦  «        }|�„tI          |¦  «        stK          d|› d|› d�¦  «        ‚t'          ||¦  «        }d }tM          |t:          j'        ¦  «        r|j(        }t"                               |
|tS          |
||¦  «        ¦  «         Œ™h d£}||vrt4                               d||¦  «         Œ¾|
S )Nr   )ÚFakeOpaqueObjectÚget_opaque_obj_infoÚget_opaque_type_namer   ÚOpaqueTypeStrz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_storagec                 ób   •— i | ]+\  }}t          |t          j        ¦  «        ¯ ‰|¦  «        |“Œ,S r\   ©r,   rI   ÚTensor)Ú.0ÚiÚinprŒ   s      €r   ú
<dictcomp>z%maybe_to_fake_obj.<locals>.<dictcomp>  sK   ø€ ð ð ð á�A�sÝ˜c¥5¤<Ñ0Ô0ðØ� Ñ$Ô$ aðð ð r&   c                 ó˜   •— i | ]F\  }}t          |t          j        ¦  «        r'‰ ‰|¦  «                 |k    ¯4|‰ ‰|¦  «                 “ŒGS r\   rŽ   )r�   r‘   r’   rŒ   Ústorage_maps      €€r   r“   z%maybe_to_fake_obj.<locals>.<dictcomp>  sj   ø€ ð ð ð á�A�sÝ˜c¥5¤<Ñ0Ô0ðð    °Ñ 4Ô 4Ô5¸Ò:Ð:ð �;˜˜¨sÑ3Ô3Ô4ð ;Ð:Ð:r&   z¯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                 ó¦   — t          j        |                      ¦   «         |                      ¦   «         | j        | j        | j        | j        ¬¦  «        S )N)ÚdeviceÚdtypeÚrequires_gradÚlayout)rI   Úempty_stridedÚsizeÚstrider—   r˜   r™   rš   )Úts    r   ú<lambda>z#maybe_to_fake_obj.<locals>.<lambda>4  sB   € �%Ô-Ø—F’F‘H”HØ—H’H‘J”JØœ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Ú_pytreer†   r   rˆ   r‰   rŠ   r   r‹   r   r	   r…   Úmembersr   r@   r   r   r   rA   r£   r€   Útorch._higher_order_ops.utilsrŒ   Ú	enumerater}   r   r   Útree_map_onlyrI   r�   Ú"_find_fake_class_for_script_objectÚ__obj_unflatten__Ú_typeÚqualified_nameÚ_method_namesÚcallabler   r,   ÚScriptMethodr?   r=   )Ú	fake_moder   Úpytreerˆ   r‰   rŠ   r   r‹   Úx_typeÚ	type_nameÚfake_x_wrappedÚopaque_infoÚ	attr_namer~   Ú	alias_mapÚfake_flattenedÚfake_xr"   ÚattrÚ	real_attrÚmethod_schemaÚoverride_skip_listrŒ   r•   s                         @@r   Úmaybe_to_fake_objrÀ   ç   s  øø€ ð )Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(õ ˜ÑÔð Øˆðð ð ð ð ð ð ð ð ð ð ð ð ð õ �!‰WŒW€FØ€~�fÑÔð DYØ%& Y�M�MÐ4HÐ4HÈÑ4PÔ4Pˆ	Ý)Ð*:Ð*:Ñ*<Ô*<¸iÈÑKÔKˆð *Ð)¨&Ñ1Ô1ˆØÐÝ Ð!R¸Ð!RÐ!RÐ!RÑSÔSÐSØ$Ô,ð 	Uð 	UˆIÝ'Ñ)Ô)ð Uð UÝ˜q )Ñ,Ô,ð Ý#ðY°)ð Yð YØ%ðYð Yð Yñô ð õ ×"Ò" >°9½gÀaÈÑ>SÔ>SÑTÔTÐTðUð Uð Uñ Uô Uð Uð Uð Uð Uð Uð Uøøøð Uð Uð Uð Uøð Ðõ $Ñ%Ô%ð 	)ð 	)Ø×&Ò&Ñ(Ô(ˆFð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)õ 	% VÑ,Ô,Ð,àð &	ð &	ØEÐEÐEÐEÐEÐEðð ð ð å'¨Ñ/Ô/ðñ ô ˆKð
ð ð ð ð å'¨Ñ/Ô/ðñ ô ˆIõ �9‰~Œ~ Ò!Ð!Ý—’ðOð ØØñô ð ð $×1Ò1Ý”ðð ð ñô ˆNð7&	ð &	ð &	ñ &	ô &	ð &	ð &	ð &	ð &	ð &	ð &	øøøð &	ð &	ð &	ð &	õP 4°AÑ6Ô6×HÒHÈÑXÔXˆå% f¨a¯gªg©i¬i×.FÒ.FÑ.HÔ.HÈ!ÑLÔL€Nà—’Ñ!Ô!ð Wð WˆÝ�v˜t TÑ*Ô*ˆØÐÝ˜D‘>”>ð VÝ"Ð#T¨TÐ#TÐ#TÈTÐ#TÐ#TÐ#TÑUÔUÐUå  4Ñ(Ô(ˆIð :>ˆMÝ˜)¥UÔ%7Ñ8Ô8ð 1Ø )Ô 0�õ ×ÒØØÝ  °°}ÑEÔEñô ð ð ð "UÐ!TÐ!TÐØÐ-Ð-Ð-Ý—’ÐLÈaÐQUÑVÔVÐVøØÐs8   Â$ADÄD	ÄD	ÄD>Ä>EÅEÅBG6Ç6G:Ç=G:rq   c                 ó<   ‡ — dt           fˆ fd„}|€|S  ||¦  «        S )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.
    rq   c                 ó˜  •— t          ‰¦  «        \  }}t          j                             ||¦  «         t	          | t
          d ¦  «        }|st          | › dt
          › d�¦  «        ‚t          | j        t
                   t          ¦  «        st          t
          › d�¦  «        ‚t                               t          ‰¦  «        | ¦  «         | S )Nz doesn't define a classmethod r    z method is not a classmethod.)r   rI   Ú_CÚ _get_custom_class_python_wrapperrA   Ú_CONVERT_FROM_REAL_NAMEr   r,   r;   rb   Úglobal_fake_class_registryrr   Ú_full_qual_class_name)rq   Únsr"   Úfrom_methodÚqualnames       €r   Úinnerz"register_fake_class.<locals>.inner   sÑ   ø€ Ý" 8Ñ,Ô,‰ˆˆDõ 	Œ×1Ò1°"°dÑ;Ô;Ð;å˜jÕ*AÀ4ÑHÔHˆØð 	ÝØÐWÐWÕ=TÐWÐWÐWñô ð õ ˜*Ô-Õ.EÔFÍÑTÔTð 	ÝÝ*ÐIÐIÐIñô ð õ 	#×+Ò+Õ,AÀ(Ñ,KÔ,KÈZÑXÔXÐXØÐr&   )r^   )rÊ   rq   rË   s   `  r   Úregister_fake_classrÌ   ]  sG   ø€ ðFÕ1ð ð ð ð ð ð ð( ÐØˆØˆ5�ÑÔÐr&   c                 óP   — t                                t          | ¦  «        ¦  «        S r(   )rÆ   ru   rÇ   )rÊ   s    r   Úderegister_fake_classrÎ   ¹  s   € Ý%×0Ò0Õ1FÀxÑ1PÔ1PÑQÔQÐQr&   c                 ó6   — t                                | ¦  «        S r(   )rÆ   rl   ©ri   s    r   Úhas_fake_classrÑ   ½  s   € Ý%×.Ò.¨}Ñ=Ô=Ð=r&   c                 óX   — t          | ¦  «        sd S t                               | ¦  «        S r(   )rÑ   rÆ   ro   rÐ   s    r   Úfind_fake_classrÓ   Á  s+   € Ý˜-Ñ(Ô(ð ØˆtÝ%×.Ò.¨}Ñ=Ô=Ð=r&   rÊ   c                 ó<   — t          | ¦  «        \  }}d|z   dz   |z   S )Nz__torch__.torch.classes.r    r   )rÊ   rÈ   r"   s      r   rÇ   rÇ   Ç  s(   € Ý˜xÑ(Ô(�H€BˆØ%¨Ñ*¨SÑ0°4Ñ7Ð7r&   c                 ó¨   — t          | t          j        ¦  «        o8|                      ¦   «                              ¦   «                              d¦  «        S )Nz__torch__.torch.classes)r,   rI   rJ   r­   r®   Ú
startswithrP   s    r   Ú_is_script_objectr×   Ì  sK   € ÝØ�UÔñô ð à
�)Š)‰+Œ+×
$Ò
$Ñ
&Ô
&×
1Ò
1Ø!ñô ðr&   ri   c                 ó�   — |                       d¦  «        }t          |¦  «        dk    rt          d| ›d�¦  «        ‚|\  }}}}}||fS )Nr    é   zCould not split full_qualname=z, expected 5 parts)Úsplitr}   r…   )ri   ÚsplitsÚ_torchÚ	_torch_nsÚ_classesrÈ   Ú
class_names          r   Ú_ns_and_class_namerà   Õ  sZ   € Ø× Ò  Ñ%Ô%€FÝ
ˆ6�{„{�aÒÐÝÐR°ÐRÐRÐRÑSÔSÐSØ28Ñ/€FˆI�x  ZØˆzˆ>Ðr&   c                 óÚ   — |                       ¦   «                              ¦   «         }t          |¦  «        \  }}t          |¦  «        }|€!t	          d|› d|› d|› dt
          › d�	¦  «        ‚|S )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   ri   rÈ   rß   rq   s        r   r«   r«   Ý  sš   € Ø—G’G‘I”I×,Ò,Ñ.Ô.€MÝ'¨Ñ6Ô6�N€Bˆ
Ý  Ñ/Ô/€JØÐÝð?˜}ð ?ð ?Ø/1ð?ð ?Ø5?ð?ð ?õ
 @Wð?ð ?ð ?ñ
ô 
ð 	
ð Ðr&   r¬   c                 ó|  ‡— t          |¦  «        }t          |t          d ¦  «        }|st          |› dt          › d�¦  «        ‚t          j        j                             | d ¦  «        Št          j        j                             ˆfd„¦  «        5  | 	                    |¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )Nz must define a classmethod z2 that converts the real object to the fake object.c                  ó   •— ‰ S r(   r\   )Úctxs   €r   rŸ   z%_fake_obj_from_real.<locals>.<lambda>ý  s   ø€ ¸€ r&   )
r«   rA   rÅ   r   rI   Ú_libraryÚ	fake_implÚFakeImplCtxÚset_ctx_getterra   )r²   r   rq   Úfrom_real_methodrä   s       @r   Ú_fake_obj_from_realrê   ñ  s  ø€ Ý3°AÑ6Ô6€Jå˜zÕ+BÀDÑIÔIÐØð 
ÝØð Bð BÕ6Mð Bð Bð Bñ
ô 
ð 	
õ Œ.Ô
"×
.Ò
.¨y¸$Ñ
?Ô
?€CÝ	ŒÔ	!×	0Ò	0°°°°Ñ	=Ô	=ð 'ð 'Ø×#Ò# AÑ&Ô&ð'ð 'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð 'ð 's   ÂB1Â1B5Â8B5r(   )$r   ÚloggingÚtypingr   r   rI   Útorch._library.utilsr   Útorch.utils._python_dispatchr   Ú	getLoggerrE   r   r	   rQ   r=   r^   rd   rÆ   r€   rJ   ry   r†   rÀ   rÌ   rÎ   rÑ   rÓ   rH   rÇ   r×   r|   rà   r«   rÅ   rê   r\   r&   r   ú<module>rð      sù  ðà €€€Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?ð €gÔ˜Ñ!Ô!€ðsð sð sð sð sñ sô sð sðl¨ð °ð ð ð ð ðUð Uð Uð Uð Uñ Uô Uð Uð"ð ð ð ð ˜hñ ô ð ð%ð %ð %ð %ð %ñ %ô %ð %ðP /Ð.Ñ0Ô0Ð ðð ð ð&˜Ô+ð &°ð &ð &ð &ð &ðsà
ðsð ˜Ô*Ñ*ðsð sð sð sðlYð YÐ.EÈÑ.Lð Yð Yð Yð YðxRð Rð Rð> Tð >ð >ð >ð >ð> c¨D¡jð >ð >ð >ð >ð8 Cð 8¨Cð 8ð 8ð 8ð 8ð
˜3ð  4ð ð ð ð ð cð ¨e°C¸°H¬oð ð ð ð ð¨%Ô*<ð Àð ð ð ð ð" .Ð ð'¨ð 'ð 'ð 'ð 'ð 'ð 'r&   