U
    zhoS                     @   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Zd dlmZmZm	Z	m
Z
mZmZmZmZ d dl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mZ ddlmZm Z m!Z! e"e#Z$e%d	j&Z'G d
d de j(Z)ej*ddG dd de)Z+ej*ddG dd de)Z,ej*ddG dd de)Z-ej*ddG dd dZ.ej*G dd dZ/G dd de!j0Z1G dd dZ2G dd de!j3Z4e5eeeej6gej7f f ddd Z8eej6d!f e5d"d#d$Z9d%d&eej6d!f e5d"d'd(Z:d)d%d*ed!ef eej6d!f e;e5d+d,d-Z<d.eee
ej6  ee
ej6  f d/d0d1Z=d2d3 Z>G d4d5 d5Z?e?ed d6d7d8Z@d<ed!ef d9d:d;ZAdS )=    N)AnyCallableDictListOptionalSetTupleUnion)patch)free_unbacked_symbols   )index_prevent_reordering)get_dtype_sizereduction_num_outputssympy_index_symbol	sympy_str
sympy_subs	VarRanges)
OpsHandlerReductionTypeVzindirect|tmpc                   @   s   e Zd ZU eed< ejed< eje	eef d dddZ
ejejdddZejd	d
 ZejedddZejedddZdS )Depnameindexrenamesreturnc                 C   s   d S N selfr   r   r   N/var/www/html/venv/lib/python3.8/site-packages/torch/_inductor/dependencies.pyrename$   s    z
Dep.renamer   c                 C   s   d S r   r   r    r   r   r!   	get_numel(   s    zDep.get_numelc                 C   s   d S r   r   r$   r   r   r!   numbytes_hint,   s    zDep.numbytes_hintc                 C   s   d S r   r   r$   r   r   r!   has_unbacked_symbols0   s    zDep.has_unbacked_symbolsc                 C   s   d S r   r   r$   r   r   r!   is_contiguous4   s    zDep.is_contiguousN)__name__
__module____qualname__str__annotations__sympyExprabcabstractmethodr   r"   r%   r&   boolr'   r(   r   r   r   r!   r       s   


r   T)frozenc                   @   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Z	e
e ed< dd	 Zd
d Zd$ddZeeejejf dddZejdddZeeef d dddZdd Zdd ZedddZd%edddZedd d!Zedd"d#ZdS )&	MemoryDepr   r   .	var_namessizeNmodec              	   C   s&   d| j d| j d| j d| j d	S )Nz
MemoryDep(, ))r   r   rangesr7   r$   r   r   r!   __repr__A   s    zMemoryDep.__repr__c                 C   s   t | jdd | jD S )zF
        Return the offset by setting every variable to be 0.
        c                 S   s   i | ]
}|d qS )r   r   .0vr   r   r!   
<dictcomp>H   s      z(MemoryDep.get_offset.<locals>.<dictcomp>)r   r   r5   r$   r   r   r!   
get_offsetD   s    zMemoryDep.get_offsettc                    s   ddl m} tjj| j| j}tt	t
||jdd}||}| j}| j}||}||}	tjj|	|t| jg|	|\}
}}t|\} tt|	| fdd|
D }tt| j|}t| j|t| t| }|S )a'  
        Used to decide if two MemoryDep does not equal due to different loop orders.
        More specifically, when dep1 and dep2 are not equal, we can normalize
        both and check if they are equal after that. If yes, then the mismatch is
        caused by different loop orders.
        r   )irT)keyreversec                    s   g | ]} |qS r   r   r=   xadd_varr   r!   
<listcomp>l   s     z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)Ztorch._inductorrB   r   graphsizevarsZstride_hintsr   r5   sortedrangelen__getitem__Zsame_reorderr6   _simplify_loopsr   var_builderdictzipr   r.   expandr4   r   tuplekeysvalues)r    prefixrB   stridesorderZstride_reordersizesr5   Znew_reordered_sizesZnew_reordered_var_namesZnew_simplified_sizesreindexprune
var_rangesreplacementZ	new_indexoutr   rG   r!   normalize_with_stride_orderJ   s6    
  
	 z%MemoryDep.normalize_with_stride_orderr#   c                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})rR   rS   r5   r6   r$   r   r   r!   r:   t   s    zMemoryDep.rangesc                 C   sZ   |   rtj| j}n>t| jj}t	d}t
