
    9jH                        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__     `/media/conek/DATA/Code/OCR/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k7  rt        t        | j                  | j                        S )Nr   )r   r%   r   r&   AssertionError)r'   r4   s     r   __getitem__zLayout.__getitem__o   sM    DJJ$**Q-Q88Av$$$**dkk22r   c                 ,    t        | j                        S r   )r   r%   r/   s    r   sizezLayout.sizex   s    tzz""r   c                 :     | | j                         dz
        dz   S r-   )r9   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   r7   r9   r;   strr?   rC   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   )rK   r%   r&   s      r   make_layoutrR      sC    
7|q71:!6!*?w?@ME6%  r   layoutc                 N    t        |       r| j                         S t        |       S r   )r    r9   r   rS   s    r   r9   r9      s     {{}6?r   c                 "    | j                         S r   )r;   rU   s    r   r;   r;      s    ==?r   profilec                     t              rst               t              k  rt        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rN   r4   rS   rW   s     r   rP   zcoalesce.<locals>.<genexpr>   s      NQ&)WQZ0N   c              3   (   K   | ]	  }|     y wr   r   rN   r4   rS   s     r   rP   zcoalesce.<locals>.<genexpr>        EqE   r   r   )r   r.   r6   rR   r   rangerQ   reversedr	   r%   r&   appendr   reversetuplerS   rW   result_shaperesult_strider%   r&   s   ``    r   rZ   rZ      ss   v;W%  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              rst               t              k  rt        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   )filterr[   s     r   rP   zfilter.<locals>.<genexpr>   s      L1q	71:.Lr\   c              3   (   K   | ]	  }|     y wr   r   r^   s     r   rP   zfilter.<locals>.<genexpr>   r_   r`   r   r   )r   r.   r6   rR   r   rb   rQ   r	   r%   r&   rd   r   rZ   rf   rg   s   ``    r   rl   rl      s    v;W%  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              rst	               t	              k  rt
        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 ]j  \  }}||z  dk(  s||z  dk(  st
        t        t!        d||z        |      }	|	dk7  r%|j#                  |	       |j#                  ||z         ||	z  }| |z   }l |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rN   r4   rn   ro   s     r   rP   zcomposition.<locals>.<genexpr>   s      RWQZ4Rr\   c              3   (   K   | ]	  }|     y wr   r   rN   r4   rn   s     r   rP   zcomposition.<locals>.<genexpr>        GGr`   c              3   6   K   | ]  }t        |        y wr   rr   )rN   	layoutB_irn   s     r   rP   zcomposition.<locals>.<genexpr>   s     Ty;w	:Ts   r   r   )r   rs   r   r   r.   r6   rR   r   rb   r%   r&   rZ   rQ   rc   r	   minmaxrd   re   rf   )
rn   ro   rh   ri   
rest_shaperest_strideflat_A
curr_shapecurr_stride	new_shapes
   ``        r   rs   rs      sC   	7F7O44	'	w<#g,&  ReCL>QRGU3w<W%FG
 	
 
'--	 TGTTT~~gmmQ'']]
nn'" (+WV\\*12./'&--:PQRQS:T1U(
 	#J ,1[:5MQR5R$$C:#<=zJIA~##I.$$[;%>?#y0J
*K	& ?c,/14
+  wv}}/Ea/H!HI 	|!,q/=+;<<%-u]/CDDr   max_idxc                 f   t        |       rt        t        |             S g }g }d}t        t	        t        | j                        t        | j                                    }|D ][  \  }}|dk(  s|dk(  r|||z  k  }t        |      t        u r|st        |j                  ||z         |j                  |       ||z  }] |j                  ||z   dz
  |z         |j                  |       |j                          |j                          t        t        t        |      t        |                  S )Nr   r   )r   
complementr   sortedrQ   r	   r&   r%   typerE   r6   rd   re   rZ   rf   )	rS   r   rh   ri   current_idx	sorted_DSr&   r%   in_bounds	            r   r   r   /  s   f~&.))LMKs76==176<<3HIJI" %Q;%1*%&.0Nd"H  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   rQ   r   rd   re   rZ   rf   )
rS   rh   ri   r   
flat_shapeflat_stride
sorted_DSAr&   r%   rstrides
             r   right_inverser   P  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   rR   r   rU   s    r   left_inverser   m  s2    ~	f~Z%7@AAr   c                      S t              rt         t                    S t              rst	               t	              k  rt
        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_dividert   s     r   rP   z!logical_divide.<locals>.<genexpr>  s(       #71:wqz:r\   c              3   (   K   | ]	  }|     y wr   r   rv   s     r   rP   z!logical_divide.<locals>.<genexpr>  rw   r`   )r   r   r   r   r.   r6   rR   r   rb   rs   r   r9   rn   ro   s   ``r   r   r   w  s    	gvg77	'	w<#g,&  "3w<0 HU3w<W%FG	
 		
 GZg?@ r   c                      S t              rt         t                    S t              rst	               t	              k  rt
        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_productrt   s     r   rP   z"logical_product.<locals>.<genexpr>  s(       $GAJ
;r\   c              3   (   K   | ]	  }|     y wr   r   rv   s     r   rP   z"logical_product.<locals>.<genexpr>  rw   r`   )r   r   r   r   r.   r6   rR   r   rb   rs   r   r9   r;   r   s   ``r   r   r     s    	gvg77	'	w<#g,&  "3w<0 HU3w<W%FG	
 		
 JwWw(GH'R r   splitterc                     t        t        dd            S t              rt              t              k  rt        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)rN   r4   rn   ro   r   s     r   rP   zhier_unzip.<locals>.<genexpr>  s*      
 xWQZ8
s    c              3   .   K   | ]  }|   d      yw)r   Nr   rN   r4   splits     r   rP   zhier_unzip.<locals>.<genexpr>  s     AaA   c              3   .   K   | ]  }|   d      yw)r   Nr   r   s     r   rP   zhier_unzip.<locals>.<genexpr>  s     >QU1Xa[>r   c              3   (   K   | ]	  }|     y wr   r   rv   s     r   rP   zhier_unzip.<locals>.<genexpr>  s     KAWQZKr`   )rR   r   r   r.   r6   rb   r   )r   rn   ro   r   s   ```@r   r   r     s    
 6!Q<11	'	w<#g,&   
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   rR   rb   r.   rn   ro   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   rR   rb   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   rS   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   rF   rf   rD   r   __annotations__r   r    r   rH   rI   rJ   rR   r9   r;   rZ   rl   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s  B
   *
 
 
 (NU63;''$. 	 
	 	% %F8, %@5Z @5H %x/ ) / -6=y =(*U63;-??$FY F!&5#55 !& !! c 6 c 
'AV 'Am 'Av 'AVK6 KM KV K8@E @E+ @E& @EHG' G# Gf GBG*T1 Gftm G:B)D0 BVd] BF [ V 6V k f 4&&& & 	&>86 8K 8F 8
T& T; T6 T9F 9[ 9V 9
T6 TK TF T
%, f vs{AS r   