o
    ei|                     @   sZ  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 d dl	m
Z
mZmZmZ d dl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mZ d dlmZ d	d
lmZ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)m*Z* edZ+e,e-Z.e/dj0Z1G dd de j2Z3ej4ddG dd de3Z5ej4ddG dd de3Z6ej4ddG dd de3Z7ej4ddG dd dZ8ej4G dd dZ9G d d! d!e*j:Z;G d"d# d#e*j<Z=d$e>d%e?e'eej@gejAf f fd&d'ZBd(eej@ d$e>d%e?eCeCejA  e'f fd)d*ZDd+d,d(eej@ d$e>d%e?eCeej@  e'f fd-d.ZEd/d+d0d1d2ed3e
f d(eej@ d4eFd$e>d5eeCej@  d%e9fd6d7ZG	/dId2e
d8eCeCej@  d9e'd4eFd%e;f
d:d;ZHd<d=d%e?eeCej@  eeCej@  f fd>d?ZId%e>fd@dAZJG dBdC dCe!ZK		dJd2ed3e
f dDeej@ dEeeej@  dFeFd%eejA f
dGdHZLdS )K    N)CallableIterableSequence)AnyOptionalTypeVarUnion)Self)patch)get_free_symbols)free_symbolsfree_unbacked_symbols
OrderedSet   )make_symbolSymT   )index_prevent_reordering)DefaultHandler)get_dtype_sizereduction_num_outputssympy_index_symbol
sympy_subs	VarRanges)ReductionTypeVTzindirect|tmpc                   @   s   e Zd ZU eed< ejed< ej	dde	de
ej fddZejdeeef defd	d
ZejdejfddZejdefddZejdefddZejde	fddZejde	fddZddedefddZdS )DepnameindexFunbacked_onlyreturnc                 C      d S N selfr!   r%   r%   f/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/_inductor/dependencies.pyget_free_symbol_uses)   s   zDep.get_free_symbol_usesrenamesc                 C   r#   r$   r%   r'   r*   r%   r%   r(   rename/      z
Dep.renamec                 C   r#   r$   r%   r'   r%   r%   r(   	get_numel3   r-   zDep.get_numelc                 C   r#   r$   r%   r.   r%   r%   r(   numbytes_hint7   r-   zDep.numbytes_hintc                 C   r#   r$   r%   r.   r%   r%   r(   
numel_hint;   r-   zDep.numel_hintc                 C   r#   r$   r%   r.   r%   r%   r(   has_unbacked_symbols?   r-   zDep.has_unbacked_symbolsc                 C   r#   r$   r%   r.   r%   r%   r(   is_contiguousC   r-   zDep.is_contiguoustprefixc                 C   s   | S r$   r%   )r'   r5   r%   r%   r(   normalize_with_stride_orderG      zDep.normalize_with_stride_orderNFr4   )__name__
__module____qualname__str__annotations__sympyExprabcabstractmethodboolr   Symbolr)   dictr	   r,   r/   intr0   r1   r2   r3   r6   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< 	d5d	ed
eej fddZd
efddZed
efddZdd d
e
ee  fddZd
ejfddZd6ddZd7ded
d fddZed
eejejf fddZd6ddZd
ejfd d!Zd"eeef d
d fd#d$Zd
efd%d&Zd
efd'd(Zd
efd)d*Zd
efd+d,Zd8d.ed
efd/d0Z d
efd1d2Z!d
efd3d4Z"dS )9	MemoryDepr   r    .	var_namessizeNmodeFr!   r"   c                 C   s$   t | j|t | j|B t | j|B S r$   )r   r    rJ   rI   r&   r%   r%   r(   r)   U   s   


