o
    "ioS                  	   @   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Z4de5deeeej6gej7f f fd d!Z8d"eej6d#f de5fd$d%Z9d&d'd"eej6d#f de5fd(d)Z:d*d&d+d,ed#ef d"eej6d#f d-e;de5fd.d/Z<d0d1deee
ej6  ee
ej6  f fd2d3Z=d4d5 Z>G d6d7 d7Z?d8e?ded fd9d:Z@d=d,ed#ef f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de	eef dd fddZ
ejdejfddZejd	d
 ZejdefddZejdefddZdS )Depnameindexrenamesreturnc                 C      d S N selfr   r   r   Z/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/_inductor/dependencies.pyrename$      z
Dep.renamec                 C   r   r   r   r    r   r   r!   	get_numel(   r#   zDep.get_numelc                 C   r   r   r   r$   r   r   r!   numbytes_hint,   r#   zDep.numbytes_hintc                 C   r   r   r   r$   r   r   r!   has_unbacked_symbols0   r#   zDep.has_unbacked_symbolsc                 C   r   r   r   r$   r   r   r!   is_contiguous4   r#   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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%defddZdefd d!Zdef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       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                       g | ]} |qS r   r   r=   xadd_varr   r!   
<listcomp>l       z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)torch._inductorrC   r   graphsizevarsstride_hintsr   r5   sortedrangelen__getitem__same_reorderr6   _simplify_loopsr   var_builderdictzipr   r.   expandr4   r   tuplekeysvalues)r    prefixrC   stridesorderstride_reordersizesr5   new_reordered_sizesnew_reordered_var_namesnew_simplified_sizesreindexprune
var_rangesreplacement	new_indexoutr   rI   r!   normalize_with_stride_orderJ   s2   


	 z%MemoryDep.normalize_with_stride_orderr   c                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})rX   rY   r5   r6   r$   r   r   r!   r:   t   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   rN   r%   r   setr   free_symbolsr.   IntegerrY   r5   r6   )r    numelvarsvarr6   r   r   r!   r%   y   s   
zMemoryDep.get_numelr   c                 C   s.   | j |v 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   $   t jj|  tt j| j S r   r   rN   rO   	size_hintr%   r   	get_dtyper   r$   r   r   r!   r&         zMemoryDep.numbytes_hintc                 C      t t|  dkS Nr   rS   r   r%   r$   r   r   r!   r'         zMemoryDep.has_unbacked_symbolsc                 C   s   t | jtjo| j| jv 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 ]2}||u r( dS t|tjrQt |jdkrQ|jd |u rQt|jd ttj	frQ|jd dkrQ dS q|S )zA
        Whether the stride for the last dimension is 1.
        r   T   r   F)
rS   r5   r~   r   r.   AddargsMulintrq   )r    result_for_complex_expressionterms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vo|   S t | jttjfS r   )r~   r   r.   r   r5   rn   r   rq   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   )rn   r   r<   r   r   r!   	<genexpr>   s    z(MemoryDep.is_indirect.<locals>.<genexpr>)anyr   rp   r$   r   r   r!   rn         zMemoryDep.is_indirect)rB   T)r)   r*   r+   r,   r-   r.   r/   r   r   r7   r   r;   rA   rl   propertyr   r:   r%   r"   r&   r'   r2   r(   r   r   rn   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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 )StarDepr   Nr7   c                 C      t d)NzStarDep does not have an indexNotImplementedErrorr$   r   r   r!   r         zStarDep.indexr   c                 C   s   t j| jS r   )r   rN   r%   r   r$   r   r   r!   r%      s   zStarDep.get_numelr   c                 C   s    | j |v rt|| j  | jS | S r   )r   r   r7   r   r   r   r!   r"      s   
zStarDep.renamec                 C   ru   r   rv   r$   r   r   r!   r&      ry   zStarDep.numbytes_hintc                 C   rz   r{   r|   r$   r   r   r!   r'      r}   zStarDep.has_unbacked_symbolsc                 C      dS NFr   r$   r   r   r!   r(         zStarDep.is_contiguousc                 C   r   r   r   r$   r   r   r!   r      r   zStarDep.is_scalarc                 C   r   r   r   r$   r   r   r!   rn      r   zStarDep.is_indirect)r)   r*   r+   r,   r-   r7   r   r   r   r.   r/   r%   r   r"   r&   r'   r2   r(   r   rn   r   r   r   r!   r      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 )WeakDepr   c                 C   r   )NzWeakDep does not have an indexr   r$   r   r   r!   r      r   zWeakDep.indexr   c                 C   s
   t dS rm   )r.   rq   r$   r   r   r!   r%      s   
