o
    )i5                  
   @   s   d dl mZmZmZ zd dlZd dlm Z W n ey. Z	 zG dd dZ
ede	dZ	[	ww ddlmZ G dd dZ
d	ejd
ejfddZd	ejdejd
ejfddZdS )    )DictHashableListNc                   @   s$   e Zd Zdd Zdd Zdd ZdS )FormatEnforcerAnalyzerc                 O      d S N selfargskwargsr   r   e/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/lmformatenforcer/analyzer.py__init__      FormatEnforcerAnalyzer.__init__c                 O   r   r   r   r	   r   r   r   report_raw_logits	   r   (FormatEnforcerAnalyzer.report_raw_logitsc                 O   s   i S r   r   r	   r   r   r   generate_report_dict   r   +FormatEnforcerAnalyzer.generate_report_dictN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s    r   zoFormatEnforcerAnalyzer not available because numpy is not installed. Please install it with "pip install numpy"   )TokenEnforcerc                   @   sL   e Zd ZdZdefddZdee dej	fddZ
dee d	efd
dZdS )r   z>A helper class to help analyze the format enforcer's behavior.token_enforcerc                 C   s   || _ i | _d S r   )r   
raw_logits)r
   r   r   r   r   r      s   
r   output_tokenslogitsc                 C   s   || j t|< dS )zvReport what logits were generated for a specific token sequence. The logits must be before any processing / filtering.N)r   tuple)r
   r   r   r   r   r   r      s   r   returnc                    sj  g }g }t t|D ]"}|d| }t|}| jv r,| j|  | j| q
t|}t	|}|j
dd}	t||	}
dd  jjD dtdtf fdd	fd
d|	D }t|tj }t |jd D ]
}d|| || < qn|| }|j
dd}t||}fdd|D }i }||d< | |d< | |d< ||d< |	 |d< |
 |d< |S )z\Generate a report dict containing the analysis results for a specific output token sequence.Nr   axisc                 S   s   i | ]\}}}||qS r   r   ).0token_idZ	token_str_r   r   r   
<dictcomp>+   s    z?FormatEnforcerAnalyzer.generate_report_dict.<locals>.<dictcomp>r#   r   c                    s   | v r|  S  j | gS r   )r   decoder)r#   )r
   single_token_dictr   r   single_token_decoder,   s   zIFormatEnforcerAnalyzer.generate_report_dict.<locals>.single_token_decoderc                       g | ]} |qS r   r   r"   idxr(   r   r   
<listcomp>1       z?FormatEnforcerAnalyzer.generate_report_dict.<locals>.<listcomp>r   c                    r)   r   r   r*   r,   r   r   r-   ;   r.   Zgenerated_tokenZgenerated_token_idxZgenerated_scoreZleading_tokenZleading_token_idxZleading_score)rangelenr   r   appendr   Zget_allowed_tokensnparray_softmaxZargmax_select_arrayZregular_tokensintstrZ	full_likeinfshapetolist)r
   r   Zscores_matrixZallowed_tokens_matrixr+   prefixZprefix_tupler   Zsoftmax_logitsZoriginal_indicesZoriginal_scoresZoriginal_tokensZpenalty_matrixrowZenfored_softmax_logitsZenforced_indicesZenforced_scoresZenforced_tokensZdf_dictr   )r
   r(   r'   r   r      s>   



r   N)r   r   r   __doc__r   r   r   r6   nptZ	ArrayLiker   dictr   r   r   r   r   r      s
    arrr   c                 C   s   t | }|t j|ddd S )z6Compute softmax values for each sets of scores in arr.r   T)r!   Zkeepdims)r2   expsum)r@   Ze_arrr   r   r   r4   F   s   
r4   index_arrayc                 C   s"   t j| t j|ddddjddS )Nr    )r2   Ztake_along_axisZexpand_dimsZsqueeze)r@   rC   r   r   r   r5   K   s   "r5   )typingr   r   r   numpyr2   Znumpy.typingr>   ImportErrorer    r   Zndarrayr4   r5   r   r   r   r   <module>   s    

5 