o
    iy                     @   s^  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 d dlm	Z	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'm(Z( ddl)m*Z*m+Z+ edZ,e-e.Z/e0dj1Z2G dd de j3Z4ej5ddG dd de4Z6ej5ddG dd de4Z7ej5ddG dd de4Z8ej5ddG dd dZ9ej5G dd dZ:G d d! d!e+j;Z<G d"d# d#e+j=Z>d$e?d%e@e(e
ejAgejBf f fd&d'ZCd(eejA d$e?d%e@eDeDejB  e(f fd)d*ZEd+d,d(eejA d$e?d%e@eDeejA  e(f fd-d.ZFd/d+d0d1d2e
d3e	f d(eejA d4eGd$e?d5eeDejA  d%e:fd6d7ZH	/dId2e	d8eDeDejA  d9e(d4eGd%e<f
d:d;ZId<d=d%e@eeDejA  eeDejA  f fd>d?ZJd%e?fd@dAZKG dBdC dCe!ZL		dJd2e
d3e	f dDeejA dEeeejA  dFeGd%eejB f
dGdHZMdS )K    N)IterableSequence)AnyCallable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_str
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ddedefddZdS )DepnameindexFunbacked_onlyreturnc                 C      d S N selfr"   r&   r&   Y/home/ubuntu/veenaModal/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)   rename0      z
Dep.renamec                 C   r$   r%   r&   r(   r&   r&   r)   	get_numel4   r.   zDep.get_numelc                 C   r$   r%   r&   r/   r&   r&   r)   numbytes_hint8   r.   zDep.numbytes_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_contiguous@   r.   zDep.is_contiguoustprefixc                 C   s   | S r%   r&   )r(   r5   r&   r&   r)   normalize_with_stride_orderD      zDep.normalize_with_stride_orderNFr4   )__name__
__module____qualname__str__annotations__sympyExprabcabstractmethodboolr   Symbolr*   dictr	   r-   r0   intr1   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< 	d3d	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d4ddZd5ded
d fddZed
eejejf fddZd4d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d6d,ed
efd-d.Zd
efd/d0Z d
efd1d2Z!dS )7	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*   P   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
MemoryDep())rK   r    r!   ranges)r(   
maybe_moder&   r&   r)   __repr__Y   s   
"zMemoryDep.__repr__c                 C   s
   t | jS r%   )lenrI   r/   r&   r&   r)   num_vars_   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d	| 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>x   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&   )rV   irW   r&   r&   r)   
