
    9i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-dS )/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dS )
LayoutBaseN)__name__
__module____qualname__     S/var/www/icac/venv/lib/python3.11/site-packages/torch/distributed/_pycute/layout.pyr   r   =   s        Dr   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dS )r   N_shape_strider   c                 \    || _         |t          | j                   | _        d S || _        d S r   )shaper   stride)selfr"   r#   s      r   __init__zLayout.__init__F   s.    
?(44DKKK!DKKKr   otherc                 p    t          |t                    sdS | j        |j        k    o| j        |j        k    S )NF)r   r   r%   r&   )r'   r)   s     r   __eq__zLayout.__eq__N   s6    %(( 	5zU[(HT[EL-HHr   c                 V    t          | j                  rt          | j                  S dS Nr   )r   r%   lenr'   s    r   __len__zLayout.__len__T   s'    DJ 	tz??"1r   argsc                    t          |          rt          |          dk    rBt          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>> 		>4yyA~~fT!Wdj996$q'4;;W;WXXXfT4:66tT[8Q8QRRR4yyA~~tAw
DK@@@tTZ===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   sQ    DJ 	3$*Q-Q8886666$*dk222r   c                 *    t          | j                  S r   )r   r%   r/   s    r   sizezLayout.sizew   s    tz"""r   c                 H     | |                                  dz
            dz   S r-   )r8   r/   s    r   cosizezLayout.cosize{   s#    tDIIKK!O$$q((r   c                 $    | j          d| j         S )N:r%   r&   r/   s    r   __str__zLayout.__str__   s    *,,t{,,,r   c                 (    d| j          d| j         dS )NzLayout(,)r=   r/   s    r   __repr__zLayout.__repr__   s    444dk44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 I I I    >n > > > > >(3S 3T 3 3 3 3#c # # # #) ) ) ) )- - - - -5# 5 5 5 5 5 5r   LayoutOrIntTupleLayoutProfileLayoutInputlayoutsc                      t          |           dk    rt          | d                   s| d         } t          d | D              \  }}t          ||          S )Nr   r   c              3   2   K   | ]}|j         |j        fV  d S r   r=   ).0as     r   	<genexpr>zmake_layout.<locals>.<genexpr>   s+      ??!17AH-??????r   )r.   r    zipr   )rJ   r%   r&   s      r   make_layoutrQ      sZ    
7||q71:!6!6!*??w???@ME6%   r   layoutc                 f    t          |           r|                                 S t          |           S r   )r    r8   r   rR   s    r   r8   r8      s,     {{}}6??r   c                 *    |                                  S r   )r:   rT   s    r   r:   r:      s    ==??r   profilec                     t                    rt                     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 ]q\  }}|dk    r|d         dk    r||d<   ||d<   #|d         |d         z  |k    r|d         |z  |d<   G|
                    |           |
                    |           rt          |          dk    rt          |d         |d                   S |                                 |                                 t          t          |          t          |                    S )Nc              3   P   K   | ] }t          |         |                   V  !d S r   )coalescerM   r4   rR   rV   s     r   rO   zcoalesce.<locals>.<genexpr>   s5      NNQ&)WQZ00NNNNNNr   c              3   (   K   | ]}|         V  d S r   r   rM   r4   rR   s     r   rO   zcoalesce.<locals>.<genexpr>   '      EEqEEEEEEr   r   r   )r   r.   rQ   r   rangerP   reversedr	   r%   r&   appendr   reversetuplerR   rV   result_shaperesult_strider%   r&   s   ``    r   rY   rY      s     
6{{c'll****NNNNN%G:M:MNNNEEEEE#g,,F$D$DEEE 
 
 	
 3LCM &&'''&-2H2H)I)I  ) )v A::"""$L &M""b 11V;;+B/%7L &&&  ((((
<Al1o}Q'7888eL))5+?+?@@@r   c                     t                    rt                     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 ];\  }}|dk    s0|dk    s*|	                    |           |	                    |           <t          |          dk    rt          dd          S t          t          t          |          t          |                              S )Nc              3   P   K   | ] }t          |         |                   V  !d S r   )filterrZ   s     r   rO   zfilter.<locals>.<genexpr>   s5      LL1q	71:..LLLLLLr   c              3   (   K   | ]}|         V  d S r   r   r\   s     r   rO   zfilter.<locals>.<genexpr>   r]   r   r   r   )r   r.   rQ   r   r_   rP   r	   r%   r&   ra   r   rY   rc   rd   s   ``    r   ri   ri      se    
6{{c'll****LLLLLc'll8K8KLLLEEEEE#g,,F$D$DEEE 
 
 	
 LMWV\22GFM4J4JKK ) )v

fkk&&&  (((
<Aa||u\22E-4H4HIIJJJr   layoutAlayoutBc                      S t                    rt           t                              S t                    rt	                     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 ]y\  }}||z  dk    s||z  dk    sJ t          t          d||z            |          }	|	dk    r-|                    |	           |                    ||z             ||	z  }| |z   }z|dk    st	          |          dk    rE|                    |           |                    |t          |j	                  d         z             |                                 |                                 t	          |          dk    rt          |d         |d                   S t          t%          |          t%          |                    S )Nc              3   P   K   | ] }t          |         |                   V  !d S r   compositionrM   r4   rk   rl   s     r   rO   zcomposition.<locals>.<genexpr>   s5      RRWQZ44RRRRRRr   c              3   (   K   | ]}|         V  d S r   r   rM   r4   rk   s     r   rO   zcomposition.<locals>.<genexpr>   '      GGGGGGGGr   c              3   8   K   | ]}t          |          V  d S r   ro   )rM   	layoutB_irk   s     r   rO   zcomposition.<locals>.<genexpr>   s-      TTy;w	::TTTTTTr   r   r   )r   rp   r   r   r.   rQ   r   r_   r%   r&   rY   rP   r`   r	   minmaxra   rb   rc   )
rk   rl   re   rf   
rest_shaperest_strideflat_A
curr_shapecurr_stride	new_shapes
   ``        r   rp   rp      s   	 U7F7OO444	'		 	U7||s7||++++RRRRReCLL>Q>QRRRGGGGU3w<<W%F%FGGG 
 
 	
 
