U
    ªÊ¹jÎ  ã                   @   sÚ   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 d dlmZ d dlmZ d d	lmZmZmZmZmZmZmZ d d
lmZmZ dd„ ZG dd„ dƒZe jdd„ ƒZ e jdd„ ƒZ!dS )é    N)ÚList)Ú	call_hook©ÚGetItemSourceÚLocalSource)Úcounters©Úclone_preserve_strides)ÚFakeTensorMode)ÚGraphModule)Ú	decomposeÚdisable_autocast_cacheÚdisable_proxy_modes_tracingÚfetch_tensor_proxyÚProxyTorchDispatchModeÚPythonKeyTracerÚtrack_tensor_tree)Ú
DimDynamicÚShapeEnvc                 C   s   | d k	rt | ƒS | S ©Nr   )Úx© r   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_dynamo/compiled_autograd.pyÚmaybe_clone   s    r   c                   @   s†   e Zd Zddœdd„Zdd„ Zedd„ ƒZeej	 ee
 d	œd
d„Zdd„ Ze
dœdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚAutogradCompilerInstanceN)Úreturnc                 C   sT   || _ t ¡ | _| jj| _tƒ | _tdd| jd�| _t	ƒ | _
t| j
dƒ| _d | _d S )NT)Zallow_fallback_kernelsZallow_non_fake_inputsÚ	shape_envZsymbolic)Úcompiler_fnÚ
contextlibÚ	ExitStackÚstackÚcloser   r   r
   Úfake_tensor_moder   Ú	fx_tracerr   Ú
proxy_modeÚhooks_proxy)Úselfr   r   r   r   Ú__init__   s    

