o
    ߗin                  	   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlZd dlZd dlmZ d dlmZ ddlmZmZ dd	lmZ dd
lmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z' edZ(e)e*Z+e,dj-Z.G dd de j/Z0ej1ddG dd de0Z2ej1ddG dd de0Z3ej1ddG dd de0Z4ej1ddG dd dZ5ej1G dd dZ6G dd de'j7Z8G dd de'j9Z:d e;d!ee#eej<gej=f f fd"d#Z>d$eej< d e;fd%d&Z?d'd(d$eej< d e;fd)d*Z@d+d'd,d-d.ed/ef d$eej< d0eAd e;fd1d2ZBdBd3d4ZCd5d6d!ee
e	ej<  e
e	ej<  f fd7d8ZDd9d: ZEG d;d< d<ZFd=eFd!e%d fd>d?ZGdCd.ed/ef fd@dAZHdS )D    N)
AnyCallableDictListOptionalSequenceSetTupleTypeVarUnion)patch)free_unbacked_symbols)
OrderedSet   )make_symbolSymT   )index_prevent_reordering)get_dtype_sizereduction_num_outputssympy_index_symbol	sympy_str
sympy_subs	VarRanges)
OpsHandler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d fddZ
ejdejfddZejd	d
 ZejdefddZejdefddZdddZdS )Depnameindexrenamesreturnc                 C      d S N selfr!   r%   r%   Z/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_inductor/dependencies.pyrename3      z
Dep.renamec                 C   r#   r$   r%   r'   r%   r%   r(   	get_numel7   r*   zDep.get_numelc                 C   r#   r$   r%   r+   r%   r%   r(   numbytes_hint;   r*   zDep.numbytes_hintc                 C   r#   r$   r%   r+   r%   r%   r(   has_unbacked_symbols?   r*   zDep.has_unbacked_symbolsc                 C   r#   r$   r%   r+   r%   r%   r(   is_contiguousC   r*   zDep.is_contiguoustc                 C      | S r$   r%   )r'   prefixr%   r%   r(   normalize_with_stride_orderG      zDep.normalize_with_stride_orderNr0   )__name__
__module____qualname__str__annotations__sympyExprabcabstractmethodr   r)   r,   r-   boolr.   r/   r3   r%   r%   r%   r(   r   /   s   
 

r   T)frozenc                   @   s2  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d Zdd Zdd Zd,ddZd-ddZedeejejf fddZ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!d" Zdefd#d$Zd.defd&d'Zdefd(d)Zdefd*d+ZdS )/	MemoryDepr   r    .	var_namessizeNmoder"   c                 C   s<   d}| j d urd| j  }d| jd| j d| j | dS )N , z
MemoryDep())rD   r   r    ranges)r'   
maybe_moder%   r%   r(   __repr__S   s   
"zMemoryDep.__repr__c                 C   s
   t | jS r$   )lenrB   r+   r%   r%   r(   num_varsY   s   
zMemoryDep.num_varsc                    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>r   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%   )rN   irO   r%   r%   r(   
<dictcomp>   s    z8MemoryDep.decide_loop_order_to_match.<locals>.<dictcomp>c                    s   g | ]} | qS r%   r%   rM   stride_to_indexr%   r(   
<listcomp>       z8MemoryDep.decide_loop_order_to_match.<locals>.<listcomp>r   )rL   rK   r    free_symbolsany	itertoolschainrC   r   graphsizevarsstride_hintsrB   setlogdebug	enumeraterange)r'   otherself_stridesother_stridesorderr%   rS   r(   decide_loop_order_to_match]   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    dictfromkeysrB   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.
        )rA   r   _RecordLoadStoreInner
