
    ɯwgg              	       ~   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 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 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jF                  e$      Z% ejL                  d
      jN                  Z( G d de jR                        Z* ejV                  d       G d de*             Z, ejV                  d       G d de*             Z- ejV                  d       G d de*             Z. ejV                  d       G d d             Z/ejV                   G d d             Z0 G d de"jb                        Z2 G d de"jf                        Z4de5deeeejl                  gejn                  f   f   fdZ8d eejl                  d!f   de5fd"Z9d#d$d eejl                  d!f   de5fd%Z:d&d#d'd(d)ed!ef   d eejl                  d!f   d*e;de5fd+Z<d,d-dee
e	ejl                        e
e	ejl                        f   fd.Z=d/ Z> G d0 d1      Z?d2e?de d   fd3Z@d5d)ed!ef   fd4ZAy)6    N)AnyCallableDictListOptionalSetTupleUnion)patch)free_unbacked_symbols)
OrderedSet   )index_prevent_reordering)get_dtype_sizereduction_num_outputssympy_index_symbol	sympy_str
sympy_subs	VarRanges)
OpsHandlerReductionTypeVzindirect|tmpc                   ,   e Zd ZU eed<   ej                  ed<   ej                  de	eef   dd fd       Z
ej                  dej                  fd       Zej                  d        Zej                  defd       Zej                  defd	       Zdd
Zy)Depnameindexrenamesreturnc                      y N selfr   s     a/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_inductor/dependencies.pyrenamez
Dep.rename%           c                      y r    r!   r#   s    r$   	get_numelzDep.get_numel)   r&   r'   c                      y r    r!   r)   s    r$   numbytes_hintzDep.numbytes_hint-   r&   r'   c                      y r    r!   r)   s    r$   has_unbacked_symbolszDep.has_unbacked_symbols1   r&   r'   c                      y r    r!   r)   s    r$   is_contiguouszDep.is_contiguous5   r&   r'   c                     | S r    r!   )r#   prefixs     r$   normalize_with_stride_orderzDep.normalize_with_stride_order9   s    r'   Nt)__name__
__module____qualname__str__annotations__sympyExprabcabstractmethodr   r%   r*   r,   boolr.   r0   r3   r!   r'   r$   r   r   !   s    
I::d38n    	5::   	  	d   	t  r'   r   T)frozenc                      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	Zed
        Zd Zd ZddZddZedeej                  ej                  f   fd       Zdej                  fdZdeeef   dd fdZd Zd ZdefdZddefdZdefdZdefdZy)	MemoryDepr   r   .	var_namessizeNmoder   c           	      p    d| j                   d| j                   d| j                   d| j                   d	S )Nz
MemoryDep(, ))r   r   rangesrE   r)   s    r$   __repr__zMemoryDep.__repr__E   s4    DII=4::,bR		{RSTTr'   c                 ,    t        | j                        S r    )lenrC   r)   s    r$   num_varszMemoryDep.num_varsH   s    4>>""r'   c                    | j                   |j                   k(  sJ | j                   t        | j                  j                        k7  ry|j                   t        |j                  j                        k7  ryt	        d t        j                  | j                  |j                        D              ryt        j                  j                  j                  | j                  | j                        }t        j                  j                  j                  |j                  |j                        }t        t        |            t        |      k7  s t        t        |            t        |      k7  rt        j                  d| |||       yt        |      t        |      k7  ryt!        |      D ci c]  \  }}||
 }}}g }|D ]  }|j#                  ||           t        |      t        t%        d| j                               k(  sJ |S c c}}w )zD
        Can return None if not able to decide loop orders.
        Nc              3   4   K   | ]  }|d k(  xs |dk(    yw)r   r   Nr!   ).0ss     r$   	<genexpr>z7MemoryDep.decide_loop_order_to_match.<locals>.<genexpr>a   s      PAqAvaPs   zaunable to decide loop order. self_dep=%s v.s. other_dep=%s, self_strides=%s v.s. other_strides=%sr   )rM   rL   r   free_symbolsany	itertoolschainrD   r   graphsizevarsstride_hintsrC   setlogdebug	enumerateappendrange)r#   otherself_stridesother_stridesirQ   stride_to_indexorders           r$   decide_loop_order_to_matchz$MemoryDep.decide_loop_order_to_matchL   s    }}... ==C

 7 788>>S!9!9:: PEJJ)OPP ww''44TZZP((55ekk5??S s< !S%66#;
;  IIs 
 |M 22,5l,CDDAq1a4DD 	-ALL+,	- 5zSq$--!89999 Es   -H	c                 j    t        | j                  t        j                  | j                  d            S )zF
        Return the offset by setting every variable to be 0.
        r   )r   r   dictfromkeysrC   r)   s    r$   