zMemoryDep.get_free_symbol_usesc                 C   s<   d}| j d urd| j  }d| jd| j d| j | dS )N z, z
MemoryDep())rK   r   r    ranges)r'   
maybe_moder%   r%   r(   __repr__^   s   
"zMemoryDep.__repr__c                 C   s
   t | jS r$   )lenrI   r.   r%   r%   r(   num_varsd   s   
zMemoryDep.num_varsotherc                    s  | j |j ksJ | j t| jjkrdS |j t|jjkrdS tdd t| j|jD r/dS tj	j
| j| j}tj	j
|j|j}tt|t|ksWtt|t|krbtd| ||| dS t|t|krldS dd t|D   fdd|D }t|tt| j ksJ |S )	zD
        Can return None if not able to decide loop orders.
        Nc                 s   s     | ]}|d kp|dkV  qdS )r   r   Nr%   .0sr%   r%   r(   	<genexpr>}   s    z7MemoryDep.decide_loop_order_to_match.<locals>.<genexpr>zaunable to decide loop order. self_dep=%s v.s. other_dep=%s, self_strides=%s v.s. other_strides=%sc                 S   s   i | ]\}}||qS r%   r%   )rU   irV   r%   r%   r(   
<dictcomp>   s    z8MemoryDep.decide_loop_order_to_match.<locals>.<dictcomp>c                    s   g | ]} | qS r%   r%   rT   stride_to_indexr%   r(   
<listcomp>       z8MemoryDep.decide_loop_order_to_match.<locals>.<listcomp>)rR   rQ   r    r   any	itertoolschainrJ   r   graphsizevarsstride_hintsrI   r   logdebug	enumeraterange)r'   rS   self_stridesother_stridesorderr%   rZ   r(   decide_loop_order_to_matchh   s8   
z$MemoryDep.decide_loop_order_to_matchc                 C   s   t | jt| jdS )zF
        Return the offset by setting every variable to be 0.
        r   )r   r    rE   fromkeysrI   r.   r%   r%   r(   
get_offset   s   zMemoryDep.get_offsetc                 C   s$   t | jgt| j| j| jR  S )z
        Normalize by merging loops. The different to normalize_with_stride_order is,
        this method does not reorder loops while normalize_with_stride_order reorder
        loops based on stride order.
        )rH   r   _RecordLoadStoreInner
_normalizer    rN   rK   r.   r%   r%   r(   	normalize   s   zMemoryDep.normalizer4   r5   c                    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%   rU   xadd_varr%   r(   r\      r]   z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)torch._inductorrq   r   ra   rb   rc   r    rI   sortedrg   rQ   __getitem__same_reorderrJ   _simplify_loopsr   var_builderrE   zipr   r?   expandrH   r   tuplekeysvalues)r'   r5   rq   stridesrj   stride_reordersizesrI   new_reordered_sizesnew_reordered_var_namesnew_simplified_sizesreindex_prune
var_rangesreplacement	new_indexoutr%   rw   r(   r6      s6   


	z%MemoryDep.normalize_with_stride_orderc                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})rE   r   rI   rJ   r.   r%   r%   r(   rN      s   zMemoryDep.rangesc                 C   s*   t | jtjj| j| j| j| j	| j
dS )N)r   r    rI   rJ   rK   )rH   r   r   ra   rb   simplify_with_rangesr    rN   rI   rJ   rK   r.   r%   r%   r(   r      s   zMemoryDep.simplify_with_rangesc                 C   sZ   |   rtj| j}|S t| jj}tj	j
}t| j| jD ]\}}||v r*|| }q|S r$   )is_indirectr   ra   r/   r   r   r    r   r?   SOner   rI   rJ   )r'   numelvarsvarrJ   r%   r%   r(   r/      s   zMemoryDep.get_numelr*   c                 C   s.   | j |v rt|| j  | j| j| j| jdS | S )N)rI   rJ   rK   )r   rH   r    rI   rJ   rK   r+   r%   r%   r(   r,      s   
zMemoryDep.renamec                 C   @   zt jjj|  ddtt j| j W S  ty   Y dS w Nr   )fallback	r   ra   rb   optimization_hintr/   r   	get_dtyper   NotImplementedErrorr.   r%   r%   r(   r0        zMemoryDep.numbytes_hintc                 C   .   zt jjj|  ddW S  ty   Y dS w r   r   ra   rb   r   r/   r   r.   r%   r%   r(   r1     
   zMemoryDep.numel_hintc                 C      t t|  dkS Nr   rQ   r   r/   r.   r%   r%   r(   r2        zMemoryDep.has_unbacked_symbolsc                 C   s,   t | jtjr	dS t | jtjo| j| jv S NT)
isinstancer    r?   IntegerrD   rI   r.   r%   r%   r(   r3     s   zMemoryDep.is_contiguousTresult_for_complex_expressionc                 C   s   t | jdkr	dS t| jtjr| jjn| jg}| jd }|D ]2}||kr( dS t|tjrQt |jdkrQ|jd |k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   Tr   r   F)
rQ   rI   r   r    r?   AddargsMulrF   r   )r'   r   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?   rD   rI   r   rF   r   r.   r%   r%   r(   	is_scalar6  s   zMemoryDep.is_scalarc                 C   s   t dd | jjD S )Nc                 s   s    | ]}t |jV  qd S r$   )r   r   rU   vr%   r%   r(   rW   <      z(MemoryDep.is_indirect.<locals>.<genexpr>)r^   r    r   r.   r%   r%   r(   r   ;  s   zMemoryDep.is_indirectr8   )r"   rH   r9   T)#r:   r;   r<   r=   r>   r?   r@   r   rD   rK   r   rC   r   r)   rP   propertyrF   rR   listrk   rm   rp   r6   rE   rN   r   r/   r,   r0   r1   r2   r3   r   r   r   r%   r%   r%   r(   rH   K   s>   
 

	9