zWeakDep.get_numelr   c                 C   s   | j |v rt|| j  S | S r   )r   r   r   r   r   r!   r"      s   
zWeakDep.renamec                 C   r   rm   r   r$   r   r   r!   r&      r   zWeakDep.numbytes_hintc                 C   r   r   r   r$   r   r   r!   r'      r   zWeakDep.has_unbacked_symbolsc                 C   r   r   r   r$   r   r   r!   r(     r   zWeakDep.is_contiguousN)r)   r*   r+   r,   r-   r   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   r   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< 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ddZdS )
ReadWritesreadswritesindex_exprsN
range_varsrh   )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   r"   r=   depr   r   r!   	<setcomp>      z$ReadWrites.rename.<locals>.<setcomp>c                    r   r   r   r   r   r   r!   r     r   r   r   r   r   r   r   rh   r   r   r   r   r!   r"     s   zReadWrites.renamer   c                 C   s<   t |ttfs	J tt| j|h| j| j| j	| j
| jdS Nr   )r~   r   r   r   ro   unionr   r   r   r   rh   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   )
ro   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 q&t||||dS )Nc                 S      g | ]}|j qS r   )r   r=   rwr   r   r!   rK   7  r@   z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   r   r   )r   r   r   r   r!   rK   8  r@   c                 S   r   r   )r   r   r   r   r!   rK   9  r@   r   )ro   r   r   r   r   r   r   )r   
all_writes	all_reads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    	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 ]}t|tsq|rt|jttjfs ||j	 q|S )z6
        Integer index is used for load_seed.
        )
ro   r   r~   r4   r   r   r.   rq   addr   )r    ignore_integer_indexnamesr   r   r   r!   buffer_namesN  s   
zReadWrites.buffer_names)r   r   r   )r)   r*   r+   r   r   r-   r   r   r   r   r.   r/   rh   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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 )_RecordLoadStoreInnerrh   	normalizec                    s2   t    t | _t | _t | _|| _|| _d S r   )super__init__ro   _reads_writes_index_exprs_var_ranges
_normalize)r    rh   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   rN   rO   simplifyrG   r   r   r!   rK   j  s    z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 s   s     | ]\}}|d kr|V  qdS r   Nr   r=   kr>   r   r   r!   r   k  s    z5_RecordLoadStoreInner.canonicalize.<locals>.<genexpr>c                 s   s    | ]	}|d kr|V  qdS r   r   r<   r   r   r!   r   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                    rF   r   r   rG   rI   r   r!   rK     rL   r   )r   r   r]   r[   rY   r\   rp   itemsr   rN   rO   rV   r   rW   canonicalization_prefixrX   r   r.   rZ   pop)r    r   rb   r5   rp   rh   
index_vars	new_sizesrf   rg   new_varsri   r   rI   r!   canonicalizef  s:   

 z"_RecordLoadStoreInner.canonicalizer   c                 C   s4   | j t|g| |R   d| dt| dS )Nzload(r8   r9   )r   r   r4   r   r   r    r   r   r   r   r!   load  s   z_RecordLoadStoreInner.loadc                 C   s    t |tsJ | |t|S r   )r~   r   r   r.   rq   r   r   r   r!   	load_seed  s   z_RecordLoadStoreInner.load_seedNvaluec              	   C   sF   | j t|g| |R 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.storec                 C   s   |  ||d| dS )Nzstore_reduction(r9   )r   )r    r   r   r   r   r   r!   store_reduction  r   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   r   r   )r    r]   r   r   r   r   r   r   r!   	bucketize  s   (z_RecordLoadStoreInner.bucketizer   )r)   r*   r+   r   r2   r   r.   r/   r   r   r   r,   r   r   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 rm   )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dedef fddZ  ZS )RecordLoadStorerh   r   c                    s&   t ||d}t|}t j|d d S )N)rh   r   )r   )r   r   r   r   )r    rh   r   r   r   r   r!   r     s
   zRecordLoadStore.__init__)r)   r*   r+   r   r2   r   r   r   r   r   r!   r     s    r   r^   r   c                    s4   t   t dtjdtjf fdd}|fS )Nlengthr   c                    s    t  t  }| |< |S r   )r   next)r   r>   cntr^   rh   r   r!   rJ     s   zvar_builder.<locals>.add_var)r   countrX   r.   r/   r   )r^   rJ   r   r   r!   rW     s   rW   argsizes.c                 G   s6   t | \}}g }|D ]}|tt|| q
