o
    پi                     @   s  d Z ddlZddlZddlmZmZmZmZmZ ddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ zdd	lmZ W n eyY   dd	lmZ Y nw eeZG d
d deZG dd deZ	ddee eef dee  fddZ!dS )z+Constrained decoding with outlines backend.    N)DictListOptionalTupleUnion)
RegexGuide)TransformerTokenizer)	BaseModel)INVALID_GRAMMAR_OBJBaseGrammarBackendBaseGrammarObject)OutlinesJumpForwardMap)build_regex_from_schemac                       s  e Zd Zdedeedf ddf fddZdefdd	Zd
edede	j
fddZede	j
de	j
fddZde	j
deddfddZede	j
de	j
fddZdd Zdee fddZdeee ef deeef fddZdee dee d efd!d"Z  ZS )#OutlinesGrammarguidejump_forward_mapNreturnc                    s    t    || _|| _d| _d S )Nr   )super__init__r   r   state)selfr   r   	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/constrained/outlines_backend.pyr   +   s   

zOutlinesGrammar.__init__tokenc                 C   s   | j | j|| _d S N)r   get_next_stater   )r   r   r   r   r   accept_token5   s   zOutlinesGrammar.accept_token
vocab_size
batch_sizec                 C   s   t j||t j|dS )N)dtypedevice)torchzerosbool)r   r   r    r"   r   r   r   allocate_vocab_mask8   s   z#OutlinesGrammar.allocate_vocab_mask
vocab_maskc                 C   s   | S r   r   )r'   r"   r   r   r   move_vocab_mask=   s   zOutlinesGrammar.move_vocab_maskidxc                 C   sX   t j| j| jjt jdj|jdd}|| }|	d |
d|t j|t jd d S )N)r!   T)non_blocking   r   )r#   tensorr   get_next_instructionr   tokensint64tor"   fill_scatter_
zeros_liker%   )r   r'   r)   r.   r   r   r   fill_vocab_maskA   s   
zOutlinesGrammar.fill_vocab_masklogitsc                 C   s   |  |td d S )Nz-inf)masked_fill_float)r5   r'   r   r   r   apply_vocab_maskI   s   z OutlinesGrammar.apply_vocab_maskc                 C   s   t | j| jS r   )r   r   r   )r   r   r   r   copyM   s   zOutlinesGrammar.copyc           	      C   s   | j sd S | j | j}|d u st|dkrd S g }tdd}| j}t|rJ|d d |v rJ|d}||d  |d }t|rJ|d d |v s.dd |D }||}||fS )Nr+         r   c                 S   s(   g | ]}d t |dd   dqS )z<0x   N>)hexupper).0br   r   r   
<listcomp>d   s   ( z4OutlinesGrammar.try_jump_forward.<locals>.<listcomp>)r   jump_forward_byter   lenrangepopappendconvert_tokens_to_ids)	r   	tokenizerjump_forward_bytessuffix_bytescontinuation_range	cur_state	byte_edgesuffix_tokens
suffix_idsr   r   r   try_jump_forwardP   s(   


z OutlinesGrammar.try_jump_forwardhelperc                 C   s   |\}}| j |S r   )r   jump_forward_symbol)r   rR   _rM   r   r   r   jump_forward_str_stateh   s   z&OutlinesGrammar.jump_forward_str_stateold_output_idsnew_output_ids
next_statec                 C   s
   || _ d S r   )r   )r   rV   rW   rX   r   r   r   jump_and_retokenizel   s   
z#OutlinesGrammar.jump_and_retokenize)__name__
__module____qualname__r   r   r   r   intr   r#   Tensorr&   staticmethodr(   r4   r8   r9   r   r   rQ   r   strrU   rY   __classcell__r   r   r   r   r   *   s>    


&r   c                       s|   e Zd ZdedB f fddZdedee fddZd	ef fd
dZd	ef fddZ	d	efddZ
d	efddZ  ZS )OutlinesGrammarBackendwhitespace_patternNc                    s   t    zt|| _W n: tyF   |j}dd }tt|jj|dt|_t|| _|| jj	_|| j_| jj	j
| j_
| jj	 | j_Y nw || _d S )Nc                 S   s
   || _ d S r   )_value)r   valuer   r   r   fset      
z-OutlinesGrammarBackend.__init__.<locals>.fset)fgetrf   )r   r   r   outlines_tokenizerAttributeErrorpad_token_idpropertytyperh   rI   	pad_token	get_vocab
vocabularyrc   )r   rI   rc   origin_pad_token_idrf   r   r   r   r   s   s$   





zOutlinesGrammarBackend.__init__regexr   c              
   C   s|   zt tdrt|| j}nt|| j}W n! tjjy6 } ztd|d| t	W  Y d }~S d }~ww d }t
||S )N
from_regexz Hit invalid regex schema: regex=, e=)hasattrr   rs   ri   interegularpatternsInvalidSyntaxloggererrorr
   r   )r   rr   r   er   r   r   r   _compile_regex   s   

z%OutlinesGrammarBackend._compile_regex
key_stringc                       t  |S r   )r   dispatch_ebnfr   r}   r   r   r   r         z$OutlinesGrammarBackend.dispatch_ebnfc                    r~   r   )r   dispatch_structural_tagr   r   r   r   r      r   z.OutlinesGrammarBackend.dispatch_structural_tagc              
   C   sf   z	t || jd}W n$ ttjjtfy- } ztd|d| t	W  Y d }~S d }~ww | 
|S )N)rc   z$Hit invalid json_schema: key_string=rt   )build_regex_from_objectrc   NotImplementedErrorjsondecoderJSONDecodeError
ValueErrorry   rz   r
   r|   )r   r}   rr   r{   r   r   r   dispatch_json   s   

z$OutlinesGrammarBackend.dispatch_jsonc                 C   s
   |  |S r   )r|   r   r   r   r   dispatch_regex   rg   z%OutlinesGrammarBackend.dispatch_regex)rZ   r[   r\   r`   r   r   r   r|   r   r   r   r   ra   r   r   r   r   rb   r   s    rb   objectrc   c                 C   sB   t | ttrt|  }nt | trt| }n| }t||S r   )
isinstancerm   r	   r   dumpsmodel_json_schemar   r   )r   rc   schemar   r   r   r      s   

r   r   )"__doc__r   loggingtypingr   r   r   r   r   rv   r#   outlines.fsm.guider   outlines.models.transformersr   pydanticr	   +sglang.srt.constrained.base_grammar_backendr
   r   r   ,sglang.srt.constrained.outlines_jump_forwardr   outlines.fsm.json_schemar   ImportErroroutlines_core.fsm.json_schema	getLoggerrZ   ry   r   rb   r`   r   r   r   r   r   <module>   s2   
HD