ýz!AutogradCompilerInstance.__init__c                 C   s    t |tjƒst‚| jj||d�S )N)Úsource)Ú
isinstanceÚtorchÚTensorÚAssertionErrorr"   Zfrom_tensor)r&   r   r(   r   r   r   Ú	wrap_fake-   s    z"AutogradCompilerInstance.wrap_fakec                 C   s   t t| ƒ|ƒS r   r   )ÚnameÚidxr   r   r   r(   1   s    zAutogradCompilerInstance.source)ÚinputsÚsizesc                    s6  t d d  d7  < tj ¡ ˆj_tjjtd�ˆj_	i ˆj_
ˆj dddi ¡‰ ˆj dddi ¡}ˆj dd	di ¡ˆ_‡fd
d„t|ƒD ƒ}‡ fdd„tt|ƒƒD ƒ}ˆ ||¡ ‡fdd„t|ƒD ƒ}ˆ ||¡ ˆj ti ƒ¡ ˆj ˆj¡ ˆj ˆjj¡ ˆj ˆj¡ ˆj tƒ ¡ ˆj tdd�¡ ||fS )NÚcompiled_autogradZcapturesé   )Z
tracer_clsÚplaceholderr0   r   r1   Úhooksc              	      s$   g | ]\}}ˆ   |ˆ  d |¡¡‘qS )r0   )r-   r(   )Ú.0r/   r   ©r&   r   r   Ú
<listcomp>?   s   ÿz:AutogradCompilerInstance.begin_capture.<locals>.<listcomp>c                    s   g | ]}ˆ | ‘qS r   r   ©r6   Úi)Ú
args_proxyr   r   r8   C   s     c              	      s*   g | ]"\}}ˆ j  |ˆ  d |¡tj¡‘qS )r1   )r   Z$create_unspecified_symint_and_symbolr(   r   ZDYNAMIC)r6   r/   Úvalr7   r   r   r8   G   s   û
ýT)Zenable_current)r   r*   ÚnnÚModuler#   ÚrootÚfxZGraphr   ÚgraphZtensor_attrsÚcreate_proxyr%   Ú	enumerateÚrangeÚlenÚbind_tensors_to_proxiesr    Úenter_contextr   r"   r$   Zsym_moder   r   )r&   r0   r1   Zsizes_proxyÚproxiesr   )r;   r&   r   Úbegin_capture5   s.    
þ
úz&AutogradCompilerInstance.begin_capturec                    s&   ˆ j  dt|f‡ fdd„|D ƒ˜i ¡S )NZcall_functionc                    s   g | ]}ˆ   |¡‘qS r   ©Úto_proxy©r6   r   r7   r   r   r8   `   s     z<AutogradCompilerInstance.proxy_call_hook.<locals>.<listcomp>)r#   rB   r   )r&   ÚhookÚargsr   r7   r   Úproxy_call_hookZ   s    ÿþùz(AutogradCompilerInstance.proxy_call_hook)r:   c              	   C   sT   | j | }|  ||| ¡}tƒ �* t|| ƒ||< |  || g|g¡ W 5 Q R X |S r   )r%   rO   r   r   rF   )r&   r0   Úhook_idr:   rM   Úproxyr   r   r   Útensor_pre_hooke   s    
þz(AutogradCompilerInstance.tensor_pre_hookc              	   C   sF   | j | }|  ||¡}tƒ �  dd„ |D ƒ}|  ||¡ W 5 Q R X |S )Nc                 S   s   g | ]}t |ƒ‘qS r   ©r   rL   r   r   r   r8   w   s     z5AutogradCompilerInstance.pre_hook.<locals>.<listcomp>©r%   rO   r   rF   )r&   r0   rP   rM   rH   r   r   r   Úpre_hookp   s    
þz!AutogradCompilerInstance.pre_hookc              	   C   sH   | j | }|  |||¡}tƒ �  dd„ |D ƒ}|  ||¡ W 5 Q R X |S )Nc                 S   s   g | ]}t |ƒ‘qS r   rS   rL   r   r   r   r8   ƒ   s     z6AutogradCompilerInstance.post_hook.<locals>.<listcomp>rT   )r&   Úoutputsr0   rP   rM   rH   r   r   r   Ú	post_hook{   s    
ýz"AutogradCompilerInstance.post_hookc              	   C   sF   | j  ¡  | j dd| j |  |¡¡fi ¡ |  t| jj| jj	dƒ¡S )NÚoutputZCompiledAutograd)
r    r!   r#   Zcreate_nodeZ
create_argrK   r   r   r?   rA   )r&   rV   r   r   r   Úend_capture‡   s    
üÿz$AutogradCompilerInstance.end_capturec                    sn   |d krd S t |tƒr(‡ fdd„|D ƒS t |tƒrHt‡ fdd„|D ƒƒS t |tjtjfƒs^t‚tˆ jƒ|ƒj	S )Nc                    s   g | ]}ˆ   |¡‘qS r   rJ   rL   r7   r   r   r8   —   s     z5AutogradCompilerInstance.to_proxy.<locals>.<listcomp>c                 3   s   | ]}ˆ   |¡V  qd S r   rJ   rL   r7   r   r   Ú	<genexpr>™   s     z4AutogradCompilerInstance.to_proxy.<locals>.<genexpr>)
r)   ÚlistÚtupler*   r+   ZSymIntr,   r   r#   rQ   )r&   Útr   r7   r   rK   “   s    

z!AutogradCompilerInstance.to_proxyc                    sR   t ˆ tjjƒr(‡ fdd„tt|ƒƒD ƒ‰ t|ƒtˆ ƒks<t‚t|ˆ d | jd� d S )Nc                    s   g | ]}ˆ | ‘qS r   r   r9   ©rH   r   r   r8   Ÿ   s     zDAutogradCompilerInstance.bind_tensors_to_proxies.<locals>.<listcomp>)ZconstantZtracer)	r)   r*   r@   ZProxyrD   rE   r,   r   r#   )r&   ZtensorsrH   r   r^   r   rF   �   s    z0AutogradCompilerInstance.bind_tensors_to_proxies)Ú__name__Ú
__module__Ú__qualname__r'   r-   Ústaticmethodr(   r   r*   r+   ÚintrI   rO   rR   rU   rW   rY   rK   rF   r   r   r   r   r      s   
%
r   c              	   c   sJ   t jjj t t| ¡¡}t j 	d¡� d V  W 5 Q R X t jjj |¡ d S )NF)
r*   Ú_CÚ_dynamor2   Úset_autograd_compilerÚ	functoolsÚpartialr   ZautogradZset_multithreading_enabled)r   Úpriorr   r   r   Úenable¤   s    

ÿrj   c                  c   s*   t jjj d ¡} d V  t jjj | ¡ d S r   )r*   rd   re   r2   rf   )ri   r   r   r   Údisable®   s    rk   )"r   rg   Útypingr   r*   Ztorch._dynamo.external_utilsr   Ztorch._dynamo.sourcer   r   Ztorch._dynamo.utilsr   Ztorch._prims_commonr	   Ztorch._subclassesr
   Ztorch.fxr   Z"torch.fx.experimental.proxy_tensorr   r   r   r   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   r   r   Úcontextmanagerrj   rk   r   r   r   r   Ú<module>   s$   $	 
	