||fS r   )rW   appendlistmap)r^   r   rh   rJ   r   r6   r   r   r!   index_vars_no_squeeze  s
   r   d)r^   c           
      G   sb   ddl m} t| \}}g }g }|D ]}||\}}	|| ||	tt|| q||fS )Nr   )SqueezeView)rC   r  rW   squeezerr   r   r   )
r^   r   r  rh   rJ   r   r   r6   new_sizerf   r   r   r!   index_vars_squeeze  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ttj|}|jj}t	t
|jt
|j|j|||jjS )Nr^   )r   )r  r   r   set_ops_handlerr   r   r   from_iterabler   r   ro   r   r   r   r   )	r  r   r^   r   r   rh   r   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)rC   r
  r  r~   dataget_sizeget_reduction_sizerS   	get_readsro   r4   r   r   r   rN   
get_bufferextend)
r	  r
  r  r6   reduction_sizer   seen	new_readsreadbufferr   r   r!   #extract_input_node_reduction_ranges  sP   



r  c                   C   r   )Ncr   r   r   r   r!   r   E  r   r   c                   @   s   e Zd ZU eej ed< dd Zdede	de
f fddZddejfd
dZdd Zdd Zdejdejdededed f deded f f
ddZdS )FreeUnbackedSymbolsOpsHandlersymbolsc                 C   s   t  | _d S r   )ro   r  r$   r   r   r!   r   M     z&FreeUnbackedSymbolsOpsHandler.__init__r   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   r]   r~   r.   r/   logicboolalgBooleanr  r   )r   kwargsar$   r   r!   r   Q  s
   z8FreeUnbackedSymbolsOpsHandler.__getattr__.<locals>.innerr   )r    r   r   r   r$   r!   r   P  s   z)FreeUnbackedSymbolsOpsHandler.__getattr__Tc                 C   s@   t |tjtjjjfrJ |  jt|O  _tdt	| dS )N(r9   )
r~   r.   r/   r  r  r  r  r   r   r,   )r    	index_varr6   checkr   r   r!   indirect_indexingX  s   z/FreeUnbackedSymbolsOpsHandler.indirect_indexingc                 C   r   )Nr  r   )r    rH   r   r   r!   frexp]  r   z#FreeUnbackedSymbolsOpsHandler.frexpc                 C   s   dt | S )Nr   )rS   )r    dtypes
combine_fnr]   r   r   r!   scan`  r  z"FreeUnbackedSymbolsOpsHandler.scanr   	src_dtypereduction_typer   N)N.c                 C   s   t |}|dkrd| S d S )Nr   r   )r   )r    r   r*  r+  r   
num_valuesr   r   r!   	reductionc  s   z'FreeUnbackedSymbolsOpsHandler.reductionr   )r)   r*   r+   r   r.   r   r-   r   r,   r   r   r   r%  r&  r)  r   r   r   r	   r   r-  r   r   r   r!   r  J  s$   
 r  hc                 C   s   | S r   r   )r.  r   r   r!   (_typecheck_FreeUnbackedSymbolsOpsHandlern  s   r/  c              	   C   s   ddl m} |d ur||gn|g}t }t|. t|dd | |  W d    n1 s0w   Y  W d    |jS W d    |jS 1 sJw   Y  |jS )Nr   )FlexibleLayoutallow_indexingT)rC   r0  r  r   r  r
   objectr  )r  r   rindexr0  r   handlerr   r   r!   extract_free_unbacked_symbolst  s   
(r5  r   )Br0   r   r   r   loggingrer   r   r   r   r   r   r   r   r	   unittest.mockr
   r.   r   %torch.fx.experimental.symbolic_shapesr   codegen.commonr   utilsr   r   r   r   r   r   virtualizedr   r   r   	getLoggerr)   logcompilesearchrn   ABCr   	dataclassr4   r   r   r   r   MockHandlerr   r   KernelFormatterHandlerr   r,   r/   r   rW   r   r  r2   r  r  r   r  r/  r5  r   r   r   r!   <module>   sv   ( 

 

+
OU(
"


@$
