o
    Zhls                     @   sH  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 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-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=eAeAej>  e%f fd,d-ZCd.d*d/d0d1e
d2e	f d'eej> d3eDd#e<d4eeAej>  d$e7fd5d6ZE	.dGd1e	d7eAeAej>  d8e%d3eDd$e9f
d9d:ZFd;d<d$e=eeAej>  eeAej>  f fd=d>ZGd$e<fd?d@ZHG dAdB dBeZI	dHd1e
d2e	f dCeej> dDeeej>  d$eej? fdEdFZJdS )I    N)IterableSequence)AnyCallableOptionalTypeVarUnion)Self)patch)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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indexrenamesreturnc                 C      d S N selfr   r#   r#   K/var/www/auris/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_hint1   r(   zDep.numbytes_hintc                 C   r!   r"   r#   r)   r#   r#   r&   has_unbacked_symbols5   r(   zDep.has_unbacked_symbolsc                 C   r!   r"   r#   r)   r#   r#   r&   is_contiguous9   r(   zDep.is_contiguoustprefixc                 C   s   | S r"   r#   )r%   r/   r#   r#   r&   normalize_with_stride_order=      zDep.normalize_with_stride_orderNr.   )__name__
__module____qualname__str__annotations__sympyExprabcabstractmethoddictr	   r'   r*   intr+   boolr,   r-   r0   r#   r#   r#   r&   r   %   s   
 
r   T)frozenc                   @   sh  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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d/ddZd0dedd fddZedeejejf fddZd/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d1d(edefd)d*Zdefd+d,Zdefd-d.ZdS )2	MemoryDepr   r   .	var_namessizeNmoder    c                 C   s<   d}| j d urd| j  }d| jd| j d| j | dS )N , z
MemoryDep())rC   r   r   ranges)r%   Z
maybe_moder#   r#   r&   __repr__I   s   
"zMemoryDep.__repr__c                 C   s
   t | jS r"   )lenrA   r)   r#   r#   r&   num_varsO   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>h   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#   )rM   irN   r#   r#   r&   
<dictcomp>   s    z8MemoryDep.decide_loop_order_to_match.<locals>.<dictcomp>c                    s   g | ]} | qS r#   r#   rL   Zstride_to_indexr#   r&   
<listcomp>       z8MemoryDep.decide_loop_order_to_match.<locals>.<listcomp>r   )rJ   rI   r   free_symbolsany	itertoolschainrB   r   graphsizevarsstride_hintsrA   r   logdebug	enumeraterange)r%   rK   Zself_stridesZother_stridesorderr#   rR   r&   decide_loop_order_to_matchS   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   r<   fromkeysrA   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.
        )r@   r   _RecordLoadStoreInner
_normalizer   rG   rC   r)   r#   r#   r&   	normalize   s   zMemoryDep.normalizer.   r/   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#   rM   xadd_varr#   r&   rS      rT   z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)Ztorch._inductorrg   r   rY   rZ   r[   r   rA   sortedr_   rI   __getitem__Zsame_reorderrB   _simplify_loopsr   var_builderr<   zipr   r8   expandr@   r   tuplekeysvalues)r%   r/   rg   stridesr`   Zstride_reordersizesrA   Znew_reordered_sizesZnew_reordered_var_namesZnew_simplified_sizesreindex_prune
var_rangesreplacementZ	new_indexoutr#   rm   r&   r0      s6   


	z%MemoryDep.normalize_with_stride_orderc                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})r<   rs   rA   rB   r)   r#   r#   r&   rG      s   zMemoryDep.rangesc                 C   s*   t | jtjj| j| j| j| j	| j
