U
    zhrD                     @   s  U d dl Z d dlZd dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZm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 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&m'Z' d dl(m)Z* d dl+m,Z,m-Z- dgZ.eZ/eZ0edef Z1eejj2ge	e$ f Z3ej4ej5ej6ej7ej8ej9ej:hZ;e
e e<d< G dd de=Z>G dd de#Z?dS )    N)nullcontext)AnyCallableDictListOptionalSetTupleUnion)_unstack_pytree)fx)enable_python_dispatcher)NodeMetadata)
ProxyValue)
FakeTensorUnsupportedFakeTensorException)FakeTensorMode)	traceback)PythonKeyTracer)CodeGen)PassBase
PassResult)_extract_tensor_metadataTensorMetadata)_pytree)PropagateUnbackedSymIntscompute_unbacked_bindings!_ExportPassBaseDeprecatedDoNotUse._TORCH_SYM_OPSc                   @   s   e Zd ZdS )ExportPassBaseErrorN)__name__
__module____qualname__ r#   r#   I/var/www/html/venv/lib/python3.8/site-packages/torch/_export/pass_base.pyr   -   s   r   c                   @   s  e Zd ZdZedd ZG dd deZG dd dej	Z
dd	d
dZeejjjeedf eeef eedddZejjee dddZeddddZeeeedddZeedf eeef eedddZeeedf eedddZeejjejjee eedd d!Zejjee ee eed"d#d$Zee eed%d&d'Z!ee eed(d)d*Z"ejeedf e#d+d,d-Z$eje#dd.d/Z%dS )0r   zl
    Interpreter-based pass class to help users maintain the IR spec while writing
    transformations.
    c                   C   s   t ddtjddiS )NZstack_trace    )limit)r   joinr   format_stackr#   r#   r#   r$   _create_dummy_node_metadata7   s    z=_ExportPassBaseDeprecatedDoNotUse._create_dummy_node_metadatac                       sb   e Zd Zdedd fddZddddZeejj	d	 fd
dZ
ejj	eddddZ  ZS )z._ExportPassBaseDeprecatedDoNotUse.ExportTracerr   N)callbackcodegenreturnc                    sJ   t    || _tj | _tj | _	| j	
| i | _d | _i | _d S N)super__init__r+   torchnnModulerootr   GraphgraphZset_codegenZtensor_attrsfake_tensor_mode
submodules)selfr+   r,   	__class__r#   r$   r0   =   s    
z7_ExportPassBaseDeprecatedDoNotUse.ExportTracer.__init__r-   c                 C   s   t dd S )Nz%ExportTracer doesn't support trace().r   r9   r#   r#   r$   traceG   s    z4_ExportPassBaseDeprecatedDoNotUse.ExportTracer.trace)ar-   c                    s   t |tjjrB|| jkrvdt| j }| j|| || j|< n4t |trvt	|dr`|j
d krptd| d|j
}t |}t |tjrt |tjjr|jdkr| || | jt|| |S )NZ
submodule_constantzCannot add z
 to graph.get_attr)
isinstancer1   r2   r3   r8   lenr4   Z
add_moduler   hasattrrA   r   r/   
create_argTensorr   Nodeopset_metadatar+   on_attrr   )r9   r@   Zname_submodulenoder:   r#   r$   rF   J   s&    


