o
    پi#                  
   @   s   d Z 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dl
mZmZmZmZ ddlZddlmZ eeZeG dd	 d	ZG d
d dZe ZeG dd dZG dd dZi Zdd Z	ddededee dee fddZdS )zCThe baseclass of a backend for grammar-guided constrained decoding.    N)ThreadPoolExecutor)	dataclassfield)Event)DictListOptionalTuple)
ServerArgsc                   @   s   e Zd ZU dZee ed< dZee ed< dZ	ee ed< dZ
eed< dZeed< eedZee ed	< dZee ed
< dZeed< dS )GrammarStatsNcompilation_timeschema_count	ebnf_sizeFis_cache_hitis_grammar_aborted)default_factorytree_traversal_timedispatch_typer   num_timeout)__name__
__module____qualname__r   r   float__annotations__r   intr   r   boolr   r   listr   r   r   strr    r   r   _/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/constrained/base_grammar_backend.pyr      s   
 r   c                   @   s<  e Zd Zdd ZdefddZdeddfd	d
ZdefddZdd Z	dede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ede
jde
jddfddZd,ddZedd  Zejd!d  Zdeeee ef  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ddfd*d+ZdS )-BaseGrammarObjectc                 C   s   d| _ d | _d | _d S NF)	_finishedgrammar_statscurrent_tokenselfr   r   r   __init__,   s   
zBaseGrammarObject.__init__	reasoningc                 C   s   d S Nr   )r&   r(   r   r   r   maybe_init_reasoning1      z&BaseGrammarObject.maybe_init_reasoningtokenreturnNc                 C      t  )z0
        Accept a token in the grammar.
        NotImplementedError)r&   r,   r   r   r   accept_token4   s   zBaseGrammarObject.accept_tokenkc                 C   r.   r)   r/   )r&   r2   r   r   r   rollback:      zBaseGrammarObject.rollbackc                 C   s   dS r!   r   r%   r   r   r   is_terminated=   r+   zBaseGrammarObject.is_terminated
vocab_size
batch_sizec                 C   r.   r)   r/   )r&   r6   r7   devicer   r   r   allocate_vocab_mask@   s   z%BaseGrammarObject.allocate_vocab_mask
vocab_maskidxc                 C   r.   r)   r/   )r&   r:   r;   r   r   r   fill_vocab_maskE   r4   z!BaseGrammarObject.fill_vocab_maskc                 C   r.   r)   r/   )r:   r8   r   r   r   move_vocab_maskH      z!BaseGrammarObject.move_vocab_masklogitsc                 C   r.   r)   r/   )r?   r:   r   r   r   apply_vocab_maskL   r>   z"BaseGrammarObject.apply_vocab_maskc                 C   s   | S r)   r   r%   r   r   r   copyP   r+   zBaseGrammarObject.copyc                 C   s   | j S r)   r"   r%   r   r   r   finishedS   r>   zBaseGrammarObject.finishedc                 C   s
   || _ d S r)   rB   )r&   rC   r   r   r   rC   W   s   
c                 C   r.   )z
        Try to jump forward in the grammar.

        Returns:
            A jump forward helper which may be used in `jump_forward_str_state`.
            None if the jump forward is not possible.
        r/   )r&   	tokenizerr   r   r   try_jump_forward[      z"BaseGrammarObject.try_jump_forwardhelperc                 C   r.   )z
        Jump forward for the grammar.

        Returns:
            A tuple of the jump forward string and the next state of the grammar
            (which can be used in `jump_and_retokenize` if needed).
        r/   )r&   rG   r   r   r   jump_forward_str_statee   rF   z(BaseGrammarObject.jump_forward_str_stateold_output_idsnew_output_ids
next_statec                 C   r.   )zN
        Jump forward occurs, and update the grammar state if needed.
        r/   )r&   rI   rJ   rK   r   r   r   jump_and_retokenizeo   s   z%BaseGrammarObject.jump_and_retokenize)r-   r    )r   r   r   r'   r   r*   r   r1   r3   r5   torchTensorr9   r<   staticmethodr=   r@   rA   propertyrC   setterr   r	   r   r   rE   rH   rL   r   r   r   r   r    *   sD    



&

