o
    ’à·i"2  ã                   @   sæ   d Z ddlmZ ddlmZ ddlT G dd„ dƒZdd	„ ZG d
d„ deƒZdd„ Z	dd„ Z
dd„ Zd1dd„Zd1dd„Zdd„ Zd2dd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-ed.efd/d0„ZdS )3z=
Definition of CuTe Layouts and functions to manipulate them
é    )Úchain)ÚUnioné   )Ú*c                   @   s   e Zd ZdS )Ú
LayoutBaseN)Ú__name__Ú
__module__Ú__qualname__© r
   r
   úb/home/ubuntu/vllm_env/lib/python3.10/site-packages/flashinfer/data/cutlass/python/pycute/layout.pyr   +   s    r   c                 C   s
   t | tƒS ©N)Ú
isinstancer   )Úxr
   r
   r   Ú	is_layout/   ó   
r   c                   @   sV   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚLayoutNc                 C   s(   || _ |d u rt| j ƒ| _d S || _d S r   )ÚshapeÚprefix_productÚstride)ÚselfÚ_shapeÚ_strider
   r
   r   Ú__init__4   s   
zLayout.__init__c                 C   s   | j |j ko| j|jkS r   ©r   r   )r   Úotherr
   r
   r   Ú__eq__<   s   zLayout.__eq__c                 C   s   t | jƒr
t| jƒS dS ©Nr   )Úis_tupler   Úlen©r   r
   r
   r   Ú__len__@   s   

zLayout.__len__c                 G   s€   t |ƒr(t|ƒdkrtt|d | jƒt|d | jƒƒS tt|| jƒt|| jƒƒS t|ƒdkr8t|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   Úargsr
   r
   r   Ú__call__G   s   "zLayout.__call__c                 C   s:   t | jƒrt| j| | j| ƒS |dksJ ‚t| j| jƒS )Nr   )r   r   r   r   )r   Úir
   r
   r   Ú__getitem__[   s   
zLayout.__getitem__c                 C   s
   t | jƒS r   )Úproductr   r   r
   r
   r   Úsizec   r   zLayout.sizec                 C   s   | |   ¡ d ƒd S r   )r)   r   r
   r
   r   Úcosizeg   s   zLayout.cosizec                 C   s   | j › d| j› S )Nú:r   r   r
   r
   r   Ú__str__k   s   zLayout.__str__c                 C   s   d| j › d| j› dS )NzLayout(ú,ú)r   r   r
   r
   r   Ú__repr__o   s   zLayout.__repr__r   )r   r   r	   r   r   r    r%   r'   r)   r*   r,   r/   r
   r
   r
   r   r   3   s    
r   c                  G   s@   t | ƒdkrt| d ƒs| d } tdd„ | D ƒŽ \}}t||ƒS )Nr   r   c                 s   s    | ]	}|j |jfV  qd S r   r   )Ú.0Úar
   r
   r   Ú	<genexpr>x   ó   € zmake_layout.<locals>.<genexpr>)r   r   Úzipr   )Úlayoutsr   r   r
   r
   r   Úmake_layoutt   s   
r6   c                 C   s   t | ƒr|  ¡ S t| ƒS r   )r   r)   r(   ©Úlayoutr
   r
   r   r)   }   s   r)   c                 C   s   |   ¡ S r   )r*   r7   r
   r
   r   r*   „   s   r*   Nc                    s  t ˆƒr0tˆ ƒtˆƒksJ ‚tt‡ ‡fdd„tdtˆƒƒD ƒ‡ fdd„ttˆƒtˆ ƒƒD ƒƒƒS dg}dg}ttˆ jƒtˆ jƒƒD ]5\}}|dkrJqA|d dkrY||d< ||d< qA|d |d  |krl|d | |d< qA| 	|¡ | 	|¡ qAt|ƒdkr†t
