o
    پi|3                     @   s  d Z ddl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mZmZmZmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZ e ZerTddlmZ ndd	lmZ e e!Z"d
Z#G dd deZ$G dd de%Z&G dd deZ'dd Z(e!dkre(  dS dS )z+Constrained decoding with xgrammar backend.    N)DictListOptionalTupleUnion)CompiledGrammarGrammarCompilerGrammarMatcherStructuralTagItemTokenizerInfoallocate_token_bitmask)INVALID_GRAMMAR_OBJBaseGrammarBackendBaseGrammarObjectGrammarStats)is_legacy_structural_tag)is_hip) apply_token_bitmask_inplace_cuda)"apply_token_bitmask_inplace_triton   c                       sT  e Zd Zde fdedededeee	e ef  dee
 dee ddf fd	d
Zde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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d+d, Z  ZS )-XGrammarGrammarNmatcher
vocab_sizectxoverride_stop_tokens
key_stringgrammar_statsreturnc                    s8   t    || _|| _|| _|| _g | _|| _|| _d S N)	super__init__r   r   r   r   accepted_tokensr   r   )selfr   r   r   r   r   r   	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/constrained/xgrammar_backend.pyr    7   s   
	
zXGrammarGrammar.__init__tokenc                 C   sP   |   s&|| _| j|}|std| d| j d| j | j| d S d S )NzTokens not accepted: z
Accepted tokens: z
Key string: )is_terminatedcurrent_tokenr   accept_token
ValueErrorr!   r   append)r"   r'   acceptedr%   r%   r&   r*   I   s   zXGrammarGrammar.accept_tokenkc                 C   s"   | j | | jd |  | _d S r   )r   rollbackr!   )r"   r.   r%   r%   r&   r/   W   s   zXGrammarGrammar.rollbackc                 C   s
   | j  S r   )r   r(   r"   r%   r%   r&   r(   [   s   
zXGrammarGrammar.is_terminated
batch_sizec                 C   s
   t ||S r   )r   )r"   r   r1   devicer%   r%   r&   allocate_vocab_mask^   s   
z#XGrammarGrammar.allocate_vocab_mask
vocab_maskidxc                 C   s   | j || d S r   )r   fill_next_token_bitmask)r"   r4   r5   r%   r%   r&   fill_vocab_maskc   s   zXGrammarGrammar.fill_vocab_maskc                 C   s   | j |ddS )NT)non_blocking)to)r4   r2   r%   r%   r&   move_vocab_maskf   s   zXGrammarGrammar.move_vocab_masklogitsc                 C   sx   |j jdks|j jdks|j jdkr"trt|| d S t|| d S |j jdkr3| jr3| || d S td|j j )NcudanpuxpucpuzUnsupported device: )r2   type_is_hipr   r   apply_vocab_mask_cpuRuntimeError)r"   r;   r4   r%   r%   r&   apply_vocab_maskj   s   z XGrammarGrammar.apply_vocab_maskc                 C   s:   t | jt| jd}t|| j| j| j| jtj| j	dg dS )Nmax_rollback_tokensr   T)is_cache_hittree_traversal_time)
r	   r   MAX_ROLLBACK_TOKENSr   r   r   r   dataclassesreplacer   )r"   r   r%   r%   r&   copyy   s   zXGrammarGrammar.copyc                 C   s   | j  }|rg |fS d S r   )r   find_jump_forward_string)r"   	tokenizersr%   r%   r&   try_jump_forward   s   
z XGrammarGrammar.try_jump_forwardhelperc                 C   s   |\}}|dfS )Nr%   )r"   rQ   _datar%   r%   r&   jump_forward_str_state   s   z&XGrammarGrammar.jump_forward_str_stateold_output_idsnew_output_ids
next_statec                 C   sx   d}t |D ]\}}||| kr|d }q |t|k r&| jt||  t|t|D ]}| j|| s9J q-d S )Nr      )	enumeratelenr   r/   ranger*   )r"   rV   rW   rX   r.   iold_idr%   r%   r&   jump_and_retokenize   s   
z#XGrammarGrammar.jump_and_retokenizec                 C   s   d| j d| jd| jdS )Nz XGrammarGrammar(self.key_string=z, self.accepted_tokens=z, self.current_token=))r   r!   r)   r0   r%   r%   r&   __repr__   s   zXGrammarGrammar.__repr__)__name__
__module____qualname__r   r	   intr   r   r   r   strr    r*   r/   r(   torchTensorr3   r7   staticmethodr:   rD   rL   r   rP   rU   r_   ra   __classcell__r%   r%   r#   r&   r   5   sV    
&
r   c                   @   s   e Zd ZdZdS )TokenizerNotSupportedErrorz;Raised when tokenizer is not supported by XGrammar backend.N)rb   rc   rd   __doc__r%   r%   r%   r&   rk      s    rk   c                       s   e Zd Z		ddedeee  def fddZedd	 Z	ed
e
ddfddZdededed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d Z  ZS )XGrammarGrammarBackendNTr   model_eos_token_idsany_whitespacec              
      s   t    t|dr | \}}|d u rtdt|j dn ztj|||d}d }W n t	y? } ztd| d }~ww t
