U
    zh                     @   s   d dl Z d dlZd dlZd dlm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 eeZG dd dZd	d
 Zdd Zdd ZejdddZejdddZdS )    N)patchdisable)countersdefakeflatten_graph_inputs)aot_module_simplified)_disable_current_modesc                   @   s&   e Zd Zdd ZejjdddZdS )AotAutogradc                 K   s   d| _ || _d S )NZcompiler_fn)__name__kwargs)selfr    r   O/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/backends/common.py__init__   s    zAotAutograd.__init__)gmc           	         s  t dd |D rt||| S t| jdr@| jd  | jd< td d  d7  < d}|r~td td d	  d7  < |S  fd
d}| jdp| jd  || jd< | jdp| jd | jd< ddlm	} ddl
m} | jdd |krtdd}nt }zh| X |H t||f| j}td d  d7  < t|W  5 Q R  W  5 Q R  W S Q R X W 5 Q R X W n, tk
r   td d	  d7  <  Y nX d S )Nc                 s   s   | ]}t |tttfV  qd S N)
isinstancelisttupledict).0xr   r   r   	<genexpr>   s     z'AotAutograd.__call__.<locals>.<genexpr>decompositionsaot_autogradtotal   Fz5Unable to use AOT Autograd because graph has mutationZnot_okc                     s   t t  | |S r   r   )argsr   bw_compilerr   r   _wrapped_bw_compiler-   s    z2AotAutograd.__call__.<locals>._wrapped_bw_compilerr    fw_compilerZinference_compilerr   )nop)enable_aot_loggingz%functorch.compile.config.debug_assertTok)anyr   callabler   getr   logdebugfunctorch.compiler#   Ztorch._inductor.debugr$   r   
contextlibnullcontextr   r   	Exception)	r   r   example_inputsZuse_fallbackr!   r#   r$   Zpatch_configZcgr   r   r   __call__   s@    

6zAotAutograd.__call__N)r   
__module____qualname__r   torchZfxZGraphModuler0   r   r   r   r   r
      s   r
   c                  K   s
   t f | S r   )r
   )r   r   r   r   r   M   s    r   c                 C   s0   ddl m}m}m} |||d}| r,||d< |S )Nr   )default_decompositions#min_cut_rematerialization_partition
ts_compile)r"   r    Zpartition_fnr   )r+   r4   r5   r6   )Zuse_decompsr4   r5   r6   r   r   r   r   mem_efficient_fusion_kwargsQ   s    r7   c                    s   t   fdd}|S )zg
    Decorator for backends that need real inputs.  We swap out fake
    tensors for zero tensors.
    c              
      s:   t  * ttt|} | |f|W  5 Q R  S Q R X d S r   )r	   r   mapr   )modelinputsr   fnr   r   wrapperk   s    z(fake_tensor_unsupported.<locals>.wrapper)	functoolswraps)r<   r=   r   r;   r   fake_tensor_unsupportede   s    r@   )returnc                 C   s"   | D ]}t |dr|j  S qd S )Ndevice)hasattrrB   r/   r   r   r   r   device_from_inputst   s    
rE   c                 C   s"   | D ]}t |dr|j  S qd S )Ndtype)rC   rF   rD   r   r   r   dtype_from_inputsz   s    
rG   )r,   r>   loggingZunittest.mockr   r3   Ztorch._dynamor   Ztorch._dynamo.utilsr   r   r   Ztorch._functorch.aot_autogradr   Ztorch.utils._python_dispatchr	   	getLoggerr   r)   r
   r   r7   r@   rB   rE   rF   rG   r   r   r   r   <module>   s   
<