'-	 	  UTTTTGTTTTTT~gmQ''']
n'"" (+WV\**122.//'&-:P:PQRQSQS:T1U1U(
 (
 	 	#J +q00K*4LPQ4Q4Q4Q4QC:#<==zJJIA~~##I...$$[;%>???#y0J
*KK ??c,//144
+++  wv}/E/Ea/H!HIII 	|!!,q/=+;<<<%--u]/C/CDDDr   max_idxc                    t          |           rt          t          |                     S g }g }d}t          t	          t          | j                  t          | j                                      }|D ]g\  }}|dk    s|dk    r|||z  k    }t          |          t          us|sJ |
                    ||z             |
                    |           ||z  }h|
                    ||z   dz
  |z             |
                    |           |                                 |                                 t          t          t          |          t          |                              S )Nr   r   )r   
complementr   sortedrP   r	   r&   r%   typerD   ra   rb   rY   rc   )	rR   r   re   rf   current_idx	sorted_DSr&   r%   in_bounds	            r   r   r   '  sl   f~~ *&..)))LMKs76=1176<3H3HIIJJI" 
% 
%Q;;%1**%&.0Xd**x***Fk1222[)))fn;.2{BCCC%%% F5..m0D0DEEFFFr   c           	      D   | d S t          |           rt          |           S g }g }d}t          | j                  }t          | j                  }t          t          ||t          |                              }|D ]D\  }}}	|dk    r||k    r n0|                    |           |                    |	           ||z  }E|	                                 |	                                 t          t          t          |          t          |                              S r-   )r   r   r	   r%   r&   r   rP   r   ra   rb   rY   rc   )
rR   re   rf   r   
flat_shapeflat_stride
sorted_DSAr&   r%   rstrides
             r   right_inverser   G  s%   ~t	 f~~LMK&&J&-((KK^J5O5OPPQQJ", % %wA::&  EE"""W%%%fnF5..m0D0DEEFFFr   c                     | d S t          |           rt          |           S t          t          t	          |           |                     S r   )r   r   r   rQ   r   rT   s    r   left_inverser   d  sF    ~t	 f~~Z%7%7@@AAAr   c                 *     S t                    rt           t                              S t                    rt	                     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   P   K   | ] }t          |         |                   V  !d S r   )logical_dividerq   s     r   rO   z!logical_divide.<locals>.<genexpr>w  sI         #71:wqz::     r   c              3   (   K   | ]}|         V  d S r   r   rs   s     r   rO   z!logical_divide.<locals>.<genexpr>{  rt   r   )r   r   r   r   r.   rQ   r   r_   rp   r   r8   rk   rl   s   ``r   r   r   n  s   	 