_normalizer    rH   rD   r+   r%   r%   r(   	normalize   s   zMemoryDep.normalizer0   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%   rN   xadd_varr%   r(   rU      rV   z9MemoryDep.normalize_with_stride_order.<locals>.<listcomp>)torch._inductorrn   r   r[   r\   r]   r    rB   sortedrb   rK   __getitem__same_reorderrC   _simplify_loopsr   var_builderrh   zipr   r;   expandrA   r   tuplekeysvalues)r'   r2   rn   stridesrf   stride_reordersizesrB   new_reordered_sizesnew_reordered_var_namesnew_simplified_sizesreindexprune
var_rangesreplacement	new_indexoutr%   rt   r(   r3      s2   


	 z%MemoryDep.normalize_with_stride_orderc                 C   s   t t| j| jS )z{c0: 128, c1: 512, ...})rh   r|   rB   rC   r+   r%   r%   r(   rH      s   zMemoryDep.rangesc                 C   s*   t | jtjj| j| j| j| j	| j
dS )N)r   r    rB   rC   rD   )rA   r   r   r[   r\   simplify_with_rangesr    rH   rB   rC   rD   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    rW   r;   SOner|   rB   rC   )r'   numelvarsvarrC   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)rB   rC   rD   )r   rA   r    rB   rC   rD   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   r[   r\   	size_hintr,   r   	get_dtyper   NotImplementedErrorr+   r%   r%   r(   r-         zMemoryDep.numbytes_hintc                 C      t t|  dkS r   rK   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    r;   IntegerSymbolrB   r+   r%   r%   r(   r/     s   zMemoryDep.is_contiguousTc                 C   s   t | jdkr	dS t| jtjr| jjn| jg}| jd }|D ]2}||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)
rK   rB   r   r    r;   AddargsMulintr   )r'   result_for_complex_expressiontermslast_symtermr%   r%   r(   stride1_for_last_dim  s"   

zMemoryDep.stride1_for_last_dimc                 C   s6   t | jtjr| j| jvo|   S t | jttjfS r$   )r   r    r;   r   rB   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   rN   vr%   r%   r(   rP   )      z(MemoryDep.is_indirect.<locals>.<genexpr>)rX   r    rW   r+   r%   r%   r(   r   (     zMemoryDep.is_indirect)r"   rA   r5   T)r6   r7   r8   r9   r:   r;   r<   r	   r   rD   r   rJ   propertyrL   rg   rj   rm   r3   r   rH   r   r,   r)   r   r-   r.   r?   r/   r   r   r   r%   r%   r%   r(   rA   K   s0   
 

9

*	rA   c                   @   s   e Zd ZU eed< dZee ed< edd Zde	j
fddZd	eeef dd fd
dZdd Zdd ZdefddZdefddZdefddZdS )StarDepr   NrD   c                 C      t d)NzStarDep does not have an indexr   r+   r%   r%   r(   r    2     zStarDep.indexr"   c                 C   s   t j| jS r$   )r   r[   r,   r   r+   r%   r%   r(   r,   6  s   zStarDep.get_numelr!   c                 C       | j |v rt|| j  | jS | S r$   )r   r   rD   r&   r%   r%   r(   r)   9     
zStarDep.renamec                 C   r   r   r   r+   r%   r%   r(   r-   >  r   zStarDep.numbytes_hintc                 C   r   r   r   r+   r%   r%   r(   r.   F  r   zStarDep.has_unbacked_symbolsc                 C      dS NFr%   r+   r%   r%   r(   r/   I  r4   zStarDep.is_contiguousc                 C   r   r   r%   r+   r%   r%   r(   r   L  r4   zStarDep.is_scalarc                 C   r   r   r%   r+   r%   r%   r(   r   O  r4   zStarDep.is_indirect)r6   r7   r8   r9   r:   rD   r   r   r    r;   r<   r,   r   r)   r-   r.   r?   r/   r   r   r%   r%   r%   r(   r   ,  s   
 
r   c                   @   sr   e Zd ZU eed< eed< edd ZdejfddZ	de
eef dd fd	d
Zdd Zdd ZdefddZdS )WeakDepr   mutating_bufc                 C   r   )NzWeakDep does not have an indexr   r+   r%   r%   r(   r    b  r   zWeakDep.indexr"   c                 C   s   t jjS r$   )r;   r   r   r+   r%   r%   r(   r,   f  s   zWeakDep.get_numelr!   c                 C   r   r$   )r   r   r   r&   r%   r%   r(   r)   i  r   zWeakDep.renamec                 C   r   )Nr   r%   r+   r%   r%   r(   r-   n  r4   zWeakDep.numbytes_hintc                 C   r   r   r%   r+   r%   r%   r(   r.   q  r4   zWeakDep.has_unbacked_symbolsc                 C   r   r   r%   r+   r%   r%   r(   r/   t  r4   zWeakDep.is_contiguousN)r6   r7   r8   r9   r:   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jed< eejdf ed< eejdf ed< dS )IndexExprDepr    .rB   rC   N)r6   r7   r8   r;   r<   r:   r	   r   r%   r%   r%   r(   r   x  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j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  fddZdd Zdd Zd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)   rN   depr!   r%   r(   rP     r   z$ReadWrites.rename.<locals>.<genexpr>c                 3   r   r$   r   r   r   r%   r(   rP     r   )r   r   r   r   r   r   r   r&   r%   r   r(   r)     s   zReadWrites.renamer   c                 C   sF   t |tttfs
J t |ts|h}tt| j|| j| j	| j
| jS r$   )r   r   r   r^   r   r   unionr   r   r   r   r   )r'   r   r%   r%   r(   	with_read  s   
zReadWrites.with_readrc   c                 C   s@   t | j|j}t | j|j}t | j|j}t|| ||S r$   )r   r   r   r   r   r   )r'   rc   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   rN   rwr%   r%   r(   rU         z)ReadWrites.merge_list.<locals>.<listcomp>c                 S   r   r%   )r   r   r%   r%   r(   rU     r   c                 S   r   r%   )r   r   r%   r%   r(   rU     r   )r   r   r   )r   
all_writes	all_readsall_index_exprsr%   r%   r(   
merge_list  s   zReadWrites.merge_listc                 C   s   t | j| | j| j| j| jS r$   )r   r   r   r   r   r   )r'   	rem_readsr%   r%   r(   remove_reads  s   zReadWrites.remove_readsc                 C   s   t | j| jS r$   )rY   rZ   r   r   r+   r%   r%   r(   reads_and_writes  s   zReadWrites.reads_and_writesTc                 C   sF   t  }|  D ]}t|tsq|rt|jttjfs ||j	 q|S )z6
        Integer index is used for load_seed.
        )