,
	rH   c                   @   s   e Zd ZU eed< dZee ed< edej	fddZ
dej	fddZd	eeef dd fd
dZ	ddedeej fddZdefddZdefddZdefddZdefddZdefddZdefddZdS )StarDepr   NrK   r"   c                 C      t d)NzStarDep does not have an indexr   r.   r%   r%   r(   r    F     zStarDep.indexc                 C   s   t j| jS r$   )r   ra   r/   r   r.   r%   r%   r(   r/   K  s   zStarDep.get_numelr*   c                 C   s    | j |v rt|| j  | jS | S r$   )r   r   rK   r+   r%   r%   r(   r,   N  s   
zStarDep.renameFr!   c                 C      t  S r$   r   r&   r%   r%   r(   r)   S     zStarDep.get_free_symbol_usesc                 C   r   r   r   r.   r%   r%   r(   r0   X  r   zStarDep.numbytes_hintc                 C   r   r   r   r.   r%   r%   r(   r1   `  r   zStarDep.numel_hintc                 C   r   r   r   r.   r%   r%   r(   r2   f  r   zStarDep.has_unbacked_symbolsc                 C      dS NFr%   r.   r%   r%   r(   r3   i  r7   zStarDep.is_contiguousc                 C   r   r   r%   r.   r%   r%   r(   r   l  r7   zStarDep.is_scalarc                 C   r   r   r%   r.   r%   r%   r(   r   o  r7   zStarDep.is_indirectr8   )r:   r;   r<   r=   r>   rK   r   r   r?   r@   r    r/   rE   r,   rC   r   rD   r)   rF   r0   r1   r2   r3   r   r   r%   r%   r%   r(   r   ?  s&   
 
r   c                   @   s   e Zd ZU eed< eed< dZeed< 	ddedeej	 fddZ
edejfd	d
ZdejfddZdeeef dd fddZdefddZdefddZdefddZdefddZdS )WeakDepr   mutating_bufFis_faker!   r"   c                 C   r   r$   r   r&   r%   r%   r(   r)     r   zWeakDep.get_free_symbol_usesc                 C   r   )NzWeakDep does not have an indexr   r.   r%   r%   r(   r      r   zWeakDep.indexc                 C   s   t jjS r$   )r?   r   r   r.   r%   r%   r(   r/     s   zWeakDep.get_numelr*   c                 C   s$   | j |v rt|| j  | j| jS | S r$   )r   r   r   r   r+   r%   r%   r(   r,     s   
zWeakDep.renamec                 C   r   Nr   r%   r.   r%   r%   r(   r0     r7   zWeakDep.numbytes_hintc                 C   r   r   r%   r.   r%   r%   r(   r1     r7   zWeakDep.numel_hintc                 C   r   r   r%   r.   r%   r%   r(   r2     r7   zWeakDep.has_unbacked_symbolsc                 C   r   r   r%   r.   r%   r%   r(   r3     r7   zWeakDep.is_contiguousNr8   )r:   r;   r<   r=   r>   r   rC   r   r?   rD   r)   r   r@   r    r/   rE   r,   rF   r0   r1   r2   r3   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    .rI   rJ   N)r:   r;   r<   r?   r@   r>   r   rD   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< deeef dd fd	d
Zdeeee f dd fddZd!ddZede	d  dd fddZdee dd fddZdee fddZd"dedee fddZ	d#dedee
j fdd ZdS )$
ReadWritesreadswritesindex_exprsN
range_varsr   r*   r"   c                    s>   t t fdd| jD t fdd| jD | j| j| jS )Nc                 3       | ]}|  V  qd S r$   r,   rU   depr*   r%   r(   rW     r   z$ReadWrites.rename.<locals>.<genexpr>c                 3   r   r$   r   r   r   r%   r(   rW     r   )r   r   r   r   r   r   r   r+   r%   r   r(   r,     s   zReadWrites.renamer   c                 C   sJ   t |tttfs
J t |tst|g}tt| j|| j| j| j	| j
S r$   )r   r   r   r   r   unionr   r   r   r   r   )r'   r   r%   r%   r(   	with_read  s   

zReadWrites.with_readrS   c                 C   s@   t | j|j}t | j|j}t | j|j}t|| ||S r$   )r   r   r   r   r   r   )r'   rS   r   r   r   r%   r%   r(   merge  s   zReadWrites.mergeread_writesc                 C   sL   t jdd | D  }t jdd | D  | }t jdd | D  }t|||S )Nc                 S      g | ]}|j qS r%   )r   rU   rwr%   r%   r(   r\         z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   r   r%   )r   r   r%   r%   r(   r\     r   c                 S   r   r%   )r   r   r%   r%   r(   r\     r   )r   r   r   )r   
all_writes	all_readsall_index_exprsr%   r%   r(   
merge_list  s   zReadWrites.merge_list	rem_readsc                 C   s   t | j| | j| j| j| jS r$   )r   r   r   r   r   r   )r'   r   r%   r%   r(   remove_reads  s   zReadWrites.remove_readsc                 C   s   t | j| jS r$   )r_   r`   r   r   r.   r%   r%   r(   reads_and_writes  s   zReadWrites.reads_and_writesTignore_integer_indexc                 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.
        )
r   r   r   rH   r    rF   r?   r   addr   )r'   r   namesr   r%   r%   r(   buffer_names  s   
zReadWrites.buffer_namesFr!   c                 C   s&   t  }|  D ]	}|||O }q|S r$   )r   r   r)   )r'   r!   resultr   r%   r%   r(   r)     s   zReadWrites.get_free_symbol_uses)rS   r   r"   r   r   r8   )r:   r;   r<   r   r   r>   r   r   r   r   r?   r@   r   r   rE   r=   r,   r   r   r   staticmethodr   r   r   r   rC   r   rD   r)   r%   r%   r%   r(   r     s(   
 	
	r   c                       s  e Zd Zdededdf fddZedeee	j
