
    iF                        U d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZ eez  eedf   z  dz  Zeed	<    G d
 d      Zdeded   fdZ G d de      Zeez  Zeed<   eedf   ez  dz  Zeed<   eez  eedf   z  dz  Zeed<   deeedf   z  defdZdedefdZdedefdZd-dededefdZ d-dededefdZ!dededefdZ"d.dededefd Z#dedz  dedz  fd!Z$dedz  dedz  fd"Z%dededefd#Z&dededefd$Z'd%edededefd&Z(dededefd'Z)dededefd(Z*dededefd)Z+dededefd*Z,d+eedf   dedeeef   fd,Z-y)/z
Definition of CuTe Layouts and functions to manipulate them which works with the order
of lexicographic instead of co-lexicographic as implemented in the original layout.py
    )chain)	TypeAlias)SelfTypeIs   )	crd2idxflattenhas_noneIntTupleis_intis_tupleproductslice_suffix_product.NCoordinateTypec                       e Zd Zy)
LayoutBaseN)__name__
__module____qualname__     Z/var/www/html/engine/venv/lib/python3.12/site-packages/torch/distributed/_pycute/layout.pyr   r   =   s    r   r   xreturnLayoutc                 "    t        | t              S N)
isinstancer   )r   s    r   	is_layoutr    A   s    a$$r   c                       e Zd Zddededz  ddfdZdedefdZdefdZ	d	e
deez  fd
ZdedefdZdefdZdefdZdefdZdefdZy)r   N_shape_strider   c                 Z    || _         |t        | j                         | _        y || _        y r   )shaper   stride)selfr"   r#   s      r   __init__zLayout.__init__F   s%    
?(4DK!DKr   otherc                     t        |t              sy| j                  |j                  k(  xr | j                  |j                  k(  S )NF)r   r   r%   r&   )r'   r)   s     r   __eq__zLayout.__eq__N   s4    %(zzU[[(HT[[ELL-HHr   c                 X    t        | j                        rt        | j                        S yNr   )r   r%   lenr'   s    r   __len__zLayout.__len__T   s    DJJtzz?"r   argsc                    t        |      r|t        |      dk(  r:t        t        |d   | j                        t        |d   | j
                              S t        t        || j                        t        || j
                              S t        |      dk(  r$t        |d   | j                  | j
                        S t        || j                  | j
                        S )a  
        Map a logical coordinate to a linear index (Coord has no Underscore slice operators)
        OR
        Slice the layout and return the sublayout (Coord has an Underscore slice op)

        Follow the same behavior of `Layout::operator(Coord const&)` in cute C++
        r   r   )r
   r.   r   r   r%   r&   r   )r'   r1   s     r   __call__zLayout.__call__[   s     D>4yA~fT!Wdjj96$q'4;;;WXXfT4::6tT[[8QRR4yA~tAw

DKK@@tTZZ==r   ic                     t        | j                        r&t        | j                  |   | j                  |         S |dk(  sJ t        | j                  | j                        S )Nr   )r   r%   r   r&   )r'   r4   s     r   __getitem__zLayout.__getitem__o   sK    DJJ$**Q-Q886M6$**dkk22r   c                 ,    t        | j                        S r   )r   r%   r/   s    r   sizezLayout.sizew   s    tzz""r   c                 :     | | j                         dz
        dz   S r-   )r8   r/   s    r   cosizezLayout.cosize{   s    DIIK!O$q((r   c                 8    | j                    d| j                   S )N:r%   r&   r/   s    r   __str__zLayout.__str__   s    **Qt{{m,,r   c                 <    d| j                    d| j                   dS )NzLayout(,)r=   r/   s    r   __repr__zLayout.__repr__   s    Adkk]!44r   r   )r   r   r   r   r(   objectboolr+   intr0   r   r   r3   r6   r8   r:   strr>   rB   r   r   r   r   r   E   s    "x "(T/ "T "IF It I >n > >(3S 3T 3#c #) )- -5# 5r   LayoutOrIntTupleLayoutProfileLayoutInputlayoutsc                      t        |       dk(  rt        | d         s| d   } t        d | D         \  }}t        ||      S )Nr   r   c              3   L   K   | ]  }|j                   |j                  f  y wr   r=   ).0as     r   	<genexpr>zmake_layout.<locals>.<genexpr>   s     ?!177AHH-?s   "$)r.   r    zipr   )rJ   r%   r&   s      r   make_layoutrQ      sC    
7|q71:!6!*?w?@ME6%  r   layoutc                 N    t        |       r| j                         S t        |       S r   )r    r8   r   rR   s    r   r8   r8      s     {{}6?r   c                 "    | j                         S r   )r:   rT   s    r   r:   r:      s    ==?r   profilec                     t              rot               t              k\  sJ t        t         fdt	        t                    D         fdt	        t              t                     D                    S dg}dg}t        t        t         j                              t        t         j                                    D ]Z  \  }}|dk(  r|d   dk(  r||d<   ||d<   |d   |d   z  |k(  r|d   |z  |d<   9|j                  |       |j                  |       \ t        |      dk(  rt        |d   |d         S |j                          |j                          t        t        |      t        |            S )Nc              3   B   K   | ]  }t        |   |           y wr   )coalescerM   r4   rR   rV   s     r   rO   zcoalesce.<locals>.<genexpr>   s      NQ&)WQZ0N   c              3   (   K   | ]	  }|     y wr   r   rM   r4   rR   s     r   rO   zcoalesce.<locals>.<genexpr>        EqE   r   r   )r   r.   rQ   r   rangerP   reversedr	   r%   r&   appendr   reversetuplerR   rV   result_shaperesult_strider%   r&   s   ``    r   rY   rY      ss   6{c'l***N%G:MNEE#g,F$DE
 	
 3LCM &''&--2H)I )v A:""$L &M""b 11V;+B/%7L &  (!)$ <Al1o}Q'788eL)5+?@@r   c                 T    t              rot               t              k\  sJ t        t         fdt	        t                    D         fdt	        t              t                     D                    S g }g }t        t         j                        t         j                              D ]3  \  }}|dk(  r|dk(  r|j                  |       |j                  |       5 t        |      dk(  rt        dd      S t        t        t        |      t        |                  S )Nc              3   B   K   | ]  }t        |   |           y wr   )filterrZ   s     r   rO   zfilter.<locals>.<genexpr>   s      L1q	71:.Lr[   c              3   (   K   | ]	  }|     y wr   r   r]   s     r   rO   zfilter.<locals>.<genexpr>   r^   r_   r   r   )r   r.   rQ   r   ra   rP   r	   r%   r&   rc   r   rY   re   rf   s   ``    r   rk   rk      s    6{c'l***Lc'l8KLEE#g,F$DE
 	
 LMWV\\2GFMM4JK )v
