o
    j9:j.~                     @   sb  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 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j.Z/G dd de j0Z1ej2ddG dd de1Z3ej2ddG dd de1Z4ej2ddG dd de1Z5ej2ddG dd dZ6ej2G dd dZ7G d d! d!e(j8Z9G d"d# d#e(j:Z;d$e<d%e=e%eej>gej?f f fd&d'Z@d(eej> d$e<d%e=eAeAej?  e%f fd)d*ZBd+d,d(eej> d$e<d%e=eAeej>  e%f fd-d.ZCd/d+d0d1d2ed3e
f d(eej> d4eDd$e<d5eeAej>  d%e7fd6d7ZE	/dKd2e
d8eAeAej>  d9e%d4eDd%e9f
d:d;ZFd<d=d%e=eAej> dB eAej> dB f fd>d?ZGd%e<fd@dAZHG dBdC dCeZI		dLd2ed3e
f dDeej> dEeej> dB dFeDd%eej? f
dGdHZJG dIdJ dJeZKdS )M    N)CallableIterableSequence)AnyTypeVar)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#   c/home/nk/hobo-godmode/plappi-mvp/.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%   r3   r#   r#   r&   normalize_with_stride_orderG      zDep.normalize_with_stride_orderNFr2   )__name__
__module____qualname__str__annotations__sympyExprabcabstractmethodboolr   Symbolr'   dictr   r*   r-   intr.   r/   r0   r1   r4   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dB 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 dB 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   rH   rG   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())rI   r   r   ranges)r%   
maybe_moder#   r#   r&   __repr__^   s   
"zMemoryDep.__repr__c                 C   s
   t | jS r"   )lenrG   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#   )rS   irT   r#   r#   r&   
<dictcomp>   s    z8MemoryDep.decide_loop_order_to_match.<locals>.<dictcomp>c                    s   g | ]} | qS r#   r#   rR   stride_to_indexr#   r&   
<listcomp>       z8MemoryDep.decide_loop_order_to_match.<locals>.<listcomp>)rP   rO   r   r
   any	itertoolschainrH   r   graphsizevarsstride_hintsrG   r   logdebug	enumeraterange)r%   rQ   self_stridesother_stridesorderr#   rX   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   rC   fromkeysrG   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.
        )rF   r   _RecordLoadStoreInner
_normalizer   rL   rI   r,   r#   r#   r&   	normalize   s   zMemoryDep.normalizer2   r3   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#   rS   xadd_varr#   r&   rZ      r[   z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)torch._inductorro   r   r_   r`   ra   r   rG   sortedre   rO   __getitem__same_reorderrH   _simplify_loopsr   var_builderrC   zipr   r=   expandrF   r   tuplekeysvalues)r%   r3   ro   stridesrh   stride_reordersizesrG   new_reordered_sizesnew_reordered_var_namesnew_simplified_sizesreindex_prune
var_rangesreplacement	new_indexoutr#   ru   r&   r4      s6   


	z%MemoryDep.normalize_with_stride_orderc                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})rC   r}   rG   rH   r,   r#   r#   r&   rL      s   zMemoryDep.rangesc                 C   s*   t | jtjj| j| j| j| j	| j
dS )N)r   r   rG   rH   rI   )rF   r   r   r_   r`   simplify_with_rangesr   rL   rG   rH   rI   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   r_   r-   r   r   r   r
   r=   SOner}   rG   rH   )r%   numelvarsvarrH   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)rG   rH   rI   )r   rF   r   rG   rH   rI   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   r_   r`   optimization_hintr-   r   	get_dtyper   NotImplementedErrorr,   r#   r#   r&   r.        zMemoryDep.numbytes_hintc                 C   .   zt jjj|  ddW S  ty   Y dS w r   r   r_   r`   r   r-   r   r,   r#   r#   r&   r/     
   zMemoryDep.numel_hintc                 C      t t|  dkS Nr   rO   r   r-   r,   r#   r#   r&   r0        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=   IntegerrB   rG   r,   r#   r#   r&   r1     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)
rO   rG   r   r   r=   AddargsMulrD   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=   rB   rG   r   rD   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   rS   vr#   r#   r&   rU   <      z(MemoryDep.is_indirect.<locals>.<genexpr>)r\   r   r
   r,   r#   r#   r&   r   ;  s   zMemoryDep.is_indirectr6   )r    rF   r7   T)"r8   r9   r:   r;   r<   r=   r>   r   rB   rI   rA   r   r'   rN   propertyrD   rP   listri   rk   rn   r4   rC   rL   r   r-   r*   r.   r/   r0   r1   r   r   r   r#   r#   r#   r&   rF   K   s>   
 

	9