f dee	j
 d	ee	j
 ddfd
dZede	j
dedee	j
ee	jdf ee	j
df 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dfddZdededdfddZ	d(dede	j
dedee ddf
ddZdede	j
deddfddZde	j
deej ddfddZ		d)ded eee	j
e	j
e	j
f d!ed"ejd#ed$eeee	j
f  d%ee ddfd&d'Z  ZS )*rn   r   rp   r"   Nc                    s2   t    t | _t | _t | _|| _|| _d S r$   )super__init__r   _reads_writes_index_exprs_var_ranges_should_normalize)r'   r   rp   	__class__r%   r(   r     s   

z_RecordLoadStoreInner.__init__r    rI   r   c                 C   sV   t | tjsdS | j}|r%|d |vr)|  |  |r'|d |vsdS dS dS dS )zz
        Reduction has last (reduced) dim in its sizes, but
        downstream users won't.  Normalize this away.
        Nr   )r   r?   r@   r   pop)r    rI   r   r   r%   r%   r(   drop_unused_symbols  s   
 z)_RecordLoadStoreInner.drop_unused_symbols.c           
         s   g |  }t| }tjj||t|g||\}}}tt	 \} t
t|| fdd|D }	tt||	}g |  }g |}| ||| |t|t|fS )Nc                    rt   r%   r%   ru   rw   r%   r(   r\   *  r]   z4_RecordLoadStoreInner._normalize.<locals>.<listcomp>)r   r   r   r   ra   rb   r}   r   r~   canonicalization_prefixrE   r   r   r?   r   r   )
clsr    r   
index_varsr   	new_sizesr   r   new_varsr   r%   rw   r(   ro     s   
 z _RecordLoadStoreInner._normalizec                 C   s   | j s1dd | j D }dd t| j |D }dd |D }| ||| |t|t|fS dd | j D }| ||S )Nc                 S   s   g | ]	}t jj|qS r%   r   ra   rb   simplifyru   r%   r%   r(   r\   6      z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 S   s   g | ]
