o
    پi                     @   s  d dl Z d dlZd dlmZ d dlmZmZ d dlmZ dg dddd	ej	g d
g dg dg dgej
dej	g dg dg dg dgej
ddd	g dddd	ej	g dg dg dg dgej
dej	g dg dg dg dgej
dddddgdddej	d d gddgddgddgd d ggej
dej	ddgd dgd dgd dgd d	ggej
ddgZG d!d" d"eZG d#d$ d$Zd%d& Ze ej  d'G d(d) d)eZed*kre   dS dS )+    N)MLATokenToKVPool)ForwardBatchForwardMode)CustomTestCase   )@   r   r   0         )r   r   r   )r	   r	   r	   )    r   r   )r   r   r   )dtype)
batch_sizeprefix_lensmax_chunk_capacityprefix_chunk_lennum_prefix_chunksprefix_chunk_startsprefix_chunk_seq_lens)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   r   r	   r	   )r   r   r   r	                     -   <   c                       s*   e Zd Zdef fddZdd Z  ZS )MockForwardBatchr   c                    s   t  j|i | || _d S N)super__init__r   )selfr   argskwargs	__class__ `/home/ubuntu/.local/lib/python3.10/site-packages/sglang/test/attention/test_prefix_chunk_info.pyr   ^   s   
zMockForwardBatch.__init__c                 C   s   | j S r   )r   r    r%   r%   r&   get_max_chunk_capacityb   s   z'MockForwardBatch.get_max_chunk_capacity)__name__
__module____qualname__intr   r(   __classcell__r%   r%   r#   r&   r   ]   s    r   c                   @   s   e Zd Zdd ZdS )MockReqToTokenPoolc                 C   s(   t j|| |d||t j| _d S )Ndevice)torcharangereshapetoint32req_to_token)r    r   seq_lenr0   r%   r%   r&   r   g   s   zMockReqToTokenPool.__init__N)r)   r*   r+   r   r%   r%   r%   r&   r.   f   s    r.   c           	   	   C   s   t | jD ]\}| j| }| jjd | jd d f }tj| j| tj	|j
d}d}t | jD ]+}| j||f  }| j||f  }||||  ||||| f  ||7 }q-t||saJ qd S )N)r   r0   r   )ranger   prefix_chunk_kv_indicesreq_to_token_poolr6   r   r1   emptyprefix_chunk_num_tokensr5   r0   r   itemr   copy_allclose)	forward_batchicomputed_kv_indicesr6   ref_kv_indicesrunning_ptrj	seq_startr7   r%   r%   r&   check_kv_indicesp   s(   

rG   zTest requires CUDAc                   @   s   e Zd Zdd Zdd ZdS )TestPrefixChunkInfoc              
   C   sz   d| _ d| _d| _td| _tj| _d| _d| _d| _	t
| j| j	| j| _t| j| j	 d| j| j| jd| jdd| _d S )	N   i   r   cudar
   r   F)size	page_sizer   kv_lora_rankqk_rope_head_dim	layer_numr0   enable_memory_saver)num_local_headsrM   rN   r1   r0   bfloat16r   
extend_lenmax_bsmax_seq_lenr.   r:   r   token_to_kv_poolr'   r%   r%   r&   setUp   s.   
zTestPrefixChunkInfo.setUpc                    s  t D ]}td|d  d|d  d|d   |d }|d  t |ks'J tj jd}|d } fdd	t|D }tj|jd}t||tjd
d|j	fjdtj
jj |j	  jj jdt|tjtj
|jd||| d}j|_j|_|j | |ksJ |j|d ksJ |j|d ksJ t|j|d jsJ t|j|d jsJ t| qdS )z#Test the standard extend operation.zTest case with batch_size=r   z, prefix_lens=r   z, max_chunk_capacity=r   r/   c                    s   g | ]	}j  |  qS r%   )rS   ).0rA   prefix_lens_cpur    r%   r&   
<listcomp>   s    z>TestPrefixChunkInfo.test_prefix_chunk_info.<locals>.<listcomp>r   d   )r   r   	input_idsout_cache_locseq_lens_sumforward_modereq_pool_indicesseq_lensseq_lens_cpuextend_prefix_lensextend_prefix_lens_cpur   r   r   r   N)
TEST_CASESprintlenr1   tensorr0   r8   r   randintrS   r2   rT   rU   sumr   EXTENDr:   rV   !prepare_chunked_prefix_cache_infor(   r   r   r?   r   r4   r   rG   )r    	test_caser   r   r   rc   rb   r@   r%   rY   r&   test_prefix_chunk_info   s`    

z*TestPrefixChunkInfo.test_prefix_chunk_infoN)r)   r*   r+   rW   ro   r%   r%   r%   r&   rH      s    rH   __main__)unittestr1    sglang.srt.mem_cache.memory_poolr   ,sglang.srt.model_executor.forward_batch_infor   r   sglang.test.test_utilsr   ri   r5   rf   r   r.   rG   skipIfrJ   is_availablerH   r)   mainr%   r%   r%   r&   <module>   s    		
T	
X