
    7h$                        S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJr  S S
KJr  S SKJr   " S S\5      r\" 5       r\R=                  \5      S 5       r\R=                  \5      S 5       r \RB                  S 5       r"\R=                  \RF                  5      " \" \SS95        \R=                  \RH                  5      S 5       r%S r&\S 5       r'S r(S r)S r*g)    )contextmanagerN)DispatchKey)_ConstantFunction
flat_applyto_graphablestrict_mode)autograd_not_implemented)HigherOrderOperator)FakeTensorMode)get_proxy_slotPreDispatchTorchFunctionModeProxyTorchDispatchModetrack_tensor_tree)_pytree)"is_traceable_wrapper_subclass_typec                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )ExportTracepoint   c                 $   > [         TU ]  S5        g )N_export_tracepoint)super__init__)self	__class__s    P/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/_export/wrappers.pyr   ExportTracepoint.__init__   s    -.    c                 $   > [         TU ]  " U0 UD6$ N)r   __call__)r   argskwargsr   s      r   r!   ExportTracepoint.__call__   s    w000r    )__name__
__module____qualname____firstlineno__r   r!   __static_attributes____classcell__)r   s   @r   r   r      s    /1 1r   r   c                     [         R                  " U R                  R                  X45      u  p4U R                  R	                  S[
        X45      n[        XS U R                  S9$ )Ncall_functionconstanttracer)pytreetree_mapr0   unwrap_proxycreate_proxyr   r   )moder"   r#   p_argsp_kwargsproxys         r   export_tracepoint_dispatch_moder9   %   sR    t{{'?'?$PFKK$$+VE T4LLr   c                 @    U    UsS S S 5        $ ! , (       d  f       g = fr    r%   )r5   r"   r#   s      r   "export_tracepoint_fake_tensor_moder;   .   s    	 
s   
c                     U R                  U5      nU R                  U5      nU R                  5          [        U0 UD6  UsS S S 5        $ ! , (       d  f       g = fr    )unwrap_tensorsredispatch_to_nextr   )ctxr"   r#   unwrapped_argsunwrapped_kwargss        r   export_tracepoint_functionalrB   4   sL    ''-N))&1				!N?.>? 
"	!	!s   A