<dictcomp>   s    z8MemoryDep.decide_loop_order_to_match.<locals>.<dictcomp>c                    s   g | ]} | qS r&   r&   rU   stride_to_indexr&   r)   
<listcomp>       z8MemoryDep.decide_loop_order_to_match.<locals>.<listcomp>r   )rS   rR   r!   r   any	itertoolschainrJ   r   graphsizevarsstride_hintsrI   r   logdebug	enumeraterange)r(   rT   self_stridesother_stridesorderr&   r[   r)   decide_loop_order_to_matchc   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!   rO   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&   rV   xadd_varr&   r)   r]      r^   z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)torch._inductorrr   r   rb   rc   rd   r!   rI   sortedrh   rR   __getitem__same_reorderrJ   _simplify_loopsr   var_builderrE   zipr   r?   expandrH   r    tuplekeysvalues)r(   r5   rr   stridesrk   stride_reordersizesrI   new_reordered_sizesnew_reordered_var_namesnew_simplified_sizesreindex_prune
var_rangesreplacement	new_indexoutr&   rx   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)   rO      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   rb   rc   simplify_with_rangesr!   rO   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   rb   r0   r    r   r!   r   r?   SOner   rI   rJ   )r(   numelvarsvarrJ   r&   r&   r)   r0      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|  tt j| j W S  ty   Y dS w Nr   	r   rb   rc   	size_hintr0   r   	get_dtyper    NotImplementedErrorr/   r&   r&   r)   r1         zMemoryDep.numbytes_hintc                 C      t t|  dkS r   rR   r   r0   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)
rR   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_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%   )r   r    rV   vr&   r&   r)   rX   1      z(MemoryDep.is_indirect.<locals>.<genexpr>)r_   r!   r   r/   r&   r&   r)   r   0     zMemoryDep.is_indirectr8   )r#   rH   r9   T)"r:   r;   r<   r=   r>   r?   r@   r   rD   rK   r   rC   r   r*   rQ   propertyrF   rS   listrl   rn   rq   r6   rE   rO   r   r0   r-   r1   r2   r3   r   r   r   r&   r&   r&   r)   rH   H   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S )StarDepr    NrK   r#   c                 C      t d)NzStarDep does not have an indexr   r/   r&   r&   r)   r!   :     zStarDep.indexc                 C   s   t j| jS r%   )r   rb   r0   r    r/   r&   r&   r)   r0   >  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-   A  s   
zStarDep.renameFr"   c                 C      t  S r%   r   r'   r&   r&   r)   r*   F     zStarDep.get_free_symbol_usesc                 C   r   r   r   r/   r&   r&   r)   r1   K  r   zStarDep.numbytes_hintc                 C   r   r   r   r/   r&   r&   r)   r2   S  r   zStarDep.has_unbacked_symbolsc                 C      dS NFr&   r/   r&   r&   r)   r3   V  r7   zStarDep.is_contiguousc                 C   r   r   r&   r/   r&   r&   r)   r   Y  r7   zStarDep.is_scalarc                 C   r   r   r&   r/   r&   r&   r)   r   \  r7   zStarDep.is_indirectr8   )r:   r;   r<   r=   r>   rK   r   r   r?   r@   r!   r0   rE   r-   rC   r   rD   r*   rF   r1   r2   r3   r   r   r&   r&   r&   r)   r   4  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S )WeakDepr    mutating_bufFis_faker"   r#   c                 C   r   r%   r   r'   r&   r&   r)   r*   u  r   zWeakDep.get_free_symbol_usesc                 C   r   )NzWeakDep does not have an indexr   r/   r&   r&   r)   r!   z  r   zWeakDep.indexc                 C   s   t jjS r%   )r?   r   r   r/   r&   r&   r)   r0   ~  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)   r1     r7   zWeakDep.numbytes_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!   r0   rE   r-   rF   r1   r2   r3   r&   r&   r&   r)   r   h  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-   rV   depr+   r&   r)   rX     r   z$ReadWrites.rename.<locals>.<genexpr>c                 3   r   r%   r   r   r   r&   r)   rX     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_readrT   c                 C   s@   t | j|j}t | j|j}t | j|j}t|| ||S r%   )r   r   r   r   r   r   )r(   rT   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   rV   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`   ra   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)rT   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efddZdededefddZ	d(dede	j
dedee def
ddZdede	j
dedefddZde	j
deej de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 )*ro   r   rq   r#   Nc                    s2   t    t | _t | _t | _|| _|| _d S r%   )super__init__r   _reads_writes_index_exprs_var_ranges_should_normalize)r(   r   rq   	__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                    ru   r&   r&   rv   rx   r&   r)   r]     r^   z4_RecordLoadStoreInner._normalize.<locals>.<listcomp>)r   r   r   r   rb   rc   r~   r   r   canonicalization_prefixrE   r   r   r?   r   r   )
clsr!   r   
index_varsr   	new_sizesr   r   new_varsr   r&   rx   r)   rp      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   rb   rc   simplifyrv   r&   r&   r)   r]         z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 S   s   g | ]
\}}|d kr|qS r   r&   rV   kr   r&   r&   r)   r]         c                 S   s   g | ]}|d kr|qS r   r&   r   r&   r&   r)   r]      s    c                 S   s    i | ]\}}|t jj|qS r&   r   r   r&   r&   r)   rZ   %  s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>)	r   r   r   r   r   r   r   itemsrp   )r(   r!   r   rI   r   r&   r&   r)   canonicalize  s   z"_RecordLoadStoreInner.canonicalizer    c                 C   s4   | j t|g| |R   d| dt| dS )Nzload(rM   rN   )r   r   rH   r   r   r(   r    r!   r&   r&   r)   load-  s   z_RecordLoadStoreInner.loadc                 C   s    t |tsJ | |t|S r%   )r   rF   r   r?   r   r   r&   r&   r)   	load_seed1  s   z_RecordLoadStoreInner.load_seedvaluerK   c              	   C   sF   | j t|g| |R d|i d| dt| d| d| d	S )NrK   zstore(rM   rN   )r   r   rH   r   r   )r(   r    r!   r   rK   r&   r&   r)   store5  s   $"z_RecordLoadStoreInner.storec                 C   s   |  ||d| dS )Nzstore_reduction(rN   )r   )r(   r    r!   r   r&   r&   r)   store_reduction;  r   z%_RecordLoadStoreInner.store_reductiondtypec                 C   s,   | j t| |  dt| d| dS )Nzindex_expr(rM   rN   )r   r   r   r   r   )r(   r!   r   r&   r&   r)   
index_expr>  s   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)   	bucketizeB  s   z_RecordLoadStoreInner.bucketizer%   NN)r:   r;   r<   r   rC   r   r   r   rF   r?   r@   r   r   classmethodr   rD   rp   r   r=   r   r   r   r   r   torchr   r  r   r  __classcell__r&   r&   r   r)   ro     sx    ""

	ro   c                       s*   e Zd Zdededdf fddZ  ZS )RecordLoadStorer   rq   r#   Nc                    s   t ||d}t j|d d S )Nr   rq   )parent_handler)ro   r   r   )r(   r   rq   r  r   r&   r)   r   S  s   zRecordLoadStore.__init__)r:   r;   r<   r   rC   r   r  r&   r&   r   r)   r  R  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)   ry   _  s   zvar_builder.<locals>.add_var)r`   countr?   r@   rD   )r5   ry   r&   r  r)   r   [  s   r   argsizesc                    s&   t | \}  fdd|D }||fS )Nc                    s   g | ]	}t t |qS r&   )r   map)rV   rJ   rx   r&   r)   r]   k  r   z)index_vars_no_squeeze.<locals>.<listcomp>)r   )r5   r  r   r   r&   rx   r)   index_vars_no_squeezeg  s   r  d)r5   c           
      G   sb   ddl m} t| \}}g }g }|D ]}||\}}	|| ||	tt|| q||fS )Nr   )SqueezeView)rr   r  r   squeezerappendr   r  )