gvg777	'		 

7||s7||++++    "3w<<00   HGGGU3w<<W%F%FGGG 
 
 	
 GZg??@@  r   c                 J     S t                    rt           t                              S t                    rt	                     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   P   K   | ] }t          |         |                   V  !d S r   )logical_productrq   s     r   rO   z"logical_product.<locals>.<genexpr>  sI         $GAJ
;;     r   c              3   (   K   | ]}|         V  d S r   r   rs   s     r   rO   z"logical_product.<locals>.<genexpr>  rt   r   )r   r   r   r   r.   rQ   r   r_   rp   r   r8   r:   r   s   ``r   r   r     s&   	 
gvg777	'		 

7||s7||++++    "3w<<00   HGGGU3w<<W%F%FGGG 
 
 	
 JwWw(GHH'RR  r   splitterc                     t          t          dd                    S t                    rt                    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   R   K   | ]!}t          |         |                   V  "d S r   )
hier_unzip)rM   r4   rk   rl   r   s     r   rO   zhier_unzip.<locals>.<genexpr>  sK       
 
 xWQZ88
 
 
 
 
 
r   c              3   4   K   | ]}|         d          V  dS )r   Nr   rM   r4   splits     r   rO   zhier_unzip.<locals>.<genexpr>  s+      AAaAAAAAAr   c              3   4   K   | ]}|         d          V  dS )r   Nr   r   s     r   rO   zhier_unzip.<locals>.<genexpr>  s+      >>QU1Xa[>>>>>>r   c              3   (   K   | ]}|         V  d S r   r   rs   s     r   rO   zhier_unzip.<locals>.<genexpr>  s'      KKAWQZKKKKKKr   )rQ   r   r   r.   r_   r   )r   rk   rl   r   s   ```@r   r   r     sa   
 6!Q<<111	'		 
7||s7||++++ 
 
 
 
 
 
3w<<((
 
 
 
 

 AAAAU3w<<-@-@AAAAA>>>>%G*=*=>>>KKKKs7||S\\)J)JKKK  
 
 	
 8GW%%%r   c                 .    t          t          | |          S r   )r   r   r   s     r   zipped_divider     s    ngw777r   c           
          t          | |          t          d         gfdt          t          d                             D             z             S )Nr   c                 ,    g | ]}d          |         S r   r   rM   r4   results     r   
<listcomp>z tiled_divide.<locals>.<listcomp>  !    %R%R%RqfQil%R%R%Rr   r   )r   rQ   r_   r.   rk   rl   r   s     @r   tiled_divider     sR    7G,,Fq	{%R%R%R%RE#fQi..<Q<Q%R%R%RRSSSr   c                 .    t          t          | |          S r   )r   r   r   s     r   zipped_productr     s    ow888r   c           
          t          | |          t          d         gfdt          t          d                             D             z             S )Nr   c                 ,    g | ]}d          |         S r   r   r   s     r   r   z!tiled_product.<locals>.<listcomp>  r   r   r   )r   rQ   r_   r.   r   s     @r   tiled_productr     sR    GW--Fq	{%R%R%R%RE#fQi..<Q<Q%R%R%RRSSSr   crdc                     t          t          | |j                  t          | |j                            t	          | |j        |j                  fS r   )r   r   r%   r&   r   )r   rR   s     r   slice_and_offsetr     sD    vc6<((&fm*D*DEEV\6=11 r   r   r   ).__doc__	itertoolsr   typingr   typing_extensionsr   r   	int_tupler   r	   r
   r   r   r   r   r   r   rE   rc   rC   r   __annotations__r   r    r   rG   rH   rI   rQ   r8   r:   rY   ri   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   B  
             * * * * * * * *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 (NU63;''$. 	   
	 	 	 	 	 	 	 	% %F8, % % % %?5 ?5 ?5 ?5 ?5Z ?5 ?5 ?5F %x/ ) / / / -6=y = = =(*U63;-??$FY F F F!&5#55 !& ! ! ! !! c    6 c    
%A %AV %Am %Av %A %A %A %ARK K6 KM KV K K K K4=E =E+ =E& =E =E =E =EBG G' G# Gf G G G G@G*T1 Gftm G G G G:B)D0 BVd] B B B BF [ V    2V k f    0&&& & 	& & & &<86 8K 8F 8 8 8 8
T& T; T6 T T T T9F 9[ 9V 9 9 9 9
T6 TK TF T T T T
%, f vs{AS      r   