
    )`i"2                         d Z ddlmZ ddlmZ ddlT  G d d          Zd Z G d	 d
e          Zd Z	d Z
d ZddZddZd Zd dZd Zd Zd Zd Zd Zd Zd Zd Zd ZdedefdZdS )!z=
Definition of CuTe Layouts and functions to manipulate them
    )chain)Union   )*c                       e Zd ZdS )
LayoutBaseN)__name__
__module____qualname__     /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/flashinfer/data/cutlass/python/pycute/layout.pyr   r   +   s        $r   r   c                 ,    t          | t                    S N)
isinstancer   )xs    r   	is_layoutr   /   s    	Az	"	""r   c                   F    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 ZdS )LayoutNc                 \    || _         |t          | j                   | _        d S || _        d S r   )shapeprefix_productstride)self_shape_strides      r   __init__zLayout.__init__4   s.    DJ"4:..dkkkdkkkr   c                 B    | j         |j         k    o| j        |j        k    S r   r   r   )r   others     r   __eq__zLayout.__eq__<   s    :$D)DDr   c                 V    t          | j                  rt          | j                  S dS Nr   )is_tupler   lenr   s    r   __len__zLayout.__len__@   s'    
 __Qr   c                    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   )has_noner%   r   slice_r   r   crd2idx)r   argss     r   __call__zLayout.__call__G   s     ~~ 	6	TafT!Wdj116$q'4;3O3OPPPfT4:..tT[0I0IJJJ	TatAw
DK888tTZ555r   c                     t          | j                  r&t          | j        |         | j        |                   S |dk    sJ t          | j        | j                  S )Nr   )r$   r   r   r   )r   is     r   __getitem__zLayout.__getitem__[   sQ    
 -DJqM4;q>222!VVVVDJ,,,r   c                 *    t          | j                  S r   )productr   r&   s    r   sizezLayout.sizec   s    4:r   c                 H     | |                                  dz
            dz   S r#   )r3   r&   s    r   cosizezLayout.cosizeg   s#    4		a  1$$r   c                 $    | j          d| j         S )N:r   r&   s    r   __str__zLayout.__str__k   s    j((4;(((r   c                 (    d| j          d| j         dS )NzLayout(,)r   r&   s    r   __repr__zLayout.__repr__o   s    0TZ00$+0000r   r   )r	   r
   r   r   r!   r'   r-   r0   r3   r5   r8   r<   r   r   r   r   r   3   s           E E E  6 6 6(- - -  % % %) ) )1 1 1 1 1r   r   c                      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>x   s+      <<q*<<<<<<r   )r%   r   zipr   )layoutsr   r   s      r   make_layoutrD   t   sZ    \\Qy44ajG<<G<<<=-%	v		r   c                 f    t          |           r|                                 S t          |           S r   )r   r3   r2   layouts    r   r3   r3   }   s,    v ;;==	r   c                 *    |                                  S r   )r5   rF   s    r   r5   r5      s    	r   Nc                 d    t                    rt                     t                    k    sJ t          t           fdt	          dt                              D              fdt	          t                    t                               D                                 S dg}dg}t          t           j                  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r?   r/   rG   profiles     r   rA   zcoalesce.<locals>.<genexpr>   s5      hh!hvay'!*==hhhhhhr   r   c              3   (   K   | ]}|         V  d S r   r   r?   r/   rG   s     r   rA   zcoalesce.<locals>.<genexpr>   s'      gg!fQiggggggr   r   )r$   r%   rD   r   rangerB   flattenr   r   appendr   tuplerG   rM   result_shaperesult_strider   r   s   ``    r   rK   rK      s   g jv;;#g,,&&&&uhhhhhuXYZ]^eZfZfGgGghhhgggguSQX\\Z]^dZeZeGfGfgggi i j j j #,#-GFL11'&-2H2HII # #nuVzz	b	Q		l2 mB	b	M"-	-	7	7%b)E1l2 %   6""""!,q/=#3444%%%u]';';<<<r   c                     t                    rt                     t                    k    sJ t          t           fdt	          d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   )filterrL   s     r   rA   zfilter.<locals>.<genexpr>   s5      fffVAY
;;ffffffr   r   c              3   (   K   | ]}|         V  d S r   r   rO   s     r   rA   zfilter.<locals>.<genexpr>   s'      eefQieeeeeer   r   )r$   r%   rD   r   rQ   rB   rR   r   r   rS   r   rK   rT   rU   s   ``    r   rZ   rZ      su   g hv;;#g,,&&&&ufffffUVWX[\cXdXdEeEefffeeeeU3w<<X[\bXcXcEdEdeeeg g h h h ,-GFL11'&-2H2HII # #nuVQJJ&A++%   6"""!!A;;F5..m0D0DEEFFFr   c                      S t                    rt           t                              S t                    rt	                     t	                    k    sJ t          t           fdt          d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          |j                  d d         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r?   r/   layoutAlayoutBs     r   rA   zcomposition.<locals>.<genexpr>   s5      llak'!*gajAAllllllr   r   c              3   (   K   | ]}|         V  d S r   r   r?   r/   ra   s     r   rA   zcomposition.<locals>.<genexpr>   s'      llagajllllllr   c              3   8   K   | ]}t          |          V  d S r   r^   )r?   	layoutB_ira   s     r   rA   zcomposition.<locals>.<genexpr>   s-      PP9{7I66PPPPPPr   rP   r   )is_intr_   r   r$   r%   rD   r   rQ   r   r   rK   rB   rR   minmaxrS   rT   )
ra   rb   rV   rW   
rest_shaperest_strideflat_A
curr_shapecurr_stride	new_shapes
   ``        r   r_   r_      s   _Ng Qww000 Qw<<3w<<''''ulllll5\]^abi^j^jKkKklllllll5QTU\Q]Q]^abi^j^jKkKkllln n o o o QPPPPPPPPPP^q'-###LMMJNKgF%()>)>ss)CWV]E[E[\_]_\_E`%a%a 	2 	2![+%**kJ.F!.K.K.KKc!Z;677DDi	aI&&&[;6777)+j"lj01kkQ#l++q00*%%%;)?)?)CCDDD
<ALO]1%5666E,''})=)=>>>r   c                    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   )rg   
complementr   sortedrB   rR   r   r   typeboolrS   rK   rT   )	rG   max_idxrV   rW   current_idx	sorted_DSr   r   in_bounds	            r   rq   rq      sF   F^^ &fVnn%%%,-+S//1F1FGGHH)" 
! 
!ovu{{eqjjefn,HNN$&&8&&3+-...%%%&.KKw,q0[@AAA{###	&|,,eM.B.BCC	D	DDr   c           	         | 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  }Et          t          t          |          t          |                              S r#   )rg   r   rR   r   r   rr   rB   r   rS   rK   rT   )
rG   rV   rW   rv   
flat_shapeflat_stride
sorted_DSAr   r   rstrides
             r   right_inverser~     s   ^4f~~ &>>,-+%%*&&+c+z>*3M3MNNOO* * ! !veGzzfe!!!&.KK	&|,,eM.B.BCC	D	DDr   c                     | d S t          |           rt          |           S t          t          | t	          |                               S r   )rg   r   r~   rD   rq   rF   s    r   left_inverser     sF    ^4f~~ &>>	{6:f+=+=>>	?	??r   c                 ,     S t                    rt           t                              S t                    rt	                     t	                    k    sJ t          t           fdt          dt	                              D              fdt          t	                    t	                               D                                 S t           t          t          t                                                   S )Nc              3   P   K   | ] }t          |         |                   V  !d S r   )logical_divider`   s     r   rA   z!logical_divide.<locals>.<genexpr>0  s5      oonWQZDDoooooor   r   c              3   (   K   | ]}|         V  d S r   r   rd   s     r   rA   z!logical_divide.<locals>.<genexpr>1  s'      oogajoooooor   )rg   r   r   r$   r%   rD   r   rQ   r_   rq   r3   ra   rb   s   ``r   r   r   )  s   _Ng r'6'??333 rw<<3w<<''''uoooooe_`adelamamNnNnoooooooeTWX_T`T`adelamamNnNnoooq q r r r 
