o
    I&ik<                  	   @   s(  d dl Z d dlZd dlZd dlZd dlZd dl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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 eeZedj Z!ed	 Z"G d
d dej#Z$G dd dej#Z%G dd dej#Z&G dd dej#Z'ej(G dd dZ)G dd dej*Z+G dd dZ,G dd dej-Z.de/deeeej0gej1f f fddZ2deej0df de/fd d!Z3d"d#deej0df de/fd$d%Z4d&d"d'd(edef deej0df d)e5de/fd*d+Z6d,d-dee
e	ej0  e
e	ej0  f fd.d/Z7d0d1 Z8dS )2    N)AnyCallableDictListOptionalSetTupleUnion)free_unbacked_symbols   )index_prevent_reordering)get_dtype_size	sympy_str
sympy_subssympy_symbol	VarRanges)Vzindirect|tmp)	MemoryDepStarDepWeakDepc                   @   s   e Zd ZU eed< ejed< eejdf ed< eejdf ed< dd Z	e
deejejf fd	d
ZdejfddZdeeef dd fddZdd Zdd ZdefddZdefddZdefddZdS )r   nameindex.	var_namessizec                 C   s   d| j d| j d| j dS )Nz
MemoryDep(, ))r   r   rangesself r   GC:\wamp64\www\opt\env\Lib\site-packages\torch/_inductor/dependencies.py__repr__   s   zMemoryDep.__repr__returnc                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})dictzipr   r   r   r   r   r    r       s   zMemoryDep.rangesc                 C   s\   |   rtj| j}|S t| jj}t	d}t
| j| jD ]\}}||v r+|| }q|S Nr   )is_indirectr   graph	get_numelr   setr   free_symbolssympyIntegerr$   r   r   )r   Znumelvarsvarr   r   r   r    r(   %   s   
zMemoryDep.get_numelrenamesc                 C   s*   | j |v rt|| j  | j| j| jdS | S )N)r   r   )r   r   r   r   r   r   r/   r   r   r    rename0   s
   
zMemoryDep.renamec                 C   $   t jj|  tt j| j S Nr   r'   sizevarsZ	size_hintr(   r   Z	get_dtyper   r   r   r   r    numbytes_hint7      zMemoryDep.numbytes_hintc                 C      t t|  dkS Nr   lenr
   r(   r   r   r   r    has_unbacked_symbols<      zMemoryDep.has_unbacked_symbolsc                 C   s   t | jtjo| j| jv S r3   )
