o
    پi                     @   sB  d Z ddlZddlZddlmZ ddlmZ ddlZddlmZ ddl	m
Z
 ddlmZ zddlmZ dd	lmZmZ W n eyO   dd
lmZmZmZ Y nw dZeddZeeZejG dd dZddee fddZe dd ZG dd dZdd Zedkrddl Z e j!"  ede  ed ed dS dS ) z
Faster constrained decoding with jump forward decoding / compressed finite state machine.
Reference: https://lmsys.org/blog/2024-02-05-compressed-fsm/
    N)defaultdict)Optional)InvalidSyntax)cache)get_bool_env_var)FSMInfo)make_byte_level_fsmmake_deterministic_fsm)r   r   r	   zA((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)"SGLANG_DISABLE_OUTLINES_DISK_CACHEtruec                   @   s>   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< dS )JumpEdgeNsymbolsymbol_next_statebytebyte_next_state)
__name__
__module____qualname__r   str__annotations__r   intr   r    r   r   `/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/constrained/outlines_jump_forward.pyr   .   s
   
 r   Fr   expirec                 C   s   t st| ||S dd S )Nc                 S   s   d S Nr   )fnr   r   r   <lambda>:   s    zdisk_cache.<locals>.<lambda>)DISABLE_DISK_CACHEr   )r   typedignorer   r   r   
disk_cache6   s   r    c              
   C   s@  zt | }W n ty% } ztd|  d| W Y d }~d S d }~ww t|  dd}t|\}}|j	}|j
}i }| D ]\}	}
||
g |	 qB|j}tt}|jD ]}d||< qZi }| D ];\\}}
}|
|jkrsqg||
 }|D ](}t|dkrqy||  d7  < || dkr||v r||=  n	t||d||< qyqgtt}|jD ]}d||< q| D ]h\\}}
}|
|jkrq||
 }|D ]U}d }t|dkrt|dk rt|}nt|dkrt|d dd  d	}|d ur||  d7  < || dkr||v r	||=  n||t }||_||_|||< qq|S )
Nzskip invalid regex: z, e=T)	keep_utf8   )r   r      r      )interegularparse_patternr   loggerwarningr   to_fsmreducer	   fsm_infoalphabet_symbol_mappingitems
setdefaultappendtransitionsr   r   finalsalphabet_anything_valuelenr   ordgetr   r   )regex_stringregex_patternebyte_fsm	regex_fsm_r+   symbol_to_idid_to_symbolr   id_r0   outgoings_ctsstate_to_jump_forwardstate
next_statesymbolscbyte_r   r   r   init_state_to_jump_forward=   sz   








rG   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
OutlinesJumpForwardMapc                 C   s   t || _d S r   )rG   rA   )selfr6   r   r   r   __init__   s   zOutlinesJumpForwardMap.__init__c                 C   sV   d}|}|| j v r'| j | }|jd u r	 ||fS ||j7 }|j}|}|| j v s	||fS )N )rA   r   r   )rI   rB   jump_forward_strrC   r8   r   r   r   jump_forward_symbol   s   




z*OutlinesJumpForwardMap.jump_forward_symbolc                 C   sl   || j vrd S g }d }|| j v r4| j | }|jd ur|jd us!J ||j|jf |j}|}|| j v s|S r   )rA   r   r   r/   )rI   rB   jump_forward_bytesrC   r8   r   r   r   jump_forward_byte   s   



z(OutlinesJumpForwardMap.jump_forward_bytec                 C   s   || j v o| j | jd uS r   )rA   r   )rI   rB   r   r   r   is_jump_forward_symbol_state   s   
z3OutlinesJumpForwardMap.is_jump_forward_symbol_stateN)r   r   r   rJ   rM   rO   rP   r   r   r   r   rH      s
    rH   c                 C   s|   t | }|j D ]2\}}|jd ur#||\}}t| d| | ||}t| d|d d  dd |D  q	d S )Nz -> r"   c                 S   s   g | ]\}}t |qS r   )hex).0br;   r   r   r   
<listcomp>   s    ztest_main.<locals>.<listcomp>)rH   rA   r-   r   rM   printrO   )r6   jump_forward_maprB   r8   rL   rC   bytes_r   r   r   	test_main   s   

(rY   __main__z"The google's DNS sever address is u.   霍格沃茨特快列车|霍比特人比尔博z[-+]?[0-9]+[ ]*)NFr   )#__doc__dataclassesloggingcollectionsr   typingr   r%   r   outlines.cachingr   sglang.srt.utilsr   "outlines_core.fsm.outlines_core_rsr   outlines_core.fsm.regexr   r	   ImportErroroutlines.fsm.regexIP_REGEXr   	getLoggerr   r'   	dataclassr   floatr    rG   rH   rY   outlinescachingclear_cacher   r   r   r   <module>   s@   


P'