dS )N)r   r   rA   rB   rC   )r@   r   r   rY   rZ   simplify_with_rangesr   rG   rA   rB   rC   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   rY   r*   r   r   r   rU   r8   SOners   rA   rB   )r%   ZnumelvarsvarrB   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)rA   rB   rC   )r   r@   r   rA   rB   rC   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   rY   rZ   Z	size_hintr*   r   Z	get_dtyper   NotImplementedErrorr)   r#   r#   r&   r+         zMemoryDep.numbytes_hintc                 C      t t|  dkS r   rI   r   r*   r)   r#   r#   r&   r,         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   r8   IntegerSymbolrA   r)   r#   r#   r&   r-      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)
rI   rA   r   r   r8   AddargsZMulr=   r   )r%   r   ZtermsZ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   r8   r   rA   r   r=   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   rM   vr#   r#   r&   rO   !      z(MemoryDep.is_indirect.<locals>.<genexpr>)rV   r   rU   r)   r#   r#   r&   r         zMemoryDep.is_indirect)r    r@   r2   T) r3   r4   r5   r6   r7   r8   r9   ru   r   rC   r   rH   propertyr=   rJ   listra   rc   rf   r0   r<   rG   r   r*   r'   r+   r>   r,   r-   r   r   r   r#   r#   r#   r&   r@   A   s0   
 
9
,
	r@   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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   NrC   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   rY   r*   r   r)   r#   r#   r&   r*   .  s   zStarDep.get_numelr   c                 C       | j |v rt|| j  | jS | S r"   )r   r   rC   r$   r#   r#   r&   r'   1     
zStarDep.renamec                 C   r   r   r   r)   r#   r#   r&   r+   6  r   zStarDep.numbytes_hintc                 C   r   r   r   r)   r#   r#   r&   r,   >  r   zStarDep.has_unbacked_symbolsc                 C      dS NFr#   r)   r#   r#   r&   r-   A  r1   zStarDep.is_contiguousc                 C   r   r   r#   r)   r#   r#   r&   r   D  r1   zStarDep.is_scalarc                 C   r   r   r#   r)   r#   r#   r&   r   G  r1   zStarDep.is_indirect)r3   r4   r5   r6   r7   rC   r   r   r8   r9   r   r*   r<   r'   r=   r+   r>   r,   r-   r   r   r#   r#   r#   r&   r   $  s   
 r   c                   @   s   e Zd ZU eed< 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efddZdefddZdefddZdS )WeakDepr   mutating_bufr    c                 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"   )r8   r   r   r)   r#   r#   r&   r*   ^  s   zWeakDep.get_numelr   c                 C   r   r"   )r   r   r   r$   r#   r#   r&   r'   a  r   zWeakDep.renamec                 C   r   )Nr   r#   r)   r#   r#   r&   r+   f  r1   zWeakDep.numbytes_hintc                 C   r   r   r#   r)   r#   r#   r&   r,   i  r1   zWeakDep.has_unbacked_symbolsc                 C   r   r   r#   r)   r#   r#   r&   r-   l  r1   zWeakDep.is_contiguousN)r3   r4   r5   r6   r7   r   r8   r9   r   r*   r<   r'   r=   r+   r>   r,   r-   r#   r#   r#   r&   r   S  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   .rA   rB   N)r3   r4   r5   r8   r9   r7   ru   r   r#   r#   r#   r&   r   p  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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'   rM   depr   r#   r&   rO     r   z$ReadWrites.rename.<locals>.<genexpr>c                 3   r   r"   r   r   r   r#   r&   rO     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_readrK   c                 C   s@   t | j|j}t | j|j}t | j|j}t|| ||S r"   )r   r   r   r   r   r   )r%   rK   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   rM   rwr#   r#   r&   rS         z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   r   r#   )r   r   r#   r#   r&   rS     r   c                 S   r   r#   )r   r   r#   r#   r&   rS     r   )r   r   r   )r   Z
all_writesZ	all_readsZ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"   )rW   rX   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   r@   r   r=   r8   r   addr   )r%   r   namesr   r#   r#   r&   buffer_names  s   
zReadWrites.buffer_names)rK   r   r    r   r   )r3   r4   r5   r   r   r7   r   r   r   r   r8   r9   r|   r   r<   r6   r'   r   r   r   staticmethodr   r   r   r   r>   r   r#   r#   r#   r&   r   w  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 )*rd   r|   rf   r    Nc                    s2   t    t | _t | _t | _|| _|| _d S r"   )super__init__r   _reads_writes_index_exprs_var_ranges_should_normalize)r%   r|   rf   	__class__r#   r&   r     s   