isinstancer   r+   Symbolr   r   r   r   r    is_contiguous?   s   zMemoryDep.is_contiguousc                 C   s6   t | jtjr| j| jvo|   S t | jttjfS r3   )r>   r   r+   r?   r   r&   intr,   r   r   r   r    	is_scalarB   s   zMemoryDep.is_scalarc                 C   s   t dd | jjD S )Nc                 s   s    | ]}t |jV  qd S r3   )r&   r   .0vr   r   r    	<genexpr>H   s    z(MemoryDep.is_indirect.<locals>.<genexpr>)anyr   r*   r   r   r   r    r&   G      zMemoryDep.is_indirectN)__name__
__module____qualname__str__annotations__r+   Exprr   r?   r!   propertyr   r   r(   r1   r6   r<   boolr@   rB   r&   r   r   r   r    r      s   
 
r   c                   @   s   e Zd ZU eed< edd ZdejfddZ	de
eef dd fdd	Zd
d Zdd ZdefddZdefddZdefddZdS )r   r   c                 C      t d)NzStarDep does not have an indexNotImplementedErrorr   r   r   r    r   O      zStarDep.indexr"   c                 C   s   t j| jS r3   )r   r'   r(   r   r   r   r   r    r(   S   s   zStarDep.get_numelr/   c                 C      | j |v rt|| j  S | S r3   )r   r   r0   r   r   r    r1   V      
zStarDep.renamec                 C   r2   r3   r4   r   r   r   r    r6   [   r7   zStarDep.numbytes_hintc                 C   r8   r9   r:   r   r   r   r    r<   `   r=   zStarDep.has_unbacked_symbolsc                 C      dS NFr   r   r   r   r    r@   c      zStarDep.is_contiguousc                 C   rW   rX   r   r   r   r   r    rB   f   rY   zStarDep.is_scalarc                 C   rW   rX   r   r   r   r   r    r&   i   rY   zStarDep.is_indirectN)rI   rJ   rK   rL   rM   rO   r   r+   rN   r(   r   r1   r6   r<   rP   r@   rB   r&   r   r   r   r    r   K   s   
 
r   c                   @   sj   e Zd ZU eed< edd ZdejfddZ	de
eef dd fdd	Zd
d Zdd ZdefddZdS )r   r   c                 C   rQ   )NzWeakDep does not have an indexrR   r   r   r   r    r   v   rT   zWeakDep.indexr"   c                 C   s
   t dS r%   )r+   r,   r   r   r   r    r(   z   s   
zWeakDep.get_numelr/   c                 C   rU   r3   )r   r   r0   r   r   r    r1   }   rV   zWeakDep.renamec                 C   rW   r%   r   r   r   r   r    r6      rY   zWeakDep.numbytes_hintc                 C   rW   rX   r   r   r   r   r    r<      rY   zWeakDep.has_unbacked_symbolsc                 C   rW   rX   r   r   r   r   r    r@      rY   zWeakDep.is_contiguousN)rI   rJ   rK   rL   rM   rO   r   r+   rN   r(   r   r1   r6   r<   rP   r@   r   r   r   r    r   s   s   
 
r   c                   @   s<   e Zd ZU ejed< eejdf ed< eejdf ed< dS )IndexExprDepr   .r   r   N)rI   rJ   rK   r+   rN   rM   r   r?   r   r   r   r    rZ      s   
 
rZ   c                   @   s   e Zd ZU ee ed< ee ed< ee ed< dZee	e
j  ed< dZee ed< ejejdZeje ed< d	ejeef d
d fddZded
d fddZdddZede	d  fddZdd Zdd ZdS )
ReadWritesreadswritesindex_exprsN
range_vars
var_ranges)default_factory	op_countsr/   r"   c                    s<   t  fdd| jD  fdd| jD | j| j| j| jdS )Nc                       h | ]}|  qS r   r1   rD   depr/   r   r    	<setcomp>       z$ReadWrites.rename.<locals>.<setcomp>c                    rc   r   rd   re   rg   r   r    rh      ri   rb   r[   r\   r]   r^   r_   r`   rb   r0   r   rg   r    r1      s   zReadWrites.renamerf   c                 C   s<   t |ttfs	J tt| j|h| j| j| j	| j
| jdS Nrj   )r>   r   r   r[   r)   unionr\   r]   r^   r_   r`   rb   )r   rf   r   r   r    	with_read   s   zReadWrites.with_readotherc                 C   s\   t | j|j}t | j|j}t | j|j}t| j}||j t	|| |||dS rl   )
r)   rm   r\   r]   r^   collectionsCounterrb   updater[   )r   ro   r\   r]   r^   rb   r   r   r    merge   s   zReadWrites.mergeread_writesc                 C   sn   t jdd | D  }t jdd | D  | }t jdd | D  }t }| D ]}||j q&t||||dS )Nc                 S      g | ]}|j qS r   )r]   rD   rwr   r   r    
<listcomp>       z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   ru   r   )r\   rv   r   r   r    rx      ry   c                 S   ru   r   )r^   rv   r   r   r    rx      ry   rj   )r)   rm   rp   rq   rr   rb   r[   )rt   Z
all_writesZ	all_readsZall_index_exprsrb   rw   r   r   r    
merge_list   s   zReadWrites.merge_listc                 C   s$   t | j| | j| j| j| j| jdS rl   rk   )r   Z	rem_readsr   r   r    remove_reads   s   zReadWrites.remove_readsc                 C   s   t | j| jS r3   )	itertoolschainr\   r]   r   r   r   r    reads_and_writes   s   zReadWrites.reads_and_writes)ro   r[   )rI   rJ   rK   r   DeprM   rZ   r_   r   r   r+   rN   r`   r   dataclassesfieldrp   rq   rb   typingrL   r   r1   rn   rs   staticmethodrz   r{   r~   r   r   r   r    r[      s    
 


r[   c                	       s   e Zd Zdedef fddZdejdeejeej	df eejdf f fdd	Z
d
edejdefddZd
edefddZdd
edejdedefddZd
edefddZdejdefddZdedejdejdefddZ  ZS )_RecordLoadStoreInnerr`   	normalizec                    s2   t    t | _t | _t | _|| _|| _d S r3   )super__init__r)   _reads_writes_index_exprs_var_ranges
_normalize)r   r`   r   	__class__r   r    r      s   

z_RecordLoadStoreInner.__init__r   r"   .c                    sB  | j s*dd | j D }tdd t| j |D }tdd |D }|||fS |j}dd | j D }g | }t| }tj	j
||t|g||\}}}	tt \}
 tt|| fdd|D }tt||}g |
 }