| j| jD ]\}}||kr<|| }q<|S Nr   )is_indirectr   rJ   r%   r   setr   free_symbolsr.   IntegerrS   r5   r6   )r    Znumelvarsvarr6   r   r   r!   r%   y   s    

zMemoryDep.get_numelr   c                 C   s.   | j |kr*t|| j  | j| j| j| jdS | S )N)r5   r6   r7   )r   r4   r   r5   r6   r7   r   r   r   r!   r"      s    
zMemoryDep.renamec                 C   s$   t jj|  tt j| j S r   r   rJ   rK   Z	size_hintr%   r   Z	get_dtyper   r$   r   r   r!   r&      s    zMemoryDep.numbytes_hintc                 C   s   t t|  dkS Nr   rN   r   r%   r$   r   r   r!   r'      s    zMemoryDep.has_unbacked_symbolsc                 C   s   t | jtjo| j| jkS r   )
isinstancer   r.   Symbolr5   r$   r   r   r!   r(      s    zMemoryDep.is_contiguousTc                 C   s   t | jdkrdS t| jtjr(| jjn| jg}| jd }|D ]d}||krP dS t|tjr>t |jdkr>|jd |kr>t|jd ttj	fr>|jd dkr> dS q>|S )zA
        Whether the stride for the last dimension is 1.
        r   T   r   F)
rN   r5   rl   r   r.   AddargsZMulintrf   )r    Zresult_for_complex_expressionZtermsZlast_symtermr   r   r!   stride1_for_last_dim   s&    

zMemoryDep.stride1_for_last_dimc                 C   s6   t | jtjr$| j| jko"|   S t | jttjfS r   )rl   r   r.   rm   r5   rc   rr   rf   r$   r   r   r!   	is_scalar   s    zMemoryDep.is_scalarc                 C   s   t dd | jjD S )Nc                 s   s   | ]}t |jV  qd S r   )rc   r   r<   r   r   r!   	<genexpr>   s     z(MemoryDep.is_indirect.<locals>.<genexpr>)anyr   re   r$   r   r   r!   rc      s    zMemoryDep.is_indirect)rA   )T)r)   r*   r+   r,   r-   r.   r/   r   rm   r7   r   r;   r@   ra   propertyr   r:   r%   r"   r&   r'   r2   r(   rt   ru   rc   r   r   r   r!   r4   9   s$   


*r4   c                   @   s   e Zd ZU eed< dZee ed< edd Ze	j
dddZeeef d d	d
dZdd Zdd ZedddZedddZedddZdS )StarDepr   Nr7   c                 C   s   t dd S )NzStarDep does not have an indexNotImplementedErrorr$   r   r   r!   r      s    zStarDep.indexr#   c                 C   s   t j| jS r   )r   rJ   r%   r   r$   r   r   r!   r%      s    zStarDep.get_numelr   c                 C   s    | j |krt|| j  | jS | S r   )r   ry   r7   r   r   r   r!   r"      s    
zStarDep.renamec                 C   s$   t jj|  tt j| j S r   ri   r$   r   r   r!   r&      s    zStarDep.numbytes_hintc                 C   s   t t|  dkS rj   rk   r$   r   r   r!   r'      s    zStarDep.has_unbacked_symbolsc                 C   s   dS NFr   r$   r   r   r!   r(      s    zStarDep.is_contiguousc                 C   s   dS r|   r   r$   r   r   r!   ru      s    zStarDep.is_scalarc                 C   s   dS r|   r   r$   r   r   r!   rc      s    zStarDep.is_indirect)r)   r*   r+   r,   r-   r7   r   rx   r   r.   r/   r%   r   r"   r&   r'   r2   r(   ru   rc   r   r   r   r!   ry      s   

ry   c                   @   sh   e Zd ZU eed< edd ZejdddZ	e
eef d ddd	Zd
d Zdd ZedddZdS )WeakDepr   c                 C   s   t dd S )NzWeakDep does not have an indexrz   r$   r   r   r!   r      s    zWeakDep.indexr#   c                 C   s
   t dS rb   )r.   rf   r$   r   r   r!   r%      s    zWeakDep.get_numelr   c                 C   s   | j |krt|| j  S | S r   )r   r}   r   r   r   r!   r"      s    