r   r   r   rA   r    r   r;   r   addr   )r'   ignore_integer_indexnamesr   r%   r%   r(   buffer_names  s   
zReadWrites.buffer_names)rc   r   r   )r6   r7   r8   r   r   r:   r   r   r   r   r;   r<   r   r   typingr   r9   r)   r   r   r   r   staticmethodr   r   r   r   r%   r%   r%   r(   r     s   
 	
	r   c                       sj  e Zd Zdededdf fddZe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fddZd$ded	e	j
dedefddZdedefddZd	e	j
defddZ		d%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 )&rk   r   rm   r"   Nc                    s2   t    t | _t | _t | _|| _|| _d S r$   )super__init__r   _reads_writes_index_exprs_var_ranges_should_normalize)r'   r   rm   	__class__r%   r(   r     s   

z_RecordLoadStoreInner.__init__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<   rW   pop)r    rB   r   rW   r%   r%   r(   drop_unused_symbols  s    z)_RecordLoadStoreInner.drop_unused_symbolsr    .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                    rq   r%   r%   rr   rt   r%   r(   rU     rV   z4_RecordLoadStoreInner._normalize.<locals>.<listcomp>)r   r~   r   r   r[   r\   rz   r   r{   canonicalization_prefixrh   r|   r   r;   r}   r   )
clsr    r   
index_varsr   	new_sizesr   r   new_varsr   r%   rt   r(   rl     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\   simplifyrr   r%   r%   r(   rU         z6_RecordLoadStoreInner.canonicalize.<locals>.<listcomp>c                 S   s   g | ]
\}}|d kr|qS r   r%   rN   kr   r%   r%   r(   rU         c                 S   s   g | ]}|d kr|qS r   r%   r   r%   r%   r(   rU     s    c                 S   s    i | ]\}}|t jj|qS r%   r   r   r%   r%   r(   rR      s    z6_RecordLoadStoreInner.canonicalize.<locals>.<dictcomp>)	r   r   r   r|   r   r   r~   itemsrl   )r'   r    r   rB   r   r%   r%   r(   canonicalize  s   z"_RecordLoadStoreInner.canonicalizer   c                 C   s4   | j t|g| |R   d| dt| dS )Nzload(rF   rG   )r   r   rA   r   r   r'   r   r    r%   r%   r(   load  s   z_RecordLoadStoreInner.loadc                 C   s    t |tsJ | |t|S r$   )r   r   r   r;   r   r   r%   r%   r(   	load_seed  s   z_RecordLoadStoreInner.load_seedvaluec              	   C   sF   | j t|g| |R d|i d| dt| d| d| d	S )NrD   zstore(rF   rG   )r   r   rA   r   r   )r'   r   r    r   rD   r%   r%   r(   store  s   $"z_RecordLoadStoreInner.storec                 C   s   |  ||d| dS )Nzstore_reduction(rG   )r   )r'   r   r    r   r%   r%   r(   store_reduction  r   z%_RecordLoadStoreInner.store_reductionc                 C   s,   | j t| |  dt| d| dS )Nzindex_expr(rF   rG   )r   r   r   r   r   )r'   r    dtyper%   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(   	bucketize  s   z_RecordLoadStoreInner.bucketizer$   NN)r6   r7   r8   r   r?   r   r   r   classmethodr;   r<   r	   r   rl   r   r9   r   r   r   r   r   r   r   torchr   r   r  __classcell__r%   r%   r   r(   rk     sR    
""
	rk   c                       s*   e Zd Zdededdf fddZ  ZS )RecordLoadStorer   rm   r"   Nc                    s   t ||d}t j|d d S )Nr   rm   )parent_handler)rk   r   r   )r'   r   rm   r
  r   r%   r(   r   ,  s   zRecordLoadStore.__init__)r6   r7   r8   r   r?   r   r  r%   r%   r   r(   r  +  s    "r  r2   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   cntr2   r   r%   r(   ru   8  s   zvar_builder.<locals>.add_var)rY   countr;   r<   r   )r2   ru   r%   r  r(   r{   4  s   r{   argsizesc                    s&   t | \}  fdd|D }||fS )Nc                    s   g | ]	}t t |qS r%   )listmap)rN   rC   rt   r%   r(   rU   B  r   z)index_vars_no_squeeze.<locals>.<listcomp>)r{   )r2   r  r   r   r%   rt   r(   index_vars_no_squeeze@  s   r  d)r2   c           
      G   sb   ddl m} t| \}}g }g }|D ]}||\}}	|| ||	tt|| q||fS )Nr   )SqueezeView)rn   r  r{   squeezerappendr  r  )