z9_ExportPassBaseDeprecatedDoNotUse.ExportTracer.create_arg)rL   valuer-   c                    sp   t tttjtjtjttt	t
d f	 d fdd}t|||jd< t tt d fdd}t|||jd< d S )N)xr-   c              	      s   t | tr| S t | tjr| jr*t| } z> jd k	s:tt | tjj	rZ jj
| dd}n j
| }W n  tk
r   td d }Y nX |S t | tjtjtjttttfr| S d S d S )NT)Zstatic_shapeszvFakeifying a Tensor subclass is not supported                             right now. Instead a TensorMetadata is used.)rC   r   r1   rG   is_quantized
dequantizer7   AssertionErrorr2   	Parameterfrom_tensorr   printSymIntSymFloatSymBoolintfloatboolstr)rN   Zfake_tensorr>   r#   r$   make_valb   s,    

 
zM_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_valvalc                    sr   t | tsjt | tjrj| jr&t| } z" jd k	s6t j| }d }W n t	k
rd   t
| }Y nX |S d S d S r.   )rC   r   r1   rG   rO   rP   r7   rQ   rS   r   r   )rN   _tensor_metar>   r#   r$   make_tensor_meta   s    
zU_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_tensor_metar_   )Argumentr
   r   r1   rU   rV   rW   rX   rY   rZ   r[   pytreeZtree_mapmetar   r   )r9   rL   rM   r\   r`   r#   r>   r$   rJ   ^   s    "z;_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata)r    r!   r"   r   r0   r?   ra   r1   r   rH   rF   rJ   __classcell__r#   r#   r:   r$   ExportTracer<   s   
 re   c                       s2  e Zd Zdejdd fddZeeedf e	eef e
d fdd	Zejjjeedf e	eef e
dd
dZejjjeedf e	eef e
dddZeeedf e	eef ed fddZejjjeedf e	eef ddddZeeedf e	eef ddddZejjed fddZ  ZS )z3_ExportPassBaseDeprecatedDoNotUse.ExportInterpreterr   N)r+   gmr-   c                    s(   t  | || _tt|jj| _d S r.   )r/   r0   r+   nextiterr6   nodesrL   )r9   r+   rf   r:   r#   r$   r0      s    z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.__init__.)targetargskwargsr-   c                    s(   t  |||}| j||t| jjS r.   )r/   placeholderr+   r   rL   rc   )r9   rj   rk   rl   argr:   r#   r$   rm      s    z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.placeholderc                 C   s   | j |d t| jjjS )Nr   )r+   outputr   rL   rc   datar9   rj   rk   rl   r#   r#   r$   ro      s    z:_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.outputc                 C   s6  t | jj}|tjkr.|\}}| j|||S t|dd dkrZt|sJt	| j
|||S |tkr~t|snt	| j
|||S t|tjjtjjfr| j||||S |tjjjkr|\}}}	}
| j|||	|
|S |tjjjkr |\}}}| j||||S t|tjjr$| jd||||S td| d S )Nr!   >   math	_operatorcall_functionzUnsupported target type: )r   rL   rc   operatorgetitemr+   call_getitemgetattrcallablerQ   call_symr   rC   r1   _ops
OpOverloadZOpOverloadPacketcall_operatoropshigher_ordercond	call_condmap_implcall_mapZHigherOrderOperator_fxr   )r9   rj   rk   rl   rc   rM   keypredtrue_fnfalse_fninputsfmapped_argsoperandsr#   r#   r$   rt      s@    

zA_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_functionc                    s   t  |||S r.   )r/   rB   rq   r:   r#   r$   rB      s    z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.get_attrc                 C   s   t dd S )Nzcall_module is not supported.r=   rq   r#   r#   r$   call_module   s    z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_modulec                 C   s   t dd S )Nzcall_method is not supported.r=   rq   r#   r#   r$   call_method   s    z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_method)nr-   c                    s   || _ | | j_t |S r.   )rL   Zformat_noder+   node_debug_strr/   run_node)r9   r   r:   r#   r$   r      s    z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.run_node)r    r!   r"   r   GraphModuler0   r[   r	   ra   r   r   rm   r1   rL   Targetro   rt   rB   r   r   rH   r   rd   r#   r#   r:   r$   ExportInterpreter   s@   






+ 
 


	 
 
r   Nr<   c                 C   sF   t tjtj tj | _| | t	 | _
d | _d| _d | _d S )NT)r   r1   r   r   r2   r3   r5   interpreterre   r   tracerr7   _initializedr   r>   r#   r#   r$   r0      s    z*_ExportPassBaseDeprecatedDoNotUse.__init__.)kindrj   rk   rl   rc   r-   c                 C   s   t tdd ||f\}}t| j||||}t tdd ||f\}	}
d }t|tjjrl| j	j
|jj}| j	j|||	|
|d}|jj|j | jr| jj }rt|| }r||jjd< | j	|j| t||S )Nc                 S   s   | j S r.   rp   rN   r#   r#   r$   <lambda>      z7_ExportPassBaseDeprecatedDoNotUse._fx.<locals>.<lambda>c                 S   s   | j S r.   )proxyr   r#   r#   r$   r   	  r   )nameZunbacked_bindings)rb   tree_map_onlyr   rx   r   rC   r1   r{   r|   r   r6   Z_target_to_strZoverloadpacketr    create_proxyrL   rc   updaterp   r7   	shape_envr   rJ   )r9   r   rj   rk   rl   rc   Z	args_dataZkwargs_dataZres_dataZ
args_proxyZkwargs_proxyr   Z	res_proxyr   Zsymbol_to_pathr#   r#   r$   r      s*        z%_ExportPassBaseDeprecatedDoNotUse._fx)graph_moduler-   c                    sR   j dd  }d k	rt|S tjjtt dfdd  fddjj	D S )Nrk   )rL   r-   c              	      s   d| j kr2| j d }t|dr.|jd k	r.|jS |S | j d }r|jd k	sPttjtj|j	|j
d|j|jdtdS t| jdkrd S td  d	d S )
Nr]   rA   r_   rc   )dtypedevicerequires_gradmemory_formatcpur   z,Cannot construct an input for graph module: .)rc   rE   rA   getr7   rQ   r   r1   emptyshaper   r   r   r   rD   Zusersr   )rL   Zfaker_   )r   r9   r#   r$   extract_input  s.    


z?_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.extract_inputc                    s   g | ]}|j d kr |qS )rm   )rI   ).0rL   )r   r#   r$   
<listcomp>7  s   
z<_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.<listcomp>)
rc   r   listr1   r   rH   r   r   r6   ri   )r9   r   rk   r#   )r   r   r9   r$   r     s    
z(_ExportPassBaseDeprecatedDoNotUse.inputs)attrr-   c                 C   s   d S r.   r#   )r9   r   r#   r#   r$   rK   =  s    z)_ExportPassBaseDeprecatedDoNotUse.on_attr)r   rn   rc   r-   c                 C   s6   | j d|di }|j|j_| j |j| t||S )Nrm   r#   )r   r   rp   rL   rc   rJ   r   )r9   r   rn   rc   Z	arg_proxyr#   r#   r$   rm   @  s    
z-_ExportPassBaseDeprecatedDoNotUse.placeholder)rk   rl   rc   r-   c                 C   s   |  d||||S Nrt   r   )r9   rI   rk   rl   rc   r#   r#   r$   r}   F  s    z/_ExportPassBaseDeprecatedDoNotUse.call_operator)rj   rk   rc   r-   c                 C   s   |  d||i |S r   r   )r9   rj   rk   rc   r#   r#   r$   rz   O  s    z*_ExportPassBaseDeprecatedDoNotUse.call_sym)r   r   r   r   rc   r-   c              	   C   s`   |  |t|}|  |t|}|d k	s,t|d k	s8t| dtjjj||j|jt	|fi |S r   )
call_submoduletuplerQ   r   r1   r~   r   r   r   r   )r9   r   r   r   r   rc   Ztrue_branchZfalse_branchr#   r#   r$   r   W  s    z+_ExportPassBaseDeprecatedDoNotUse.call_cond)r   r   r   rc   r-   c                 C   s`   t dd |D d }| |t|dd |D  }|d k	s@t| dtjjj|j	||fi |S )Nc                 S   s   g | ]
}|j qS r#   r   r   rn   r#   r#   r$   r   r  s     z>_ExportPassBaseDeprecatedDoNotUse.call_map.<locals>.<listcomp>r   c                 S   s   g | ]
}|j qS r#   r   r   r#   r#   r$   r   s  s     rt   )
r   r   r   rQ   r   r1   r~   r   r   r   )r9   r   r   r   rc   ZxsZf_branchr#   r#   r$   r   k  s    
z*_ExportPassBaseDeprecatedDoNotUse.call_map)rM   r   rc   r-   c                 C   s   |  dtj||fi |S r   )r   ru   rv   )r9   rM   r   rc   r#   r#   r$   rw   }  s    z._ExportPassBaseDeprecatedDoNotUse.call_getitem)resultsrc   r-   c                 C   s   |  dd|fi |S )Nro   r   )r9   r   rc   r#   r#   r$   ro     s    z(_ExportPassBaseDeprecatedDoNotUse.output)r   r   r-   c              	   C   s   | j | | |jj }| _ |j| j _| | |}| jtj	tj
tj tj  }| _ttdd |}t  |j|  W 5 Q R X tj
| j j| j j}|| _ || _t|dS )Nc                 S   s   | j S r.   r   r   r#   r#   r$   r     r   zB_ExportPassBaseDeprecatedDoNotUse.call_submodule.<locals>.<lambda>T)r   re   r6   Z_codegenr7   r   r   r1   r   Interpreterr   r2   r3   r5   rb   r   r   fx_tracebackZpreserve_node_metarunr4   r   )r9   r   r   Zprev_tracerr   Zprev_interpreterZinputs_dataZnew_graph_moduler#   r#   r$   r     s&     




