o
    Ih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   K/var/www/vscode/kcb/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 )N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graphset_codegen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   r8   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 )N
submodule_constantzCannot add z
 to graph.get_attr)
isinstancer.   r/   r0   r7   lenr1   
add_moduler   hasattrrA   r   r,   
create_argTensorr   Nodeopset_metadatar(   on_attrr   )r8   r?   name_submodulenoder9   r   r    rG   J   s&   




z9_ExportPassBaseDeprecatedDoNotUse.ExportTracer.create_argrN   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)static_shapeszvFakeifying a Tensor subclass is not supported                             right now. Instead a TensorMetadata is used.)rC   r   r.   rH   is_quantized
dequantizer6   r/   	Parameterfrom_tensorr   printSymIntSymFloatSymBoolintfloatboolstr)rP   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+   )
rC   r   r.   rH   rR   rS   r6   rU   r   r   )rP   _tensor_metar=   r   r    make_tensor_meta   s   

zU_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadata.<locals>.make_tensor_metarb   )Argumentr   r   r.   rW   rX   rY   rZ   r[   r\   r]   pytreetree_mapmetar   r   )r8   rN   rO   r_   rc   r   r=   r    rK   ^   s   "z;_ExportPassBaseDeprecatedDoNotUse.ExportTracer.set_metadatar*   N)r   r   r   r   r-   r>   rd   r.   r   rI   rG   rK   __classcell__r   r   r9   r    ExportTracer<   s    

rj   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iterr3   nodesrN   )r8   r(   rk   r9   r   r    r-      s   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.__init__targetargs.kwargsc                    s(   t  |||}| j||t| jjS r+   )r,   placeholderr(   r
   rN   rg   )r8   ro   rp   rq   argr9   r   r    rr      s   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.placeholderc                 C   s   | j |d t| jjjS )Nr   )r(   outputr
   rN   rg   datar8   ro   rp   rq   r   r   r    rt      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   >   mathbuiltins	_operatorcall_functionzUnsupported target type: )r
   rN   rg   operatorgetitemr(   call_getitemgetattrcallablecall_symr   rC   r.   _ops
OpOverloadOpOverloadPacketcall_operatoropshigher_ordercond	call_condmap_implcall_mapHigherOrderOperator_fxr   )r8   ro   rp   rq   rg   rO   keypredtrue_fnfalse_fninputsfmapped_argsoperandsr   r   r    rz      s@   