AT)deferred_errorc                      U $ r    r%   )r"   r#   s     r   export_tracepoint_cpurE   C   s    Kr   c                 :  ^^^^	 [        U [        R                  R                  5      (       d   eTS:w  d   e[        R                  R
                  R                  U T5      nU4S jm	S mUU4S jnUUU	4S jnUR                  USS9nUR                  USS9nXg4$ )N c                 X   > U T;   a  TU    S   U:X  d   eTU    S   U:X  d   eXS.TU '   g )Nin_specout_spec)rI   rJ   r%   )pathrI   rJ   module_call_specss      r   update_module_call_signatures6_wrap_submodule.<locals>.update_module_call_signaturesM   sJ    $$$T*95@@@$T*:6(BBB.5"L$r   c           	          U  HJ  n[        U[        R                  [        [        [
        [        45      (       a  M9  Uc  M>  [        SU 35      e   g )NzGOnly Tensors or scalars are supported as pytree flattened inputs, got: )
isinstancetorchTensorstrintfloatboolAssertionError)	flat_argsas     r   check_flattened(_wrap_submodule.<locals>.check_flattenedS   sE    Aq5<<c5$"GHHAI$]^_]`a  r   c                    > [         R                  " X45      u  p4T" U5        [        USTS.6n[         R                  " X45      u  pX4$ )Nmodule_call_inputskindrK   r1   tree_flattenr   tree_unflatten)moduler"   r#   rX   rI   rZ   rK   s        r   pre_hook!_wrap_submodule.<locals>.pre_hookZ   sJ    #00$@		"&	8LSWX	,,Y@|r   c                    > [         R                  " X45      u  pE[         R                  " U5      u  pgT" U5        [        UST	S.6nT
" T	XW5        [         R                  " Xg5      $ )Nmodule_call_outputsr^   r`   )rc   r"   r#   res_rI   flat_resrJ   rZ   rK   rM   s           r   	post_hook"_wrap_submodule.<locals>.post_hooka   s]    (($8
#005!%x6KRVW%dG>$$X88r   T)with_kwargs)	rP   rQ   nnModulefxgraph_module	_get_attrregister_forward_pre_hookregister_forward_hook)
modrK   rL   	submodulerd   rk   
pre_handlepost_handlerZ   rM   s
    ``     @@r   _wrap_submodulery   H   s    c588??++++2::%%//T:IM9 44X44PJ11)1NK""r   c              #      #    / n U H  nUR                  [        XU5      5        M      S v   U H  nUR                  5         M     g ! U H  nUR                  5         M     f = f7fr    )extendry   remove)fpreserve_signaturemodule_call_signatureshandlesrK   handles         r   _wrap_submodulesr   n   sV     G&DNN?14JKL 'FMMO gFMMO s   A&(A A&A##A&c                     S nXl         U $ )Nc                     [        X5      $ r    r   )r   r"   s     r   call'_mark_strict_experimental.<locals>.call|   s    4&&r   )r!   )clsr   s     r   _mark_strict_experimentalr   {   s    ' LJr   c                    US-   n[        U R                  U5      (       a0  [        U R                  U5      U:X  d   eU R                  SUS0 5      $ U R	                  U5      n[        U R                  XB5        U R                  SUS0 5      $ )a  
This is a wrapper utility method on top of tracer to cache the
already registered subclass spec attribute. This is useful because
Subclass.__init__ will be same for each subclass. By default, fx will
create multiple attributes/proxies for given attribute.
0get_attrr%   )hasattrrootgetattrr4   get_fresh_qualnamesetattr)r0   namespecfx_namequalnames        r   '_register_subclass_spec_proxy_in_tracerr      s     SjGv{{G$$v{{G,444"":wB??((.HFKK(z8R<<r   c                 f   ^  S nU" T 5      (       d  [        ST R                   S35      eU 4S jnU$ )a  
Experimental decorator that makes subclass to be traceable in export
with pre-dispatch IR. To make your subclass traceble in export, you need to:
    1. Implement __init__ method for your subclass (Look at DTensor implementation)
    2. Decorate your __init__ method with _mark_constructor_exportable_experimental
    3. Put torch._dynamo_disable decorator to prevent dynamo from peeking into its' impl

Example:

class FooTensor(torch.Tensor):
    @staticmethod
    def __new__(cls, elem, *, requires_grad=False):
        # ...
        return torch.Tensor._make_subclass(cls, elem, requires_grad=requires_grad)

    @torch._dynamo_disable
    @mark_subclass_constructor_exportable_experimental
    def __init__(self, elem, ...):
        # ...
c                 D    [        U 5      =(       a    U R                  S:H  $ )Nr   )callabler&   )fns    r   _is_initCmark_subclass_constructor_exportable_experimental.<locals>._is_init   s    |9z 99r   ztorch._export.wrappers.mark_constructor_exportable_experimental can only be applied on subclass tensor.__init__But, you are adding it on z which is not supported. If __init__ doesn't exist on your subclass, please add it. Look at DTensor.__init__ implementation for examplec                    >^ [        [        U S   5      5      (       dJ  TR                  R                  S5      (       d   eTR                  S [	        S5      *  n[        SU S35      eT" U 0 UD6  [        R                  R                  5       (       d  g [        R                  R                  5       nU Vs/ s H  n[        U[        5      (       d  M  UPM     nn[	        U5      S::  d   S[	        U5       35       e[	        U5      S:X  a  g US   nUR                  mU S   n[        [        U SS  5      U45      u  pxSR!                  TR                  R#                  5       R%                  S5      5      n	TR'                  U	5      n
[)        TR*                  X5        TR-                  S	U
S
0 5      n[.        R0                  " [        R2                  U4S jU5      n[        R4                  R6                  R9                  [;        [        U5      5      5      u  p[        U5      R<                  R#                  5       S-   n[?        TX5      nTR-                  S[@        UU/UQ70 5      n[C        UUS TS9  g s  snf )Nr   r   z5Applying mark_constructor_exportable_experimental on z is not valid as it is not a traceable tensor subclass. Please look at DTensor.__init__ implementation as an example of proper usage of this API.   z6Expected only one PreDispatchTorchFunctionMode, found ri   .r   r%   c                 0   > [        U T5      R                  $ r    )r   r8   )xr0   s    r   <lambda>Tmark_subclass_constructor_exportable_experimental.<locals>.wrapper.<locals>.<lambda>   s    N1f$=$C$Cr   _const_func_specr-   r.   )"r   typer(   endswithlenRuntimeErrorrQ   _C_is_torch_function_mode_enabled	overrides _get_current_function_mode_stackrP   r   r0   r   tuplejoinlowersplitr   r   r   r4   r1   tree_map_onlyrR   utilsr   ra   r   r&   r   r   r   )r"   r#   obj_nametorch_function_mode_stackr5   pre_dispatch_tf_modessubclassrX   rI   constructor_spec_namer   
spec_proxyflat_proxy_argsri   	func_spec!fxable_constructor_call_spec_namefunc_spec_proxyinner_proxyr0   constructor_subclasss                     @r   wrapperBmark_subclass_constructor_exportable_experimental.<locals>.wrapper   sn   1$tAw-@@'44==jIIII+889KC
O;KLHGz R} ~  	d-f-xx7799$)OO$T$T$V! 2!
1$ <= 1 	 !
 %&!+	aCCH]D^C_`	a+ $%*$Q'7)5ab?F*CD	 # --335;;C@!
 ,,-BCX/((Xr2F
 ..LLCY
 {{**77d8n-
 N##))+.@@ 	* B5
 ))j;?;	
 	(K$vNq!
s   7I5I5)r   r&   )r   r   r   s   `  r   1mark_subclass_constructor_exportable_experimentalr      sO    ,: ())))=)F)F(G H}~
 	
EN Nr   )+
contextlibr   rQ   torch._custom_opstorch._Cr   "torch._higher_order_ops.flat_applyr   r   r   #torch._higher_order_ops.strict_moder	   torch._higher_order_ops.utilsr
   
torch._opsr   torch._subclasses.fake_tensorr   "torch.fx.experimental.proxy_tensorr   r   r   r   torch.utilsr   r1   torch.utils._python_dispatchr   r   r   py_implr9   r;   py_functionalize_implrB   AutogradCPUrE   ry   r   r   r   r   r%   r   r   <module>r      s!   %     
 < B * 8  * K1* 1 &'  23M 4M N+ ,
 )) *   ;// 0/E
 KOO, -##L 	 	="gr   