o
    پi                     @   s  d dl Z d dlZd dlmZmZ d dlZd dlmZ e 	e
ZejejeZede de dgddgd	ZG d
d dZe
dkrdZe je jeddd g dg dgZedddZee e  eg dddgg dg\ZZeee dS dS )    N)ListTuple)loadngram_cache_cppz/ngram_cache_binding.cppz
/ngram.cppz-O3z
-std=c++20)namesourcesextra_cflagsc                   @   s   e Zd Z								dddZd	eee  fd
dZdd Zdd Zd	eee  de	e
je
jf fddZdee deee  deee  fddZ	dde
jde
jfddZdS )
NgramCache      
      BFS@B c	           
      C   s\   t  }	||	_||	_||	_||	_||	_||	_||	_t 	||	| _
tjdtjd| _|| _d S )N)r   r   )dtype)r   Parambranch_lengthmin_match_window_sizemax_match_window_sizemin_bfs_breadthmax_bfs_breadthdraft_token_num
match_typeNgramcachenponesint64default_mask)
selfr   r   r   r   r   r   r   capacityparam r"   `/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/speculative/cpp_ngram/ngram_cache.py__init__   s   
zNgramCache.__init__batch_tokensc                 C   s   | j | d S N)r   asyncInsert)r   r%   r"   r"   r#   	batch_put0   s   zNgramCache.batch_putc                 C      | j   d S r&   )r   synchronizer   r"   r"   r#   r*   3      zNgramCache.synchronizec                 C   r)   r&   )r   resetr+   r"   r"   r#   r-   6   r,   zNgramCache.resetreturnc                 C   s$   | j |}t|jt|jfS r&   )r   
batchMatchr   arraytokenmask)r   r%   resultr"   r"   r#   	batch_get9   s   zNgramCache.batch_gettokens	tree_maskc           	         s   dd t D }g }g }t|D ]\} t fdd|D r!q|  || q|  g }|D ]fddttD }|| q4|S )a  
        Find all leaf paths according to the binary tree_mask (i.e., paths that are not prefixes of any other path).

        Args:
            mask   : List[List[int]]   # nxn binary matrix
            tokens : List[int]         # token list corresponding to columns

        Returns:
            List[List[int]]            # token lists of only the leaf paths, preserving their order of appearance
        c                 S   s&   g | ]\}}|d d t |D fqS )c                 S   s   h | ]
\}}|d kr|qS r   r"   ).0idxvr"   r"   r#   	<setcomp>L   s    z=NgramCache.leaf_paths_from_mask.<locals>.<listcomp>.<setcomp>)	enumerate)r8   irowr"   r"   r#   
<listcomp>K   s    z3NgramCache.leaf_paths_from_mask.<locals>.<listcomp>c                 3   s    | ]} |kV  qd S r&   r"   )r8   kept)cur_setr"   r#   	<genexpr>S   s    z2NgramCache.leaf_paths_from_mask.<locals>.<genexpr>c                    s$   g | ]}  | d kr| qS r7   r"   )r8   col)rr5   r6   r"   r#   r?   [   s   $ )r<   reversedanyappendreverserangelen)	r   r5   r6   row_sets	leaf_sets	leaf_rowsr=   r3   pathr"   )rA   rD   r5   r6   r#   leaf_paths_from_mask=   s    
zNgramCache.leaf_paths_from_maskNdecoding_idsdecoding_masksc                 C   s   | d| j}| d| j| j}td|d| t|jd D ]A}| ||  ||  }|d u rBtd| d|  q"td| d |D ]}td| d| d	|j|d
d  qMq"d S )Nz
decoding_ids=z
decoding_masks=r   zdraft path z: zresult :z -> F)ensure_ascii)	reshaper   loggerinforI   shaperO   tolistdecode)r   rP   rQ   	tokenizerr=   
leaf_paths	leaf_pathr"   r"   r#   debug_result`   s$   
zNgramCache.debug_result)r
   r   r   r   r   r   r   r   r&   )__name__
__module____qualname__r$   r   intr(   r*   r-   r   r   ndarrayr4   rO   r^   r"   r"   r"   r#   r	      s6    
&


$r	   __main__z>%(levelname)s %(asctime)s %(filename)s:%(lineno)d] %(message)sz%Y-%m-%d %H:%M:%ST)levelformatdatefmtforce)
r                     r   	   r   )
r   ri   rj   ,   7   B   M   X   c   d      r   )r   r   )r   ri   rj   rj   rp   )rj   rm   i  )loggingostypingr   r   numpyr   torch.utils.cpp_extensionr   	getLoggerr_   rV   rN   dirnameabspath__file__	_abs_pathr   r	   rf   basicConfigDEBUG	token_idsr   r(   r*   r4   rP   rQ   r^   r"   r"   r"   r#   <module>   s@   

`
 