zWeakDep.renamec                 C   s   dS rb   r   r$   r   r   r!   r&      s    zWeakDep.numbytes_hintc                 C   s   dS r|   r   r$   r   r   r!   r'      s    zWeakDep.has_unbacked_symbolsc                 C   s   dS r|   r   r$   r   r   r!   r(     s    zWeakDep.is_contiguousN)r)   r*   r+   r,   r-   rx   r   r.   r/   r%   r   r"   r&   r'   r2   r(   r   r   r   r!   r}      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   .r5   r6   N)r)   r*   r+   r.   r/   r-   r   rm   r   r   r   r!   r~     s   

r~   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< ejeef d d	d
dZed dddZd dddZee	d  dddZdd Zdd ZdddZdS )
ReadWritesreadswritesindex_exprsN
range_varsr^   )default_factory	op_countsr   c                    s<   t  fdd| jD  fdd| jD | j| j| j| jdS )Nc                    s   h | ]}|  qS r   r"   r=   depr   r   r!   	<setcomp>  s     z$ReadWrites.rename.<locals>.<setcomp>c                    s   h | ]}|  qS r   r   r   r   r   r!   r     s     r   r   r   r   r   r   r^   r   r   r   r   r!   r"     s    zReadWrites.rename)r   r   c                 C   s<   t |ttfsttt| j|h| j| j	| j
| j| jdS Nr   )rl   r}   ry   AssertionErrorr   rd   unionr   r   r   r   r^   r   )r    r   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 r   )
rd   r   r   r   r   collectionsCounterr   updater   )r    r   r   r   r   r   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 qLt||||dS )Nc                 S   s   g | ]
}|j qS r   )r   r=   rwr   r   r!   rI   7  s     z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   )r   r   r   r   r!   rI   8  s     c                 S   s   g | ]
}|j qS r   )r   r   r   r   r!   rI   9  s     r   )rd   r   r   r   r   r   r   )r   Z
all_writesZ	all_readsZall_index_exprsr   r   r   r   r!   
merge_list5  s    zReadWrites.merge_listc                 C   s$   t | j| | j| j| j| j| jdS r   r   )r    Z	rem_readsr   r   r!   remove_readsA  s    zReadWrites.remove_readsc                 C   s   t | j| jS r   )	itertoolschainr   r   r$   r   r   r!   reads_and_writesK  s    zReadWrites.reads_and_writesTc                 C   sF   t  }|  D ]2}t|tsq|r4t|jttjfs||j	 q|S )z6
        Integer index is used for load_seed.
        )
rd   r   rl   r4   r   rr   r.   rf   addr   )r    Zignore_integer_indexnamesr   r   r   r!   buffer_namesN  s    
 zReadWrites.buffer_names)T)r)   r*   r+   r   r   r-   r~   r   r   r   r.   r/   r^   r   dataclassesfieldr   r   r   typingr,   r   r"   r   r   staticmethodr   r   r   r   r   r   r   r!   r     s    


r   c                       s   e Zd Zeed fddZejeejeej	df eejdf f dddZ
eejedd	d
ZeedddZdeejeedddZeedddZejedddZeejejedddZ  ZS )_RecordLoadStoreInnerr^   	normalizec                    s2   t    t | _t | _t | _|| _|| _d S r   )super__init__rd   _reads_writes_index_exprs_var_ranges
_normalize)r    r^   r   	__class__r   r!   r   ^  s    
z_RecordLoadStoreInner.__init__.)r   r   c                    s2  | j sTdd | j D }tdd t| j |D }tdd |D }|||fS |j}dd | j D }| }t| }tj	j
||t|g||\}}}	tt \}
 tt|| fdd|D }tt||}|
 }
|}|j}|
r |
d	 |kr |
  |  q|t|
