o
    
۾i"                     @   sl   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 er&d dlmZ G dd dZG dd	 d	Zd
S )    )Iterator)chain)TYPE_CHECKING)AddedRequestBatchUpdateMovedRequestRemovedRequest)LogitsProcessorc                	   @   s   e Zd ZU dZee ed< eed< ee ed< ee	 ed< 			ddee dB dee dB dee	 dB ddfd	d
Z
dddZedee fddZdeddfddZdefddZdedB fddZdedB fddZdefddZdededB fddZdS )BatchUpdateBuildera  Helps track persistent batch state changes and build
    a batch update data structure for logitsprocs
    Assumptions:
    * All information about requests removed from persistent batch
      during a step is aggregated in self._removed through calls to
      self.removed_append() at the beginning of a step. This must happen
      before the first time that self.removed, self.pop_removed()
      or self.peek_removed() are invoked in a given step
    * After the first time that self.removed, self.pop_removed()
      or self.peek_removed() are read in a step, no new removals
      are registered using self.removed_append()
    * Elements of self._removed are never directly modified, added or
      removed (i.e. modification is only via self.removed_append() and
      self.pop_removed())
    Guarantees under above assumptions:
    * self.removed is always sorted in descending order
    * self.pop_removed() and self.peek_removed() both return
      the lowest removed request index in the current step
    _removed_is_removed_sortedaddedmovedNremovedreturnc                 C   s.   |pg | _ |pg | _|pg | _d| _d| _d S )NF)r   r   r   r   batch_changed)selfr   r   r    r   Y/home/ubuntu/.local/lib/python3.10/site-packages/vllm/v1/sample/logits_processor/state.py__init__,   s
   



zBatchUpdateBuilder.__init__c                 C   s"   | j s| jjdd d| _ dS dS )zSort removed request indices in
        descending order.
        Idempotent after first call in a
        given step, until reset.
        T)reverseN)r   r   sortr   r   r   r   _ensure_removed_sorted;   s   
z)BatchUpdateBuilder._ensure_removed_sortedc                 C   s   |    | jS )z:Removed request indices sorted in
        descending order)r   r   r   r   r   r   r   E   s   zBatchUpdateBuilder.removedindexc                 C   s$   | j rtd| j| d| _dS )zRegister the removal of a request from the persistent batch.

        Must not be called after the first time self.removed,
        self.pop_removed() or self.peek_removed() are invoked.

        Args:
          index: request index
        zECannot register new removed request after self.removed has been read.TN)r   RuntimeErrorr   appendr   )r   r   r   r   r   removed_appendL   s   	
z!BatchUpdateBuilder.removed_appendc                 C   s
   t | jS N)boolr   r   r   r   r   has_removed\   s   
zBatchUpdateBuilder.has_removedc                 C   s   |   r|   | jd S dS )z#Return lowest removed request indexN)r    r   r   r   r   r   r   peek_removed_      
zBatchUpdateBuilder.peek_removedc                 C   s   |   r|   | j S dS )z Pop lowest removed request indexN)r    r   r   popr   r   r   r   pop_removedf   r#   zBatchUpdateBuilder.pop_removedc                 C   s4   d| _ | j  | j  | j  | j}d| _|S )z4Returns True if there were any changes to the batch.F)r   r   clearr   r   r   )r   r   r   r   r   resetm   s   


zBatchUpdateBuilder.reset
batch_sizec                 C   sP   d| _ d| _t| j| j| jfsdS t|| j| j| jd}g | _g | _g | _|S )a  Generate a logitsprocs batch update data structure and reset
        internal batch update builder state.

        Args:
          batch_size: current persistent batch size

        Returns:
          Frozen logitsprocs batch update instance; `None` if no updates
        FN)r(   r   r   r   )r   r   anyr   r   r   r   )r   r(   batch_updater   r   r   get_and_resetw   s   z BatchUpdateBuilder.get_and_reset)NNN)r   N)__name__
__module____qualname____doc__listr   __annotations__r   r   r   r   r   propertyr   intr   r    r"   r%   r'   r   r+   r   r   r   r   r
      s6   
 






r
   c                   @   sB   e Zd ZdZd
ded dB ddfddZeded fdd	ZdS )LogitsProcessorsz,Encapsulates initialized logitsproc objects.Nlogitsprocsr	   r   c                 C   s<   g | _ g | _|r|D ]}| r| j n| j| q
d S d S r   )argmax_invariantnon_argmax_invariantis_argmax_invariantr   )r   r5   	logitprocr   r   r   r      s   
zLogitsProcessors.__init__c                 C   s   t | j| jS )z$Iterator over all logits processors.)r   r6   r7   r   r   r   r   all   s   zLogitsProcessors.allr   )r,   r-   r.   r/   r   r   r2   r:   r   r   r   r   r4      s
    r4   N)collections.abcr   	itertoolsr   typingr   )vllm.v1.sample.logits_processor.interfacer   r   r   r   r	   r
   r4   r   r   r   r   <module>   s    