U
    ªÊ¹jJ.  ã                   @   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 d dlZd dl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+e,eeeej-gej.f f dœdd„Z/eej-df e,dœdd„Z0d d!œeej-df e,dœd"d#„Z1d$d d%œeeej-df e2e,d&œd'd(„Z3d)d*„ Z4dS )+é    N)ÚCallableÚDictÚListÚOptionalÚSetÚTupleÚUnioné   )Ú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
eejejf dœd	d
„ƒZeeef d dœdd„Zdd„ Zedœdd„Zedœdd„Zedœ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   ú[/var/www/html/bwave/python/venv/lib/python3.8/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.ranges©Úrenamesr!   c                 C   s*   | j |kr&t|| j  | j| j| jd�S | S )N)r   r   )r   r   r   r   r   ©r   r%   r   r   r   Úrename$   s    
   ÿzMemoryDep.renamec                 C   sv   |   ¡ rtj | j¡}n>t| jjƒ}t 	d¡}t
| j| jƒD ]\}}||kr<|| }q<tjj |¡ttj | j¡ƒ S ©Nr	   )Úis_indirectr   ÚgraphÚ	get_numelr   Úsetr   Úfree_symbolsÚsympyÚIntegerr#   r   r   ÚsizevarsÚ	size_hintr   Ú	get_dtype)r   ZnumelÚvarsÚvarr   r   r   r   Únumbytes_hint+   s    

ÿzMemoryDep.numbytes_hintc                 C   s   t | jtjƒo| j| jkS ©N)Ú
isinstancer   r.   ÚSymbolr   r   r   r   r   Úis_contiguous8   s    zMemoryDep.is_contiguousc                 C   s6   t | jtjƒr$| j| jko"|  ¡  S t | jttjfƒS r6   )r7   r   r.   r8   r   r)   Úintr/   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 r6   )r)   r   ©Ú.0Úvr   r   r   Ú	<genexpr>A   s     z(MemoryDep.is_indirect.<locals>.<genexpr>)Úanyr   r-   r   r   r   r   r)   @   s    zMemoryDep.is_indirectN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r.   ÚExprr   r8   r   Úpropertyr   r   r'   r5   Úboolr9   r;   r)   r   r   r   r   r      s   

r   c                   @   sl   e Zd ZU eed< edd„ ƒZeeef d dœdd„Zdd„ Z	e
d	œd
d„Ze
d	œdd„Ze
d	œdd„ZdS )r   r   c                 C   s   t dƒ‚d S )NzStarDep does not have an index©ÚNotImplementedErrorr   r   r   r   r   H   s    zStarDep.indexr$   c                 C   s   | j |krt|| j  ƒS | S r6   )r   r   r&   r   r   r   r'   L   s    
zStarDep.renamec                 C   s*   t jj t j | j¡¡tt j | j¡ƒ S r6   )r   r*   r0   r1   r+   r   r   r2   r   r   r   r   r5   Q   s
    ÿþzStarDep.numbytes_hintr    c                 C   s   dS ©NFr   r   r   r   r   r9   V   s    zStarDep.is_contiguousc                 C   s   dS rK   r   r   r   r   r   r;   Y   s    zStarDep.is_scalarc                 C   s   dS rK   r   r   r   r   r   r)   \   s    zStarDep.is_indirectN)rA   rB   rC   rD   rE   rG   r   r   r'   r5   rH   r9   r;   r)   r   r   r   r   r   D   s   

r   c                   @   sP   e Zd ZU eed< edd„ ƒZeeef d dœdd„Zdd„ Z	e
d	œd
d„ZdS )r   r   c                 C   s   t dƒ‚d S )NzWeakDep does not have an indexrI   r   r   r   r   r   f   s    zWeakDep.indexr$   c                 C   s   | j |krt|| j  ƒS | S r6   )r   r   r&   r   r   r   r'   j   s    
zWeakDep.renamec                 C   s   dS r(   r   r   r   r   r   r5   o   s    zWeakDep.numbytes_hintr    c                 C   s   dS rK   r   r   r   r   r   r9   r   s    zWeakDep.is_contiguousN)rA   rB   rC   rD   rE   rG   r   r   r'   r5   rH   r9   r   r   r   r   r   c   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)rA   rB   rC   r.   rF   rE   r   r8   r   r   r   r   rL   v   s   