g |}|j}|
r|
d	 |vr|
  |  |
r|
d	 |vs|t|
t|fS )
Nc                 S   s   g | ]	}t jj|qS r   r   r'   r5   simplifyrD   xr   r   r    rx      s    z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 s   s     | ]\}}|d kr|V  qdS r   Nr   rD   krE   r   r   r    rF      s    z5_RecordLoadStoreInner.canonicalize.<locals>.<genexpr>c                 s   s    | ]	}|d kr|V  qdS r   r   rC   r   r   r    rF      s    c                 S   s    i | ]\}}|t jj|qS r   r   r   r   r   r    
<dictcomp>   s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>c                    s   g | ]} |qS r   r   r   add_varr   r    rx      s    )r   r   valuestupler$   keysr*   itemsr   r'   r5   Z_simplify_loopsr   var_buildercanonicalization_prefixr#   r   r+   expandpop)r   r   sizesr   r*   r`   Z
index_vars	new_sizesreindexZpruneZnew_varsreplacementr   r   r    canonicalize   s:   

 z"_RecordLoadStoreInner.canonicalizer   c                 C   s4   | j t|g| |R   d| dt| dS )Nzload(r   r   )r   addr   r   r   r   r   r   r   r   r    load
  s   z_RecordLoadStoreInner.loadc                 C   s    t |tsJ | |t|S r3   )r>   rA   r   r+   r,   r   r   r   r    	load_seed  s   z_RecordLoadStoreInner.load_seedNvaluec              	   C   s@   | j t|g| |R   d| dt| d| d| d	S )Nzstore(r   r   )r   r   r   r   r   )r   r   r   r   moder   r   r    store  s   "z_RecordLoadStoreInner.storec                 C   s   |  ||d| dS )Nzstore_reduction(r   )r   )r   r   r   r   r   r   r    store_reduction  rH   z%_RecordLoadStoreInner.store_reductionc                 C   s,   | j t| |  dt| d| dS )Nzindex_expr(r   r   )r   r   rZ   r   r   )r   r   dtyper   r   r    