fk&  (	) <Aa|u\2E-4HIJJr   layoutAlayoutBc                      S t              rt         t                    S t              rot	               t	              k\  sJ t        t         fdt        t	                    D         fdt        t	              t	                     D                    S t        j                        rt         fdD              S j                  dk(  rt        j                  d      S g }g }j                  }j                  }t               }t        t        t        |j                        dd        t        t        |j                        dd              D ]f  \  }}||z  dk(  s
||z  dk(  sJ t        t        d||z        |      }	|	dk7  r%|j!                  |	       |j!                  ||z         ||	z  }| |z   }h |dk7  st	        |      dk(  r;|j!                  |       |j!                  |t        |j                        d   z         |j#                          |j#                          t	        |      dk(  rt        |d   |d         S t        t%        |      t%        |            S )Nc              3   B   K   | ]  }t        |   |           y wr   compositionrM   r4   rm   rn   s     r   rO   zcomposition.<locals>.<genexpr>   s      RWQZ4Rr[   c              3   (   K   | ]	  }|     y wr   r   rM   r4   rm   s     r   rO   zcomposition.<locals>.<genexpr>        GGr_   c              3   6   K   | ]  }t        |        y wr   rq   )rM   	layoutB_irm   s     r   rO   zcomposition.<locals>.<genexpr>   s     Ty;w	:Ts   r   r   )r   rr   r   r   r.   rQ   r   ra   r%   r&   rY   rP   rb   r	   minmaxrc   rd   re   )
rm   rn   rg   rh   
rest_shaperest_strideflat_A
curr_shapecurr_stride	new_shapes
   ``        r   rr   rr      sC   	7F7O44	'	7|s7|+++ReCL>QRGU3w<W%FG
 	
 
'--	 TGTTT~~gmmQ'']]
nn'" (+WV\\*12./'&--:PQRQS:T1U(
 	#J +q0K*4LPQ4QQQC:#<=zJIA~##I.$$[;%>?#y0J
*K	$ ?c,/14
+  wv}}/Ea/H!HI 	|!,q/=+;<<%-u]/CDDr   max_idxc                 ^   t        |       rt        t        |             S g }g }d}t        t	        t        | j                        t        | j                                    }|D ]W  \  }}|dk(  s|dk(  r|||z  k  }t        |      t        us|sJ |j                  ||z         |j                  |       ||z  }Y |j                  ||z   dz
  |z         |j                  |       |j                          |j                          t        t        t        |      t        |                  S )Nr   r   )r   
