o
    0 i]
                  	   @   s  d dl mZmZ d dlZd dlmZ ddlmZm	Z	 de
de
dee
e
f fd	d
Zde
de
deej fddZdeej deej ddfddZdeej deej ddfddZ	 ddedeej de
ddfddZde	deeee
f  deej ddfddZdS )    )TupleListN)NDArray   )	LLMatcher
LLExecutor
batch_size
vocab_sizereturnc                 C   s   | |d d fS )N        r   r	   r   r   \/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/llguidance/numpy.pyget_bitmask_shape   s   r   c                 C   s   t jt| |dt jdS )Ndtype)npfullr   int32r   r   r   r   allocate_token_bitmask   s
   r   logitsmaskc                 C   sh   t j|ddd}t t jdt jd|jd }||? d@ }|d d d | jd f }t j | |dk< d S )Nr   r   Zaxisr   r   )r   repeatZtileZaranger   shapeinf)r   r   Zmask_expandedZbit_indicesZ	bit_masksr   r   r   "apply_token_bitmask_inplace_kernel   s
   r   c                 C   s   | j dkrtj| dd} |j dkrtj|dd}|jtjks"J d| j dks+J d| j\}}|j\}}||ks=J dd| }||kr[tj | d d |d f< | d d d |f } t| | d S )	Nr   r   r   Mask must be int32   zLogits must be 2DzBatch size mismatchr   )ndimr   Zexpand_dimsr   r   r   r   r   )r   r   batchvocabZm_batchZm_vocabcutoffr   r   r   apply_token_bitmask_inplace   s   



r%   interpbitmaskindexc                 C   sd   |j tjks
J d|jdksJ d||d d f }|jd s$J d| |jj|j|j	  d S )Nr   r    Mask must be 2DC_CONTIGUOUSMask must be contiguous)
r   r   r   r!   flagsunsafe_compute_mask_ptrctypesdatasizeitemsize)r&   r'   r(   vr   r   r   fill_next_token_bitmask/   s
   r3   executormatchersc                 C   s^   |j tjks
J d|jdksJ d|j\}}|jd s!J d| ||jj|d | dS )z
    Compute the token mask directly into the specified array.
    For each matcher, provide the index of the target mask.
    r   r    r)   r*   r+      N)	r   r   r   r!   r   r,   r-   r.   r/   )r4   r5   r'   r"   r#   r   r   r   fill_next_token_bitmask_par9   s
   
r7   )r   )typingr   r   numpyr   Znumpy.typingr   Z_libr   r   intr   r   r   Zfloat32r   r%   r3   r7   r   r   r   r   <module>   sF    
	
	