,
	rF   c                   @   s   e Zd ZU eed< dZedB 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   NrI   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   r_   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   rI   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&   r.   X  r   zStarDep.numbytes_hintc                 C   r   r   r   r,   r#   r#   r&   r/   `  r   zStarDep.numel_hintc                 C   r   r   r   r,   r#   r#   r&   r0   f  r   zStarDep.has_unbacked_symbolsc                 C      dS NFr#   r,   r#   r#   r&   r1   i  r5   zStarDep.is_contiguousc                 C   r   r   r#   r,   r#   r#   r&   r   l  r5   zStarDep.is_scalarc                 C   r   r   r#   r,   r#   r#   r&   r   o  r5   zStarDep.is_indirectr6   )r8   r9   r:   r;   r<   rI   r   r=   r>   r   r-   rC   r*   rA   r   rB   r'   rD   r.   r/   r0   r1   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&   r.     r5   zWeakDep.numbytes_hintc                 C   r   r   r#   r,   r#   r#   r&   r/     r5   zWeakDep.numel_hintc                 C   r   r   r#   r,   r#   r#   r&   r0     r5   zWeakDep.has_unbacked_symbolsc                 C   r   r   r#   r,   r#   r#   r&   r1     r5   zWeakDep.is_contiguousNr6   )r8   r9   r:   r;   r<   r   rA   r   r=   rB   r'   r   r>   r   r-   rC   r*   rD   r.   r/   r0   r1   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   .rG   rH   N)r8   r9   r:   r=   r>   r<   r   rB   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	j
 dB ed< dZedB ed< deeef dd fd	d
Zdeee B 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*   rS   depr(   r#   r&   rU     r   z$ReadWrites.rename.<locals>.<genexpr>c                 3   r   r"   r   r   r   r#   r&   rU     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_readrQ   c                 C   s@   t | j|j}t | j|j}t | j|j}t|| ||S r"   )r   r   r   r   r   r   )r%   rQ   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   rS   rwr#   r#   r&   rZ         z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   r   r#   )r   r   r#   r#   r&   rZ     r   c                 S   r   r#   )r   r   r#   r#   r&   rZ     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   rF   r   rD   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)rQ   r   r    r   r   r6   )r8   r9   r:   r   r   r<   r   r   r   r=   r>   r   r   rC   r;   r*   r   r   staticmethodr   r   r   r   rA   r   rB   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j	B 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dB ddf
ddZdedej	deddfddZdej	dejdB 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j	f dB d%edB ddfd&d'Z  ZS )*rl   r   rn   r    Nc                    s2   t    t | _t | _t | _|| _|| _d S r"   )super__init__r   _reads_writes_index_exprs_var_ranges_should_normalize)r%   r   rn   	__class__r#   r&   r     s   

z_RecordLoadStoreInner.__init__r   rG   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   rG   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                    rr   r#   r#   rs   ru   r#   r&   rZ   *  r[   z4_RecordLoadStoreInner._normalize.<locals>.<listcomp>)r   r   r   r   r_   r`   r{   r   r|   canonicalization_prefixrC   r}   r   r=   r~   r   )
clsr   r   
index_varsr   	new_sizesr   r   new_varsr   r#   ru   r&   rm     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   r_   r`   simplifyrs   r#   r#   r&   rZ   6      z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 S   s   g | ]
\}}|d kr|qS r   r#   rS   kr   r#   r#   r&   rZ   7      c                 S   s   g | ]}|d kr|qS r   r#   r   r#   r#   r&   rZ   8  s    c                 S   s    i | ]\}}|t jj|qS r#   r   r   r#   r#   r&   rW   =  s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>)	r   r   r   r}   r   r   r   itemsrm   )r%   r   r   rG   r   r#   r#   r&   canonicalize2  s   z"_RecordLoadStoreInner.canonicalizer   c                 C   s"   | j t|g| |R   d S r"   )r   r   rF   r   r%   r   r   r#   r#   r&   loadE  s   "z_RecordLoadStoreInner.loadc                 C   s$   t |tsJ | |t| d S r"   )r   rD   r   r=   r   r   r#   r#   r&   	load_seedH  s   z_RecordLoadStoreInner.load_seedvaluerI   c                 C   s(   | j t|g| |R d|i d S )NrI   )r   r   rF   r   )r%   r   r   r   rI   r#   r#   r&   storeL  s   (z_RecordLoadStoreInner.storec                 C   s   |  ||d| d d S )Nzstore_reduction(rK   )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)r8   r9   r:   r   rA   r   r   rD   r=   r>   r   r   classmethodr   rB   rm   r   r;   r   r   r   r  torchr  r  r   r  __classcell__r#   r#   r   r&   rl     sx    ""


	rl   c                       s*   e Zd Zdededdf fddZ  ZS )RecordLoadStorer   rn   r    Nc                    s   t ||d}t j|d d S )Nr   rn   )parent_handler)rl   r   r   )r%   r   rn   r  r   r#   r&   r   h  s   zRecordLoadStore.__init__)r8   r9   r:   r   rA   r   r  r#   r#   r   r&   r  g  s    "r  r3   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   cntr3   r   r#   r&   rv   t  s   zvar_builder.<locals>.add_var)r]   countr=   r>   rB   )r3   rv   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)rS   rH   ru   r#   r&   rZ     r   z)index_vars_no_squeeze.<locals>.<listcomp>)r|   )r3   r  r   r   r#   ru   r&   index_vars_no_squeeze|  s   r  d)r3   c           
      G   sb   ddl m} t| \}}g }g }|D ]}||\}}	|| ||	tt|| q||fS )Nr   )SqueezeView)ro   r  r|   squeezerappendr   r  )