r    c                   @   s   e Zd ZU eed< eed< dS )
CacheEntryvalueeventN)r   r   r   r    r   r   r   r   r   r   rR   {   s   
 rR   c                   @   s  e Zd Zdd ZdededdfddZdededee fd	d
Zdedee fddZ	dedee fddZ
dedee fddZdedee fddZdeeef dedee fddZdeeef dedee fddZdeeef defddZdd ZdS )BaseGrammarBackendc                 C   s   t  | _i | _d S r)   )r   executorcacher%   r   r   r   r'      s   
zBaseGrammarBackend.__init__key_type
key_stringr-   Nc                 C   s   t d|d| d S )NzSkip unsupported key_type=z, key_string=)loggerwarningr&   rX   rY   r   r   r   _not_supported   s   z!BaseGrammarBackend._not_supportedc                 C   s   t d| d| )zB
        This function should not be reached in any case.
        zInvalid key_type: =)
ValueErrorr\   r   r   r   dispatch_fallback   s   z$BaseGrammarBackend.dispatch_fallbackc                 C      |  d|S )Njsonr]   r&   rY   r   r   r   dispatch_json      z BaseGrammarBackend.dispatch_jsonc                 C   ra   )Nregexrc   rd   r   r   r   dispatch_regex   rf   z!BaseGrammarBackend.dispatch_regexc                 C   ra   )Nebnfrc   rd   r   r   r   dispatch_ebnf   rf   z BaseGrammarBackend.dispatch_ebnfc                 C   ra   )Nstructural_tagrc   rd   r   r   r   dispatch_structural_tag   rf   z*BaseGrammarBackend.dispatch_structural_tagkeyrequire_reasoningc                 C   s   t  }|\}}|dkr| |}n8|dkr| |}n.|dkr&| |}n$|dkr0| |}n|dkr:| |}n|dkrD| |}n| ||}|d ur[|j	d ur[t  | |j	_
|S )Nrb   rg   ri   rk   structural_patternstructural_pattern_v2)timeperf_counterre   rh   rj   rl   dispatch_structural_patterndispatch_structural_pattern_v2r`   r#   r   )r&   rm   rn   srX   rY   grammarr   r   r   _init_value_dispatch   s$   z'BaseGrammarBackend._init_value_dispatchc                 C   sD   | j |}|r| }|| |dfS | j| j||}|dfS )NTF)rW   getrA   r*   rV   submitrw   )r&   rm   rn   rS   copied_valuer   r   r   get_cached_or_future_value   s   
z-BaseGrammarBackend.get_cached_or_future_valuerS   c                 C   s   || j |< d S r)   )rW   )r&   rm   rS   r   r   r   	set_cache      zBaseGrammarBackend.set_cachec                 C   s   | j   d S r)   )rW   clearr%   r   r   r   reset   r}   zBaseGrammarBackend.reset)r   r   r   r'   r   r]   r   r    r`   re   rh   rj   rl   r	   r   rw   r{   r|   r   r   r   r   r   rU      s<    




rU   c                 C   s   |t | < d S r)   )GRAMMAR_BACKEND_REGISTRY)name	init_funcr   r   r   register_grammar_backend   rf   r   server_argsr6   eos_token_idsr-   c              
   C   s4  | j }|tv rt| | |||S |dkr"ddlm} ||| jd}nb|dkrbddlm}m} |r4t|nd }	z||||	| j	 d}W nA |ya }
 zt
d|
 d	 d
| _ W Y d }
~
d S d }
~
ww |dkrwddlm} ||| j	 | jd}n|d
kr}d S td| | jrt|drddlm} |||j}|S )Noutlinesr   )OutlinesGrammarBackend)whitespace_patternxgrammar)TokenizerNotSupportedErrorXGrammarGrammarBackend)r6   model_eos_token_idsany_whitespacezIGrammar backend disabled because tokenizer is not supported by XGrammar: zn. Falling back to grammar_backend='none'. Structured outputs (JSON schema, regex, EBNF) will not be available.none
llguidance)GuidanceBackend)rD   r   r   zInvalid grammar backend: think_end_id)ReasonerGrammarBackend)grammar_backendr   'sglang.srt.constrained.outlines_backendr   #constrained_json_whitespace_pattern'sglang.srt.constrained.xgrammar_backendr   r   r   'constrained_json_disable_any_whitespacerZ   r[   )sglang.srt.constrained.llguidance_backendr   r_   reasoning_parserhasattr/sglang.srt.constrained.reasoner_grammar_backendr   r   )r   rD   r6   r   r   r   r   r   r   eos_lister   r   r   r   r   create_grammar_backend   sZ   

r   r)   )__doc__loggingrq   concurrent.futuresr   dataclassesr   r   	threadingr   typingr   r   r   r	   rM   sglang.srt.server_argsr
   	getLoggerr   rZ   r   r    INVALID_GRAMMAR_OBJrR   rU   r   r   r   setr   r   r   r   r   <module>   s:   
NF