\}}|d kr|qS r   r%   rU   kr   r%   r%   r(   r\   7      c                 S   s   g | ]}|d kr|qS r   r%   r   r%   r%   r(   r\   8  s    c                 S   s    i | ]\}}|t jj|qS r%   r   r   r%   r%   r(   rY   =  s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>)	r   r   r   r   r   r   r   itemsro   )r'   r    r   rI   r   r%   r%   r(   canonicalize2  s   z"_RecordLoadStoreInner.canonicalizer   c                 C   s"   | j t|g| |R   d S r$   )r   r   rH   r   r'   r   r    r%   r%   r(   loadE  s   "z_RecordLoadStoreInner.loadc                 C   s$   t |tsJ | |t| d S r$   )r   rF   r   r?   r   r   r%   r%   r(   	load_seedH  s   z_RecordLoadStoreInner.load_seedvaluerK   c                 C   s(   | j t|g| |R d|i d S )NrK   )r   r   rH   r   )r'   r   r    r  rK   r%   r%   r(   storeL  s   (z_RecordLoadStoreInner.storec                 C   s   |  ||d| d d S )Nzstore_reduction(rM   )r  )r'   r   r    r  r%   r%   r(   store_reductionQ     z%_RecordLoadStoreInner.store_reductiondtypec                 C   s   | j t| |  d S r$   )r   r   r   r   )r'   r    r  r%   r%   r(   
index_exprT  r  z _RecordLoadStoreInner.index_exprr   
boundariesboundary_indicesindexing_dtyperightsortersorter_indicesc                 C   s8   | j t|d  |dur| j t|d  dS dS )z?Records the names of the buffers that bucketize will read from.r   N)r   r   r   )r'   r   r  r  r	  r
  r  r  r%   r%   r(   	bucketizeW  s   z_RecordLoadStoreInner.bucketizer$   NN)r:   r;   r<   r   rC   r   r   r   rF   r?   r@   r   r   classmethodr   rD   ro   r   r=   r   r   r   r  r  torchr  r  r   r  __classcell__r%   r%   r   r(   rn     sx    ""


	rn   c                       s*   e Zd Zdededdf fddZ  ZS )RecordLoadStorer   rp   r"   Nc                    s   t ||d}t j|d d S )Nr   rp   )parent_handler)rn   r   r   )r'   r   rp   r  r   r%   r(   r   h  s   zRecordLoadStore.__init__)r:   r;   r<   r   rC   r   r  r%   r%   r   r(   r  g  s    "r  r5   r"   c                    s2   t   i dtjdtjf fdd}|fS )Nlengthr"   c                    s    t  t  }| |< |S r$   )r   next)r  r   cntr5   r   r%   r(   rx   t  s   zvar_builder.<locals>.add_var)r_   countr?   r@   rD   )r5   rx   r%   r  r(   r~   p  s   r~   argsizesc                    s&   t | \}  fdd|D }||fS )Nc                    s   g | ]	}t t |qS r%   )r   map)rU   rJ   rw   r%   r(   r\     r   z)index_vars_no_squeeze.<locals>.<listcomp>)r~   )r5   r  r   r   r%   rw   r(   index_vars_no_squeeze|  s   r  d)r5   c           
      G   sb   ddl m} t| \}}g }g }|D ]}||\}}	|| ||	tt|| q||fS )Nr   )SqueezeView)rq   r  r~   squeezerappendr   r  )
