o
    ZhE                     @   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 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Z,edef Z-ee	jj.gee  f Z/e	j0e	j1e	j2e	j3e	j4e	j5e	j6hZ7e8e e9d< G dd de:Z;G dd deZ<dS )    N)nullcontext)AnyCallableOptional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   F/var/www/auris/lib/python3.10/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
d8d
dZdedejjjdeedf deeef dedefddZdejjdee fddZdedd	fddZdedededefddZdeedf deeef dedefddZdedeedf dedefd d!Zd"ed#ejjd$ejjd%ee dedefd&d'Zd(ejjd)ee d*ee dedef
d+d,Zd-ed.e dedefd/d0Z!d1ee dedefd2d3Z"dejd%eedf de#fd4d5Z$dejde#fd6d7Z%d	S )9r   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                       sh   e Zd Zdddeddf fddZddd	Zd
edejj	f fddZ
dejj	deddfddZ  ZS )z._ExportPassBaseDeprecatedDoNotUse.ExportTracercallbackr   codegenreturnNc                    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    r,   =   s   

z7_ExportPassBaseDeprecatedDoNotUse.ExportTracer.__init__c                 C      t d)Nz%ExportTracer doesn't support trace().r   r5   r   r   r    traceG   s   z4_ExportPassBaseDeprecatedDoNotUse.ExportTracer.traceac                    s   t |tjjr!|| jvr dt| j }| j|| || j|< nt |tr;t	|dr0|j
d u r8td| d|j
}t |}t |tjrbt |tjjrb|jdkrb| || | jt|| |S )NZ
submodule_constantzCannot add z
 to graph.get_attr)
isinstancer-   r.   r/   r4   lenr0   Z
add_moduler   hasattrr=   r   r+   
create_argTensorr   Nodeopset_metadatar'   on_attrr   )r5   r<   Zname_submodulenoder6   r   r    rB   J   s&   




z9_ExportPassBaseDeprecatedDoNotUse.ExportTracer.create_argrH   valuec                    st   dt dtttjtjtjttt	t
d f	 f fdd}t|||jd< dt dtt f fdd}t|||jd< d S )	Nxr)   c              	      s   t | tr| S t | tjrH| jrt| } z" jd usJ t | tjjr/ jj	| dd}W |S  j	| }W |S  t
yG   td d }Y |S w t | tjtjtjttttfrY| S d S )NT)Zstatic_shapeszvFakeifying a Tensor subclass is not supported                             right now. Instead a TensorMetadata is used.)r?   r   r-   rC   is_quantized
dequantizer3   r.   	Parameterfrom_tensorr   printSymIntSymFloatSymBoolintfloatboolstr)rJ   Zfake_tensorr:   r   r    make_valb   s0   

		zM_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_valvalc                    sl   t | ts4t | tjr4| jrt| } z jd usJ  j| }d }W |S  ty3   t	| }Y |S w d S r*   )
r?   r   r-   rC   rK   rL   r3   rN   r   r   )rJ   _tensor_metar:   r   r    make_tensor_meta   s   

zU_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_tensor_metarZ   )Argumentr   r   r-   rP   rQ   rR   rS   rT   rU   rV   pytreeZtree_mapmetar   r   )r5   rH   rI   rW   r[   r   r:   r    rF   ^   s   "z;_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadatar)   N)r   r   r   r   r,   r;   r\   r-   r   rD   rB   rF   __classcell__r   r   r6   r    ExportTracer<   s    

ra   c                       s\  e Zd Zdddejddf fddZded	eed
f de	eef de
f fddZdejjjd	eed
f de	eef de
fddZdejjjd	eed
f de	eef de
fddZded	eed
f de	eef def fddZdejjjd	eed
f de	eef ddfddZded	eed
f de	eef ddfddZdejjdef fddZ  ZS )z3_ExportPassBaseDeprecatedDoNotUse.ExportInterpreterr'   r   gmr)   Nc                    s(   t  | || _tt|jj| _d S r*   )r+   r,   r'   nextiterr2   nodesrH   )r5   r'   rb   r6   r   r    r,      s   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.__init__targetargs.kwargsc                    s(   t  |||}| j||t| jjS r*   )r+   placeholderr'   r
   rH   r^   )r5   rf   rg   rh   argr6   r   r    ri      s   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.placeholderc                 C   s   | j |d t| jjjS )Nr   )r'   outputr
   rH   r^   datar5   rf   rg   rh   r   r   r    rk      s   z:_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.outputc                 C   s.  t | jj}|tjkr|\}}| j|||S t|dd dv r-t|s%J | j	|||S |t