r3   r  r  r   rv   r   r   rH   new_sizer   r#   r#   r&   index_vars_squeeze  s   
r   Fr#   )rn   r3   hidden_argsfn.rn   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 )Nr3   r   )LoopBody)rn   )r   	loop_bodyr#  r   extract_loop_body_with_argsr  r   set_ops_handlerr  r]   r^   from_iterabler   r   r   r   r   )r"  rn   r3   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)rS   rV   r   r#   r#   r&   rW     s    z/extract_loop_body_with_args.<locals>.<dictcomp>c                    s   i | ]
\}}|t | qS r#   )r   r   replr#   r&   rW     r   )r$  r*  rl   indexing_from_argsindirect_varsrd   r   memory_usageLOADr   buffer_name
index_name	LOAD_SEEDr   rD   STOREr   rI   STORE_REDUCTIONr  
INDEX_EXPRr  	BUCKETIZEr  )r"  r   r   rn   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)ro   r<  r=  r>  r   get_defining_opget_sizeget_reduction_sizerO   data	get_readsr   rF   r   r   r   r_   try_get_bufferextend)r;  r<  r=  r>  rH   reduction_sizer   seen	new_readsreadbufferopr#   r#   r&   #extract_input_node_reduction_ranges  sT   


rL  c                   C   r   )Ncr#   r#   r#   r#   r&   r   0  r5   r   c                   @   s8  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jB 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$de
d B dde
d B 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   rO  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BooleanrO  rP  )r%   r   r   rQ  ar#   r#   r&   _default<  s
   zFreeSymbolsOpsHandler._default	index_varrH   checkwrap_negc                 C   sB   t |tjtjjjfrJ |  j| |O  _tdt	| dS )N(rK   )
r   r=   r>   rR  rS  rT  rO  rP  r   r;   )r%   rW  rH   rX  rY  r#   r#   r&   indirect_indexingA  s   z'FreeSymbolsOpsHandler.indirect_indexingrt   )N.c                 C   r   )Nr  r#   )r%   rt   r#   r#   r&   frexpL  r5   zFreeSymbolsOpsHandler.frexpdtypes
combine_fnr   c                 C   s   dt | S Nr"   rO   )r%   r]  r^  r   r#   r#   r&   scanO     zFreeSymbolsOpsHandler.scanstable
descendingc                 C   s   dt | S r_  r`  )r%   r]  r   rc  rd  r#   r#   r&   sortT  rb  zFreeSymbolsOpsHandler.sortr  	src_dtypereduction_typer   c                 C   s   t |}|dkrd| S d S )Nr   r"   )r   )r%   r  rf  rg  r   
num_valuesr#   r#   r&   	reductionY  s   zFreeSymbolsOpsHandler.reductionmaskbodyrQ   c                 C   s   t |sJ d|  d S )Nz$masked body must always be callable.)callable)r%   rj  rk  rQ   r#   r#   r&   maskedc  s   
zFreeSymbolsOpsHandler.maskedr   )TT)r8   r9   r:   r   r=   rB   r<   rA   r   r;   r   r   rC   rV  rD   r>   r[  r\  r   ra  re  r  r  r   ri  r   rm  r#   r#   r#   r&   rN  5  sd   
 *	





&
rN  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)ro   ro  rN  r   r&  r   objectrO  )r"  r   rn  r   ro  r   handlerr#   r#   r&   extract_free_symbolsi  s   
(rs  c                   @   sX   e Zd ZU ee ed< dej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S )SymbolUsageCollectorOpsHandlerusagessymbolr    Nc                 C   s   || _ t | _d S r"   )rv  r   ru  )r%   rv  r#   r#   r&   r     s   z'SymbolUsageCollectorOpsHandler.__init__r   r   .rQ  c                 C   s0   | j |v p| j | v }|r| j| d S d S r"   )rv  r   ru  r   )r%   r   r   rQ  	used_herer#   r#   r&   rV    s   z'SymbolUsageCollectorOpsHandler._default)r8   r9   r:   r   r;   r<   r=   rB   r   r   r   rC   rV  r#   r#   r#   r&   rt  }  s   
 .rt  r6   r   )Lr?   dataclassesr]   loggingrecollections.abcr   r   r   typingr   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   	getLoggerr8   rb   compilesearchr   ABCr   	dataclassrF   r   r   r   r   MockHandlerrl   KernelFormatterHandlerr  r;   r   r>   rB   r|   r   r  r   rA   r)  r%  rL  r   rN  rs  rt  r#   r#   r#   r&   <module>   s    

& 
t
;
,Mj(	
	


.
0
C7