t|fS )
Nc                 S   s   g | ]}t jj|qS r   r   rJ   rK   simplifyrE   r   r   r!   rI   j  s     z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 s   s   | ]\}}|d kr|V  qdS r   Nr   r=   kr>   r   r   r!   rv   k  s     z5_RecordLoadStoreInner.canonicalize.<locals>.<genexpr>c                 s   s   | ]}|d kr|V  qdS r   r   r<   r   r   r!   rv   n  s      c                 S   s    i | ]\}}|t jj|qS r   r   r   r   r   r!   r?   u  s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>c                    s   g | ]} |qS r   r   rE   rG   r   r!   rI     s     rn   )r   r   rW   rU   rS   rV   re   itemsr   rJ   rK   rP   r   rQ   canonicalization_prefixrR   r   r.   rT   pop)r    r   r[   r5   re   r^   Z
index_vars	new_sizesr\   r]   Znew_varsr_   r   rG   r!   canonicalizef  s8    


 

z"_RecordLoadStoreInner.canonicalize)r   r   r   c                 C   s2   | j t|f| |  d| dt| dS )Nzload(r8   r9   )r   r   r4   r   r   r    r   r   r   r   r!   load  s    z_RecordLoadStoreInner.load)r   r   c                 C   s    t |tst| |t|S r   )rl   rr   r   r   r.   rf   r   r   r   r!   	load_seed  s    z_RecordLoadStoreInner.load_seedN)r   r   valuer   c              	   C   sD   | j t|f| |d|i d| dt| d| d| d	S )Nr7   zstore(r8   r9   )r   r   r4   r   r   )r    r   r   r   r7   r   r   r!   store  s    "z_RecordLoadStoreInner.storer   r   c                 C   s   |  ||d| dS )Nzstore_reduction(r9   )r   )r    r   r   r   r   r   r!   store_reduction  s    z%_RecordLoadStoreInner.store_reductionc                 C   s,   | j t| |  dt| d| dS )Nzindex_expr(r8   r9   )r   r   r~   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(r8   r9   )r   r   ry   r   )r    rW   r   r   r   r   r   r   r!   	bucketize  s    z_RecordLoadStoreInner.bucketize)N)r)   r*   r+   r   r2   r   r.   r/   r   rm   r   r,   r   rr   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 r   )r   r   parent_handlerr   r   
_op_counts)r    innerr   r   r!   r     s    
z_OpCounter.__init__c                 C   s   | j |  d7  < t| j|S rb   )r   getattrr   )r    r   r   r   r!   __getattr__  s    z_OpCounter.__getattr__)r)   r*   r+   __doc__r   r   r   r   r   r   r!   r     s   r   c                       s$   e Zd Zeed fddZ  ZS )RecordLoadStorer   c                    s&   t ||d}t|}t j|d d S )Nr   )r   )r   r   r   r   )r    r^   r   r   r   r   r!   r     s     zRecordLoadStore.__init__)r)   r*   r+   r   r2   r   r   r   r   r   r!   r     s   r   )rX   r   c                    s2   t   t tjtjd fdd}|fS )N)lengthr   c                    s    t  t  }| |< |S r   )r   next)r   r>   ZcntrX   r^   r   r!   rH     s    zvar_builder.<locals>.add_var)r   countrR   r.   r/   rm   )rX   rH   r   r   r!   rQ     s    rQ   .)argsizesrX   c                 G   s6   t | \}}g }|D ]}|tt|| q||fS r   )rQ   appendlistmap)rX   r   r^   rH   rq   r6   r   r   r!   index_vars_no_squeeze  s
    r   d)rX   c           
      G   sb   ddl m} t| \}}g }g }|D ]4}||\}}	|| ||	tt|| q$||fS )Nr   )SqueezeView)rB   r   rQ   Zsqueezerr   r   r   )
