ó
    Eñi\n  ã                   óö  • S SK r S SKrS SKJrJr  S SKJr  S SKJrJ	r	J
r
JrJrJr  S SKrS SKrS SKJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  SSKJr  \" S5      r \" S5      r!\"\RF                  S4   r$\"\%\RL                     \%\RF                     4   r'\RP                  RS                  \*S5      r+S SKJ,r,J-r-  \(       a  S SK.J/r/J0r0  S\RF                  S\	\RF                     4S jr1S\RF                  S\	\RF                     4S jr2S\RF                  S\3\RF                  \44   S\	\RF                     4S jr5S\RF                  S\3\RF                  \44   S\	\RF                     4S jr6S\RF                  S\74S jr8\ Rr                  " SS9 " S S 5      5       r:\
S!S"S#\RF                  S$\RF                  S%\S   S\	\"\'\'4      4
S& j5       r;\
 SBS!S"S#\RF                  S$\RF                  S%\S'   S\"\'\'4   4
S( jj5       r; SBS!S"S#\RF                  S$\RF                  S%\7S\	\"\'\'4      4
S) jjr; " S* S+5      r<S,\%\RL                     S-\%\RL                     S.\%\RL                     S/\%\RL                     S0\%\%\RF                        S1\%\%\\%\RF                     /\RF                  4         S\3\RL                  \RF                  4   4S2 jr=S3\S   S\	\:   4S4 jr>S5\RF                  S\3\RL                  \44   S6\\?   S\44S7 jr@S8\?S\	\4   4S9 jrAS:\\RF                  \44   S\44S; jrB\ Rr                  " SS9 " S< S=5      5       rC\ Rr                  " SS9 " S> S?5      5       rDS@\S   S\	\D   4SA jrEg)Cé    N)ÚCounterÚdefaultdict)ÚCallable)ÚLiteralÚOptionalÚoverloadÚTYPE_CHECKINGÚTypeVarÚUnion)Úindex_vars_no_squeeze)Úsympy_productÚ
sympy_subs)Ú
OrderedSet)ÚIdentity)Ú	try_solve)Úsymbol_is_typeÚSymTé   ©ÚVÚTÚU.Úloop_tiling)ÚFloorDivÚModularIndexing©ÚFusedSchedulerNodeÚSchedulerNodeÚexprÚreturnc                 óú  • U R                  5       (       a  g[        U [        5      (       a  g[        U R                  5      S:X  d   e[        [        U R                  5      5      n[        U [        5      (       a<  [        [        R                  " U R                  S   U R                  S   5      U5      nO![        [        R                  " U S5      U5      nU(       a  US   R                  5       (       d  gUS   $ )zk
Given an expr with a single free symbol, solve for a constant relation that would make
this expression 0.
Nr   r   é   )Úis_constantÚ
isinstancer   ÚlenÚfree_symbolsÚnextÚiterr   r   ÚsympyÚEqÚargs)r   Úfree_symbolÚouts      ÚY/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/tiling_utils.pyÚsolve_for_zeror/   $   sÀ   € ð
 ×Ñ×ÑØÜ	�Dœ(×	#Ñ	#Øäˆt× Ñ Ó! QÓ&Ð&Ð&Ü”t˜D×-Ñ-Ó.Ó/€KÜ�$œ×(Ñ(ÜœŸš §¡¨1¡¨t¯y©y¸©|Ó<¸kÓJ‰äœŸš  qÓ)¨;Ó7ˆÞ�c˜!‘f×(Ñ(×*Ñ*ØØˆq‰6€Mó    c           	      ól  ^• [        U R                  5      S:w  a  g[        [        U R                  5      5      mS[        R
                  S[        [        R
                     4U4S jjnU R                  [        5      (       d"  U R                  [        5      (       d  U" U 5      $ / n/ n[        R                  R                  U 5       H�  n[        U[        R                  5      (       aZ  SnUR                   H=  n[        U5      nUc  M  UR!                  5       (       d   eSnUR#                  U5        M?     U(       d    gM|  UR#                  U5        M�     U(       d  g[%        U5      n SS[        R
                  S	[        R
                  S
[        [        R
                     S[        R
                  4S jjn	UR'                  [        U	5      R'                  [        U	5      n
U" U
5      nU(       a  [)        UTU05      S:w  a  gUR#                  U5        [        [+        U5      5      S:X  a  US   $ g)a¨  
Giving an expr with a single free symbol, try to find a tiling that would
make the expression coalesced with respect to that symbol.

Tiling an expression `x` by `y` means that the expression will now be indexed
by both the original (x) and by (x * y). So we are looking for a
multiplicative factor that will make ((x + 1) * y) - (x * y) == 1.

To simplify things for sympy, we'll try just x * y == 1, check x(1) and x(0).
r   Nr   r    c                 ó0  >• U R                  [        5      (       d  U R                  [        5      (       a   e[        U R                  5      S:w  a  g [        [        R                  " U S5      T5      nU(       a  US   R                  5       (       d  g US   $ )Nr   )	Úhasr   r   r%   r&   r   r)   r*   r#   )r   r-   r,   s     €r.   Ú_solve_simple_exprÚ,solve_for_tiling.<locals>._solve_simple_exprJ   st   ø€ Ø—8‘8œO×,Ñ,°T·X±X¼h×5GÑ5GÐGÐGÜˆt× Ñ Ó! QÓ&ØäœŸš  qÓ)¨;Ó7ˆÞ˜#˜a™&×,Ñ,×.Ñ.ØØ�1‰vˆr0   FTÚxÚyÚzc                 ó
   • X-  $ ©N© )r6   r7   r8   s      r.   Úindexing_div_repÚ*solve_for_tiling.<locals>.indexing_div_repw   s   € ð
 ‰uˆr0   r   r:   )r%   r&   r'   r(   r)   ÚExprr   r3   r   r   ÚAddÚ	make_argsr$   ÚMulr+   r/   r#   ÚappendÚsumÚreplacer   r   )r   r4   Úrequired_valuesÚeq_1_expressionsÚargÚseenÚmul_argr-   Ú	eq_1_exprr<   Úeq_1_expr_simplifiedr,   s              @r.   Úsolve_for_tilingrL   9   sì  ø€ ô ˆ4×ÑÓ Ó"Øä”t˜D×-Ñ-Ó.Ó/€Kð¤§¡ð ´¼¿¹Ñ0D÷ ð �8‰8”O×$Ñ$¨T¯X©X´h×-?Ñ-?Ù! $Ó'Ð'à€OØÐô
 �y‰y×"Ñ" 4Ö(ˆä�cœ5Ÿ9™9×%Ñ%ØˆDàŸ8œ8�Ü$ WÓ-�Ø‘;Ùà—‘×(Ñ(Ð(Ð(Ø�Ø×&Ñ& sÖ+ñ $ö Ùñ ð ×#Ñ# CÖ(ñ# )ö& ØäÐ$Ó%€Ið
 #'ñÜ�:‰:ðä�:‰:ðô ”E—J‘JÑðô 
�‰õ	ð %×,Ñ,¬_Ð>NÓO×WÑWÜÐ"óÐñ Ð1Ó
2€Cö ”*˜Y¨°cÐ(:Ó;¸qÓ@Øà×Ñ˜3Ôä
Œ:�oÓ&Ó'¨1Ó,Ø˜qÑ!Ð!àr0   ÚindexÚ
var_rangesc                 ó0  • 0 nU R                    H  nX1;   a  SX#'   M  [        U5      X#'   M     [        X5      nU H1  nX0R                   ;  a  M  SX#'    [        X5      nXT:X  a  Us  $ SX#'   M3     g! [         a    [        R                  SX5         MY  f = f)z°
Try to find the variable that this index is broadcast over.
A broadcast pattern is one where consecutive values of a variable
access the same memory location (e.g., x // 10).
r   r   úzero division error %s %sN)r&   Úget_hintr   ÚZeroDivisionErrorÚloop_tiling_logÚinfo)rM   rN   Ú	variablesÚvÚ
zero_indexÚnew_vals         r.   Úfind_broadcast_varrY   “   s©   € ð *,€IØ×ÔˆØ‹?ØˆI‹Lä# A›;ˆI‹Lñ	  ô ˜EÓ-€JÛˆØ×&Ñ&Ó&Ùàˆ	‰ð	Ü  Ó2ˆGð
 Ó ØŠHØˆ	‹ñ ð øô !ó 	Ü× Ñ Ð!<¸eÔOÚð	ús   ÁA1Á1 BÂBc                 ó¢  • [         R                  R                  U 5      nU H  nX2;   d  M
  Us  $    0 nU R                   H  nX1;   a  SXC'   M  [	        U5      XC'   M     [        X5      nU H9  nSXC'    [        X5      nXe-
  S:X  a  SXC'   [        X5      U-
  S:X  a  Us  $ SXC'   M;     g! [         a    [        R                  SX5         Ma  f = f)z3
Try to find the symbol which coalesces this index
r   r   rP   r"   N)	r)   r?   r@   r&   rQ   r   rR   rS   rT   )rM   rN   Útop_level_termsrV   rU   rW   rX   s          r.   Úfind_coalesced_varr\   ¶   så   € ô —i‘i×)Ñ)¨%Ó0€OÛˆØÕØŠHñ ð
 *,€IØ×ÔˆØ‹?ØˆI‹Lä# A›;ˆI‹Lñ	  ô ˜EÓ-€JÛˆØˆ	‰ð	Ü  Ó2ˆGð Ñ 1Ó$ØˆI‰Lô ˜5Ó,¨wÑ6¸1Ó<Ø’Øˆ	‹ñ ð øô !ó 	Ü× Ñ Ð!<¸eÔOÚð	ús   Á4B*Â* CÃCÚmemory_exprc                 ó:   • [        S U R                   5       5      $ )z<
Check if this memory expression has any indirect indexing.
c              3   óV   #   • U  H  n[        U[        R                  5      v •  M!     g 7fr:   )r   r   ÚINDIRECT©Ú.0Úss     r.   Ú	<genexpr>Ú&has_indirect_access.<locals>.<genexpr>à   s    é € ÐRÒ9Q°AŒ~˜a¤§¡×/Ð/Ò9Qùs   ‚'))Úanyr&   )r]   s    r.   Úhas_indirect_accessrg   Ü   s   € ô ÑR¸×9QÒ9QÓRÓRÐRr0   T)Úfrozenc                   óæ   • \ rS rSr% Sr\\R                     \S'   \\R                     \S'   \	\R                  \\   4   \S'   \	\R                  \\   4   \S'   \	\R                  \4   \S'   Srg	)
ÚFusedNormalizedReadsWriteséã   zG
Normalized reads and writes for nodes in the same FusedSchedulerNode.
Ú
index_varsÚreduce_varsÚreadsÚwritesrN   r;   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r)   ÚSymbolÚ__annotations__Údictr>   ÚstrÚintÚ__static_attributes__r;   r0   r.   rj   rj   ã   sk   ‡ ñð ˜5Ÿ<™<Ñ(Ó(Ø˜EŸL™LÑ)Ó)Ø�—
‘
˜J s™OÐ+Ñ,Ó,Ø�—‘˜Z¨™_Ð,Ñ-Ó-Ø�U—\‘\ 3Ð&Ñ'Ö'r0   rj   Únr   Úpointwise_numelÚ	red_numelÚnone_if_not_divisiblec                 ó   • g r:   r;   ©r{   r|   r}   r~   s       r.   Úget_pw_red_splitsr�   ð   s   € ð 58r0   Fc                 ó   • g r:   r;   r€   s       r.   r�   r�   ù   s   € ð +.r0   c                 ó   • U R                  5       (       d&  [        U R                  R                  S   5      U:X  a^  U R                  R                  U R                  R                  S   4U R                  R
                  U R                  R                  S   44$ [        [        U R                  R                  S   5      5      [        X-  5      :X  d   e[        U R                  R                  S   5      S-
  nSnUS:¼  a1  XPR                  R                  S   U   -  nXR:X  a  OUS-  nUS:¼  a  M1  US:¼  ap  U R                  R                  S   SU nU R                  R                  SU nU R                  R                  S   US  nU R                  R                  US  n	Xv4X˜44$ U(       a  g U R                  R                  U R                  R                  S   4U R                  R
                  U R                  R                  S   44$ )Nr   r   )Úis_reductionr   Ú_bodyÚsizesÚ	iter_varsrm   rQ   r%   )
r{   r|   r}   r~   ÚiÚprodÚ	pw_splitsr‡   Ú
red_splitsÚred_varss
             r.   r�   r�     sÓ  € ð 	‡~�~×Ñœ=¨¯©¯©°qÑ)9Ó:¸oÓMð �W‰W×Ñ §¡§¡¨aÑ 0Ð1Ø�W‰W× Ñ  !§'¡'§-¡-°Ñ"2Ð3ð
ð 	
ô
 ”M !§'¡'§-¡-°Ñ"2Ó3Ó4¼ØÑ#ó9ó ð ð ô 	ˆA�G‰G�M‰M˜!ÑÓ Ñ!€AØ€DØ
ˆq‹&Ø—‘—‘˜aÑ  Ñ#Ñ#ˆØÓØØ	ˆQ‰ˆð	 ˆq�&ð 	ˆAƒvØ—G‘G—M‘M !Ñ$ Q qÐ)ˆ	Ø—G‘G×%Ñ% a¨Ð*ˆ	à—W‘W—]‘] 1Ñ% a bÐ)ˆ
Ø—7‘7×$Ñ$ Q RÐ(ˆØÐ%¨Ð'=Ð=Ð=æØð �W‰W×Ñ §¡§¡¨aÑ 0Ð1Ø�W‰W× Ñ  !§'¡'§-¡-°Ñ"2Ð3ð
ð 	
r0   c            	       ój   • \ rS rSrSrS\S   4S jrS\\\4   4S jr	S\S	\S\
\\\4      4S
 jrSrg)ÚNodeSplitGetteri,  zW
Finds a Pointwise, Reduction Split that compatible with all nodes in a SchedulerNode.
Únoder   c                 ór  • Xl         UR                  S   S   U l        UR                  S   S   U l        [	        [
        5      U l        [	        [
        5      U l        SU l        [        5       U l	        UR                  S   n[        UR                  5       5       GH‰  n[        U[        R                  R                  R                   5      (       d  M9  [#        X0R                  U R                  SS9nUc1  U R                  R%                  UR&                  R(                  5        MŒ  Uu  u  pVu  pW[        R                  R*                  R,                  R.                  R1                  X&U4U R                  5      u  pgU R                  [3        U5         R%                  [5        U5      5        U R                  [3        U5         R%                  [5        U5      5        US:w  a  [7        U5      4U l        [5        U5      [5        U5      4nU R                  R%                  U5        GMŒ     [        5       U l        g )Nr   r   r;   T)r~   )r�   Úgroupr|   r}   r   r   Úpw_split_optionsÚred_split_optionsÚreduction_splitÚall_node_sizesÚreversedÚ	get_nodesr$   ÚtorchÚ	_inductorÚ	schedulerr   r�   Úaddr…   r†   ÚcodegenÚsimdÚ
SIMDKernelÚprepare_split_iteration_lengthsr%   Útupler   Úseen_pw_splits)	Úselfr�   Úfused_groupr{   Úmaybe_splitsÚ_Ún_pw_splitsÚn_red_splitsÚn_sizes	            r.   Ú__init__ÚNodeSplitGetter.__init__1  sÅ  € ð Œ	Ø+/¯:©:°a©=¸Ñ+;ˆÔØ%)§Z¡Z°¡]°1Ñ%5ˆŒä>IÌ*Ó>UˆÔÜ?JÌ:Ó?VˆÔà&(ˆÔÜ?I»|ˆÔà—j‘j ‘mˆÜ˜$Ÿ.™.Ó*×+ˆAÜ˜a¤§¡×!:Ñ!:×!HÑ!H×IÑIÙô
 -Ø×'Ñ'¨¯©ÈtñˆLð Ñ#Ø×#Ñ#×'Ñ'¨¯©¯©Ô6Ùà2>Ñ/ÑˆQÑ/˜qô —‘×'Ñ'×,Ñ,×7Ñ7×WÑWØ¨|Ð!<¸d¿n¹nóñ &ˆKð ×!Ñ!¤# kÓ"2Ñ3×7Ñ7¼¸kÓ8JÔKØ×"Ñ"¤3 |Ó#4Ñ5×9Ñ9¼%ÀÓ:MÔNà˜rÓ!Ü(5°lÓ(CÐ'E�Ô$ä˜KÓ(¬%°Ó*=Ð>ˆFØ×Ñ×#Ñ# F×+ñ= ,ô@ 2<³ˆÕr0   r    c                 óF  • [        U R                  5      S:X  a  [        [        U R                  5      5      $ [        U R                  5      S:X  a  U R
                  4U R                  44$ [        U R                  R                  5       5      n[        U R                  R                  5       5      nS[        [        [        [           4   S[        SS4S jnX-   n[        [        USS5      5       H“  u  pV[        USS5       HS  nU R                  U    H=  nU R                  Xg-
      H%  n	U R!                  X‰5      =n
(       d  M  U
s  s  s  s  $    M?     MU     U" U R                  X-
  5        U" U R                  X%-
  5        M•     U R
                  4U R                  44$ )	z9
Get a compatible pointwise, reduction split of the node
r   r   Úsplit_optionsÚcurr_lengthr    Nc                 óà   • X    Hf  n[        [        U5      S-
  5       HH  n[        USU [        X#US-    5      4-   X#S-   S  -   5      nU [        U5         R	                  U5        MJ     Mh     g )Nr   r   r"   )Úranger%   r    r   r›   )r¬   r­   Úsplitrˆ   Ú	new_splits        r.   Úadd_combined_split_optionsÚCNodeSplitGetter.get_node_splits.<locals>.add_combined_split_optionsp  sz   € ð 'Ô3�Üœs 5›z¨A™~Ö.�AÜ %Ø˜a ˜
¤m°E¸aÀ!¹eÐ4DÓ&EÐ%GÑGÈ%ÐTUÑPUÐPWÈ.ÑXó!�Ið "¤# i£.Ñ1×5Ñ5°iÖ@ó	 /ò 4r0   éÿÿÿÿ)r%   r•   r'   r(   r’   r|   r}   ÚmaxÚkeysr“   rw   ry   r   ÚSplitÚ	enumerater¯   Ú	try_split)r¢   Úmax_pw_splitÚmax_red_splitr²   Úmax_total_splitsÚ	curr_iterÚtotal_splitsÚpw_split_lenÚpw_splitÚ	red_splitr-   s              r.   Úget_node_splitsÚNodeSplitGetter.get_node_splitsb  sŽ  € ô
 ˆt×"Ñ"Ó# qÓ(Üœ˜T×0Ñ0Ó1Ó2Ð2äˆt×$Ñ$Ó%¨Ó*Ø×)Ñ)Ð+¨d¯n©nÐ->Ð?Ð?ä˜4×0Ñ0×5Ñ5Ó7Ó8ˆÜ˜D×2Ñ2×7Ñ7Ó9Ó:ˆð	AÜ¤¤Z´Ñ%6Ð 6Ñ7ð	AÜFIð	Aàô	Að (Ñ7ÐÜ'0´Ð7GÈÈBÓ1OÖ'PÑ#ˆIÜ % l°A°rÖ :�Ø $× 5Ñ 5°lÔ C�HØ%)×%;Ñ%;Ø$Ñ3ô&˜	ð #'§.¡.°Ó"EÐE˜3×EØ#&ŸJ˜Jó	&ó !Dñ !;ñ ' t×'<Ñ'<¸lÑ>VÔWÙ&Ø×&Ñ&¨Ñ(Aöñ (Qð ×%Ñ%Ð'¨$¯.©.Ð):Ð;Ð;r0   ÚpwÚredc                 ó¼  • SSK JnJn  XR                  ;   a  gU R                  R	                  U5        U R
                   HŠ  u  pV X-   nXV4nUR                  Xx5      u  pš[        U
5      S:X  d   eU	S[        U5       n[        [        R                  R                  U5      5      nXÁ:w  d  Mn  U R                  XÂ5      =n(       d  Mˆ  Us  $    X4$ ! U a       gf = f)z[
See if this split is compatible, and potentially returning a longer split
than the input.
r   )Ú	CantSplitrž   Nr"   )Útorch._inductor.codegen.simdrÇ   rž   r¡   r›   r•   Ú_split_iteration_rangesr%   r    Ú	itertoolsÚchainÚfrom_iterabler¹   )r¢   rÄ   rÅ   rÇ   rž   Ún_pwÚn_redÚgroupsÚlengthsÚsplitsÚgettersÚpw_group_splitsÚflattened_pw_splitsr-   s                 r.   r¹   ÚNodeSplitGetter.try_splitŒ  sß   € ÷ 	Gà×$Ñ$Ó$ØØ×Ñ×Ñ Ô#à×.Ô.‰KˆDðØ™�Ø˜-�Ø",×"DÑ"DÀVÓ"U‘�ô �w“< 1Ó$Ð$Ð$Ø$ Y¤s¨2£wÐ/ˆOô
 #(¬	¯©×(EÑ(EÀoÓ(VÓ"WÐØ"Õ(ØŸ.™.Ð)<ÓBÐB�3×BØ’Jñ# /ð& ˆwˆøð ó Úðús   ÁCÃCÃC)r•   r�   r|   r’   r}   r“   r”   r¡   N)rp   rq   rr   rs   rt   r   r©   r    r·   rÂ   r   r¹   rz   r;   r0   r.   rŽ   rŽ   ,  sY   † ñð/>àÐ9Ñ:ô/>ðb(<  u¨e |Ñ!4ô (<ðT˜Eð ¨ð °(¸5ÀÈÀÑ;NÑ2O÷ r0   rŽ   r‡   rŒ   Únorm_pw_varsÚnorm_red_varsÚ
new_rangesÚreturn_getters_groupsc           	      óÐ  • [        S U 5       5      n[        R                  " SU 35      nSn[        U 5      S:X  a  [        U5      S:X  a  0 $ [        U5      [        X#-   5      :X  d   e/ n	U H*  n
U	R	                  U
 Vs/ s H
  o»" U5      PM     sn5        M,     0 n[        [        X�U4SS95       Hj  u  nu  p®[        U
5      [        U5      :w  a  US:X  d   e[        U5      S:X  d   eM;  UR                  [        X®5       VVs0 s H  u  p¿Xû_M	     snn5        Ml     Sn0 n[        XBU-   SS9 Hp  u  nn/ n[        [        U5      5       H  nUR	                  Xx   5        US-  nM     Sn[        [        U5      S-
  SS5       H  nUU-  UUU   '   UU   U-  nM     Mr     UR                  5        VVs0 s H  u  nnU[        UU5      _M     snn$ s  snf s  snnf s  snnf )zBMaps original variables to expressions using normalized variables.c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr:   )r%   ra   s     r.   rd   Ú$apply_var_mapping.<locals>.<genexpr>Å  s   é € Ð.¢:˜a”3�q—6�6¢:ùs   ‚zv_0:r   T)Ústrictr   r´   )rC   r)   Úsymbolsr%   rB   r¸   ÚzipÚupdater¯   Úitemsr   )r‡   rŒ   rÖ   r×   rØ   rÙ   Únum_varsÚ	flat_varsÚcountÚapply_groupsr‘   ÚgÚiter_vars_to_flat_varsrˆ   Ú	var_grouprV   Úflat_vars_to_new_varsÚ	new_rangeÚnew_varÚ
range_varsr¥   r‰   Úks                          r.   Úapply_var_mappingrî   ®  s  € ô. Ñ.¡:Ó.Ó.€HÜ—’  X JÐ/Ó0€IØ€Eä
ˆ9ƒ~˜Óœs 8›}°Ó1Øˆ	äˆz‹?œc ,Ñ">Ó?Ó?Ð?Ð?Ø€LÛ&ˆØ×Ñ±5Ó9²5¨a˜Q˜yž\±5Ñ9Ö:ñ 'ð  ÐÜ!*ÜˆL hÐ/¸Ñ=ö"ÑˆÑˆEô
 ˆu‹:œ˜Y›Ó'Ø˜“6ˆM�6Ü�y“> QÓ&Ð&Ð&Ùà×%Ñ%¼¸EÔ8MÔ&NÒ8M±° q¢tÑ8MÒ&NÖOñ"ð €EØÐÜ!Ø =Ñ0¸ôÑˆ	�7ð ˆ
Ü”s˜9“~Ö&ˆAØ×Ñ˜iÑ.Ô/Ø�Q‰JŠEñ 'ð ˆÜ”s˜9“~¨Ñ)¨2¨rÖ2ˆAØ3:¸T±>Ð! *¨Q¡-Ñ0Ø˜Q‘< $Ñ&ŠDó 3ñð +×0Ñ0Ô2ôâ2‰DˆAˆqð 	
Œ:�aÐ.Ó/Ò/Ù2òð ùò= :ùó 'Oùó"s   Â G
ÄGÆ9G"r�   c           
      óÌ	  ^)• [        [        5      n[        [        5      nU R                  5       nU R                  5       n[        5       n[        5       m)U HU  n[        R
                  R                  R                  Xd5      (       a  T)R                  U5        MD  UR                  U5        MW     [        U)4S jU R                  R                   5       5      nU R                  S   S   nU R                  S   S   n	[        U 5      R                  5       u  p«[        X«SS9u  u  pÍn[        U R!                  5       5       GHj  n[#        U[$        R&                  R                  R(                  5      (       d  M9  UR*                  n[        [        5      n[        [        5      nU H/  nUR-                  U5       H  nUU   R                  U5        M     M1     U H/  nUR/                  U5       H  nUU   R                  U5        M     M1     U(       d	  U(       d  MÝ  [1        XøU	5      u  u  nnu  nnX«-   nUU4n[$        R&                  R2                  R4                  R6                  R9                  UUU	5      n [$        R&                  R2                  R4                  R6                  R;                  UU5      u  nn[A        UUUUUU5      nS[B        RD                  S[B        RD                  4S	 jnURG                  5        V V!s0 s H  u  n n![I        U" U 5      U5      U!_M     n"n n!URG                  5        V#V!s0 s H  u  n#n![I        U" U#5      U5      U!_M     n$n#n!U"RG                  5        H  u  nn%UU==   U%-  ss'   M     U$RG                  5        H  u  nn%UU==   U%-  ss'   M     GMm     URG                  5        V&V!s0 s H1  u  n&n![        R
                  RJ                  RM                  U&U5      U!_M3     nn&n!URG                  5        V'V!s0 s H1  u  n'n![        R
                  RJ                  RM                  U'U5      U!_M3     nn'n![O        UUUUU5      n([P        RS                  S
U(5        U($ ! [$        R&                  R2                  R4                  R<                   a(    UR>                  (       d  U	R>                  (       d   e   gf = fs  sn!n f s  sn!n#f s  sn!n&f s  sn!n'f )zjExtracts index variables, reduce variables, read/write expressions, and variable ranges from a fused node.c              3   ó^   >#   • U  H"  oR                   T;  d  M  UR                   v •  M$     g 7fr:   )Úname)rb   ÚdepÚremoved_bufferss     €r.   rd   Ú1extract_normalized_read_writes.<locals>.<genexpr>  s$   øé € ð Ú2�S·h±hÀoÑ6U‹ˆ�ŽÒ2ùs   ƒ-š-r   r   r{   )ÚprefixNr   r    c                 ó0   • U R                  [        S 5      $ )Nc                 ó   • U $ r:   r;   )r6   s    r.   Ú<lambda>ÚIextract_normalized_read_writes.<locals>.remove_identity.<locals>.<lambda>K  s   € ±Ar0   )rD   r   )r   s    r.   Úremove_identityÚ7extract_normalized_read_writes.<locals>.remove_identityJ  s   € Ø—<‘<¤©+Ó6Ð6r0   zNormalized Fused reads: %s)*r   r   Úget_buffer_namesÚget_operation_namesr   Úgraphrš   Ú$can_buffer_be_removed_through_fusionr›   Úread_writesrn   r‘   rŽ   rÂ   r   Úlistr—   r$   r˜   r™   r   r…   Úget_all_read_exprÚget_all_write_exprr�   rœ   r�   rž   rŸ   rÉ   rÇ   r&   rî   r)   r>   rá   r   ÚsizevarsÚsimplify_with_rangesrj   rS   rT   )*r�   rn   ro   Úall_output_namesÚop_namesÚoutputsÚbuf_nameÚinputsr|   r}   rŠ   r‹   rÖ   r×   Úrangesr{   ÚbodyÚn_readsÚn_writesÚinpr   r-   r‡   r¦   rŒ   r§   rÏ   rÐ   rØ   rÙ   Úvar_maprú   ÚreadrV   Ún_reads_newÚwriteÚn_writes_newÚ	buf_namesÚrÚwÚ	fused_outró   s*                                            @r.   Úextract_normalized_read_writesr  ó  sv  ø€ ô 0;¼:Ó/F€EÜ0;¼JÓ0G€Fà×,Ñ,Ó.ÐØ×'Ñ'Ó)€HÜ)›|€GÜ'1£|€OÛ$ˆÜ�7‰7×Ñ×AÑAÀ(×UÑUØ×Ñ Ö)à�K‰K˜Ö!ñ	 %ô ô Ø ×,Ñ,×2Ò2óó €Fð #'§*¡*¨Q¡-°Ñ"2€OØ ŸJ™J q™M¨!Ñ,€Iä+¨DÓ1×AÑAÓCÑ€Iô -BØ cñ-Ñ)Ñ!€\ 6ô �$—.‘.Ó"×#ˆÜ˜!œUŸ_™_×6Ñ6×DÑD×EÑEÙà�w‰wˆä5@ÄÓ5LˆÜ6AÄ*Ó6Mˆó ˆCØ×.Ñ.¨sÖ3�Ø˜‘×!Ñ! #Ö&ó 4ñ ó ˆCØ×/Ñ/°Ö4�Ø˜‘×"Ñ" 3Ö'ó 5ñ ö žxÙä=NØ 	ó>
Ñ:Ñ ˆ�KÑ": 8¨\ð Ñ'ˆØ Ð/ˆä�O‰O×#Ñ#×(Ñ(×3Ñ3×SÑSØ˜ óð 	ð

	ä—‘×'Ñ'×,Ñ,×7Ñ7×OÑOØ˜Góñ .ˆJÐ-ô $ØØØØØØ!ó
ˆð	7¤%§*¡*ð 	7´·±ô 	7ð JQÏÉÌô
ÚIX¹g¸dÀAŒJ‘ tÓ,¨gÓ6¸Ò9Éð 	ñ 
ð
 %ŸN™NÔ,ô
â,‘��qô ‘ uÓ-¨wÓ7¸Ò:Ù,ð 	ñ 
ð
  +×0Ñ0Ö2‰OˆD�)Ø�$‹K˜9Ñ$�Kñ  3ð  ,×1Ñ1Ö3‰OˆD�)Ø�4‹L˜IÑ%�Lô  4ñM $ðT INÏÉÌôÚHUÁÀÀ1Œ�‰×Ñ×-Ñ-¨a°Ó8¸!Ò;Éð 
ñ ð IOÏÉÌôÚHVÁÀÀ1Œ�‰×Ñ×-Ñ-¨a°Ó8¸!Ò;Éð ñ ô +ØØØØØó€Iô ×ÑÐ5°yÔAØÐøôc �‰×&Ñ&×+Ñ+×5Ñ5ó 	ð #×/×/°9×3I×3IÐIÐIÚð		üó(
ùó
ùóùós,   É9AQ1Ì SÌ8 SÏ8SÐ8S Ñ1ASÓ
SÚaddrr  c                 ó$  • / nU R                    HK  nUR                  U5      n[        U[        R                  5      (       a  M5  Uc  M:  UR                  U5        MM     SSKJn  UR                  R                  R                  [        U5      5      $ )z/
Score addr according to its approximate size.
r   r   )r&   Úgetr   r   r`   rB   Úvirtualizedr   rþ   r  Úoptimization_hintr   )r  rN   r  Ú	var_sizesrV   Úv_sizer   s          r.   Ú	get_scorer!  m  sp   € ð €IØ×ÔˆØ—‘ Ó"ˆä˜a¤§¡×/Ó/°FÓ4FØ×Ñ˜VÖ$ñ	 õ
 à�7‰7×Ñ×-Ñ-¬m¸IÓ.FÓGÐGr0   r	  c                 óÐ   • [         R                  R                  U 5      nU(       d  g [         R                  R                  R	                  [        UR                  5       5      5      $ r:   )r   rþ   Útry_get_bufferr  r  r   Úget_size)r	  Úbufs     r.   Útry_get_buf_sizer&    sB   € Ü
�'‰'×
 Ñ
  Ó
*€CÞØÜ�7‰7×Ñ×-Ñ-¬m¸C¿L¹L»NÓ.KÓLÐLr0   rV   c                 ó‚   • [        U [        5      (       a  U $ [        R                  R                  R                  U 5      $ r:   )r$   ry   r   rþ   r  r  )rV   s    r.   rQ   rQ   †  s/   € Ü�!”S×ÑØˆä�w‰w×Ñ×1Ñ1°!Ó4Ð4r0   c                   óL   • \ rS rSr% Sr\R                  \S'   \\S'   \\S'   Sr	g)Ú	VarTilingi�  ze
Tiling of a var by `tiling_factor` that yields additional coalesced mem accesses by `benefit_score`
ÚvarÚtiling_factorÚscorer;   N)
rp   rq   rr   rs   rt   r)   ru   rv   ry   rz   r;   r0   r.   r)  r)  �  s   ‡ ñð 
�‰ÓØÓØ†Jr0   r)  c                   ó„   • \ rS rSr% \\R                  \4   \S'   \\R                  \4   \S'   \	\S'   Sr
\\   \S'   Srg)ÚCoalesceVarAnalysisi˜  Úcoalesced_by_varÚuncoalesced_addrsÚnorm_read_writesNÚsuggested_splitr;   )rp   rq   rr   rs   rw   r)   r>   ry   rv   rj   r2  r   r)  rz   r;   r0   r.   r.  r.  ˜  s?   ‡ ð
 ˜5Ÿ:™: s˜?Ñ+Ó+à˜EŸJ™J¨˜OÑ,Ó,à0Ó0à+/€O�X˜iÑ(Ö/r0   r.  Ú
fused_nodec           
      óþ  ^• [        U 5      nUc  gUR                  nUR                  nUR                  n[	        5       n[	        5       n[
        R                  " S UR                  5        5       S UR                  5        5       5       Hå  u  nu  p‰[        X„U	5      n
U
S:X  a  M  [        U5      nU(       a  SnO[        X„5      nUc  [        X„5      nSnU	 He  n[        R                  R                  U5      =n(       d  M+  [        U5      =n(       d  M?  U[!        UU
5      UR"                  R$                  -  -  nMg     X×(       a  SOS-  nU(       a  X\==   U-  ss'   MÙ  Xh==   U-  ss'   Mç     U(       d  ['        UUUS9$ [)        [        5      nUR                  5        GHK  u  nn[        U5      (       a  M  [*        R-                  UR/                  5       S5      nUR0                  UR/                  5       -   Hí  nUU;  a  M  US:X  a  M  UU	 [3        UU5      nSUU'   [5        UR0                  5      S:w  a  MB  [7        U5      nUb&  UR9                  5       (       a  UR:                  (       d  Mx  [=        U5      n[        R                  R>                  RA                  UUU   5      (       d  M·  Sm[C        U4S	 jUUU   U-  4 5       5      (       d  MÝ  UU   U==   U-  ss'   Mï     GMN     [5        U5      S:X  a  ['        UUUS9$ SnSnUR                  5        H.  u  nnUR                  5        H  u  nnUU:”  d  M  UU4nUnM     M0     Uc  ['        UUUS9$ ['        UUU[E        US   US   U5      S
9$ )a?  
Find variables that coalesce the reads and writes and score the total size.

If uncoalesced memory expressions are found, look for additionally tiling of variables
which will coalesce memory accesses.

For instance - for the following expression:

(32*p0) // 2048

Tiling p0 by 64 will make this expression coalesced.
Nc              3   ó*   #   • U  H	  nS U4v •  M     g7f)TNr;   ©rb   Úitems     r.   rd   Ú,analyze_memory_coalescing.<locals>.<genexpr>Ã  s   é € Ð0¢-˜$ˆ$��¢-ùó   ‚c              3   ó*   #   • U  H	  nS U4v •  M     g7f)FNr;   r6  s     r.   rd   r8  Å  s   é € Ð2¢>˜4ˆ%��¢>ùr9  r   r   r"   )r/  r0  r1  é   c              3   óx   >#   • U  H/  n[         R                  R                  R                  TU5      v •  M1     g 7fr:   )r   rþ   r  Ústatically_known_lt)rb   ÚblockÚMIN_TILING_BLOCKs     €r.   rd   r8    s3   øé € ð âL�Eô —‘× Ñ ×4Ñ4Ð5EÀu×MÐMÚLùs   ƒ7:)r/  r0  r1  r2  )#r  rn   ro   rN   r   rÊ   rË   rá   r!  rg   r\   rY   r   rþ   r#  r&  ÚminÚdtypeÚitemsizer.  r   rw   Úfromkeysr¶   r&   r   r%   rL   r#   Ú
is_integerry   r  r=  Úallr)  )r3  r1  rn   ro   rN   r/  r0  Úis_readr]   r  ÚsizeÚindirect_exprÚmaybe_coalesced_varÚtotal_scorer	  r%  Úbuf_sizeÚtiling_scoresÚuncoalesced_exprÚ
addr_scoreÚ	expr_subsrV   Úsingle_var_exprr+  Úbest_tilingÚbest_tiling_scorer*  Útiling_counterÚtileÚ
tile_scorer?  s                                 @r.   Úanalyze_memory_coalescingrV  ¦  s’  ø€ ô  6°jÓAÐàÑØà×"Ñ"€EØ×$Ñ$€FØ!×,Ñ,€Jä07³	ÐÜ/6«yÐä-6¯_ª_Ù0 %§+¡+¤-Ó0á2 6§<¡<¤>Ó2ö.Ñ)ˆÑ)�+ô
 ˜°)Ó<ˆØ�1‹9Ùô ,¨KÓ8ˆæØ"&Ñä"4°[Ó"MÐð #Ñ*Ü&8¸Ó&QÐ#àˆÛ!ˆHÜ—w‘w×-Ñ-¨hÓ7Ð7�×7Ü,¨XÓ6Ð6�×6ð œs 8¨TÓ2°S·Y±Y×5GÑ5GÑGÑG’ñ "ð 	�G‘q¨Ñ*ˆæØÓ1°[Ñ@Õ1àÓ*¨kÑ9Õ*ñK.öN Ü"Ø-Ø/Ø-ñ
ð 	
ô 7BÄ'Ó6J€Mà(9×(?Ñ(?×(AÑ$Ð˜*ÜÐ/×0Ñ0Ùä—M‘M *§/¡/Ó"3°QÓ7ˆ	Ø!×.Ñ.°·±Ó1BÔBˆAà˜
Ó"Ùà˜Q‹Ùà˜!�Ü(Ð)9¸9ÓEˆOØˆI�a‰Lä�?×/Ñ/Ó0°AÓ5Ùä,¨_Ó=ˆMð Ñ%Ø$×0Ñ0×2Ñ2Ø$×/×/áä Ó.ˆMÜ—7‘7×#Ñ#×7Ñ7¸ÀzÐRSÁ}×UÑUÙð
  !ÐÜô à+¨Z¸©]¸mÑ-KÑLó÷ ñ ñ à˜!Ñ˜]Ó+¨zÑ9Õ+ôM Cñ )BôZ ˆ=Ó˜QÓÜ"Ø-Ø/Ø-ñ
ð 	
ð 59€KØÐà,×2Ñ2Ö4Ñˆˆ^Ø .× 4Ñ 4Ö 6ÑˆD�*ØÐ-Õ-Ø" D˜k�Ø$.Ò!ó !7ñ  5ð ÑÜ"Ø-Ø/Ø-ñ
ð 	
ô Ø)Ø+Ø)Ü! +¨a¡.°+¸a±.ÐBSÓTñ	ð r0   )F)FÚdataclassesrÊ   Úcollectionsr   r   Úcollections.abcr   Útypingr   r   r   r	   r
   r   r)   r˜   Útorch._inductor.dependenciesr   Útorch._inductor.utilsr   r   Útorch.utils._ordered_setr   Útorch.utils._sympy.functionsr   Útorch.utils._sympy.solver   Útorch.utils._sympy.symbolr   r   r  r   r   r   r    r>   r·   r  ru   ÚVarsAndRangesÚ_loggingÚgetArtifactLoggerrp   rS   r   r   Útorch._inductor.schedulerr   r   r/   rL   rw   ry   rY   r\   Úboolrg   Ú	dataclassrj   r�   rŽ   rî   r  rx   r!  r&  rQ   r)  r.  rV  r;   r0   r.   Ú<module>rg     sk  ðÛ Û ß ,Ý $ß M× Mã ã Ý >ß ;Ý /Ý 1Ý .ß :å ñ ˆCƒL€ÙˆCƒL€ð 	ˆe�j‰j˜#ˆoÑ€Ø�d˜5Ÿ<™<Ñ(¨$¨u¯z©zÑ*:Ð:Ñ;€ð —.‘.×2Ñ2°8¸]ÓK€ß Bö ßKð˜Ÿ™ð ¨°·±Ñ(<ô ð*W˜5Ÿ:™:ð W¨(°5·:±:Ñ*>ô Wðt Ø�:‰:ð Ø#'¨¯
©
°C¨Ñ#8ð àˆe�j‰jÑô ðF#Ø�:‰:ð#Ø#'¨¯
©
°C¨Ñ#8ð#àˆe�j‰jÑô#ðLS U§Z¡Zð S°Dô Sð ×Ò˜dÑ#÷	(ð 	(ó $ð	(ð 
ð8Øð8à—Z‘Zð8ð �z‰zð8ð # 4™=ð	8ð
 ˆe�M =Ð0Ñ1Ñ2ó8ó 
ð8ð 
ð
 -2ñ	.Øð.à—Z‘Zð.ð �z‰zð.ð # 5™>ð	.ð
 ˆ=˜-Ð'Ñ(ô.ó 
ð.ð #(ñ	'
Øð'
à—Z‘Zð'
ð �z‰zð'
ð  ð	'
ð
 ˆe�M =Ð0Ñ1Ñ2õ'
÷Tñ ðDBØ�E—L‘LÑ!ðBà�5—<‘<Ñ ðBð �u—|‘|Ñ$ðBð ˜Ÿ™Ñ%ð	Bð
 �T˜%Ÿ*™*Ñ%Ñ&ðBð    X¨t°E·J±JÑ/?Ð.@À%Ç*Á*Ð.LÑ%MÑ NÑOðBð 
ˆ%�,‰,˜Ÿ
™
Ð
"Ñ#ôBðJwØ
Ð5Ñ
6ðwàÐ(Ñ)ôwðtHØ
�*‰*ðHØ"& u§|¡|°SÐ'8Ñ"9ðHØFPÐQTÁoðHàôHð$M˜sð M x°¡}ô Mð5��e—j‘j #�oÑ&ð 5¨3ô 5ð ×Ò˜dÑ#÷ð ó $ðð ×Ò˜dÑ#÷
0ð 
0ó $ð
0ðZØÐ;Ñ<ðZàÐ!Ñ"õZr0   