
    Vh                        d dl mZ d dlZd dl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 d dlmZ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j2                  d        Z ej-                  ej6                         e	ed             ej-                  ej8                        d        Zd Zed        Zd Z y)    )contextmanagerN)DispatchKeystrict_mode)autograd_not_implemented)HigherOrderOperator)FakeTensorMode)ProxyTorchDispatchModetrack_tensor_tree)_pytreec                   (     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    F/home/dcms/DCMS/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_moder,      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_moder/   #   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_functionalr6   )   sU    ''-N))&1				! N?.>?  s   A

AT)deferred_errorc                      | S r   r.   )r   r   s     r   export_tracepoint_cpur9   8   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)r=   r>   r.   )pathr=   r>   module_call_specss      r   update_module_call_signaturesz6_wrap_submodule.<locals>.update_module_call_signaturesB   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_flattenedH   sG     	Aq5<<c5$"GHAI$]^_]`a 	r   c                     t        j                  ||f      \  }} |       t        |dd}t        j                  ||      \  }}||fS )Nmodule_call_inputskindr?   r$   tree_flattenr   tree_unflatten)moduler   r   rK   r=   rM   r?   s        r   pre_hookz!_wrap_submodule.<locals>.pre_hookO   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_outputsrP   rR   )rU   r   r   res_r=   flat_resr>   rM   r?   rA   s           r   	post_hookz"_wrap_submodule.<locals>.post_hookV   sg    (($8
7#005(!%x6KRVW%dGX>$$Xx88r   T)with_kwargs)	rC   rD   nnModulefxgraph_module	_get_attrregister_forward_pre_hookregister_forward_hook)
modr?   r@   	submodulerV   r\   
pre_handlepost_handlerM   rA   s
    ``     @@r   _wrap_submoduleri   =   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   )extendri   remove)fpreserve_signaturemodule_call_signatureshandlesr?   handles         r   _wrap_submodulesrr   c   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>.callq   s    4&&r   )r   )clsru   s     r   _mark_strict_experimentalrw   p   s    ' CLJr   )!
contextlibr   rD   torch._custom_opstorch._Cr   #torch._higher_order_ops.strict_moder   torch._higher_order_ops.utilsr   
torch._opsr   torch._subclasses.fake_tensorr	   "torch.fx.experimental.proxy_tensorr
   r   torch.utilsr   r$   r   r   py_implr,   r/   py_functionalize_implr6   AutogradCPUr9   ri   rr   rw   r.   r   r   <module>r      s   %     ; B * 8 X )1* 1 &'  23M 4M N+ ,
 )) * 1   ;// 0/E
 KOO, -##L 	 	r   