Wk':gtG}}3U3UVV	W	WWr   c                 L     S t                    rt           t                              S t                    rt	                     t	                    k    sJ t          t           fdt          d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_productr`   s     r   rA   z"logical_product.<locals>.<genexpr>?  s5      pp!ogaj'!*EEppppppr   r   c              3   (   K   | ]}|         V  d S r   r   rd   s     r   rA   z"logical_product.<locals>.<genexpr>@  s'      pp!gajppppppr   )rg   r   r   r$   r%   rD   r   rQ   r_   rq   r3   r5   r   s   ``r   r   r   8  s!   _Ng s'6'??333 sw<<3w<<''''upppppu`abefmbnbnOoOopppppppuUXY`UaUabefmbnbnOoOopppr r s s s 
Wk*Wd7mmFSZOO>[*\*\^eff	g	ggr   c                     t          t          dd                    S t                    rt                    t                    k    sJ t           fdt	          dt                              D                       t          t          fdt	          dt                              D                       t          t          fdt	          dt                              D             fdt	          t                    t                              D                                           S             S )Nr   r   c              3   R   K   | ]!}t          |         |                   V  "d S r   )
hier_unzip)r?   r/   ra   rb   splitters     r   rA   zhier_unzip.<locals>.<genexpr>L  s7      dd
8WQZDDddddddr   c              3   4   K   | ]}|         d          V  dS )r   Nr   r?   r/   splits     r   rA   zhier_unzip.<locals>.<genexpr>N  s+      "`"`!%(1+"`"`"`"`"`"`r   c              3   4   K   | ]}|         d          V  dS )r   Nr   r   s     r   rA   zhier_unzip.<locals>.<genexpr>O  s+      )`)`!%(1+)`)`)`)`)`)`r   c              3   (   K   | ]}|         V  d S r   r   rd   s     r   rA   zhier_unzip.<locals>.<genexpr>P  s'      )`)`!'!*)`)`)`)`)`)`r   )rD   r   r$   r%   rQ   r   )r   ra   rb   r   s   ```@r   r   r   F  se   _va{{G,,, dw<<3w<<''''ddddddeTUVYZaVbVbNcNcdddddE{"`"`"`"`uPQRUV]R^R^?_?_"`"`"```"5)`)`)`)`uPQRUV]R^R^?_?_)`)`)`)`)`)`)`uS\\RUV]R^R^?_?_)`)`)`$b $b c cd d d
 
'7	#	##r   c                 .    t          t          | |          S r   )r   r   r   s     r   zipped_divider   W  s    	NGW	5	55r   c           
          t          | |          t          d         gfdt          t          d                             D             z             S )Nr   c                 ,    g | ]}d          |         S r   r   r?   r/   results     r   
<listcomp>z tiled_divide.<locals>.<listcomp>^  !    #P#P#PQF1IaL#P#P#Pr   r   )r   rD   rQ   r%   ra   rb   r   s     @r   tiled_divider   \  sR    '**&	fQi[#P#P#P#P%F1I:O:O#P#P#PP	Q	QQr   c                 .    t          t          | |          S r   )r   r   r   s     r   zipped_productr   b  s    	OWg	6	66r   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>i  r   r   r   )r   rD   rQ   r%   r   s     @r   tiled_productr   g  sR    '7++&	fQi[#P#P#P#P%F1I:O:O#P#P#PP	Q	QQr   crdrG   c                     t          t          | |j                  t          | |j                            t	          | |j        |j                  fS r   )r   r*   r   r   r+   )r   rG   s     r   slice_and_offsetr   l  sD    
V\**F3,F,F
G
G
#v|V]
3
3
5 5r   r   r   )__doc__	itertoolsr   typingr   	int_tupler   r   r   rD   r3   r5   rK   rZ   r_   rq   r~   r   r   r   r   r   r   r   r   rT   r   r   r   r   <module>r      s  B                        # # #=1 =1 =1 =1 =1Z =1 =1 =1B      
= = = =>G G G G,&? &? &?TE E E E8E E E6@ @ @
X 
X 
X
i 
i 
i$ $ $"6 6 6
R R R7 7 7
R R R
5% 5#5 5 5 5 5 5r   