o
    Zh                     @   sR  d Z ddl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mZmZ ddl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mZmZ edZedZej j!Z!e"ee!e#f ede
f f Z$eede
f e#f Z%G dd dej&j'Z(eG dd dZ)G dd deZ*dej+de,e) deee
f fddZ-dS )z?Utilities for lowering subgraphs used by higher order operators    N)	Generator)contextmanager)	dataclass)AnyCallableOptionalTypeVarUnion)	ParamSpec)
OrderedSet   )ir)SubgraphLoweringException)SimpleCSEHandler)opsVWrapperHandlerT_P.c                       sl  e Zd ZU dZeeej  ed< e	j
jjed< ee ed< eee  ed< ee ed< eej ed< ee ed< 				d'd
e	jjde	j
jjdeee  dee dd	f
 fddZededed fddZdefddZdedd	fddZdddejdedefddZdedefddZd ed!ed"eeef def fd#d$Z d ed!e!e d"eeef dd	fd%d&Z"  Z#S )(PointwiseSubgraphLoweringz
    Lowers a pointwise subgraph to a single set of buffers with a separate
    lowering object. Errors if buffers are created unexpectedly
    graph_outputs
root_graph_current_opallowed_mutationsadditional_loweringsbuffersmutated_buffersNgmroot_graph_loweringreturnc                    s<   t  | d | _|| _|| _|| _d | _t | _g | _	d S N)
super__init__r   r   r   r   r   r   r   r   )selfr   r   r   r   	__class__ P/var/www/auris/lib/python3.10/site-packages/torch/_inductor/subgraph_lowering.pyr"   +   s   
z"PointwiseSubgraphLowering.__init__op)NNNc                 c   s*    | j }|| _ z	dV  W || _ dS || _ w )zQSet which op is being processed in call function to know if we can mutate buffersN)r   )r#   r(   previousr&   r&   r'   _op_context=   s   z%PointwiseSubgraphLowering._op_contextc                 C   s   | j d uo
| j| j v S r    )r   r   r#   r&   r&   r'   _approved_mutatorG   s   

z+PointwiseSubgraphLowering._approved_mutatornamec                 C   s*   |   r| j| d S td| j d)Nz,Buffer mutation detected during lowering of z. Buffer mutations are only allowed in approved mutation ops. This is an error in the lowering of the subgraph, please file a bug report.)r,   r   addr   r   r#   r-   r&   r&   r'   mark_buffer_mutatedM   s
   z-PointwiseSubgraphLowering.mark_buffer_mutatedF)set_namebufferr1   c                C   s6   |   r| dt| j }| j| |S td)NbufzBuffers cannot be created while lowering a pointwise subgraph. This could be for a good reason (e.g. you're calling an op we can't codegen as a pointwise op), but it could also be a bug. Please file a bug report if you think this should be supportable.)r,   Zqualify_namelenr   appendr   )r#   r2   r1   r-   r&   r&   r'   register_bufferW   s   z)PointwiseSubgraphLowering.register_bufferc                 C   s   t | j|S r    )getattrr   r/   r&   r&   r'   __getattr__c   s   z%PointwiseSubgraphLowering.__getattr__targetargskwargsc                    s   ddl m} | |\ |tju r*t|d tttfr*t	 
|||W  d    S | jd urL|| jv rLt|ts;J | j| |i |W  d    S ||vrWt| d|| |i |W  d    S 1 sjw   Y  d S )Nr   )	loweringsr   z. not supported in subgraph, (missing lowering))Zloweringr<   r*   operatorgetitem
isinstancelisttupledictr!   call_functionr   
OpOverloadr   )r#   r9   r:   r;   r<   r$   r&   r'   rC   f   s    


$z'PointwiseSubgraphLowering.call_functionc                 C   s   t |dksJ |d | _d S )Nr   r   )r4   r   )r#   r9   r:   r;   r&   r&   r'   output   s   z PointwiseSubgraphLowering.output)NN)$__name__
__module____qualname____doc__r   r@   r   ZIRNode__annotations__torchZ	_inductorgraphZGraphLowering
TargetTyper   rD   LoweringDictZBufferstrfxGraphModuler"   r   r   r*   boolr,   r0   r6   r   r8   rB   rC   rA   rE   __classcell__r&   r&   r$   r'   r      sL   
 
	