z_RecordLoadStoreInner.__init__r   rA   ry   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   r8   r9   rU   pop)r   rA   ry   rU   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                    rj   r#   r#   rk   rm   r#   r&   rS     rT   z4_RecordLoadStoreInner._normalize.<locals>.<listcomp>)rv   ru   rw   r   rY   rZ   rq   r   rr   canonicalization_prefixr<   rs   r   r8   rt   r   )
clsr   r|   Z
index_varsry   	new_sizesrz   r{   Znew_varsr}   r#   rm   r&   re     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   rY   rZ   simplifyrk   r#   r#   r&   rS         z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 S   s   g | ]
\}}|d kr|qS r   r#   rM   kr   r#   r#   r&   rS         c                 S   s   g | ]}|d kr|qS r   r#   r   r#   r#   r&   rS     s    c                 S   s    i | ]\}}|t jj|qS r#   r   r   r#   r#   r&   rQ     s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>)	r   r   rw   rs   rv   r   ru   itemsre   )r%   r   ry   rA   r|   r#   r#   r&   canonicalize  s   z"_RecordLoadStoreInner.canonicalizer   c                 C   s4   | j t|g| |R   d| dt| dS )Nzload(rE   rF   )r   r   r@   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   r8   r   r   r#   r#   r&   	load_seed  s   z_RecordLoadStoreInner.load_seedvaluerC   c              	   C   sF   | j t|g| |R d|i d| dt| d| d| d	S )NrC   zstore(rE   rF   )r   r   r@   r   r   )r%   r   r   r   rC   r#   r#   r&   store  s   $"z_RecordLoadStoreInner.storec                 C   s   |  ||d| dS )Nzstore_reduction(rF   )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(rE   rF   )r   r   r   r   r   )r%   r   r   r#   r#   r&   
index_expr  s   z _RecordLoadStoreInner.index_exprrw   
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%   rw   r   r   r   r   r   r   r#   r#   r&   	bucketize  s   z_RecordLoadStoreInner.bucketizer"   NN)r3   r4   r5   r   r>   r   r   r   r=   r8   r9   r   r   classmethodru   r   re   r   r6   r   r   r   r   r   torchr   r   r   r   __classcell__r#   r#   r   r&   rd     sx    ""

	rd   c                       s*   e Zd Zdededdf fddZ  ZS )RecordLoadStorer|   rf   r    Nc                    s   t ||d}t j|d d S )Nr|   rf   )parent_handler)rd   r   r   )r%   r|   rf   r   r   r#   r&   r   *  s   zRecordLoadStore.__init__)r3   r4   r5   r   r>   r   r   r#   r#   r   r&   r   )  s    "r   r/   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   Zcntr/   r|   r#   r&   rn   6  s   zvar_builder.<locals>.add_var)rW   countr8   r9   r   )r/   rn   r#   r   r&   rr   2  s   rr   argsizesc                    s&   t | \}  fdd|D }||fS )Nc                    s   g | ]	}t t |qS r#   )r   map)rM   rB   rm   r#   r&   rS   B  r   z)index_vars_no_squeeze.<locals>.<listcomp>)rr   )r/   r   r|   r   r#   rm   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)rg   r   rr   Zsqueezerappendr   r   )
r/   r   r   r|   rn   r   r   rB   new_sizerz   r#   r#   r&   index_vars_squeezeF  s   
r   Fr#   )rf   r/   hidden_argsfn.rf   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 )Nr/   r   )LoopBody)rf   )r   	loop_bodyr   r   extract_loop_body_with_argsr   r   set_ops_handlerr   rW   rX   from_iterabler   r   r   r   r   )r   rf   r/   r   r   r   r|   r   innerr   r   r#   r#   r&   extract_read_writesU  s*   
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)rM   rP   r   r#   r#   r&   rQ     s    z/extract_loop_body_with_args.<locals>.<dictcomp>c                    s   i | ]
\}}|t | qS r#   )r   r   replr#   r&   rQ     r   )r   r  rd   Zindexing_from_argsZindirect_varsr^   r   Zmemory_usageZLOADr   Zbuffer_nameZ
index_nameZ	LOAD_SEEDr   r=   ZSTOREr   rC   ZSTORE_REDUCTIONr   Z
INDEX_EXPRr   Z	BUCKETIZEr   )r   r   r|   rf   r  r  Zname_to_indexentryr#   r  r&   r  y  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)rg   r  r  r  r   Zget_defining_opget_sizeZget_reduction_sizerI   dataZ	get_readsr   r@   r   r   r   rY   Ztry_get_bufferextend)r  r  r  r  rB   Zreduction_sizer   seenZ	new_readsreadbufferopr#   r#   r&   #extract_input_node_reduction_ranges  sT   