v r?t|s7J | j	|||S t|tjjtjjfrS| j||||S |tjjjkrj|\}}}	}
| j|||	|
|S |tjjjkr|\}}}| j||||S t|tjjr| jd||||S td| )Nr   >   builtinsmath	_operatorcall_functionzUnsupported target type: )r
   rH   r^   operatorgetitemr'   call_getitemgetattrcallablecall_symr   r?   r-   _ops
OpOverloadZOpOverloadPacketcall_operatoropshigher_ordercond	call_condmap_implcall_mapZHigherOrderOperator_fxr   )r5   rf   rg   rh   r^   rI   keypredtrue_fnfalse_fninputsfmapped_argsoperandsr   r   r    rq      s@   

zA_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_functionc                    s   t  |||S r*   )r+   r>   rm   r6   r   r    r>      s   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.get_attrc                 C   r8   )Nzcall_module is not supported.r9   rm   r   r   r    call_module   s   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_modulec                 C   r8   )Nzcall_method is not supported.r9   rm   r   r   r    call_method   s   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_methodnc                    s   || _ | | j_t |S r*   )rH   Zformat_noder'   node_debug_strr+   run_node)r5   r   r6   r   r    r      s   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.run_node)r   r   r   r   GraphModuler,   rV   tupler\   dictr   ri   r-   rH   Targetrk   rq   r>   r   r   rD   r   r`   r   r   r6   r    ExportInterpreter   sr    

	





*







"r   r)   Nc                 C   sF   t tjtj tj | _| | t	 | _
d | _d| _d | _d S )NT)r   r-   r   r   r.   r/   r1   interpreterra   r   tracerr3   _initializedr   r:   r   r   r    r,      s   
z*_ExportPassBaseDeprecatedDoNotUse.__init__kindrf   rg   .rh   r^   c                 C   s   t tdd ||f\}}t| j||||}t tdd ||f\}	}
d }t|tjjr6| j	j
|jj}| j	j|||	|
|d}|jj|j | jr_| jj }r_t|| }r_||jjd< | j	|j| t||S )Nc                 S      | j S r*   rl   rJ   r   r   r    <lambda>      z7_ExportPassBaseDeprecatedDoNotUse._fx.<locals>.<lambda>c                 S   r   r*   )proxyr   r   r   r    r   	  r   )nameZunbacked_bindings)r]   tree_map_onlyr   ru   r   r?   r-   rx   ry   r   r2   Z_target_to_strZoverloadpacketr   create_proxyrH   r^   updaterl   r3   	shape_envr   rF   )r5   r   rf   rg   rh   r^   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_modulec                    sT   j dd  }d urt|S dtjjdtt ffdd  fddjj	D S )Nrg   rH   r)   c              	      s   d| j v r| j d }t|dr|jd ur|jS |S | j d }r>jd us(J tjtj|j|j	d|j
|jdtdS t| jdkrGd S td  d	)
NrX   r=   rZ   r^   )dtypedevicerequires_gradmemory_formatcpur   z,Cannot construct an input for graph module: .)r^   rA   r=   getr3   r   r-   emptyshaper   r   r   r   r@   Zusersr   )rH   ZfakerZ   )r   r5   r   r    extract_input  s.   


z?_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.extract_inputc                    s   g | ]}|j d kr |qS )ri   )rE   ).0rH   )r   r   r    
<listcomp>7  s
    