index_expr  s   z _RecordLoadStoreInner.index_exproffsets_nameoffsets_sizeindexing_dtyperightc                 C   s8   | j t| d| d| dt| d| d| dS )Nz
bucketize(r   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r    	bucketize  s   (z_RecordLoadStoreInner.bucketizer3   )rI   rJ   rK   r   rP   r   r+   rN   r   r?   r   rL   r   rA   r   r   r   r   torchr   r   __classcell__r   r   r   r    r      s*    "
-r   c                       s(   e Zd ZdZ fddZdd Z  ZS )
_OpCounterz,Shim to count how many times each op is usedc                    s   t    || _t | _d S r3   )r   r   parent_handlerrp   rq   
_op_counts)r   innerr   r   r    r   ,  s   
z_OpCounter.__init__c                 C   s   | j |  d7  < t| j|S r%   )r   getattrr   )r   r   r   r   r    __getattr__1  s   z_OpCounter.__getattr__)rI   rJ   rK   __doc__r   r   r   r   r   r   r    r   )  s    r   c                       s&   e Zd Zdedef fddZ  ZS )RecordLoadStorer`   r   c                    s&   t ||d}t|}t j|d d S )N)r`   r   )r   )r   r   r   r   )r   r`   r   r   r   r   r    r   7  s
   zRecordLoadStore.__init__)rI   rJ   rK   r   rP   r   r   r   r   r   r    r   6  s    r   prefixr"   c                    s4   t   t dtjdtjf fdd}|fS )Nlengthr"   c                    s    t  t  }| |< |S r3   )r   next)r   rE   Zcntr   r`   r   r    r   C  s   zvar_builder.<locals>.add_var)r|   countr#   r+   rN   r?   )r   r   r   r   r    r   ?  s   r   argsizes.c                 G   s6   t | \}}g }|D ]}|tt|| q
||fS r3   )r   appendlistmap)r   r   r`   r   argsr   r   r   r    index_vars_no_squeezeK  s
   r   d)r   c           
      G   sb   ddl m} t| \}}g }g }|D ]}||\}}	|| ||	tt|| q||fS )Nr   )SqueezeView)irr   r   Zsqueezerr   r   r   )
r   r   r   r`   r   r   r   r   new_sizer   r   r   r    index_vars_squeezeS  s   
r   F)r   r   fnr   c          	      G   s   t |d|i\}}t||d}t| | |  W d    n1 s#w   Y  |r-g }ng tj| }|jj}tt|j	t|j
|j|||jjS )Nr   )r   )r   r   r   Zset_ops_handlerr|   r}   r   r[   r)   r   r   r   r   )	r   r   r   r   r   r`   rw   r_   r   r   r   r    extract_read_writes`  s"   
r   
input_nodeztorch._inductor.ir.TensorBoxc           
      C   s\  ddl m}m} t| j|r"|  }|  }t|dkr ||fS dS t| jj|s+dS |  }d}d}|du rt|dkrt	 }g }|D ]Q}t|t
sLqD|j|v rRqD||j tj|j}	|	du rdqDt|	|rt|	 dkr|du r~|	 }|	 }qD||	 ks||	 kr dS qD||	  qD||kr||fS |}|du rt|dks=||fS )aX  
    Returns the size and reduction size of all inputs, if the sizes and reduction_sizes (if exist) are all the same.
    It's possible that a node has multiple inputs, some are Reduction nodes and others are Pointwise nodes.
    In this case, reduction_sizes of the Reduction nodes need to be the same.
    Otherwise returns (None, None).
    r   )ComputedBufferLoopsr   )NNN)r   r   r   r>   dataget_sizeZget_reduction_sizer;   Z	get_readsr)   r   r   r   r   r'   
get_bufferextend)
r   r   r   r   Zreduction_sizer\   seenZ	new_readsreadbufferr   r   r    #extract_input_node_reduction_ranges{  sP   



r   c                   C   rW   )Ncr   r   r   r   r    r     rY   r   )9rp   r   r|   loggingrer   r   r   r   r   r   r   r   r	   r+   r   Z%torch.fx.experimental.symbolic_shapesr
   Zcodegen.commonr   utilsr   r   r   r   r   Zvirtualizedr   	getLoggerrI   logcompilesearchr&   r   
NamedTupler   r   r   rZ   	dataclassr[   ZMockHandlerr   r   ZKernelFormatterHandlerr   rL   rN   r?   r   r   r   rP   r   r   r   r   r   r   r    <module>   sZ    (
4(AU(	"


@