o
    )iJ                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZmZ d dlmZmZ d d	lmZmZ eeZe dZeG d
d dZdS )    N)Iterable)	dataclass)Optional)init_logger)LogprobPromptLogprobsSampleLogprobs)AnyTokenizerconvert_ids_list_to_tokens)EngineCoreOutputEngineCoreRequest)LogprobsListsLogprobsTensorsc                   @   s   e Zd ZU ee ed< ee ed< ee ed< ee ed< ee	 ed< ee	 ed< e
dee dedd fd	d
ZdeddfddZdeddfddZdee fddZedee dee	 deee  de	de	dee	ef fddZdeddfddZdS )LogprobsProcessor	tokenizerlogprobsprompt_logprobscumulative_logprobnum_logprobsnum_prompt_logprobsrequestreturnc                 C   sX   |j d usJ |j j}|j j}| ||d u rd nd|d u rd ng |d u r%d nd g||dS )Ng        )r   r   r   r   r   r   )Zsampling_paramsr   r   )clsr   r   r   r    r   c/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/vllm/v1/engine/logprobs.pyfrom_new_request#   s   z"LogprobsProcessor.from_new_requestlogprobs_listsNc           
   
   C   s   | j dusJ | jdusJ | jdusJ |\}}}t|||D ]+\}}}| jdu r,tnt| j|}|d }	|  j|	7  _| j| ||||| j  q dS )a  Update with sample logprobs from EngineCore.

        Outer lists are only of len > 1 if EngineCore made
        >1 tokens in prior step (e.g. in spec decoding).

        Args:
          logprobs_lists: the lists of logprob tokens, logprobs, and ranks.

        Nr   )	r   r   r   zipr   NONESr
   append_make_logprob_dict)
selfr   Ztoken_ids_lstZlogprobs_lstZ	ranks_lstrankr   	token_idsdecoded_tokensZsampled_token_logprobr   r   r   _update_sample_logprobs6   s,   

z)LogprobsProcessor._update_sample_logprobsprompt_logprobs_tensorsc              
   C   s   | j dusJ | jdusJ |\}}}| jdu rdn	t| j|  }|j\}}| }| }	| }t|D ]*}
|
| }|| }|du rItn||| }| j	| 
|	|
 ||
 |||
 | j  q9dS )zUpdate with prompt logprobs from EngineCore.

        Args:
          prompt_logprobs_tensors: tuple containing the prompt logprobs
                                   tensors.

        N)r   r   r   r
   flattentolistshaperanger   r   r    )r!   r&   r#   r   ranksr$   Znum_prompt_tokensr   Zprompt_token_ranksr   posoffsetZ
offset_endZdecoded_tokens_for_posr   r   r   _update_prompt_logprobs\   s6   



z)LogprobsProcessor._update_prompt_logprobsc                 C   s   | j }|rg | _ |S )a  Pop and return all request prompt logprobs

        The logprobs processor aggregates prompt chunk logprobs
        over one or more prefill chunks. This method returns
        all prompt logprobs at once and then forgets them.
        Ensures correct RequestOutputKind.DELTA semantics
        wherein all prompt logprobs are returned at once at
        the end of prefill.

        Returns:
          None if prompt logprobs are disabled for this request.
          List of all prompt logprobs, otherwise.
        )r   )r!   Zplpr   r   r   pop_prompt_logprobs   s   z%LogprobsProcessor.pop_prompt_logprobslogprob_token_idsr$   r"   c                 C   sD   |dkrt | }td|d }t|f|}dd t|| ||D S )a  Make a Logprob dictionary for a position.

        Args:
          logprobs: list of log probabilities
          logprob_token_ids: list of top token ids
          decoded_tokens: list of decoded top tokens
          rank: rank of the sampled token
          num_logprobs: number of logprobs requested
            by the user (in addition to sampled logprob)

        Returns:
          dict[token id, Logprob]
           c                 S   s$   i | ]\}}}}|t |||d qS ))logprobr"   Zdecoded_token)r   ).0Ztoken_idr3   r"   tokenr   r   r   
<dictcomp>   s    
z8LogprobsProcessor._make_logprob_dict.<locals>.<dictcomp>)lenr*   	itertoolschainr   )r   r0   r$   r"   r   Z
topk_ranksr+   r   r   r   r       s   z$LogprobsProcessor._make_logprob_dictoutputc                 C   s4   |j d ur| |j  |jd ur| |j d S d S )N)Znew_logprobsr%   Znew_prompt_logprobs_tensorsr.   )r!   r:   r   r   r   update_from_output   s
   

z$LogprobsProcessor.update_from_output)__name__
__module____qualname__r   r	   __annotations__r   r   floatintclassmethodr   r   r   r%   r   r.   r/   staticmethodlistr   strdictr   r    r   r;   r   r   r   r   r      sJ   
 &
/

&r   )r8   collections.abcr   dataclassesr   typingr   Zvllm.loggerr   Zvllm.sequencer   r   r   Z)vllm.transformers_utils.detokenizer_utilsr	   r
   Zvllm.v1.enginer   r   Zvllm.v1.outputsr   r   r<   loggerrepeatr   r   r   r   r   r   <module>   s   