.r   c                   @   s"   e Zd ZU ejed< ejed< dS )InputDescriptordtypedeviceN)rF   rG   rH   rK   rU   rJ   rV   r&   r&   r&   r'   rT      s   
 
rT   c                       sZ   e Zd Zdejjdeddf fddZdedejjfdd	Z	d
e
e ddfddZ  ZS )TracingOpsHandlertracer
num_inputsr   Nc                    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 )rZ   inputr&   )rX   create_proxy).0ir+   r&   r'   
<listcomp>   s    z.TracingOpsHandler.__init__.<locals>.<listcomp>)r\   r!   r"   rX   rangeplaceholders)r#   rX   rY   parentr$   r+   r'   r"      s   
zTracingOpsHandler.__init__idxc                 C   s
   | j | S r    )ra   )r#   rc   r&   r&   r'   rZ      s   
zTracingOpsHandler.placeholderr:   c                    s*    j ddt fdd|D fi  d S )NrE   c                 3   s    | ]	} j |V  qd S r    )rX   Z
create_arg)r]   ar+   r&   r'   	<genexpr>   s    z+TracingOpsHandler.output.<locals>.<genexpr>)rX   Zcreate_noderA   )r#   r:   r&   r+   r'   rE      s   zTracingOpsHandler.output)rF   rG   rH   rK   rP   Tracerintr"   ZProxyrZ   rA   objectrE   rS   r&   r&   r$   r'   rW      s    
rW   subgraphinputsr   c              	      s  dt dt dttjtjd f fdd  fddt|D }| j}t|tj	d}t
| |j|  W d    n1 s<w   Y  tj }tjj|jd	|_	tt|t|}|jd us_J t|J g }|jD ]7}t|tjsxJ t|| g ksJ t|jtjsJ t|jjtjsJ d
}	|jj|	}
||
 qjtj|  W d    n1 sw   Y  tj i |j	dt!j"dt!j#dt$ffdd}|S )Nloop_idx	input_idxr   c                 S   s
   t |S r    )r   rZ   )rk   rl   r&   r&   r'   fake_inner_fn   s   
z/lower_pointwise_subgraph.<locals>.fake_inner_fnc              	      s2   g | ]\}}t jj|j|jtj |d g dqS ))rl   )rV   rU   inner_fnranges)r   	PointwisecreaterV   rU   	functoolspartial)r]   r^   Zdesc)rm   r&   r'   r_      s    z,lower_pointwise_subgraph.<locals>.<listcomp>)r   )Z
tracer_clsr&   r:   r;   c                     s    t  g| R i |S r    )r   Zget_ops_handler)r:   r;   )
lowered_gmr&   r'   rn      s   z*lower_pointwise_subgraph.<locals>.inner_fn)%rg   r	   r   ExprZ	TensorBox	enumerateZgraph_moduler   r   rL   Zset_graph_handlerrunrK   rP   rf   ZGraphr%   r   rW   r4   r   Zset_ops_handlerr?   typeget_sizedataZ
StorageBoxrp   rn   r5   r   rE   rQ   r   r:   r;   r   )ri   rj   Zgraph_inputsr   Zpw_subgraphrX   Z	trace_opsZ
output_irsZout_varrc   Zir_outrn   r&   )rm   rt   r'   lower_pointwise_subgraph   sD   

	

r{   ).rI   rr   r=   collections.abcr   
contextlibr   dataclassesr   typingr   r   r   r   r	   Ztyping_extensionsr
   rK   Ztorch.utils._ordered_setr    r   excr   Zops_handlerr   Zvirtualizedr   r   r   r   r   Z_opsrD   rB   rO   rN   rM   rP   ZInterpreterr   rT   rW   ZSubgraphr@   r{   r&   r&   r&   r'   <module>   s<    h