r  c                   C   r   )Ncr#   r#   r#   r#   r&   r     r1   r   c                   @   s:  e Zd ZU eej ed< d+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 )-FreeUnbackedSymbolsOpsHandlersymbolsr    Nc                 C   s   t  | _d S r"   )r   r  r)   r#   r#   r&   r     s   z&FreeUnbackedSymbolsOpsHandler.__init__r   r   .kwargsc                 C   sB   t || D ]}t|tjtjjjfr|  j	t
|O  _	qd S r"   )rW   rX   rw   r   r8   r9   logicboolalgBooleanr  r   )r%   r   r   r  ar#   r#   r&   _default  s
   z&FreeUnbackedSymbolsOpsHandler._defaultT	index_varrB   checkwrap_negc                 C   s@   t |tjtjjjfrJ |  jt|O  _tdt	| dS )N(rF   )
r   r8   r9   r  r  r  r  r   r   r6   )r%   r   rB   r!  r"  r#   r#   r&   indirect_indexing  s   z/FreeUnbackedSymbolsOpsHandler.indirect_indexingrl   )N.c                 C   r   )Nr   r#   )r%   rl   r#   r#   r&   frexp  r1   z#FreeUnbackedSymbolsOpsHandler.frexpdtypes
combine_fnrw   c                 C   s   dt | S Nr"   rI   )r%   r&  r'  rw   r#   r#   r&   scan
     z"FreeUnbackedSymbolsOpsHandler.scanstable
descendingc                 C   s   dt | S r(  r)  )r%   r&  rw   r,  r-  r#   r#   r&   sort  r+  z"FreeUnbackedSymbolsOpsHandler.sortr   	src_dtypereduction_typer   c                 C   s   t |}|dkrd| S d S )Nr   r"   )r   )r%   r   r/  r0  r   Z
num_valuesr#   r#   r&   	reduction  s   z'FreeUnbackedSymbolsOpsHandler.reductionmaskbodyrK   c                 C   s   t |sJ d|  d S )Nz$masked body must always be callable.)callable)r%   r2  r3  rK   r#   r#   r&   masked  s   
z$FreeUnbackedSymbolsOpsHandler.masked)r    N)TT)r3   r4   r5   r   r8   r   r7   r   r6   ru   r   r<   r  r   r=   r9   r>   r$  r%  r   r*  r.  r   r   r   r1  r   r5  r#   r#   r#   r&   r    sd   
 
*	



&
r  r   rindexc              	   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   )FlexibleLayoutZallow_indexingT)rg   r7  r  r   r  r
   objectr  )r   r   r6  r7  r   handlerr#   r#   r&   extract_free_unbacked_symbols$  s   
(r:  )Fr"   )Kr:   dataclassesrW   loggingrecollections.abcr   r   typingr   r   r   r   r   Ztyping_extensionsr	   Zunittest.mockr
   r8   r   Z%torch.fx.experimental.symbolic_shapesr   Ztorch.utils._ordered_setr   Zutils._sympy.symbolr   r   Zcodegen.commonr   Zops_handlerr   utilsr   r   r   r   r   r   Zvirtualizedr   r   r   	getLoggerr3   r\   compilesearchr   ABCr   	dataclassr@   r   r   r   r   ZMockHandlerrd   ZKernelFormatterHandlerr   r6   ru   r9   r   rr   r   r   r   r>   r  r  r  r   r  r:  r#   r#   r#   r&   <module>   s     

 
c
.
Dm(	
	


(
0
C6