|d| _|| _|| _|| _d S )Ninit_xgrammarzTokenizer type z is not supported by XGrammar)r   stop_token_idsz8Failed to create XGrammar TokenizerInfo from tokenizer: )tokenizer_info)r   r    hasattrrp   rk   r@   rb   r   from_huggingface	Exceptionr   grammar_compilerr   r   ro   )r"   rN   r   rn   ro   rr   r   er#   r%   r&   r       s.   


zXGrammarGrammarBackend.__init__c                 C   s   t | tsdS | d}|dv r| ddu ri | d< |dkr)t| d dS |dv r=| dg D ]}t| q3dS |d	v rO| d
g D ]	}t| qGdS dS )zDRecursively replace missing json_schema fields with an empty schema.Nr@   >   json_schemaqwen_xml_parameterrx   tagcontent>   orsequenceelements>   triggered_tagstags_with_separatortags)
isinstancedictgetrm   _sanitize_structural_format)structural_formatfmt_typeelementrz   r%   r%   r&   r      s&   

z2XGrammarGrammarBackend._sanitize_structural_formatstructural_tagr   c                 C   s,   |  dg D ]}| dd u ri |d< qd S )N
structuresschema)r   )r   	structurer%   r%   r&   #_sanitize_structural_tag_structures   s
   z:XGrammarGrammarBackend._sanitize_structural_tag_structuresr   r   r   c                 C   s&   t |t| jd}t|| j|| j||S )NrE   )r	   rI   r   r   r   )r"   r   r   r   r   r%   r%   r&   _from_context   s   z$XGrammarGrammarBackend._from_contextc              
   C   s   z|dkr| j  }n	| j j|| jd}W n$ ttjjtfy9 } zt	
d|d| tW  Y d }~S d }~ww | ||tddS )Nz$$ANY$$)r   ro   z$Hit invalid json_schema: key_string=, e=jsondispatch_type)rv   compile_builtin_json_grammarcompile_json_schemaro   rC   r   decoderJSONDecodeErrorUnicodeDecodeErrorloggererrorr   r   r   r"   r   r   rw   r%   r%   r&   dispatch_json  s   z$XGrammarGrammarBackend.dispatch_jsonc              
   C   d   z| j |}W n ty' } ztd|d| tW  Y d }~S d }~ww | ||tddS )NzHit invalid ebnf: key_string=r   ebnfr   )rv   compile_grammarrC   r   r   r   r   r   r   r%   r%   r&   dispatch_ebnf     z$XGrammarGrammarBackend.dispatch_ebnfc              
   C   r   )NzHit invalid regex: key_string=r   regexr   )rv   compile_regexrC   r   r   r   r   r   r   r%   r%   r&   dispatch_regex  r   z%XGrammarGrammarBackend.dispatch_regexc              
   C   s   zAt |}t|r"| | dd |d D }| j||d }n|d}t|tr:| 	| ||d< t 
|}| j|}W n# tt jjfyd } ztd|d| tW  Y d }~S d }~ww | ||tdd	S )
Nc                 S   s,   g | ]}t |d  t|d |d dqS )beginr   end)r   r   r   )r
   r   dumps).0r   r%   r%   r&   
<listcomp>&  s    zBXGrammarGrammarBackend.dispatch_structural_tag.<locals>.<listcomp>r   triggersformatz'Hit invalid structural_tag: key_string=r   r   r   )r   loadsr   r   rv   compile_structural_tagr   r   r   r   r   rC   r   r   r   r   r   r   r   )r"   r   r   r   r   format_dictrw   r%   r%   r&   dispatch_structural_tag   s2   





z.XGrammarGrammarBackend.dispatch_structural_tagc                 C   s   | j   d S r   )rv   clear_cacher0   r%   r%   r&   reset?  s   zXGrammarGrammarBackend.reset)NT)rb   rc   rd   re   r   r   boolr    ri   r   r   r   r   rf   r   r   r   r   r   r   r   r   rj   r%   r%   r#   r&   rm      s8    
$

rm   c            
         s   ddl m} m} ddlm} || | |}|j} j}t ||gd}d}|	|} fdddD }	|
|	d  |
|	d	  |
| | sOJ |d	 | rZJ d S )
Nr   )
AutoConfigAutoTokenizer)DEFAULT_MODEL_NAME_FOR_TEST)r   rn   zhello (world|there)c                    s   g | ]} j |d dd qS )F)add_special_tokensr   )encode)r   trN   r%   r&   r   T  s    zdemo_test.<locals>.<listcomp>)helloz worldrY   )transformersr   r   sglang.test.test_utilsr   from_pretrainedr   eos_token_idrm   r   r*   r(   r/   )
r   r   r   	hf_configr   r   backendr   grammartokensr%   r   r&   	demo_testC  s(   





r   __main__))rl   rJ   r   loggingtypingr   r   r   r   r   rg   xgrammarr   r   r	   r
   r   r   +sglang.srt.constrained.base_grammar_backendr   r   r   r   sglang.srt.constrained.utilsr   sglang.srt.utilsr   rA   
sgl_kernelr   -sglang.srt.constrained.triton_ops.bitmask_opsr   	getLoggerrb   r   rI   r   ru   rk   rm   r   r%   r%   r%   r&   <module>   s0    	
t  
