o
    i                     @   sX   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	 eddG dd dZ
dS )	    )TupleOptional)	dataclassN)
SeqlenInfoT)frozenc                	   @   s   e Zd ZU eje ed< eje ed< eje ed< dZeje ed< dZ	e
ej ed< dZe
ej ed< d	Zeje ed
< ejdedejdeejejf fddZejdedejdejdejfddZejdedejdejdejfddZdS )	BlockInfom_block_sizen_block_size	is_causalFis_localNwindow_size_leftwindow_size_right   qhead_per_kvhead_packgqaseqlen_infom_blockreturnc           
      C   s  t |j| j}t| jp| jo| jd urK|d | j	 }t| j
dkr,t || j
}||j |j }t| jr<|n|| j }t|t || j}d}t| joV| jd ur|| j	 }t| j
dkrj|| j
 }||j |j }|| j }	t|	| j d}||fS )Nr   r   )cuteceil_divseqlen_kr	   cutlass
const_exprr
   r   r   r   r   seqlen_qminr   max)
selfr   r   n_block_max	m_idx_maxn_idxn_idx_rightn_block_min	m_idx_min
n_idx_left r#   P/home/ubuntu/vllm_env/lib/python3.10/site-packages/flash_attn/cute/block_info.pyget_n_block_min_max   s&   


zBlockInfo.get_n_block_min_maxr    c                 C   sl   || j  }t| jdkr|| j }||j |j }t| j p$| jdu r(|n|| j }t||| j	 S )zZIf we have separate iterations with causal or local masking at the start, where do we stopr   N)
r   r   r   r   r   r   r   r   r   r	   )r   r   r   r    r!   r   r   r#   r#   r$   !get_n_block_min_causal_local_mask-   s   

z+BlockInfo.get_n_block_min_causal_local_maskc                 C   sx   t | j p
| jdu r|S |d | j }t | jdkr$t|| j}||j |j	 }|| j }t 
|t|| jS )zhIf we have separate iterations with local masking at the end, where do we stop the non-masked iterationsNr   )r   r   r   r   r   r   r   r   r   r   r   r	   )r   r   r   r    r   r   r"   r#   r#   r$   !get_n_block_min_before_local_mask@   s   
z+BlockInfo.get_n_block_min_before_local_mask)__name__
__module____qualname__r   	Constexprint__annotations__boolr   r   r   Int32r   r   r   jitr   r   r%   r&   r'   r#   r#   r#   r$   r      sH   
 r   )typingr   r   dataclassesr   r   cutlass.cuter   flash_attn.cute.seqlen_infor   r   r#   r#   r#   r$   <module>   s   