r2   r  r  r   ru   r   r   rC   new_sizer   r%   r%   r(   index_vars_squeezeF  s   
r  Fr%   )rm   r2   hidden_argsfn.rm   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 )Nr2   r   )LoopBody)rm   )r  	loop_bodyr  r   extract_loop_body_with_argsr  r   set_ops_handlerr
  rY   rZ   from_iterabler   r   r   r   r   )r  rm   r2   r  r  r   r   r  innerr   r   r%   r%   r(   extract_read_writesS  s*   
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)rN   rQ   r   r%   r%   r(   rR     s    z/extract_loop_body_with_args.<locals>.<dictcomp>c                    s   i | ]
\}}|t | qS r%   )r   r   replr%   r(   rR     r   )r  r#  rk   indexing_from_argsindirect_varsra   r   memory_usageLOADr   buffer_name
index_name	LOAD_SEEDr   r   STOREr   rD   STORE_REDUCTIONr   
INDEX_EXPRr   	BUCKETIZEr  )r  r   r   rm   r#  r!  name_to_indexentryr%   r%  r(   r  w  s2   
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)rn   r5  r6  r7  r   get_defining_opget_sizeget_reduction_sizerK   data	get_readsr   rA   r   r   r   r[   try_get_bufferextend)r4  r5  r6  r7  rC   reduction_sizer   seen	new_readsreadbufferopr%   r%   r(   #extract_input_node_reduction_ranges  sT   


rE  c                   C   r   )Ncr%   r%   r%   r%   r(   r     r4   r   c                   @   s   e Zd ZU eej ed< dddZdede	de
f fdd	Z	
ddejfddZdd Zdd Zd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ddZdS )FreeUnbackedSymbolsOpsHandlersymbolsr"   Nc                 C   s   t  | _d S r$   )r   rH  r+   r%   r%   r(   r        z&FreeUnbackedSymbolsOpsHandler.__init__r   .c                    s    fdd}|S )Nc                     sB   t | | D ]}t|tjtjjjfr  j	t
|O  _	qd S r$   )rY   rZ   r   r   r;   r<   logicboolalgBooleanrH  r   )r   kwargsar+   r%   r(   r!    s
   z8FreeUnbackedSymbolsOpsHandler.__getattr__.<locals>.innerr%   )r'   r   r!  r%   r+   r(   __getattr__  s   z)FreeUnbackedSymbolsOpsHandler.__getattr__Tc                 C   s@   t |tjtjjjfrJ |  jt|O  _tdt	| dS )N(rG   )
