
    rh$                         d dl mZ d dlZd dlZd dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lmZ d dlmZ  G d de      Z e       Zej=                  e      d        Zej=                  e      d        Z ejB                  d        Z" ej=                  ejF                         eed             ej=                  ejH                        d        Z%d Z&ed        Z'd Z(d Z)d Z*y)    )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                   (     e Zd Z fdZ fdZ xZS )ExportTracepointc                 $    t         |   d       y )N_export_tracepoint)super__init__)self	__class__s    i/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/_export/wrappers.pyr   zExportTracepoint.__init__   s    -.    c                 "    t        |   |i |S N)r   __call__)r   argskwargsr   s      r   r   zExportTracepoint.__call__   s    w000r   )__name__
__module____qualname__r   r   __classcell__)r   s   @r   r   r      s    /1 1r   r   c                     t        j                  | j                  j                  ||f      \  }}| j                  j	                  dt
        ||      }t        ||d | j                        S )Ncall_functionconstanttracer)pytreetree_mapr*   unwrap_proxycreate_proxyr   r   )moder    r!   p_argsp_kwargsproxys         r   export_tracepoint_dispatch_moder3   %   sZ    t{{'?'?$PFHKK$$+VXE T54LLr   c                 6    | 5  |cd d d        S # 1 sw Y   y xY wr    )r/   r    r!   s      r   "export_tracepoint_fake_tensor_moder6   .   s    	   s   c                     | j                  |      }| j                  |      }| j                         5  t        |i | |cd d d        S # 1 sw Y   y xY wr   )unwrap_tensorsredispatch_to_nextr   )ctxr    r!   unwrapped_argsunwrapped_kwargss        r   export_tracepoint_functionalr=   4   sU    ''-N))&1				! N?.>?  s   A

AT)deferred_errorc                      | S r   r5   )r    r!   s     r   export_tracepoint_cpur@   C   s    Kr   c                 6  	 t        | t        j                  j                        sJ dk7  sJ t        j                  j
                  j                  |       }fd	d fd}	fd}|j                  |d      }|j                  |d      }||fS )N c                 R    | v r|    d   |k(  sJ |    d   |k(  sJ ||d| <   y )Nin_specout_spec)rD   rE   r5   )pathrD   rE   module_call_specss      r   update_module_call_signaturesz6_wrap_submodule.<locals>.update_module_call_signaturesM   sL    $$$T*95@@@$T*:6(BBB.58"L$r   c           	          | D ]B  }t        |t        j                  t        t        t
        t        f      r3|6t        d|        y )NzGOnly Tensors or scalars are supported as pytree flattened inputs, got: )
isinstancetorchTensorstrintfloatboolAssertionError)	flat_argsas     r   check_flattenedz(_wrap_submodule.<locals>.check_flattenedS   sG     	Aq5<<c5$"GHAI$]^_]`a 	r   c                     t        j                  ||f      \  }} |       t        |dd}t        j                  ||      \  }}||fS )Nmodule_call_inputskindrF   r+   tree_flattenr   tree_unflatten)moduler    r!   rR   rD   rT   rF   s        r   pre_hookz!_wrap_submodule.<locals>.pre_hookZ   sT    #00$@	7	"&	8LSWX	,,Y@fV|r   c                     t        j                  ||f      \  }}t        j                  |      \  }} |       t        |d	d} 
	||       t        j                  ||      S )Nmodule_call_outputsrW   rY   )r\   r    r!   res_rD   flat_resrE   rT   rF   rH   s           r   	post_hookz"_wrap_submodule.<locals>.post_hooka   sg    (($8