r5   r  r  r   rx   r   r   rJ   new_sizer   r%   r%   r(   index_vars_squeeze  s   
r"  Fr%   )rp   r5   hidden_argsfn.rp   r#  c                G   s   t |d|i\}}ddlm} t| |r t| g ||||}n't||d}	t|	 | g ||R   W d    n1 s?w   Y  |	j}|rLg }
ng t	j
|}
tt|jt|j|j|
|S )Nr5   r   )LoopBody)rp   )r"  	loop_bodyr%  r   extract_loop_body_with_argsr  r   set_ops_handlerr  r_   r`   from_iterabler   r   r   r   r   )r$  rp   r5   r#  r  r   r   r%  innerr   r   r%   r%   r(   extract_read_writes  s0   

r+  r   r   c                    sL  ddl m} t||d}| |}| jr)dd t| jD   fdd| D }| j|j D ]}|	|j
||j  q/| j|j D ]}||j
t||j  qB| j|j D ]}||j
||j d |j qW| j|j D ]}||j
||j d  qm| j|j D ]}|||j d  q| j|j D ]}|d |j
d d d fd d d  q|S )Nr   )MemoryUsageTyper  c                 S   s   i | ]\}}|t tj|qS r%   )r   r   TMP)rU   rX   r   r%   r%   r(   rY     s    z/extract_loop_body_with_args.<locals>.<dictcomp>c                    s   i | ]
\}}|t | qS r%   )r   r   replr%   r(   rY     r   )r&  r,  rn   indexing_from_argsindirect_varsrf   r   memory_usageLOADr   buffer_name
index_name	LOAD_SEEDr   rF   STOREr  rK   STORE_REDUCTIONr  
INDEX_EXPRr  	BUCKETIZEr  )r$  r   r   rp   r,  r*  name_to_indexentryr%   r.  r(   r'    sD   
r'  
input_nodeztorch._inductor.ir.IRNodec                 C   s  ddl m}m}m} t|  |r)g |  }g |  }t|dkr'||fS dS t| j	j	|s2dS | 
 }d}d}|du rt|dkrt }g }|D ]g}	t|	tsSqK|	j|v rYqK||	j tj|	j}