r   r;   r<   rJ  rK  rL  rH  r   r   r9   )r'   	index_varrC   checkwrap_negr%   r%   r(   indirect_indexing  s   z/FreeUnbackedSymbolsOpsHandler.indirect_indexingc                 C   r   )Nr  r%   )r'   rs   r%   r%   r(   frexp  r4   z#FreeUnbackedSymbolsOpsHandler.frexpc                 C   s   dt | S Nr$   rK   )r'   dtypes
combine_fnr   r%   r%   r(   scan  rI  z"FreeUnbackedSymbolsOpsHandler.scanc                 C   s   dt | S rV  rW  )r'   rX  r   stable
descendingr%   r%   r(   sort  rI  z"FreeUnbackedSymbolsOpsHandler.sortr   	src_dtypereduction_typer   )N.c                 C   s   t |}|dkrd| S d S )Nr   r$   )r   )r'   r   r^  r_  r   
num_valuesr%   r%   r(   	reduction  s   z'FreeUnbackedSymbolsOpsHandler.reductionc                 C   s   t |sJ d|  d S )Nz$masked body must always be callable.)callable)r'   maskbodyrc   r%   r%   r(   masked	  s   
z$FreeUnbackedSymbolsOpsHandler.masked)r"   N)TT)r6   r7   r8   r   r;   r   r:   r   r9   r   r   rO  rT  rU  rZ  r]  r  r   r   r   r	   ra  re  r%   r%   r%   r(   rG    s.   
 
	


rG  hc                 C   r1   r$   r%   )rf  r%   r%   r(   (_typecheck_FreeUnbackedSymbolsOpsHandler  s   rg  c              	   C   s   ddl m} |d ur||gn|g}t }t|. t|dd | |  W d    n1 s0w   Y  W d    |jS W d    |jS 1 sJw   Y  |jS )Nr   )FlexibleLayoutallow_indexingT)rn   rh  rG  r   r  r   objectrH  )r  r    rindexrh  r   handlerr%   r%   r(   extract_free_unbacked_symbols  s   
(rm  )Fr$   )Ir=   dataclassesrY   loggingrer   r   r   r   r   r   r   r   r	   r
   r   unittest.mockr   r;   r  %torch.fx.experimental.symbolic_shapesr   torch.utils._ordered_setr   utils._sympy.symbolr   r   codegen.commonr   utilsr   r   r   r   r   r   virtualizedr   r   r   r   	getLoggerr6   r_   compilesearchr   ABCr   	dataclassrA   r   r   r   r   MockHandlerrk   KernelFormatterHandlerr  r9   r<   r   r{   r  r  r?   r"  r  rE  r   rG  rg  rm  r%   r%   r%   r(   <module>   s|   0 

 
a
.
Dg(	


$"
C.