r5   r  r  r   ry   r   r   rJ   new_sizer   r&   r&   r)   index_vars_squeezeo  s   
r  Fr&   )rq   r5   hidden_argsfn.rq   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)rq   )r  	loop_bodyr   r   extract_loop_body_with_argsr  r   set_ops_handlerr  r`   ra   from_iterabler   r   r   r   r   )r  rq   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)rV   rY   r   r&   r&   r)   rZ     s    z/extract_loop_body_with_args.<locals>.<dictcomp>c                    s   i | ]
\}}|t | qS r&   )r   r   replr&   r)   rZ     r   )r!  r'  ro   indexing_from_argsindirect_varsrg   r   memory_usageLOADr   buffer_name
index_name	LOAD_SEEDr   rF   STOREr   rK   STORE_REDUCTIONr   
INDEX_EXPRr  	BUCKETIZEr  )r  r   r   rq   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)rr   r9  r:  r;  r   get_defining_opget_sizeget_reduction_sizerR   data	get_readsr   rH   r    r   r   rb   try_get_bufferextend)r8  r9  r:  r;  rJ   reduction_sizer   seen	new_readsreadbufferopr&   r&   r)   #extract_input_node_reduction_ranges  sT   


rI  c                   C   r   )Ncr&   r&   r&   r&   r)   r     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   rL  r   r   get_symbolsr'   r&   r&   r)   r      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`   ra   r   r   r?   r@   logicboolalgBooleanrL  rM  )r(   r    r   rN  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(rN   )
r   r?   r@   rO  rP  rQ  rL  rM  r   r=   )r(   rT  rJ   rU  rV  r&   r&   r)   indirect_indexing)  s   z'FreeSymbolsOpsHandler.indirect_indexingrw   )N.c                 C   r   )Nr	  r&   )r(   rw   r&   r&   r)   frexp4  r7   zFreeSymbolsOpsHandler.frexpdtypes
combine_fnr   c                 C   s   dt | S Nr%   rR   )r(   rZ  r[  r   r&   r&   r)   scan7     zFreeSymbolsOpsHandler.scanstable
descendingc                 C   s   dt | S r\  r]  )r(   rZ  r   r`  ra  r&   r&   r)   sort<  r_  zFreeSymbolsOpsHandler.sortr   	src_dtypereduction_typer   c                 C   s   t |}|dkrd| S d S )Nr   r%   )r   )r(   r   rc  rd  r   
num_valuesr&   r&   r)   	reductionA  s   zFreeSymbolsOpsHandler.reductionmaskbodyrT   c                 C   s   t |sJ d|  d S )Nz$masked body must always be callable.)callable)r(   rg  rh  rT   r&   r&   r)   maskedK  s   
zFreeSymbolsOpsHandler.maskedr   )TT)r:   r;   r<   r   r?   rD   r>   rC   r   r=   r   r   rE   rS  r   rF   r@   rX  rY  r   r^  rb  r  r   r   rf  r   rj  r&   r&   r&   r)   rK    sd   
 *	



&
rK  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)rr   rl  rK  r   r#  r
   objectrL  )r  r!   rk  r"   rl  r   handlerr&   r&   r)   extract_free_symbolsQ  s   
(rp  r8   r   )NrA   dataclassesr`   loggingrecollections.abcr   r   typingr   r   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   r   virtualizedr   r   r   	getLoggerr:   re   compilesearchr   ABCr   	dataclassrH   r   r   r   r   MockHandlerro   KernelFormatterHandlerr  r=   r   r@   rD   r   r   r  r  rC   r&  r"  rI  r   rK  rp  r&   r&   r&   r)   <module>   s     

" 
l
3
'Mm(	
	


+
0
C7
