U
    ªÊ¹jð  ã                   @   sL  d dl mZ d dlZd dl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 d d	lmZmZ d d
lmZ d dlmZmZ edƒZe ej¡ e ej¡ e ej¡ e ej ¡ e ej!¡ e ej"¡ e #e¡dd„ ƒZ$e #e¡dd„ ƒZ%e #ej&¡dd„ ƒZ'e #ej(¡dd„ ƒZ)dd„ Z*edd„ ƒZ+dS )é    )ÚcontextmanagerN)Ú_ExcludeDispatchKeyGuardÚDispatchKeyÚDispatchKeySet)ÚModuleCallSignature)Ú#_unwrap_all_tensors_from_functional)Úwrap)ÚHigherOrderOperator)ÚFakeTensorMode)ÚProxyTorchDispatchModeÚtrack_tensor_tree)Ú_pytree)Ú_get_current_dispatch_modeÚ_pop_mode_temporarilyÚ_export_tracepointc               
   O   sŒ   t ƒ }|d k	stdƒ‚tƒ �f}|js:t| |ŽW  5 Q R £ S t |jj| |f¡\}}|j 	dt||¡}t
| |d |jd�W  5 Q R £ S Q R X d S )Nz5Mode should always be enabled for python fallback keyZcall_function)ZconstantÚtracer)r   ÚAssertionErrorr   Zenable_tracingr   ÚpytreeZtree_mapr   Zunwrap_proxyZcreate_proxyr   )ÚargsÚkwargsÚmodeZp_argsZp_kwargsÚproxy© r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_export/wrappers.pyÚexport_tracepoint_dispatch_mode   s       ÿr   c                  O   s   | S ©Nr   ©r   r   r   r   r   Ú"export_tracepoint_fake_tensor_mode,   s    r   c               
   O   sR   t j ¡ }t| |d�}t||d�}tttjƒƒ� t||ŽW  5 Q R £ S Q R X d S )N)Úreapply_views)	ÚtorchZ_CZ$_functionalization_reapply_views_tlsr   r   r   r   ÚFunctionalizer   )r   r   r   Zunwrapped_argsZunwrapped_kwargsr   r   r   Úexport_tracepoint_functionalize1   s    
 ÿ ÿr!   c                  O   s   | S r   r   r   r   r   r   Úexport_tracepoint_cpu>   s    r"   c                    s¨   t | tjjƒst‚ˆdkst‚d }| ‰ˆ d¡D ]*}ˆ}tˆ|ƒsPtdˆ› �ƒ‚tˆ|ƒ‰q0ddl	m
} |‡ fdd„ƒ‰G ‡ ‡‡‡fdd	„d	ƒ}t|||ƒ ƒ ||ˆfS )
NÚ Ú.z Couldn't find submodule at path r   )Úassume_constant_resultc                    s$   | ˆ kst ‚tg g ||d�ˆ | < d S )N)ÚinputsÚoutputsÚin_specÚout_spec)r   r   )Úpathr(   r)   )Úmodule_call_signaturesr   r   Úupdate_module_call_signaturesQ   s       ÿz6_wrap_submodule.<locals>.update_module_call_signaturesc                       s*   e Zd Z‡ ‡fdd„Z‡‡‡fdd„ZdS )z&_wrap_submodule.<locals>.WrappedModulec                    s:   t ˆjj| jˆjfi ƒ| _ˆj| _t| dƒr0t‚ˆ | _d S )Nr+   )ÚtypeÚ	__class__Ú__name__Ú__dict__Úhasattrr   r+   )Úself)r+   Ú	submoduler   r   Ú__init__Y   s    
ýz/_wrap_submodule.<locals>.WrappedModule.__init__c                    sF   t  ||f¡\}‰ ‡ ‡‡‡fdd„}t|f|žŽ }t  || jˆ j¡S )Nc                     sX   t | dˆdœŽ} t | ˆ ¡\}}ˆ||Ž}t |¡\}}t |dˆdœŽ}ˆˆˆ |ƒ |S )NZmodule_call_inputs)Úkindr*   Zmodule_call_outputs)r   r   Útree_unflattenÚtree_flatten)Ú	flat_argsr   r   ÚresÚflat_resr)   )r(   r*   r3   r,   r   r   Úflat_gmf   s      ÿ
  ÿz?_wrap_submodule.<locals>.WrappedModule.forward.<locals>.flat_gm)r   r7   r   r6   r+   r)   )r2   r   r   r8   r;   r:   )r*   r3   r,   )r(   r   Úforwardc   s     
ÿz._wrap_submodule.<locals>.WrappedModule.forwardN)r/   Ú
__module__Ú__qualname__r4   r<   r   ©r+   r*   r3   r,   r   r   ÚWrappedModuleX   s   
r@   )Ú
isinstancer   ÚnnÚModuler   Úsplitr1   ÚRuntimeErrorÚgetattrZtorch._dynamor%   Úsetattr)Úmodr*   r+   ÚparentÚnamer%   r@   r   r?   r   Ú_wrap_submoduleC   s    
 rK   c                 c   sN   g }z&|D ]}| t| ||ƒ¡ q
d V  W 5 |D ]\}}}t |||ƒ q0X d S r   )rG   ÚappendrK   )ÚfZpreserve_signaturer+   ÚtasksrI   rJ   r3   r*   r   r   r   Ú_wrap_submodules|   s    
rO   ),Ú
contextlibr   r   Ztorch._custom_opsZtorch._Cr   r   r   Ztorch._export.exported_programr   Z!torch._functorch.eager_transformsr   Ztorch._higher_order_ops.wrapr   Z
torch._opsr	   Ztorch._subclasses.fake_tensorr
   Z"torch.fx.experimental.proxy_tensorr   r   Ztorch.utilsr   r   Ztorch.utils._python_dispatchr   r   r   ZfallthroughZPythonDispatcherZPythonTLSSnapshotZADInplaceOrViewZBackendSelectZAutocastCPUZAutogradCPUZpy_implr   r   r    r!   ZCPUr"   rK   rO   r   r   r   r   Ú<module>   s:   





9