o
    پi^                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	Z	d dl
mZmZ d dlmZ erBd dlmZ d dlmZ d d	lmZ eeZG d
d dZdS )    )annotationsN)futures)TYPE_CHECKINGList)INVALID_GRAMMAR_OBJcreate_grammar_backend)envs)AbortReq)Req)	Schedulerc                   @  sN   e Zd ZdddZdd Zdd ZdddZdddZdddZdddZ	dS )GrammarManager	schedulerr   c                 C  s   || _ |j| _g | _| jjst| j|j|jj|jj| _	nd | _	|j
| _|jj| _|jj| _|jj| _tj | _tj | _d S N)r   server_argsgrammar_queueskip_tokenizer_initr   	tokenizermodel_config
vocab_sizehf_eos_token_idgrammar_backenddp_tp_cpu_groupgrammar_sync_groupdp_tp_group
world_sizegrammar_sync_size
first_rankgrammar_sync_entryis_first_rankis_grammar_sync_entryr   SGLANG_GRAMMAR_POLL_INTERVALget"SGLANG_GRAMMAR_MAX_POLL_ITERATIONS)selfr    r$   Z/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/constrained/grammar_manager.py__init__   s$   


zGrammarManager.__init__c                 C  s
   t | jS r   lenr   r#   r$   r$   r%   __len__1   s   
zGrammarManager.__len__c                 C  s   | j r
| j   d S d S r   )r   resetr)   r$   r$   r%   clear4   s   zGrammarManager.clearreturnboolc                 C  s   t | jdkS )Nr   r'   r)   r$   r$   r%   has_waiting_grammars8   s   z#GrammarManager.has_waiting_grammarsrecv_reqr	   c                 C  sP   | j D ]"}|js|j|jr%td|j |jr |j  |d qd S )Nz%Abort grammar queue request. req.rid=zAborted by AbortReq.)	r   	abort_allrid
startswithloggerdebuggrammarcancelset_finish_with_abort)r#   r0   reqr$   r$   r%   abort_requests;   s   


zGrammarManager.abort_requestsr9   r
   c                 C  s
  d}|j jd us|j jd us|j jd us|j jd ur{| jd u r'd}|| nT|j jd ur4d|j jf}n$|j jd urAd|j jf}n|j jd urNd|j jf}n
|j jrXd|j jf}| j||j\}}||_	|sm||_
d}n|tu r{d|}|| |r| j| |S )	NFzGrammar-based generation (json_schema, regex, ebnf, structural_tag) is not supported when the server is launched with --grammar-backend nonejsonregexebnfstructural_tagTz,Invalid grammar request with cache hit: key=)sampling_paramsjson_schemar<   r=   r>   r   r8   get_cached_or_future_valuerequire_reasoningr6   grammar_keyr   r   append)r#   r9   add_to_grammar_queue	error_msgkeyvalue	cache_hitr$   r$   r%   process_req_with_grammarC   s:   


z'GrammarManager.process_req_with_grammar	List[Req]c           	        sF  t  }t  }t }t | | jk rZt| jD ]0\}}||v r!q| s*|jdu r0|| qt	|jt
js>J d||j rH|| qt| jd  t | | jk st| jD ] \}}||vr| j|  jd7  _| j| j| jkr|| q_| jdkr|| n&dg| j }tjj|||f| jd t jdd |D  t jdd |D   g }D ]7}| j| }|| | s|jdu rq|j |_| j|j|j  |jtu rd	|j}|| q D ]$}| j| }|| |j  | j|jt d
|j}|| q fddt| jD | _|S )ad  
        Move requests whose grammar objects are ready from grammar_queue to waiting_queue.

        Rank i returns two sets ready_reqs_i, failed_reqs_i
        ready_reqs_all = all_gather(ready_reqs_i)
        failed_reqs_all = all_gather(failed_reqs_i)

        ready_reqs = intersect(ready_reqs_all)
        failed_reqs = union(failed_reqs_all)
        Nzreq=
      )groupc                 S     g | ]}|d  qS )r   r$   .0xr$   r$   r%   
<listcomp>       z=GrammarManager.get_ready_grammar_requests.<locals>.<listcomp>c                 S  rO   )rM   r$   rP   r$   r$   r%   rS      rT   z)Invalid grammar request: req.grammar_key=z1Grammar preprocessing timed out: req.grammar_key=c                   s$   g | ]\}}|vr| vr|qS r$   r$   )rQ   ir9   synced_failed_req_idxssynced_ready_req_idxsr$   r%   rS      s
    ) settimeperf_counterr    	enumerater   finishedr6   add
isinstancer   Futuredonesleepgrammar_wait_ctr"   r   torchdistributedall_gather_objectr   intersectionunionrD   resultr   	set_cacherC   copyr   r8   r7   )	r#   ready_req_idxsfailed_req_idxs
start_timerU   r9   all_gather_outputreturn_reqsrF   r$   rV   r%   get_ready_grammar_requestsk   st   












z)GrammarManager.get_ready_grammar_requestsN)r   r   )r-   r.   )r0   r	   )r9   r
   r-   r.   )r-   rK   )
__name__
__module____qualname__r&   r*   r,   r/   r:   rJ   rq   r$   r$   r$   r%   r      s    



(r   )
__future__r   loggingrZ   
concurrentr   typingr   r   rd   +sglang.srt.constrained.base_grammar_backendr   r   sglang.srt.environr   sglang.srt.managers.io_structr	   "sglang.srt.managers.schedule_batchr
   sglang.srt.managers.schedulerr   	getLoggerrr   r4   r   r$   r$   r$   r%   <module>   s    