rL   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< dZej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S )Ú
ReadWritesÚreadsÚwritesÚindex_exprsNÚ
range_varsÚ
var_rangesÚ	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   rT   rU   rW   r   r   rX   ˆ   s     ©rS   ©rM   rN   rO   rP   rQ   rR   rS   r&   r   rW   r   r'   …   s    úzReadWrites.rename)rV   r!   c                 C   s<   t |ttfƒst‚tt | j|h¡| j| j	| j
| j| jd�S ©NrY   )r7   r   r   ÚAssertionErrorrM   r,   ÚunionrN   rO   rP   rQ   rR   rS   )r   rV   r   r   r   Ú	with_read�   s    úzReadWrites.with_read)Úotherc                 C   sr   t  | j|j¡}t  | j|j¡}t  | j|j¡}| jd k	rXt | j¡}| |jpRi ¡ n|j}t	|| |||d�S r[   )
r,   r]   rN   rO   rP   rS   ÚcollectionsÚCounterÚupdaterM   )r   r_   rN   rO   rP   rS   r   r   r   Úmergeš   s    
zReadWrites.merge)Úread_writesc                 C   sx   t jdd„ | D ƒŽ }t jdd„ | D ƒŽ | }t jdd„ | D ƒŽ }t ¡ }| D ]}|jd k	rL| |j¡ qLt||||d�S )Nc                 S   s   g | ]
}|j ‘qS r   )rO   ©r=   Úrwr   r   r   Ú
<listcomp>§   s     z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r   )rN   re   r   r   r   rg   ¨   s     c                 S   s   g | ]
}|j ‘qS r   )rP   re   r   r   r   rg   ©   s     rY   )r,   r]   r`   ra   rS   rb   rM   )rd   Z
all_writesZ	all_readsZall_index_exprsrS   rf   r   r   r   Ú
merge_list¥   s    
zReadWrites.merge_listc                 C   s$   t | j| | j| j| j| j| jd�S r[   rZ   )r   Z	rem_readsr   r   r   Úremove_reads²   s    úzReadWrites.remove_readsc                 C   s   t  | j| j¡S r6   )Ú	itertoolsÚchainrN   rO   r   r   r   r   Úreads_and_writes¼   s    zReadWrites.reads_and_writes)rA   rB   rC   r   ÚDeprE   rL   rQ   r   r   r.   rF   rR   r   rS   r`   ra   Útypingr   rD   r'   r^   rc   Ústaticmethodrh   ri   rl   r   r   r   r   rM   |   s   


rM   c                       sÀ   e Zd Zeedœ‡ fdd„Zejeej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©rR   Ú	normalizec                    s2   t ƒ  ¡  tƒ | _tƒ | _tƒ | _|| _|| _d S r6   )ÚsuperÚ__init__r,   Ú_readsÚ_writesÚ_index_exprsÚ_var_rangesÚ
_normalize)r   rR   rr   ©Ú	__class__r   r   rt   Á   s    
z_RecordLoadStoreInner.__init__.)r   r!   c                    s0  | j sTdd„ | j ¡ D ƒ}tdd„ t| j ¡ |ƒD ƒƒ}tdd„ |D ƒƒ}|||fS |j}dd„ | j ¡ D ƒ}| ¡ •}| ¡ •}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   r*   r0   Úsimplify©r=   Úxr   r   r   rg   Í   s     z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 s   s   | ]\}}|d kr|V  qdS ©r	   Nr   ©r=   Úkr>   r   r   r   r?   Î   s     z5_RecordLoadStoreInner.canonicalize.<locals>.<genexpr>c                 s   s   | ]}|d kr|V  qdS r€   r   r<   r   r   r   r?   Ñ   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   rg   é   s     éÿÿÿÿ)ry   rx   ÚvaluesÚtupler#   Úkeysr-   Úitemsr   r*   r0   Z_simplify_loopsr
   Úvar_builderÚcanonicalization_prefixr"   r   r.   ÚexpandÚpop)r   r   Úsizesr   r-   rR   Z
index_varsÚ	new_sizesÚreindexZpruneZnew_varsÚreplacementr   r„   r   ÚcanonicalizeÉ   s8    ÿ
þ

ý
 

