U
    ªÊ¹j  ã                   @   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
 d dlmZ d dlmZ e e¡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)Úaot_module_simplified)Ú_disable_current_modesc                     s   t jjdœ‡ fdd„}|S )N)Úgmc                    sj  t ˆ d¡ƒrˆd ƒ ˆd< td d  d7  < d}|rZt d¡ td d  d7  < | S ‡ fdd	„}ˆ d
¡pvˆd ‰ |ˆd
< ˆ d¡p�ˆd ˆd< ddlm} ddlm} ˆ dd ¡|krÊt	ddƒ}nt
 ¡ }zf|ƒ �V |�F t| |fˆŽ}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
�rd   td d  d7  < ‚ Y nX d S )NÚdecompositionsÚaot_autogradÚtotalé   Fz5Unable to use AOT Autograd because graph has mutationZnot_okc                     s   t t ˆ ƒ| |ŽƒS ©Nr   )ÚargsÚkwargs©Úbw_compiler© ú\/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/backends/common.pyÚ_wrapped_bw_compiler   s    z?aot_autograd.<locals>.compiler_fn.<locals>._wrapped_bw_compilerr   Úfw_compilerZinference_compilerr   )Únop)Úenable_aot_loggingz%functorch.compile.config.debug_assertTÚok)ÚcallableÚgetr   ÚlogÚdebugÚfunctorch.compiler   Ztorch._inductor.debugr   r   Ú
contextlibÚnullcontextr   r   Ú	Exception)r	   Úexample_inputsZuse_fallbackr   r   r   Zpatch_configZcg©r   r   r   Úcompiler_fn   s4    
ÿ6z!aot_autograd.<locals>.compiler_fn)ÚtorchZfxZGraphModule)r   r$   r   r#   r   r      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   r&   r'   r(   )Zuse_decompsr&   r'   r(   r   r   r   r   Úmem_efficient_fusion_kwargsA   s    ür)   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   ÚlistÚmapr   )ÚmodelÚinputsr   ©Úfnr   r   Úwrapper[   s    z(fake_tensor_unsupported.<locals>.wrapper)Ú	functoolsÚwraps)r/   r0   r   r.   r   Úfake_tensor_unsupportedU   s    r3   )Úreturnc                 C   s"   | D ]}t |dƒr|j  S qd S )NÚdevice)Úhasattrr5   ©r"   Úxr   r   r   Údevice_from_inputsd   s    
r9   c                 C   s"   | D ]}t |dƒr|j  S qd S )NÚdtype)r6   r:   r7   r   r   r   Údtype_from_inputsj   s    
r;   )r   r1   ÚloggingZunittest.mockr   r%   Ztorch._dynamor   Ztorch._dynamo.utilsr   r   Ztorch._functorch.aot_autogradr   Ztorch.utils._python_dispatchr   Ú	getLoggerÚ__name__r   r   r)   r3   r5   r9   r:   r;   r   r   r   r   Ú<module>   s   
2