o
    پi                      @   s   d Z ddlZddlZddlZddlmZmZmZ ddlZddl	m
Z
mZmZmZ ddlmZ ddlmZmZmZ ddlmZmZmZ ddlmZ eeZG d	d
 d
eZG dd deZdS )z-Constrained decoding with llguidance backend.    N)ListOptionalTuple)	LLMatcherLLTokenizer	StructTaggrammar_from)from_tokenizer)allocate_token_bitmaskapply_token_bitmask_inplacefill_next_token_bitmask)INVALID_GRAMMAR_OBJBaseGrammarBackendBaseGrammarObject)is_legacy_structural_tagc                       s  e Zd Zdedef fddZdefddZdej	d	ed
d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edej	dej	d
dfddZ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fd!d"Z  ZS )#GuidanceGrammarllguidance_tokenizerserialized_grammarc                    sB   t    || _|| _t| j| jttjddd| _	d | _
d S )NLLGUIDANCE_LOG_LEVEL1)	log_level)super__init__r   r   r   intosenvironget
ll_matcherbitmask)selfr   r   	__class__ ]/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/constrained/llguidance_backend.pyr   *   s   

zGuidanceGrammar.__init__tokenc                 C   s0   | j |std| j    d| _d S d S )Nzmatcher error: T)r   consume_tokenloggerwarning	get_errorfinished)r   r$   r"   r"   r#   accept_token6   s   
zGuidanceGrammar.accept_token
vocab_maskidxreturnNc                 C   s"   | j  rd| _t| j || d S )NT)r   
is_stoppedr)   r   )r   r+   r,   r"   r"   r#   fill_vocab_mask;   s   
zGuidanceGrammar.fill_vocab_mask
vocab_size
batch_sizec                 C   sF   | j d u s| j jd |k rt|| jj| _ | j }|S | j d | }|S )Nr   )r   shaper
   r   r0   )r   r0   r1   devicer   r"   r"   r#   allocate_vocab_maskA   s   z#GuidanceGrammar.allocate_vocab_maskc                 C   s   | j |ddS )NT)non_blocking)to)r+   r3   r"   r"   r#   move_vocab_maskO      zGuidanceGrammar.move_vocab_masklogitsc                 C   s   t | | d S N)r   )r9   r+   r"   r"   r#   apply_vocab_maskS   r8   z GuidanceGrammar.apply_vocab_maskc                 C   s   t | j| jdS )Nr   r   )r   r   r   )r   r"   r"   r#   copyW   s   zGuidanceGrammar.copyc                 C   s   | j  }|r|dfS d S )N )r   compute_ff_tokens)r   	tokenizer	ff_tokensr"   r"   r#   try_jump_forward]   s   
z GuidanceGrammar.try_jump_forwardhelperc                 C   s   dS )N)r>   r"   )r   rC   r"   r"   r#   jump_forward_str_stated   s   z&GuidanceGrammar.jump_forward_str_stateold_output_idsnew_output_ids
next_statec                 C   s   d S r:   r"   )r   rF   rG   rH   r"   r"   r#   jump_and_retokenizeg   s   z#GuidanceGrammar.jump_and_retokenize)__name__
__module____qualname__r   strr   r   r*   torchTensorr/   r4   staticmethodr7   r;   r=   r   r   r   rB   rE   rI   __classcell__r"   r"   r    r#   r   (   s2    
&r   c                       s   e Zd Z			ddedee dee f fddZ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  ZS )GuidanceBackendTNany_whitespacewhitespace_patternn_vocabc                    s.   t    || _|| _|| _t| j|| _d S r:   )r   r   r@   rS   rT   r	   r   )r   r@   rS   rT   rU   r    r"   r#   r   o   s
   
zGuidanceBackend.__init__r-   c              
   C   sP   zt | j|dW S  ty' } ztd|d| tW  Y d }~S d }~ww )Nr<   z(Hit invalid grammar: serialized_grammar=, e=)r   r   	Exceptionr&   errorr   )r   r   er"   r"   r#   _from_serialized}   s   z GuidanceBackend._from_serialized
key_stringc              
   C   sf   zt j|| j| jdd}W n ty- } ztd|d| tW  Y d }~S d }~ww | |S )N)whitespace_flexiblerT   )defaultsz$Hit invalid json_schema: key_string=rV   )	r   grammar_from_json_schemarS   rT   rW   r&   rX   r   rZ   r   r[   r   rY   r"   r"   r#   dispatch_json   s   

zGuidanceBackend.dispatch_jsonc                 C   s   t d|}| |S )Nregex)r   rZ   )r   r[   r   r"   r"   r#   dispatch_regex   s   

zGuidanceBackend.dispatch_regexc              
   C   sV   zt d|}| |W S  ty* } ztd|d| tW  Y d }~S d }~ww )NebnfzHit invalid ebnf: key_string=rV   )r   rZ   
ValueErrorr&   rX   r   r_   r"   r"   r#   dispatch_ebnf   s   
zGuidanceBackend.dispatch_ebnfc              
      s   z!t | t sJ  fdd d D }t|}| |W S  ty@ } ztd|d| t	W  Y d }~S d }~ww )Nc                    s0   g | ]}t |d  |d |d  d d dqS )beginschemaendtriggersr   )rf   grammarrh   trigger)r   ).0	structurestructural_tagr"   r#   
<listcomp>   s    
z;GuidanceBackend.dispatch_structural_tag.<locals>.<listcomp>
structuresz'Hit invalid structural_tag: key_string=rV   )
jsonloadsr   r   
to_grammarrZ   rW   r&   rX   r   )r   r[   tagsgrY   r"   rn   r#   dispatch_structural_tag   s   


	z'GuidanceBackend.dispatch_structural_tag)TNN)rJ   rK   rL   boolr   rM   r   r   r   rZ   r`   rb   re   rw   rQ   r"   r"   r    r#   rR   m   s     
rR   )__doc__rr   loggingr   typingr   r   r   rN   
llguidancer   r   r   r   llguidance.hfr	   llguidance.torchr
   r   r   +sglang.srt.constrained.base_grammar_backendr   r   r   sglang.srt.constrained.utilsr   	getLoggerrJ   r&   r   rR   r"   r"   r"   r#   <module>   s   
E