z<_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.<listcomp>)
r^   r   listr-   r   rD   r   r   r2   re   )r5   r   rg   r   )r   r   r5   r    r     s    
z(_ExportPassBaseDeprecatedDoNotUse.inputsattrc                 C   s   d S r*   r   )r5   r   r   r   r    rG   =  s   z)_ExportPassBaseDeprecatedDoNotUse.on_attrr   rj   c                 C   s6   | j d|di }|j|j_| j |j| t||S )Nri   r   )r   r   rl   rH   r^   rF   r   )r5   r   rj   r^   Z	arg_proxyr   r   r    ri   @  s   

z-_ExportPassBaseDeprecatedDoNotUse.placeholderc                 C   s   |  d||||S Nrq   r   )r5   rE   rg   rh   r^   r   r   r    rz   F  s   z/_ExportPassBaseDeprecatedDoNotUse.call_operatorc                 C   s   |  d||i |S r   r   )r5   rf   rg   r^   r   r   r    rw   O  s   z*_ExportPassBaseDeprecatedDoNotUse.call_symr   r   r   r   c              	   C   s`   |  |t|}|  |t|}|d usJ |d usJ | dtjjj||j|jt|fi |S r   )	call_submoduler   r   r-   r{   r|   r}   r   r   )r5   r   r   r   r   r^   Ztrue_branchZfalse_branchr   r   r    r~   W  s   z+_ExportPassBaseDeprecatedDoNotUse.call_condr   r   r   c                 C   s`   t dd |D d }| |t|dd |D  }|d us J | dtjjj|j||fi |S )Nc                 S      g | ]}|j qS r   r   r   rj   r   r   r    r   r      z>_ExportPassBaseDeprecatedDoNotUse.call_map.<locals>.<listcomp>r   c                 S   r   r   r   r   r   r   r    r   s  r   rq   )	r   r   r   r   r-   r{   r|   r   r   )r5   r   r   r   r^   ZxsZf_branchr   r   r    r   k  s   
z*_ExportPassBaseDeprecatedDoNotUse.call_maprI   r   c                 C   s   |  dtj||fi |S r   )r   rr   rs   )r5   rI   r   r^   r   r   r    rt   }  s   z._ExportPassBaseDeprecatedDoNotUse.call_getitemresultsc                 C   s   |  dd|fi |S )Nrk   r   )r5   r   r^   r   r   r    rk     s   z(_ExportPassBaseDeprecatedDoNotUse.outputc                 C   s   | j | | |jj}| _ |j| j _| | |}| jtj	tj
tj tj }| _ttdd |}t  |j|  W d    n1 sKw   Y  tj
| j j| j j}|| _ || _t|dS )Nc                 S   r   r*   r   r   r   r   r    r     r   zB_ExportPassBaseDeprecatedDoNotUse.call_submodule.<locals>.<lambda>T)r   ra   r2   Z_codegenr3   r   r   r-   r   Interpreterr   r.   r/   r1   r]   r   r   fx_tracebackZpreserve_node_metarunr0   r   )r5   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 u s'||ju s'J d|j}q|d u r=tdd| j_t	 }t	 }n
d|_
|| j_t }| jj| _|+ | | |t|}W d    n1 sdw   Y  W d    |S W d    |S 1 s|w   Y  |S )Nr   Fz.ExportPass is not initialized with __init__().z#Multiple fake tensor mode detected.T)allow_non_fake_inputs)ru   r   r   r?   r   Z	fake_moder   r   r3   r   r   r	   r   r   )r5   r   r   r3   iZdispatcher_moderesultr   r   r    call  s:   


(z&_ExportPassBaseDeprecatedDoNotUse.callr_   )&r   r   r   __doc__staticmethodr&   r   ra   r   r   r   r,   rV   r-   rH   r   r   r\   r   r
   r   r   r   r   r   rG   ri   rz   Fnrw   r~   r   rS   rt   rk   r   r   r   r   r   r   r    r   1   s    
_
X	


%


	






)=rr   r   typing
contextlibr   r   r   r   r   r-   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   r]   Z%torch.fx.experimental.symbolic_shapesr   r   __all__r\   Valuer   r   ZPassTypeZsym_intZ	sym_floatZsym_iteZsym_maxZsym_minZsym_notZsym_sqrtr   set__annotations__RuntimeErrorr   r   r   r   r   r    <module>   sF   