rX   r   r   r^   rH   rq   r   r6   new_sizer\   r   r   r!   index_vars_squeeze  s    
r   F)r   rX   )fnr   r   rX   c          	   	   G   s   t |d|i\}}t||d}t| | |  W 5 Q R X |rFg }nttj|}|jj}t	t
|jt
|j|j|||jjS )NrX   )r   )r   r   r   set_ops_handlerr   r   r   from_iterabler   r   rd   r   r   r   r   )	r   r   rX   r   rq   r^   r   r   r   r   r   r!   extract_read_writes  s     r   ztorch._inductor.ir.TensorBox)
input_noder   c           
      C   sZ  ddl m}m} t| j|rD|  }|  }t|dkr@||fS dS t| jj|sVdS |  }d}d}|dkrRt|dkrRt	 }g }|D ]}t|t
sq|j|krq||j tj|j}	|	dkrqt|	|r*t|	 dkr*|dkr|	 }|	 }n"||	 ks"||	 kr8 dS q||	  q||krL||fS |}qf||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)rB   r   r   rl   dataget_sizeZget_reduction_sizerN   Z	get_readsrd   r4   r   r   r   rJ   Z
get_bufferextend)
r   r   r   r6   Zreduction_sizer   seenZ	new_readsreadbufferr   r   r!   #extract_input_node_reduction_ranges  sR    







r   c                   C   s   dS )Ncr   r   r   r   r!   r   E  s    r   c                   @   s   e Zd ZU eej ed< dd Zee	de
f dddZdejd	d
dZdd Zdd Zejejeeded f eded f dddZdS )FreeUnbackedSymbolsOpsHandlersymbolsc                 C   s   t  | _d S r   )rd   r   r$   r   r   r!   r   M  s    z&FreeUnbackedSymbolsOpsHandler.__init__.r   c                    s    fdd}|S )Nc                     sB   t | | D ],}t|tjtjjjfr  j	t
|O  _	qd S r   )r   r   rW   rl   r.   r/   logicboolalgBooleanr   r   )rq   kwargsar$   r   r!   r   Q  s    z8FreeUnbackedSymbolsOpsHandler.__getattr__.<locals>.innerr   )r    r   r   r   r$   r!   r   P  s    z)FreeUnbackedSymbolsOpsHandler.__getattr__Tr#   c                 C   s@   t |tjtjjjfrt|  jt|O  _t	dt
| dS )N(r9   )rl   r.   r/   r   r   r   r   r   r   r   r,   )r    Z	index_varr6   checkr   r   r!   indirect_indexingX  s    z/FreeUnbackedSymbolsOpsHandler.indirect_indexingc                 C   s   dS )Nr   r   )r    rF   r   r   r!   frexp]  s    z#FreeUnbackedSymbolsOpsHandler.frexpc                 C   s   dt | S )Nr   )rN   )r    ZdtypesZ
combine_fnrW   r   r   r!   scan`  s    z"FreeUnbackedSymbolsOpsHandler.scanN)N.)r   	src_dtypereduction_typer   r   c                 C   s   t |}|dkrd| S d S )Nr   r   )r   )r    r   r   r   r   Z
num_valuesr   r   r!   	reductionc  s    z'FreeUnbackedSymbolsOpsHandler.reduction)T)r)   r*   r+   r   r.   rm   r-   r   r,   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r!   r   J  s   
r   )hr   c                 C   s   | S r   r   )r   r   r   r!   (_typecheck_FreeUnbackedSymbolsOpsHandlern  s    r   )r   c              
   C   sf   ddl m} |d k	r||gn|g}t }t|( t|dd | |  W 5 Q R X W 5 Q R X |jS )Nr   )FlexibleLayoutZallow_indexingT)rB   r  r   r   r   r
   objectr   )r   r   rindexr  rq   handlerr   r   r!   extract_free_unbacked_symbolst  s      r  )N)Br0   r   r   r   loggingrer   r   r   r   r   r   r   r   r	   Zunittest.mockr
   r.   r   Z%torch.fx.experimental.symbolic_shapesr   Zcodegen.commonr   utilsr   r   r   r   r   r   Zvirtualizedr   r   r   	getLoggerr)   logcompilesearchrc   ABCr   	dataclassr4   ry   r}   r~   r   ZMockHandlerr   r   ZKernelFormatterHandlerr   r,   r/   rm   rQ   r   r   r2   r   r   r   r   r   r  r   r   r   r!   <module>   sf   ( 

 
+

OU
& 
@%