|d |d ƒS t
t|ƒt|ƒƒS )Nc                 3   ó"    | ]}t ˆ | ˆ| ƒV  qd S r   )Úcoalesce©r0   r&   ©r8   Úprofiler
   r   r2   Œ   ó   €  zcoalesce.<locals>.<genexpr>r   c                 3   ó    | ]}ˆ | V  qd S r   r
   r;   r7   r
   r   r2      ó   € r   éÿÿÿÿ)r   r   r6   r   Úranger4   Úflattenr   r   Úappendr   Útuple©r8   r=   Úresult_shapeÚresult_strider   r   r
   r<   r   r:   ‰   s(    ÿ

r:   c                    sØ   t ˆƒr0tˆ ƒtˆƒksJ ‚tt‡ ‡fdd„tdtˆƒƒD ƒ‡ fdd„ttˆƒtˆ ƒƒD ƒƒƒS g }g }ttˆ jƒtˆ jƒƒD ]\}}|dksU|dksU| 	|¡ | 	|¡ q?t|ƒdkrat
ddƒS tt
t|ƒt|ƒƒƒS )Nc                 3   r9   r   )Úfilterr;   r<   r
   r   r2   «   r>   zfilter.<locals>.<genexpr>r   c                 3   r?   r   r
   r;   r7   r
   r   r2   ¬   r@   r   )r   r   r6   r   rB   r4   rC   r   r   rD   r   r:   rE   rF   r
   r<   r   rI   ¨   s    ÿ

€
rI   c           
         sÎ  ˆd u rˆ S t ˆƒrtˆ tˆƒƒS tˆƒrAtˆ ƒtˆƒksJ ‚tt‡ ‡fdd„tdtˆƒƒD ƒ‡ fdd„ttˆƒtˆ ƒƒD ƒƒƒS tˆjƒrQt‡ fd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 ]6\}}|| dks|| dksJ ‚ttd|| ƒ|ƒ}	|	dkr©| |	¡ | || ¡ ||	 }| |  }q}|dks¾t|ƒdkrÏ| |¡ | |t|j	ƒd  ¡ t|ƒdkrÞt|d |d ƒS tt|ƒt|ƒƒS )Nc                 3   r9   r   ©Úcompositionr;   ©ÚlayoutAÚlayoutBr
   r   r2   Å   r>   zcomposition.<locals>.<genexpr>r   c                 3   r?   r   r
   r;   ©rM   r
   r   r2   Æ   r@   c                 3   s    | ]}t ˆ |ƒV  qd S r   rJ   )r0   Ú	layoutB_irO   r
   r   r2   È   s   € rA   r   )Úis_intrK   r   r   r   r6   r   rB   r   r   r:   r4   rC   ÚminÚmaxrD   rE   )
rM   rN   rG   rH   Ú
rest_shapeÚrest_strideÚflat_AÚ
curr_shapeÚcurr_strideÚ	new_shaper
   rL   r   rK   ¾   s@    ÿ

.

rK   c           	      C   sÐ   t | ƒr
tt| ƒƒS g }g }d}ttt| jƒt| jƒƒƒ}|D ]-\}}|dks+|dkr,q||| k}t|ƒt	us<|s<J ‚| 
|| ¡ | 
|¡ || }q| 
|| d | ¡ | 
|¡ ttt|ƒt|ƒƒƒS )Nr   r   )rQ   Ú
complementr   Úsortedr4   rC   r   r   ÚtypeÚboolrD   r:   rE   )	r8   Úmax_idxrG   rH   Úcurrent_idxÚ	sorted_DSr   r   Úin_boundr
   r
   r   rZ   è   s"   


rZ   c           
      C   s¨   | d u rd S t | ƒrt| ƒS g }g }d}t| jƒ}t| jƒ}tt||t|ƒƒƒ}|D ]\}}}	|dkr4q*||kr: n| |¡ | |	¡ || }q*t	tt
|ƒt
|ƒƒƒS r   )rQ   r   rC   r   r   r[   r4   r   rD   r:   rE   )
r8   rG   rH   r_   Ú
flat_shapeÚflat_strideÚ
sorted_DSAr   r   Úrstrider
   r
   r   Úright_inverse  s&   