z0_ExportPassBaseDeprecatedDoNotUse.call_submodulec              
   C   s   t | ddstd| |}d }|D ].}t|tr&|d ksN||jksNtd|j}q&|d krztdd| j_	t
 }t
 }nd|_|| j_	t }| jj	| _	|& | | |t|}W 5 Q R X W 5 Q R X |S )Nr   Fz.ExportPass is not initialized with __init__().z#Multiple fake tensor mode detected.T)allow_non_fake_inputs)rx   r   r   rC   r   Z	fake_moderQ   r   r   r7   r   r   r   r   r   )r9   r   r   r7   iZdispatcher_moderesultr#   r#   r$   call  s4    


$z&_ExportPassBaseDeprecatedDoNotUse.call)&r    r!   r"   __doc__staticmethodr*   r   re   r   r   r   r0   r[   r1   rL   r   r	   ra   r   r   r   r   r   r   r   rK   rm   r}   Fnrz   r   r   rX   rw   ro   r   r   r   r#   r#   r#   r$   r   1   sd   
_X

%	



   
)@ru   r   typing
contextlibr   r   r   r   r   r   r   r	   r
   r1   Z#functorch.experimental.control_flowr   r   Ztorch._dispatch.pythonr   Z&torch._export.pass_infra.node_metadatar   Z$torch._export.pass_infra.proxy_valuer   Ztorch._subclassesr   r   Ztorch._subclasses.fake_tensorr   Ztorch.fxr   Z"torch.fx.experimental.proxy_tensorr   Ztorch.fx.graphr   Ztorch.fx.passes.infra.pass_baser   r   Ztorch.fx.passes.shape_propr   r   Ztorch.utilsr   rb   Z%torch.fx.experimental.symbolic_shapesr   r   __all__ra   Valuer   r   ZPassTypeZsym_intZ	sym_floatZsym_iteZsym_maxZsym_minZsym_notZsym_sqrtr   __annotations__RuntimeErrorr   r   r#   r#   r#   r$   <module>   sF    (