o
    c۷i                     @   s   d dl mZmZ d dlmZ d dlZd dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZmZ eG dd deZG d	d
 d
ZdS )    )Optional
NamedTuple)	dataclassN)Int32Boolean
const_expr)
copy_utils)
ParamsBasemlir_namedtuplec                   @   sD   e Zd ZU dZeej ed< dZeej ed< dZ	eej ed< dS )VarlenArgumentsNmCuSeqlensMmCuSeqlensKmAIdx)
__name__
__module____qualname__r   r   cuteTensor__annotations__r   r    r   r   H/home/ubuntu/vllm_env/lib/python3.10/site-packages/quack/varlen_utils.pyr      s   
 r   c                   @   s4  e Zd ZeG dd deZededfddddeded	ed
edef
ddZe	dddde
defddZe	ejddddeded	edd fddZdedefddZdedefddZdejdedejfddZdedejfddZdejdedejfdd Zd!ejdedejfd"d#Zd$d% Zd&d' ZdS )(VarlenManagerc                   @   sh   e Zd ZU dZeej ed< dZeej ed< dZ	eej ed< e
ejddddedd fdd	ZdS )
zVarlenManager.ParamsNcu_seqlens_mcu_seqlens_kr   locipargsreturnc                C   s   t j| j| j| jdS )N)r   r   r   )r   Paramsr   r   r   r   r   r   r   r   r   create   s
   zVarlenManager.Params.create)r   r   r   r   r   r   r   r   r   r   staticmethodjitr   r!   r   r   r   r   r      s   
 "r   TNr   paramslen_m_staticlen_k_staticlast_batch_idxis_group_changedc                C   s^   || _ || _|| _|| _|| _t|jd u| _t|jd u| _	t|j
d u| _|| _|| _d S N)r%   _len_m_static_len_k_static_last_batch_idx_is_group_changedr   r   varlen_mr   varlen_kr   gather_A_loc_ip)selfr%   r&   r'   r(   r)   r   r   r   r   r   __init__&   s   
zVarlenManager.__init__r   r   c                C   s.   | j d ur| jd urJ dtjj| ||dS )Nz(Only support either varlen_m or varlen_kr   )r   r   r   r   r!   r    r   r   r   to_underlying_arguments<   s   z%VarlenManager.to_underlying_argumentsc                C   s   t | ||dS )N)r&   r'   )r   )r%   r&   r'   r   r   r   r   r   r!   C   s   
zVarlenManager.create	batch_idxc                 C   ,   t | jr| jj|d  | jj|  S | jS N   )r   r/   r%   r   r+   r4   r7   r   r   r   len_mO      
zVarlenManager.len_mc                 C   r8   r9   )r   r0   r%   r   r,   r;   r   r   r   len_kU   r=   zVarlenManager.len_kmA_mklc           	      C   s   | j }t| jrt|j| d f|}|S t| jrQ|j| }tt|}t|dkr6td |f|}|S |j|d  | }t|dk}t	j
|||d|d}|S |d d |f }|S N   r:      
ragged_dim	ptr_shift)r%   r   r/   r   domain_offsetr   r0   r   rankr   offset_ragged_tensor)	r4   r?   r7   r%   mA_mkoffsetragged_ranklengthrE   r   r   r   offset_batch_A[   s,   


	zVarlenManager.offset_batch_Ac                 C   s`   | j }t| jrt|j| f|j}|S t| jr't|j| f|j}|S |jd |f }|S r*   )	r%   r   r/   r   rF   r   r   r0   r   )r4   r7   r%   mAIdx_mkr   r   r   offset_batch_AIdxs   s   

zVarlenManager.offset_batch_AIdxmB_nklc           	      C   s   | j }t| jr?|j| }tt|}t|dkr$td |f|}|S |j|d  | }t|dk}tj|||d|d}|S |d d |f }|S r@   )	r%   r   r0   r   r   rG   rF   r   rH   )	r4   rP   r7   r%   rJ   rK   mB_nkrL   rE   r   r   r   offset_batch_B}   &   

	zVarlenManager.offset_batch_BmD_mnlc           	      C   s   | j }t| jr?|j| }tt|}t|dkr$t|d f|}|S |j|d  | }t|dk}tj|||d|d}|S |d d |f }|S )NrA   r:   rB   r   rC   )	r%   r   r/   r   r   rG   rF   r   rH   )	r4   rT   r7   r%   rJ   rK   mD_mnrL   rE   r   r   r   offset_batch_epi   rS   zVarlenManager.offset_batch_epic                 C   sP   g g }| _ | j| j| j| j| jfD ]}t|}||7 }| j t	| q|S r*   )
_values_posr%   r+   r,   r-   r.   cutlassextract_mlir_valuesappendlen)r4   valuesobj
obj_valuesr   r   r   __extract_mlir_values__   s   
z%VarlenManager.__extract_mlir_values__c              	   C   sj   g }t | j| j| j| j| jg| jD ]\}}|t	||d |  ||d  }q| j
t|d| jiS )Nr   )zipr%   r+   r,   r-   r.   rW   rZ   rX   new_from_mlir_values	__class__tupler2   )r4   r\   obj_listr]   n_itemsr   r   r   __new_from_mlir_values__   s   
z&VarlenManager.__new_from_mlir_values__)r   r   r   r   r	   r   r   r   r5   r"   r   r6   r   r#   r!   r<   r>   r   rM   rO   rR   rV   r_   rf   r   r   r   r   r      sT    


r   )typingr   r   dataclassesr   rX   cutlass.cuter   r   r   r   quackr   quack.cute_dsl_utilsr	   r
   r   r   r   r   r   r   <module>   s   