rf   c                 C   s.   | d u rd S t | ƒrt| ƒS tt| t| ƒƒƒS r   )rQ   r   rf   r6   rZ   r7   r
   r
   r   Úleft_inverse  s
   rg   c                    sœ   ˆd u rˆ S t ˆƒrtˆ tˆƒƒS tˆƒrAtˆ ƒtˆƒksJ ‚tt‡ ‡fdd„tdtˆƒƒD ƒ‡ fdd„ttˆƒtˆ ƒƒD ƒƒƒS tˆ tˆt	ˆt
ˆ ƒƒƒƒS )Nc                 3   r9   r   )Úlogical_divider;   rL   r
   r   r2   0  r>   z!logical_divide.<locals>.<genexpr>r   c                 3   r?   r   r
   r;   rO   r
   r   r2   1  r@   )rQ   rh   r   r   r   r6   r   rB   rK   rZ   r)   rL   r
   rL   r   rh   )  s    ÿrh   c                    s¤   ˆd u rˆ S t ˆƒrtˆ tˆƒƒS tˆƒrAtˆ ƒtˆƒksJ ‚tt‡ ‡fdd„tdtˆƒƒD ƒ‡ fdd„ttˆƒtˆ ƒƒD ƒƒƒS tˆ tt	ˆ t
ˆ ƒtˆƒ ƒˆƒƒS )Nc                 3   r9   r   )Úlogical_productr;   rL   r
   r   r2   ?  r>   z"logical_product.<locals>.<genexpr>r   c                 3   r?   r   r
   r;   rO   r
   r   r2   @  r@   )rQ   rh   r   r   r   r6   r   rB   rK   rZ   r)   r*   rL   r
   rL   r   ri   8  s    ÿ"ri   c              
      sÆ   ˆd u rt tddƒˆ ƒS tˆƒr^tˆ ƒtˆƒksJ ‚t ‡ ‡‡fdd„tdtˆƒƒD ƒƒ‰t t ‡fdd„tdtˆƒƒD ƒƒt t‡fdd„tdtˆƒƒD ƒ‡ fdd„ttˆƒtˆ ƒƒD ƒƒƒƒS ˆˆ ˆƒS )Nr   r   c                 3   s$    | ]}t ˆˆ | ˆ| ƒV  qd S r   )Ú
hier_unzipr;   )rM   rN   Úsplitterr
   r   r2   L  s   €" zhier_unzip.<locals>.<genexpr>c                 3   ó    | ]	}ˆ | d  V  qdS )r   Nr
   r;   ©Úsplitr
   r   r2   N  r3   c                 3   rl   )r   Nr
   r;   rm   r
   r   r2   O  r3   c                 3   r?   r   r
   r;   rO   r
   r   r2   P  r@   )r6   r   r   r   rB   r   )rk   rM   rN   r
   )rM   rN   rn   rk   r   rj   F  s   $ ÿÿ
rj   c                 C   ó   t t| |ƒS r   )rj   rh   rL   r
   r
   r   Úzipped_divideW  ó   rp   c                    ó6   t | |ƒ‰ tˆ d g‡ fdd„ttˆ d ƒƒD ƒ ƒS )Nr   c                    ó   g | ]}ˆ d  | ‘qS ©r   r
   r;   ©Úresultr
   r   Ú
<listcomp>^  ó    z tiled_divide.<locals>.<listcomp>r   )rp   r6   rB   r   rL   r
   ru   r   Útiled_divide\  ó   
,ry   c                 C   ro   r   )rj   ri   rL   r
   r
   r   Úzipped_productb  rq   r{   c                    rr   )Nr   c                    rs   rt   r
   r;   ru   r
   r   rw   i  rx   z!tiled_product.<locals>.<listcomp>r   )r{   r6   rB   r   rL   r
   ru   r   Útiled_productg  rz   r|   Úcrdr8   c                 C   s*   t t| |jƒt| |jƒƒt| |j|jƒfS r   )r   r"   r   r   r#   )r}   r8   r
   r
   r   Úslice_and_offsetl  s   ÿr~   r   rt   )Ú__doc__Ú	itertoolsr   Útypingr   Ú	int_tupler   r   r   r6   r)   r*   r:   rI   rK   rZ   rf   rg   rh   ri   rj   rp   ry   r{   r|   rE   r~   r
   r
   r
   r   Ú<module>   s4    A	


*
ÿ