7#005(!%x6KRVW%dGX>$$Xx88r   T)with_kwargs)	rJ   rK   nnModulefxgraph_module	_get_attrregister_forward_pre_hookregister_forward_hook)
modrF   rG   	submoduler]   rc   
pre_handlepost_handlerT   rH   s
    ``     @@r   _wrap_submodulerp   H   s    c588??+++2::%%//T:IM9 44X44PJ11)1NK{""r   c              #      K   g }	 |D ]  }|j                  t        | ||               d  |D ]  }|j                           y # |D ]  }|j                           w xY wwr   )extendrp   remove)fpreserve_signaturemodule_call_signatureshandlesrF   handles         r   _wrap_submodulesry   n   sj     G& 	MDNN?1d4JKL	M 	FMMO	g 	FMMO	s   A!'A A!AA!c                     d }|| _         | S )Nc                     t        | |      S r   r   )r   r    s     r   callz'_mark_strict_experimental.<locals>.call|   s    4&&r   )r   )clsr|   s     r   _mark_strict_experimentalr~   {   s    ' CLJr   c                    |dz   }t        | j                  |      r/t        | j                  |      |k(  sJ | j                  d|di       S | j	                  |      }t        | j                  ||       | j                  d|di       S )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_attrr5   )hasattrrootgetattrr.   get_fresh_qualnamesetattr)r*   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4(z8R<<r   c                 Z     d } |       st        d j                   d       fd}|S )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                 :    t        |       xr | j                  dk(  S )Nr   )callabler"   )fns    r   _is_initzCmark_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                     t        t        | d               sEj                  j                  d      sJ j                  d t	        d        }t        d| d       | i | t        j                  j                         sy t        j                  j                         }|D cg c]  }t        |t              r| }}t	        |      dk  sJ dt	        |              t	        |      dk(  ry |d   }|j                  | d   }t        t        | dd        |f      \  }}dj!                  j                  j#                         j%                  d            }	j'                  |	      }
t)        j*                  |
|       j-                  d	|
d
i       }t/        j0                  t        j2                  fd|      }t        j4                  j6                  j9                  t;        t        |                  \  }}t        |      j<                  j#                         dz   }t?        ||      }j-                  dt@        ||g|i       }tC        ||d        y c c}w )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 ra   .r   r5   c                 0    t        |       j                  S r   )r   r2   )xr*   s    r   <lambda>zTmark_subclass_constructor_exportable_experimental.<locals>.wrapper.<locals>.<lambda>   s    N1f$=$C$C r   _const_func_specr'   r(   )"r   typer$   endswithlenRuntimeErrorrK   _C_is_torch_function_mode_enabled	overrides _get_current_function_mode_stackrJ   r   r*   r   tuplejoinlowersplitr   r   r   r.   r+   tree_map_onlyrL   utilsr   rZ   r   r"   r   r   r   )r    r!   obj_nametorch_function_mode_stackr/   pre_dispatch_tf_modessubclassrR   rD   constructor_spec_namer   
spec_proxyflat_proxy_argsra   	func_spec!fxable_constructor_call_spec_namefunc_spec_proxyinner_proxyr*   constructor_subclasss                     @r   wrapperzBmark_subclass_constructor_exportable_experimental.<locals>.wrapper   sk   1$tAw-@'44==jIII+889KC
O;KLHGz R} ~  	d-f-xx779$)OO$T$T$V! 2!
$ <= !
 !
 %&!+	aCCH]D^C_`	a+ $%*$Q'7)5ab?F*CD	7 # --335;;C@!
 ,,-BCXw/((Xr2F
 ..LLCY
 {{**77d8n-
9 N##))+.@@ 	* B5y
 ))j;?;	
 	(K$vNq!
s   (I)r   r"   )r   r   r   s   `  r   1mark_subclass_constructor_exportable_experimentalr      sL    ,: ()))=)F)F(G H}~
 	
EN Nr   )+
contextlibr   rK   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   r+   torch.utils._python_dispatchr   r   r   py_implr3   r6   py_functionalize_implr=   AutogradCPUr@   rp   ry   r~   r   r   r5   r   r   <module>r      s$   %     
 < B * 8  * K1* 1 &'  23M 4M N+ ,
 )) * 1   ;// 0/E
 KOO, -##L 	 	="gr   