complementr   sortedrP   r	   r&   r%   typerD   rc   rd   rY   re   )	rR   r   rg   rh   current_idx	sorted_DSr&   r%   in_bounds	            r   r   r   '  s   f~&.))LMKs76==176<<3HIJI" 
%Q;%1*%&.0Xd*x77Fk12[)fn
% ;.2{BC% F5.m0DEFFr   c           	         | y t        |       rt        |       S g }g }d}t        | j                        }t        | j                        }t        t        ||t        |                  }|D ]:  \  }}}	|dk(  r||k7  r n)|j                  |       |j                  |	       ||z  }< |j                          |j                          t        t        t        |      t        |                  S r-   )r   r   r	   r%   r&   r   rP   r   rc   rd   rY   re   )
rR   rg   rh   r   
flat_shapeflat_stride
sorted_DSAr&   r%   rstrides
             r   right_inverser   G  s    ~	f~LMK&J&--(KK^J5OPQJ", %wA:& E"W%fn% F5.m0DEFFr   c                 p    | y t        |       rt        |       S t        t        t	        |       |             S r   )r   r   r   rQ   r   rT   s    r   left_inverser   d  s2    ~	f~Z%7@AAr   c                      S t              rt         t                    S t              rot	               t	              k\  sJ t        t         fdt        t	                    D         fdt        t	              t	                     D                    S t         t        t        t                                 S )Nc              3   B   K   | ]  }t        |   |           y wr   )logical_dividers   s     r   rO   z!logical_divide.<locals>.<genexpr>w  s(       #71:wqz:r[   c              3   (   K   | ]	  }|     y wr   r   ru   s     r   rO   z!logical_divide.<locals>.<genexpr>{  rv   r_   )r   r   r   r   r.   rQ   r   ra   rr   r   r8   rm   rn   s   ``r   r   r   n  s    	gvg77	'	7|s7|+++"3w<0 HU3w<W%FG
 	
 GZg?@ r   c                      S t              rt         t                    S t              rot	               t	              k\  sJ t        t         fdt        t	                    D         fdt        t	              t	                     D                    S t         t        t         t               t              z                    S )Nc              3   B   K   | ]  }t        |   |           y wr   )logical_productrs   s     r   rO   z"logical_product.<locals>.<genexpr>  s(       $GAJ
;r[   c              3   (   K   | ]	  }|     y wr   r   ru   s     r   rO   z"logical_product.<locals>.<genexpr>  rv   r_   )r   r   r   r   r.   rQ   r   ra   rr   r   r8   r:   r   s   ``r   r   r     s    	gvg77	'	7|s7|+++"3w<0 HU3w<W%FG
 	
 JwWw(GH'R r   splitterc                     t        t        dd            S t              rt              t              k\  sJ t         fdt	        t                    D              t        t        fdt	        t                    D              t        t        fdt	        t                    D        fdt	        t              t                    D                          S         S )Nr   r   c              3   D   K   | ]  }t        |   |           y wr   )
hier_unzip)rM   r4   rm   rn   r   s     r   rO   zhier_unzip.<locals>.<genexpr>  s*      
 xWQZ8
s    c              3   .   K   | ]  }|   d      yw)r   Nr   rM   r4   splits     r   rO   zhier_unzip.<locals>.<genexpr>  s     AaA   c              3   .   K   | ]  }|   d      yw)r   Nr   r   s     r   rO   zhier_unzip.<locals>.<genexpr>  s     >QU1Xa[>r   c              3   (   K   | ]	  }|     y wr   r   ru   s     r   rO   zhier_unzip.<locals>.<genexpr>  s     KAWQZKr_   )rQ   r   r   r.   ra   r   )r   rm   rn   r   s   ```@r   r   r     s    
 6!Q<11	'	7|s7|+++ 
3w<(
 

 AU3w<-@AA>%G*=>Ks7|S\)JK
 	
 GW%%r   c                 $    t        t        | |      S r   )r   r   r   s     r   zipped_divider     s    ngw77r   c           	          t        | |      }t        |d   gt        t        |d               D cg c]
  }|d   |    c}z         S c c}w Nr   r   )r   rQ   ra   r.   rm   rn   resultr4   s       r   tiled_divider     sG    7G,Fq	{E#fQi.<Q%RqfQil%RRSS%R   A
c                 $    t        t        | |      S r   )r   r   r   s     r   zipped_productr     s    ow88r   c           	          t        | |      }t        |d   gt        t        |d               D cg c]
  }|d   |    c}z         S c c}w r   )r   rQ   ra   r.   r   s       r   tiled_productr     sG    GW-Fq	{E#fQi.<Q%RqfQil%RRSS%Rr   crdc                     t        t        | |j                        t        | |j                              t	        | |j                  |j                        fS r   )r   r   r%   r&   r   )r   rR   s     r   slice_and_offsetr     s@    vc6<<(&fmm*DEV\\6==1 r   r   )r   ).__doc__	itertoolsr   typingr   typing_extensionsr   r   	int_tupler   r	   r
   r   r   r   r   r   r   rE   re   rC   r   __annotations__r   r    r   rG   rH   rI   rQ   r8   r:   rY   rk   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s  B
   *
 
 
 (NU63;''$. 	 
	 	% %F8, %?5Z ?5F %x/ ) / -6=y =(*U63;-??$FY F!&5#55 !& !! c 6 c 
%AV %Am %Av %ARK6 KM KV K4=E =E+ =E& =EBG' G# Gf G@G*T1 Gftm G:B)D0 BVd] BF [ V 2V k f 0&&& & 	&<86 8K 8F 8
T& T; T6 T9F 9[ 9V 9
T6 TK TF T
%, f vs{AS r   