zA_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_functionc                    s   t  |||S r+   )r,   rB   rv   r9   r   r    rB      s   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.get_attrc                 C   r;   )Nzcall_module is not supported.r<   rv   r   r   r    call_module   s   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_modulec                 C   r;   )Nzcall_method is not supported.r<   rv   r   r   r    call_method   s   z?_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.call_methodnc                    s   || _ | | j_t |S r+   )rN   format_noder(   node_debug_strr,   run_node)r8   r   r9   r   r    r      s   z<_ExportPassBaseDeprecatedDoNotUse.ExportInterpreter.run_node)r   r   r   r   GraphModuler-   r]   tuplerd   dictr   rr   r.   rN   Targetrt   rz   rB   r   r   rI   r   ri   r   r   r9   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/   r0   r2   interpreterrj   r   tracerr6   _initializedr   r=   r   r   r    r-      s   
z*_ExportPassBaseDeprecatedDoNotUse.__init__kindro   rp   .rq   rg   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+   ru   rP   r   r   r    <lambda>      z7_ExportPassBaseDeprecatedDoNotUse._fx.<locals>.<lambda>c                 S   r   r+   )proxyr   r   r   r    r   	  r   )nameunbacked_bindings)re   tree_map_onlyr   r~   r   rC   r.   r   r   r   r3   _target_to_stroverloadpacketr   create_proxyrN   rg   updateru   r6   	shape_envr   rK   )r8   r   ro   rp   rq   rg   	args_datakwargs_datares_data
args_proxykwargs_proxyr   	res_proxyr   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 )Nrp   rN   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	)
Nr`   rA   rb   rg   )dtypedevicerequires_gradmemory_formatcpur   z,Cannot construct an input for graph module: .)rg   rF   rA   getr6   r   r.   emptyshaper   r   r   r   rD   usersr   )rN   fakerb   )r   r8   r   r    extract_input  s.   


z?_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.extract_inputc                    s   g | ]}|j d kr |qS )rr   )rJ   ).0rN   )r   r   r    
<listcomp>7  s
    
z<_ExportPassBaseDeprecatedDoNotUse.inputs.<locals>.<listcomp>)
rg   r   listr.   r   rI   r   r   r3   rn   )r8   r   rp   r   )r   r   r8   r    r     s    
z(_ExportPassBaseDeprecatedDoNotUse.inputsattrc                 C   s   d S r+   r   )r8   r   r   r   r    rL   =  s   z)_ExportPassBaseDeprecatedDoNotUse.on_attrr   rs   c                 C   s6   | j d|di }|j|j_| j |j| t||S )Nrr   r   )r   r   ru   rN   rg   rK   r   )r8   r   rs   rg   	arg_proxyr   r   r    rr   @  s   

z-_ExportPassBaseDeprecatedDoNotUse.placeholderc                 C   s   |  d||||S Nrz   r   )r8   rJ   rp   rq   rg   r   r   r    r   F  s   z/_ExportPassBaseDeprecatedDoNotUse.call_operatorc                 C   s   |  d||i |S r   r   )r8   ro   rp   rg   r   r   r    r   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   )r8   r   r   r   r   rg   true_branch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   rs   r   r   r    r   r      z>_ExportPassBaseDeprecatedDoNotUse.call_map.<locals>.<listcomp>r   c                 S   r   r   r   r   r   r   r    r   s  r   rz   )	r   r   r   r   r.   r   r   r   r   )r8   r   r   r   rg   xsf_branchr   r   r    r   k  s   
z*_ExportPassBaseDeprecatedDoNotUse.call_maprO   r   c                 C   s   |  dtj||fi |S r   )r   r{   r|   )r8   rO   r   rg   r   r   r    r}   }  s   z._ExportPassBaseDeprecatedDoNotUse.call_getitemresultsc                 C   s   |  dd|fi |S )Nrt   r   )r8   r   rg   r   r   r    rt     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   rj   r3   _codegenr6   r   r   r.   r   Interpreterr   r/   r0   r2   re   r   r   fx_tracebackpreserve_node_metarunr1   r   )r8   r   r   prev_tracerr   prev_interpreterinputs_data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)r~   r   r   rC   r   	fake_moder   r   r6   r   r   r	   r   r   )r8   r   r   r6   idispatcher_moderesultr   r   r    call  s:   


(z&_ExportPassBaseDeprecatedDoNotUse.callrh   )&r   r   r   __doc__staticmethodr'   r   rj   r   r   r   r-   r]   r.   rN   r   r   rd   r   r
   r   r   r   r   r   rL   rr   r   Fnr   r   r   rZ   r}   rt   r   r   r   r   r   r   r    r   1   s    
_
X	


%


	






)=r{   r   typing
contextlibr   r   r   r   r   r.   #functorch.experimental.control_flowr   r   torch._dispatch.pythonr	   &torch._export.pass_infra.node_metadatar
   $torch._export.pass_infra.proxy_valuer   torch._subclassesr   r   torch._subclasses.fake_tensorr   torch.fxr   "torch.fx.experimental.proxy_tensorr   torch.fx.graphr   torch.fx.passes.infra.pass_baser   r   torch.fx.passes.shape_propr   r   torch.utilsr   re   %torch.fx.experimental.symbolic_shapesr   r   __all__rd   Valuer   r   PassTypesym_int	sym_floatsym_itesym_maxsym_minsym_notsym_sqrtr   set__annotations__RuntimeErrorr   r   r   r   r   r    <module>   sF   
