o
    پi                     @   sr   d dl mZ d dlmZ d dlZd dlmZ d dlmZmZ 	 eddG dd dZ	eddG d	d
 d
Z
dS )    )Optional)	dataclassN)Int32
const_exprT)frozenc                   @   sV   e Zd ZU ejed< ejed< e		d
dejdejdeej	 deej	 fdd	Z
dS )
SeqlenInfooffsetseqlenN	batch_idxseqlen_static
cu_seqlenssequsedc                 C   s^   t |d u rdn||  }t |d ur||  }nt |d ur(|| d  ||   }n|}t||S Nr      )r   r   )r
   r   r   r   r   r	    r   V/home/ubuntu/.local/lib/python3.10/site-packages/flash_attn_origin/cute/seqlen_info.pycreate   s   

zSeqlenInfo.create)NN)__name__
__module____qualname__cutlassr   __annotations__staticmethodr   cuteTensorr   r   r   r   r   r      s   
 

r   c                   @   sH  e Zd ZU ejed< ejed< ejed< ejed< ejed< ejed< eje ed< eje ed< eje ed	< eje ed
< e						d"dejdejdejde	e
j de	e
j de	e
j de	e
j dejej dejej fddZ	d#de
jdededeje de
jf
ddZ	d#de
jdededeje de
jf
d d!ZdS )$SeqlenInfoQKoffset_qoffset_kpadded_offset_qpadded_offset_kseqlen_qseqlen_khas_cu_seqlens_qhas_cu_seqlens_khas_seqused_qhas_seqused_kN   r
   seqlen_q_staticseqlen_k_staticmCuSeqlensQmCuSeqlensK	mSeqUsedQ	mSeqUsedKtile_mtile_nc	                 C   s  t |d u rdn||  }	t |d u rdn||  }
t |d u r dn	|	| |  | | }t |d u r2dn	|
| |  | | }t |d urG||  }nt |d u rO|n|| d  |	 }t |d urb||  }nt |d u rj|n|| d  |
 }|d u}|d u}|d u}|d u}t|	|
||||||||
S r   )r   r   )r
   r'   r(   r)   r*   r+   r,   r-   r.   r   r   r   r   r    r!   r"   r#   r$   r%   r   r   r   r   2   sL   





zSeqlenInfoQK.createFmQdimpaddedreturnc                 C   s   t | j rd| |f dt|d |   }|| S t | r$| jn| j}t t|jd dkr5|nd|f}|fdt|d   }t||S )z(Seqlen must be the first dimension of mQNr   r   r   )r   r"   r   rankr   r   shapedomain_offset)selfr/   r
   r0   r1   idxr   r   r   r   r   offset_batch_Qk   s   $$zSeqlenInfoQK.offset_batch_QmKc                 C   sr   t | j rd| |f dt|d |   }|| S t | r$| jn| j}|fdt|d   }t||S )z(Seqlen must be the first dimension of mKr3   r   r4   )r   r#   r   r5   r   r   r7   )r8   r;   r
   r0   r1   r9   r   r   r   r   offset_batch_K|   s   $zSeqlenInfoQK.offset_batch_K)NNNNr&   r&   )F)r   r   r   r   r   r   	Constexprboolr   r   r   r   r   intr:   r<   r   r   r   r   r   %   sz   
 







	=
r   )typingr   dataclassesr   r   cutlass.cuter   r   r   r   r   r   r   r   r   <module>   s    