U
    yh                     @   s   d Z ddlZddlZddlmZ ddl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mZmZ ed
ZG dd de	jjZeG dd dZG dd dee Zejee dddZdS )zAUtilities for lowering subgraphs used by higher order operators

    N)	dataclass)ListOptionalTypeVar   )irSubgraphLoweringException)SimpleCSEHandler)opsVWrapperHandlerTc                       sl   e Zd ZU eeej  ed< ej	j
dd fddZedd Zdd	 Zd
d Z fddZdd Z  ZS )PointwiseSubgraphLoweringgraph_outputsz#torch._inductor.graph.GraphLowering)gmroot_graph_loweringc                    s   t  | d | _|| _d S N)super__init__r   
root_graph)selfr   r   	__class__ S/var/www/html/venv/lib/python3.8/site-packages/torch/_inductor/subgraph_lowering.pyr      s    z"PointwiseSubgraphLowering.__init__c                 C   s   | j jS r   )r   sizevarsr   r   r   r   r   !   s    z"PointwiseSubgraphLowering.sizevarsc                 C   s   t dd S )Nz+Mutations are not supported in this contextr   )r   namer   r   r   mark_buffer_mutated%   s    z-PointwiseSubgraphLowering.mark_buffer_mutatedc                 C   s   t dd S )Nz0Buffer creation is not supported in this contextr   )r   datar   r   r   register_buffer(   s    z)PointwiseSubgraphLowering.register_bufferc                    s   ddl m} |tjkr:t|d tttfr:t 	|||S t|t
jjsLt||krbt| dt
jj|jkr~td| || ||S )Nr   )	loweringsr   z. not supported in subgraph, (missing lowering)z@Only pointwise operators are supported in this context, but got )Zloweringr"   operatorgetitem
isinstancelisttupledictr   call_functiontorchZ_opsZ
OpOverloadAssertionErrorr	   TagZ	pointwisetags)r   targetargskwargsr"   r   r   r   r)   -   s    z'PointwiseSubgraphLowering.call_functionc                 C   s   t |dkst|d | _d S )Nr   r   )lenr+   r   )r   r.   r/   r0   r   r   r   outputA   s    z PointwiseSubgraphLowering.output)__name__
__module____qualname__r   r   r   ZIRNode__annotations__r*   fxGraphModuler   propertyr   r   r!   r)   r2   __classcell__r   r   r   r   r      s   
	
r   c                   @   s"   e Zd ZU ejed< ejed< dS )InputDescriptordtypedeviceN)r3   r4   r5   r*   r<   r6   r=   r   r   r   r   r;   F   s   

r;   c                       s,   e Zd Z fddZdd Zdd Z  ZS )TracingOpsHandlerc                    s>   | dddi }t | | _ fddt|D  _d S )Nplaceholderr   r   c                    s$   g | ]} j d d| di qS )r?   inputr   )tracercreate_proxy).0ir   r   r   
<listcomp>R   s   z.TracingOpsHandler.__init__.<locals>.<listcomp>)rB   r   r   rA   rangeplaceholders)r   rA   Z
num_inputsparentr   r   r   r   M   s    
zTracingOpsHandler.__init__c                 C   s
   | j | S r   )rG   )r   idxr   r   r   r?   W   s    zTracingOpsHandler.placeholderc                    s&    j ddt fdd|D fi S )Nr2   c                 3   s   | ]} j |V  qd S r   )rA   Z
create_arg)rC   ar   r   r   	<genexpr>\   s     z+TracingOpsHandler.output.<locals>.<genexpr>)rA   Zcreate_noder'   )r   r/   r   r   r   r2   Z   s       zTracingOpsHandler.output)r3   r4   r5   r   r?   r2   r:   r   r   r   r   r>   L   s   
r>   )subgraphinputsc              	      sH  dd   fddt |D }| j}t|tjd}t| |j|  W 5 Q R X tj	 }tjj
|jd|_tt|t|}|jd k	stt| g }|jD ]n}t|tjstt|| g kstt|jtjstt|jjtjstd}	|jj|	}
||
 qtj|  W 5 Q R X tji |jfdd	}|S )
Nc                 S   s
   t |S r   )r   r?   )Zloop_idx	input_idxr   r   r   fake_inner_fnb   s    z/lower_pointwise_subgraph.<locals>.fake_inner_fnc              	      s2   g | ]*\}}t jj|j|jtj |d g dqS ))rN   )r=   r<   inner_fnranges)r   	Pointwisecreater=   r<   	functoolspartial)rC   rD   desc)rO   r   r   rE   e   s   z,lower_pointwise_subgraph.<locals>.<listcomp>)r   )Z
tracer_clsr   c                     s    t  f| |S r   )r   Zget_ops_handler)r/   r0   )
lowered_gmr   r   rP      s    z*lower_pointwise_subgraph.<locals>.inner_fn)	enumerateZgraph_moduler   r   graphZset_graph_handlerrunr*   r7   ZTracerZGraphr   r
   r>   r1   r   r+   Zset_ops_handlerr%   r   Z	TensorBoxtypeget_sizer    Z
StorageBoxrR   rP   appendr   r2   r8   )rL   rM   Zgraph_inputsr   Zpw_subgraphrA   Z	trace_opsZ
output_irsZout_varrI   Zir_outrP   r   )rO   rW   r   lower_pointwise_subgraph`   s4    
	

r^   )__doc__rT   r#   dataclassesr   typingr   r   r   r*    r   excr	   Zops_handlerr
   Zvirtualizedr   r   r   r   r7   ZInterpreterr   r;   r>   ZSubgraphr^   r   r   r   r   <module>   s   1