|
du rkqK|
 }|du sxt||ryqKt||rt| dkr|du rg | }g | }qK|g | ks|g | kr dS qK||
  qK||kr||fS t|}|du rt|dksD||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ExternKernelLoopsr   r  N)rq   r>  r?  r@  r   get_defining_opget_sizeget_reduction_sizerQ   data	get_readsr   rH   r   r   r   ra   try_get_bufferextend)r=  r>  r?  r@  rJ   reduction_sizer   seen	new_readsreadbufferopr%   r%   r(   #extract_input_node_reduction_ranges  sT   


rN  c                   C   r   )Ncr%   r%   r%   r%   r(   r   0  r7   r   c                   @   sD  e Zd ZU eej ed< d,deddfddZde	d	e
ed
f dee	ef defddZ		d-dedeeejf dededejf
ddZdede
d fddZdededee de
d fddZdedee dedede
d f
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'ed(ed
ef d)eddfd*d+ZdS ).FreeSymbolsOpsHandlersymbolsTr!   r"   Nc                 C   s    t  | _|rt| _d S t| _d S r$   )r   rQ  r   r   get_symbolsr&   r%   r%   r(   r   8  s   zFreeSymbolsOpsHandler.__init__r   r   .kwargsc                 C   sD   t || D ]}t|tjtjjjfr|  j	| 
|O  _	qd S r$   )r_   r`   r   r   r?   r@   logicboolalgBooleanrQ  rR  )r'   r   r   rS  ar%   r%   r(   _default<  s
   zFreeSymbolsOpsHandler._default	index_varrJ   checkwrap_negc                 C   sB   t |tjtjjjfrJ |  j| |O  _tdt	| dS )N(rM   )
r   r?   r@   rT  rU  rV  rQ  rR  r   r=   )r'   rY  rJ   rZ  r[  r%   r%   r(   indirect_indexingA  s   z'FreeSymbolsOpsHandler.indirect_indexingrv   )N.c                 C   r   )Nr  r%   )r'   rv   r%   r%   r(   frexpL  r7   zFreeSymbolsOpsHandler.frexpdtypes
combine_fnr   c                 C   s   dt | S Nr$   rQ   )r'   r_  r`  r   r%   r%   r(   scanO     zFreeSymbolsOpsHandler.scanstable
descendingc                 C   s   dt | S ra  rb  )r'   r_  r   re  rf  r%   r%   r(   sortT  rd  zFreeSymbolsOpsHandler.sortr  	src_dtypereduction_typer  c                 C   s   t |}|dkrd| S d S )Nr   r$   )r   )r'   r  rh  ri  r  
num_valuesr%   r%   r(   	reductionY  s   zFreeSymbolsOpsHandler.reductionmaskbodyrS   c                 C   s   t |sJ d|  d S )Nz$masked body must always be callable.)callable)r'   rl  rm  rS   r%   r%   r(   maskedc  s   
zFreeSymbolsOpsHandler.maskedr   )TT)r:   r;   r<   r   r?   rD   r>   rC   r   r=   r   r   rE   rX  r   rF   r@   r]  r^  r   rc  rg  r  r  r   rk  r   ro  r%   r%   r%   r(   rP  5  sd   
 *	



&
rP  r    rindexr!   c              	   C   s   ddl m} |d ur||gn|g}t|}t|. t|dd | |  W d    n1 s1w   Y  W d    |jS W d    |jS 1 sKw   Y  |jS )Nr   )FlexibleLayoutallow_indexingT)rq   rq  rP  r   r(  r
   objectrQ  )r$  r    rp  r!   rq  r   handlerr%   r%   r(   extract_free_symbolsi  s   
(ru  r8   r   )MrA   dataclassesr_   loggingrecollections.abcr   r   r   typingr   r   r   r   typing_extensionsr	   unittest.mockr
   r?   r  torch._inductor.utilsr   %torch.fx.experimental.symbolic_shapesr   r   torch.utils._ordered_setr   utils._sympy.symbolr   r   codegen.commonr   ops_handlerr   utilsr   r   r   r   r   virtualizedr   r   r   	getLoggerr:   rd   compilesearchr   ABCr   	dataclassrH   r   r   r   r   MockHandlerrn   KernelFormatterHandlerr  r=   r   r@   rD   r~   r   r  r"  rC   r+  r'  rN  r   rP  ru  r%   r%   r%   r(   <module>   s    

& 
t
;
,Mj(	
	


.
0
C7