get_offsetzMemoryDep.get_offset   s$     $**dmmDNNA&FGGr'   c                     t        | j                  gt        j                  | j                  | j
                        | j                   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.
        )rB   r   _RecordLoadStoreInner
_normalizer   rI   rE   r)   s    r$   	normalizezMemoryDep.normalize   sC     II
"--djj$++F
 II
 	
r'   c                 @   ddl m} t        j                  j                  j                  | j                  | j                        }t        t        t        |            |j                  d      }|j                  |      }| j                  }| j                  } ||      } ||      }	t        j                  j                  j                  |	|t        | j                  g|	|            \  }
}}t!        |      \  }}t#        t%        |	 ||
D cg c]
  } ||       c}                  }t'        t)        j*                  | j                        |      }t-        | j.                  |t1        |j3                               t1        |j5                                     }|S c c}w )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reverse)torch._inductorrp   r   rW   rX   rY   r   rC   sortedr_   rL   __getitem__same_reorderrD   _simplify_loopsr   var_builderrh   zipr   r;   expandrB   r   tuplekeysvalues)r#   r2   rp   stridesre   stride_reordersizesrC   new_reordered_sizesnew_reordered_var_namesnew_simplified_sizesreindexprune
var_rangesadd_varxreplacement	new_indexouts                      r$   r3   z%MemoryDep.normalize_with_stride_order   sQ    	'''""//

DNNK uS\*0C0CTR/		NN	,U3"0";/0ww/?/?/O/O#$57J0
,gu *&1
G'-ABBC
 u||DJJ7E			9eJOO4E.FjN_N_NaHbc
 Cs   Fc                 T    t        t        | j                  | j                              S )z{c0: 128, c1: 512, ...})rh   ry   rC   rD   r)   s    r$   rI   zMemoryDep.ranges   s     C		233r'   c                 H   | j                         r+t        j                  j                  | j                        }|S t        | j                  j                        }t        j                  d      }t        | j                  | j                        D ]  \  }}||v s||z  } |S Nr   )is_indirectr   rW   r*   r   r   r   rS   r;   Integerry   rC   rD   )r#   numelvarsvarrD   s        r$   r*   zMemoryDep.get_numel   s    GG%%dii0E  -7tzz7N7N,ODMM!$E ; )	T$;!DLE) r'   r   c                     | j                   |v rEt        || j                      | j                  | j                  | j                  | j
                        S | S )N)rC   rD   rE   )r   rB   r   rC   rD   rE   r"   s     r$   r%   zMemoryDep.rename   sJ    99		"

..YYYY  r'   c                     t         j                  j                  j                  | j	                               t        t         j                  j                  | j                              z  S r    r   rW   rX   	size_hintr*   r   	get_dtyper   r)   s    r$   r,   zMemoryDep.numbytes_hint   H    ww))$..*:;nGGdii(?
 
 	
r'   c                 L    t        t        | j                                     dkD  S Nr   rL   r   r*   r)   s    r$   r.   zMemoryDep.has_unbacked_symbols       ()9:;a??r'   c                 ~    t        | j                  t        j                        xr | j                  | j                  v S r    )
isinstancer   r;   SymbolrC   r)   s    r$   r0   zMemoryDep.is_contiguous   s)    $**ell3T

dnn8TTr'   c                    t        | j                        dk(  ryt        | j                  t        j
                        r| j                  j                  n| j                  g}| j                  d   }|D ]  }||u r yt        |t        j                        s$t        |j                        dk(  s=|j                  d   |u sOt        |j                  d   t        t        j                  f      s}|j                  d   dkD  s y |S )zA
        Whether the stride for the last dimension is 1.
        r   T   r   F)
rL   rC   r   r   r;   AddargsMulintr   )r#   result_for_complex_expressiontermslast_symterms        r$   stride1_for_last_dimzMemoryDep.stride1_for_last_dim   s     t~~!##-djj%))#D

4::,>>"% 	Dx
 4+		Na'IIaLH,tyy|c5==-ABIIaL1$	 -,r'   c                     t        | j                  t        j                        r+| j                  | j                  vxr | j                          S t        | j                  t        t        j                  f      S r    )r   r   r;   r   rC   r   r   r   r)   s    r$   	is_scalarzMemoryDep.is_scalar  sR    djj%,,/::T^^3ND<L<L<N8NN$**sEMM&:;;r'   c                 N    t        d | j                  j                  D              S )Nc              3   F   K   | ]  }t        |j                          y wr    )r   r   )rP   vs     r$   rR   z(MemoryDep.is_indirect.<locals>.<genexpr>  s     H1;qvv&Hs   !)rT   r   rS   r)   s    r$   r   zMemoryDep.is_indirect  s    H

0G0GHHHr'   )r   rB   r4   T)r6   r7   r8   r9   r:   r;   r<   r	   r   rE   r   rJ   propertyrM   rf   rj   rn   r3   r   rI   r*   r%   r,   r.   r?   r0   r   r   r   r!   r'   r$   rB   rB   =   s   
I::U\\3&''


C
  D(3-U# U # #9vH

(T 4U\\5::56 4 4	5:: 		d38n 	 	

@Ut U-$ -:<4 <
IT Ir'   rB   c                       e Zd ZU eed<   dZee   ed<   ed        Zde	j                  fdZdeeef   dd fdZd	 Zd
 ZdefdZdefdZdefdZy)StarDepr   NrE   c                     t        d      )NzStarDep does not have an indexNotImplementedErrorr)   s    r$   r   zStarDep.index      !"BCCr'   r   c                 T    t         j                  j                  | j                        S r    )r   rW   r*   r   r)   s    r$   r*   zStarDep.get_numel  s    ww  ++r'   r   c                 h    | j                   |v r#t        || j                      | j                        S | S r    )r   r   rE   r"   s     r$   r%   zStarDep.rename  s-    997499-tyy99r'   c                     t         j                  j                  j                  | j	                               t        t         j                  j                  | j                              z  S r    r   r)   s    r$   r,   zStarDep.numbytes_hint!  r   r'   c                 L    t        t        | j                                     dkD  S r   r   r)   s    r$   r.   zStarDep.has_unbacked_symbols&  r   r'   c                      yNFr!   r)   s    r$   r0   zStarDep.is_contiguous)      r'   c                      yr   r!   r)   s    r$   r   zStarDep.is_scalar,  r   r'   c                      yr   r!   r)   s    r$   r   zStarDep.is_indirect/  r   r'   )r6   r7   r8   r9   r:   rE   r   r   r   r;   r<   r*   r   r%   r,   r.   r?   r0   r   r   r!   r'   r$   r   r     s    
ID(3- D D,5:: ,d38n  


@t 4 T r'   r   c                       e Zd ZU eed<   eed<   ed        Zdej                  fdZ	de
eef   dd fdZd Zd	 Zdefd
Zy)WeakDepr   mutating_bufc                     t        d      )NzWeakDep does not have an indexr   r)   s    r$   r   zWeakDep.indexB  r   r'   r   c                 ,    t        j                  d      S r   )r;   r   r)   s    r$   r*   zWeakDep.get_numelF  s    }}Qr'   r   c                 h    | j                   |v r#t        || j                      | j                        S | S r    )r   r   r   r"   s     r$   r%   zWeakDep.renameI  s/    997499-t/@/@AAr'   c                      yr   r!   r)   s    r$   r,   zWeakDep.numbytes_hintN  s    r'   c                      yr   r!   r)   s    r$   r.   zWeakDep.has_unbacked_symbolsQ  r   r'   c                      yr   r!   r)   s    r$   r0   zWeakDep.is_contiguousT  r   r'   N)r6   r7   r8   r9   r:   r   r   r;   r<   r*   r   r%   r,   r.   r?   r0   r!   r'   r$   r   r   ;  sd     ID D 5::  d38n  
t r'   r   c                   |    e Zd ZU ej                  ed<   eej                  df   ed<   eej                  df   ed<   y)IndexExprDepr   .rC   rD   N)r6   r7   r8   r;   r<   r:   r	   r   r!   r'   r$   r   r   X  s3    ::U\\3&''


C
  r'   r   c                      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	Zd
eeee   f   dd fdZddZede	d    fd       Zd Zd ZddZy)
ReadWritesreadswritesindex_exprsN
range_varsr   r   r   c                     t        t        fd| j                  D              t        fd| j                  D              | j                  | j
                  | j                        S )Nc              3   @   K   | ]  }|j                          y wr    r%   rP   depr   s     r$   rR   z$ReadWrites.rename.<locals>.<genexpr>i  s     Asszz'*A   c              3   @   K   | ]  }|j                          y wr    r   r   s     r$   rR   z$ReadWrites.rename.<locals>.<genexpr>j  s     Bsszz'*Br   )r   r   r   r   r   r   r   r"   s    `r$   r%   zReadWrites.renameg  sK    AdjjAABdkkBBOOOO
 	
r'   r   c                    t        |t        t        t        f      sJ t        |t              s|h}t	        t        j                  | j                  |      | j                  | j                  | j                  | j                        S r    )r   r   r   rZ   r   r   unionr   r   r   r   r   )r#   r   s     r$   	with_readzReadWrites.with_readp  si    ##6777#s#%CTZZ-KKOOOO
 	
r'   c                    t        j                  | j                  |j                        }t        j                  | j                  |j                        }t        j                  | j                  |j                        }t        ||z
  ||      S r    )r   r   r   r   r   r   )r#   r`   r   r   r   s        r$   mergezReadWrites.merge|  sg      U[[9!!$++u||< &&t'7'79J9JK%&.&+>>r'   read_writesc                 <   t        j                  | D cg c]  }|j                   c} }t        j                  | D cg c]  }|j                   c} |z
  }t        j                  | D cg c]  }|j                   c} }t        |||      S c c}w c c}w c c}w r    )r   r   r   r   r   r   )r   rw
all_writes	all_readsall_index_exprss        r$   
merge_listzReadWrites.merge_list  s    %%K'Hb		'HI
$$+&FBrxx&FG*T	$**k,RR^^,RS)ZAA (I&F,Rs   BB+Bc                     t        | j                  |z
  | j                  | j                  | j                  | j
                        S r    )r   r   r   r   r   r   )r#   	rem_readss     r$   remove_readszReadWrites.remove_reads  s9    JJ"KKOOOO
 	
r'   c                 V    t        j                  | j                  | j                        S r    )rU   rV   r   r   r)   s    r$   reads_and_writeszReadWrites.reads_and_writes  s    tzz4;;77r'   c                     t               }| j                         D ][  }t        |t              s|r+t        |j                  t
        t        j                  f      rA|j                  |j                         ] |S )z6
        Integer index is used for load_seed.
        )
r   r   r   rB   r   r   r;   r   addr   )r#   ignore_integer_indexnamesr   s       r$   buffer_nameszReadWrites.buffer_names  se     ",((* 	$Cc9-'z		C/0 		#((#	$ r'   )r`   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    c?sOL))-1Jejj)*1&*J#*
fkk#s(3 
 


U3C=1 

l 

? B\ 2 B B
8r'   r   c                   $    e Zd Zdededdf fdZe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	       Zde	j                  dee	j                  ee	j                  df   ee	j                  df   f   fd
Zdede	j                  defdZdedefdZddede	j                  dedefdZdedefdZde	j                  defdZdede	j                  dej.                  defdZ xZS )rl   r   rn   r   Nc                     t         |           t               | _        t               | _        t               | _        || _        || _        y r    )super__init__r   _reads_writes_index_exprs_var_ranges_should_normalize)r#   r   rn   	__class__s      r$   r   z_RecordLoadStoreInner.__init__  s:    '1|.8l6@l&0'0r'   c                     t        | t        j                        sy| j                  }|r4|d   |vr,|j	                          |j	                          |r	|d   |vr*yyyy)zz
        Reduction has last (reduced) dim in its sizes, but
        downstream users won't.  Normalize this away.
        Nr   )r   r;   r<   rS   pop)r   rC   r   rS   s       r$   drop_unused_symbolsz)_RecordLoadStoreInner.drop_unused_symbols  sW     %,))IbM=MMOIIK IbM=i=ir'   r   .c                     g |j                         }t        |j                               }t        j                  j
                  j                  ||t        |g||            \  }}}t        t                     \  }}	t        t        | ||D 
cg c]
  }
 |	|
       c}
                  }t        t        j                  |      |      }g |j                         }g |}| j                  |||       |t        |      t        |      fS c c}
w r    )r|   r{   r}   r   rW   rX   rw   r   rx   canonicalization_prefixrh   ry   r   r;   rz   r   )clsr   r   
index_varsr   	new_sizesr   r   new_varsr   r   r   s               r$   rm   z _RecordLoadStoreInner._normalize  s     *z()
j'')*$%GG$4$4$D$D$eWj%@%
!	7E ((?(AB'3z7	3R1GAJ3R+STU5<<.<%X]]_% iL	x;eHouY'777 4Ss   Dc                    | j                   s| j                  j                         D cg c]+  }t        j                  j
                  j                  |      - }}t        | j                  j                         |      D cg c]  \  }}|dk7  s| }}}|D cg c]
  }|dk7  s	| }}| j                  |||       |t        |      t        |      fS | j                  j                         D ci c]/  \  }}|t        j                  j
                  j                  |      1 }}}| j                  ||      S c c}w c c}}w c c}w c c}}w r   )r   r   r}   r   rW   rX   simplifyry   r|   r   r{   itemsrm   )r#   r   r   r   kr   rC   r   s           r$   canonicalizez"_RecordLoadStoreInner.canonicalize  s)    %%;?;K;K;R;R;TUaQWW%%..q1UEU'*4+;+;+@+@+BE'JUtq!aSTfUIU %01aQ0E0$$UIu=%	*E%L88 ((..0
1 qww((++

 
 uj11 VU0

s#   0D<EE
E&E34Er   c                     | j                   j                  t        |g| j                  |              d| dt	        |       dS )Nzload(rG   rH   )r   r   rB   r
  r   r#   r   r   s      r$   loadz_RecordLoadStoreInner.load  sB    	$B):):5)ABCtfBy/022r'   c                 p    t        |t              sJ | j                  |t        j                  |            S r    )r   r   r  r;   r   r  s      r$   	load_seedz_RecordLoadStoreInner.load_seed  s,    %%%%yyu}}U344r'   valuec           	          | j                   j                  t        |g| j                  |      d|i       d| dt	        |       d| d| d	S )NrE   zstore(rG   rH   )r   r   rB   r
  r   )r#   r   r   r  rE   s        r$   storez_RecordLoadStoreInner.store  sU    4N$*;*;E*BNNOvR	% 01E7"TF!DDr'   c                 0    | j                  ||d| d      S )Nzstore_reduction(rH   )r  )r#   r   r   r  s       r$   store_reductionz%_RecordLoadStoreInner.store_reduction  s    zz$)9%'BCCr'   c                     | j                   j                  t        | j                  |              dt	        |       d| dS )Nzindex_expr(rG   rH   )r   r   r   r
  r   )r#   r   dtypes      r$   
index_exprz _RecordLoadStoreInner.index_expr  sA    lD,=,=e,DEFYu-.bq99r'   offsets_nameoffsets_sizeindexing_dtyperightc                     | j                   j                  t        |             d| d| dt        |       d| d| dS )Nz
bucketize(rG   rH   )r   r   r   r   )r#   r}   r  r  r  r  s         r$   	bucketizez_RecordLoadStoreInner.bucketize  sL     	-.F82l^2i6M5NbQ_P``bchbiijkkr'   r    )r6   r7   r8   r   r?   r   r   r   classmethodr;   r<   r	   r   rm   r
  r9   r  r   r  r  r  r  torchr  r  __classcell__r   s   @r$   rl   rl     s   19 1 1$ 1   8JJ8,58	uzz5s!23U5::s?5KK	L8 822ZZ2	uzz5s!23U5::s?5KK	L2&3 3UZZ 3C 35c 5# 5E# Eejj E EC EDC D# D:

 :c :	l 	l jj		l
 	l 	lr'   rl   c                   ,     e Zd Zdededdf fdZ xZS )RecordLoadStorer   rn   r   Nc                 @    t        ||      }t        | 	  |       y )Nr   rn   )parent_handler)rl   r   r   )r#   r   rn   r&  r   s       r$   r   zRecordLoadStore.__init__  s$    .!Y
 	7r'   )r6   r7   r8   r   r?   r   r   r!  s   @r$   r#  r#    s"    89 8 8$ 8 8r'   r#  r2   r   c                      t        j                         i dt        j                  dt        j                  f fd}|fS )Nlengthr   c                 B    t         t                     }| |<   |S r    )r   next)r(  r   cntr2   r   s     r$   r   zvar_builder.<locals>.add_var  s(    &$s)56
1r'   )rU   countr;   r<   r   )r2   r   r+  r   s   ` @@r$   rx   rx     s<    
//
CJ

 u|| 
 wr'   argsizes.c           	          t        |       \  }}g }|D ]&  }|j                  t        t        ||                   ( ||fS r    )rx   r^   listmap)r2   r-  r   r   r   rD   s         r$   index_vars_no_squeezer1    sH    %f-J%'D .DWd+,-.r'   d)r2   c                     ddl m} t        |       \  }}g }g }|D ]Q  }|j                  |      \  }}	|j	                  |       |j	                   |	t        t        ||                         S ||fS )Nr   )SqueezeView)rp   r4  rx   squeezerr^   r/  r0  )
r2   r-  r4  r   r   r   r  rD   new_sizer   s
             r$   index_vars_squeezer7  $  sz    %f-J#%D(*I ;'006'"GDWh!789:; r'   Fr!   )rn   r2   hidden_argsfnrn   c          	      j   t        |d|i\  }}ddlm}m} t	        | |      rSt        ||      }	| j                  g ||      }
| j                  rkt        | j                        D ci c]  \  }}|t        j                  d|         }}}|
j                         D ci c]  \  }}|t        ||       }
}}| j                  |j                     D ]+  }|	j                  |j                   |
|j"                            - | j                  |j$                     D ]4  }|	j'                  |j                   t)        |
|j"                                  6 | j                  |j*                     D ]7  }|	j-                  |j                   |
|j"                     d |j.                         9 | j                  |j0                     D ],  }|	j3                  |j                   |
|j"                     d        . | j                  |j4                     D ]!  }|	j7                  |
|j"                     d        # | j                  |j8                     D ].  }|	j;                  d |j                   |
|j"                     d d        0 nAt=        ||      }t?        j@                  |      5   | g ||  d d d        |jB                  }	|rg }n!g tD        jF                  jI                  |      }tK        tM        |	jN                        tM        |	jP                        |	jR                  ||      S c c}}w c c}}w # 1 sw Y   xY w)Nr2   r   )LoopBodyMemoryUsageTyper%  tmp)rn   )*r7  	loop_bodyr;  r<  r   rl   indexing_from_argsindirect_varsr]   r;   r   r  r   memory_usageLOADr  buffer_name
index_name	LOAD_SEEDr  r   STOREr  rE   STORE_REDUCTIONr  
INDEX_EXPRr  	BUCKETIZEr  r#  r   set_ops_handlerr&  rU   rV   from_iterabler   r   r   r   r   )r9  rn   r2   r8  r-  r   r   r;  r<  innername_to_indexrc   r   replr	  entryr   r   s                     r$   extract_read_writesrP  1  s    *8CFCD*4"h%yQ--.C.C{.CD;DREUEU;VW41aAu||c!I..WDW@M@S@S@UV1Q
1d 33VMV___%9%9: 	KEJJu((-8H8H*IJ	K___%>%>? 	UEOOE--s=AQAQ3R/ST	U___%:%:; 	EKK!!=1A1A#BD%**	 ___%D%DE 	E!!!!=1A1A#BD	 ___%?%?@ 	DE]5+;+;<dC	D___%>%>? 	EOOe''u7G7G)H$PT	 Z9=r" 	$##{#	$!!
;y44T:;
5<< 5==! C XV.	$ 	$s   *#L#L#L))L2
input_nodeztorch._inductor.ir.TensorBoxc                    ddl m}m} t        | j                  |      r3| j                         }| j                         }t        |      dkD  r||fS yt        | j                  j                  |      sy| j                         }d}d}|Nt        |      dkD  r?t               }g }|D ]  }t        |t              s|j                  |v r$|j                  |j                         t        j                  j                  |j                        }	|	k|	j!                         }
|
~t        |
|      rht        |
j                               dkD  rL|!|
j                         }|
j                         }||
j                         k7  s||
j                         k7  s y|j#                  |
j                                 ||k(  r||fS |}|t        |      dkD  r?||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Loopsr   NNN)rp   rS  rT  r   dataget_sizeget_reduction_sizerL   	get_readsr   rB   r   r   r   rW   try_get_bufferget_defining_opextend)rQ  rS  rT  rD   reduction_sizer   seen	new_readsreadbufferops              r$   #extract_input_node_reduction_rangesrc  l  s    **//>2""$#668~".))joo**E2
   "END

 SZ!^ *	 	1DdI.yyD HHTYYWW++DII6F~'')Bz"n-#b6K6K6M2NQR2R!)%'%:%:%<N;;=D#r'<'<'>>$"++-BW'  0)	1* I.))E7 
 SZ!^8 .!!r'   c                       y)Ncr!   r!   r'   r$   r  r    s    r'   c                       e Zd ZU eej
                     ed<   ddZdede	de
f   fdZ	 ddej
                  fdZd	 Zd
 Zd Zdej"                  dej"                  dededed   f   deded   f   f
dZy)FreeUnbackedSymbolsOpsHandlersymbolsr   Nc                 "    t               | _        y r    )r   rh  r)   s    r$   r   z&FreeUnbackedSymbolsOpsHandler.__init__  s    !|r'   r   .c                       fd}|S )Nc                     t        j                  | |j                               D ]_  }t        |t        j
                  t        j                  j                  j                  f      sBxj                  t        |      z  c_	        a y r    )rU   rV   r}   r   r;   r<   logicboolalgBooleanrh  r   )r   kwargsar#   s      r$   rL  z8FreeUnbackedSymbolsOpsHandler.__getattr__.<locals>.inner  sZ    __T6==?; =a%**ekk.A.A.I.I!JKLL$9!$<<L=r'   r!   )r#   r   rL  s   `  r$   __getattr__z)FreeUnbackedSymbolsOpsHandler.__getattr__  s    	=
 r'   c                     t        |t        j                  t        j                  j                  j
                  f      rJ | xj                  t        |      z  c_        t        dt        |       d      S )N(rH   )
r   r;   r<   rl  rm  rn  rh  r   r   r9   )r#   	index_varrD   checkwrap_negs        r$   indirect_indexingz/FreeUnbackedSymbolsOpsHandler.indirect_indexing  sZ     i%**ekk6I6I6Q6Q)RSSS-d33!Ac)n%5Q"788r'   c                      y)NrU  r!   )r#   r   s     r$   frexpz#FreeUnbackedSymbolsOpsHandler.frexp  s    r'   c                     dt        |      z  S Nr    rL   )r#   dtypes
combine_fnr}   s       r$   scanz"FreeUnbackedSymbolsOpsHandler.scan      V$$r'   c                     dt        |      z  S r{  r|  )r#   r}  r}   stable
descendings        r$   sortz"FreeUnbackedSymbolsOpsHandler.sort  r  r'   r  	src_dtypereduction_typer  )N.c                 0    t        |      }|dkD  rd|z  S d S )Nr   r    )r   )r#   r  r  r  r  
num_valuess         r$   	reductionz'FreeUnbackedSymbolsOpsHandler.reduction  s$     +>:
'1A~w#?4?r'   )r   N)TT)r6   r7   r8   r   r;   r   r:   r   r9   r   r   rq  rw  ry  r  r  r  r  r   r
   r	   r  r!   r'   r$   rg  rg    s    %%$ c(:  599	9%%@{{@ ;;@ &	@
 T5++,@ 
tU9%%	&@r'   rg  hc                     | S r    r!   )r  s    r$   (_typecheck_FreeUnbackedSymbolsOpsHandlerr    s	     Hr'   c                    ddl m} |||gn|g}t               }t        j                  |      5  t        j                  |dd      5   | |  d d d        d d d        |j                  S # 1 sw Y   xY w# 1 sw Y   |j                  S xY w)Nr   )FlexibleLayoutallow_indexingT)rp   r  rg  r   rJ  r   objectrh  )r9  r   rindexr  r   handlers         r$   extract_free_unbacked_symbolsr    s    "$0E6?ugD+-G 
		7	# U\\($&  	D	  ??	   ??s#   A5A)A5)A2	.A55B	r    )Br=   dataclassesrU   loggingrer   r   r   r   r   r   r   r	   r
   unittest.mockr   r;   r  %torch.fx.experimental.symbolic_shapesr   torch.utils._ordered_setr   codegen.commonr   utilsr   r   r   r   r   r   virtualizedr   r   r   	getLoggerr6   r[   compilesearchr   ABCr   	dataclassrB   r   r   r   r   MockHandlerrl   KernelFormatterHandlerr#  r9   r<   r   rx   r1  r7  r?   rP  rc  r  rg  r  r  r!   r'   r$   <module>r     s   
    	  I I I    G / 4  6 5 g!bjj)00#'' 8 d#NI NI $NIb d# c   $ V d#c  $8 d#! ! $! A A AH`lAMM `lF8a.. 8	 	i5::,:T1U&U V 	U5::s?%; S  IL 
%

C"8 
# 
  8c8UZZ_%8 8 	8v;".;"
8D$%xUZZ0@'AAB;"|
&@ &@R$hsCx&8 r'   