z"_RecordLoadStoreInner.canonicalize)r   r   r!   c                 C   s2   | j  t|f|  |¡žŽ ¡ d|› dt|ƒ› d�S )Nzload(r   r   )ru   Úaddr   r“   r   ©r   r   r   r   r   r   Úloadö   s    z_RecordLoadStoreInner.load)r   r   c                 C   s    t |tƒst‚|  |t |¡¡S r6   )r7   r:   r\   r–   r.   r/   r•   r   r   r   Ú	load_seedú   s    z_RecordLoadStoreInner.load_seedN)r   r   Úvaluer!   c              	   C   s>   | j  t|f|  |¡žŽ ¡ d|› dt|ƒ› d|› d|› d�	S )Nzstore(r   r   )rv   r”   r   r“   r   )r   r   r   r˜   Úmoder   r   r   Ústoreþ   s    z_RecordLoadStoreInner.store)r   r!   c                 C   s   |   ||d|› d�¡S )Nzstore_reduction(r   )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(r   r   )rw   r”   rL   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   )ru   r”   r   r   )r   r‡   rž   rŸ   r    r¡   r   r   r   Ú	bucketize	  s    z_RecordLoadStoreInner.bucketize)N)rA   rB   rC   r   rH   rt   r.   rF   r   r“   rD   r–   r:   r—   rš   r›   r�   Útorchrœ   r¢   Ú__classcell__r   r   rz   r   rp   À   s   	þ-úrp   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 r6   )rs   rt   Úparent_handlerr`   ra   Ú
_op_counts)r   Úinnerrz   r   r   rt     s    
z_OpCounter.__init__c                 C   s   | j |  d7  < t| j|ƒS r(   )r§   Úgetattrr¦   )r   r   r   r   r   Ú__getattr__  s    z_OpCounter.__getattr__)rA   rB   rC   Ú__doc__rt   rª   r¤   r   r   rz   r   r¥     s   r¥   c                       s$   e Zd Zeedœ‡ fdd„Z‡  ZS )ÚRecordLoadStorerq   c                    s&   t ||d�}t|ƒ}tƒ j|d� d S )Nrq   )r¦   )rp   r¥   rs   rt   )r   rR   rr   r¦   rz   r   r   rt   #  s     ÿzRecordLoadStore.__init__)rA   rB   rC   r   rH   rt   r¤   r   r   rz   r   r¬   "  s   r¬   )Úprefixr!   c                    s2   t  ¡ ‰ tƒ ‰tjtjdœ‡ ‡‡fdd„}ˆ|fS )N)Úlengthr!   c                    s    t ˆ› tˆ ƒ› �ƒ}| ˆ|< |S r6   )r   Únext)r®   r>   ©Zcntr­   rR   r   r   r…   /  s    zvar_builder.<locals>.add_var)rj   Úcountr"   r.   rF   r8   )r­   r…   r   r°   r   r‹   +  s    r‹   .)Úargsizesr­   c                 G   s6   t | ƒ\}}g }|D ]}| tt||ƒƒ¡ q||fS r6   )r‹   ÚappendÚlistÚmap)r­   r²   rR   r…   Úargsr   r   r   r   Úindex_vars_no_squeeze7  s
    r·   Úd)r­   c           
      G   sb   ddl m} t| ƒ\}}g }g }|D ]4}| |¡\}}	| |¡ | |	tt||ƒƒƒ¡ q$||fS )Nr	   )ÚSqueezeView)Zirr¹   r‹   Zsqueezerr³   r´   rµ   )
r­   r²   r¹   rR   r…   r¶   r�   r   Únew_sizer‘   r   r   r   Úindex_vars_squeeze?  s    
r»   F)rr   r­   )Úfnr²   rr   r­   c          	   	   G   s~   t |d|iŽ\}}t||d�}t |¡� | |Ž  W 5 Q R X |rFg }ntj|Ž •}|jj}tt|j	ƒt|j
ƒ|j|||jjƒS )Nr­   )rr   )r»   r¬   r   Zset_ops_handlerrj   rk   r¦   rM   r,   ru   rv   rw   r§   )	r¼   rr   r­   r²   r¶   rR   rf   rQ   r¨   r   r   r   Úextract_read_writesL  s     úr½   c                   C   s   dS )NÚcr   r   r   r   r   rŒ   g  s    rŒ   )5r`   Údataclassesrj   ÚloggingÚrern   r   r   r   r   r   r   r   r.   r£   Zcodegen.commonr
   Úutilsr   r   r   r   r   Zvirtualizedr   Ú	getLoggerrA   ÚlogÚcompileÚsearchr)   rm   Ú
NamedTupler   r   r   rL   Ú	dataclassrM   ZMockHandlerrp   r¥   ZKernelFormatterHandlerr¬   rD   rF   r8   r‹   r·   r»   rH   r½   rŒ   r   r   r   r   Ú<module>   sF   $
.CU	& üü