o
    ﰓiD                  
   @   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   M/home/ubuntu/.local/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                    sl  g }g }t t|D ]#}|d| }t|}| jv r-| j|  | 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|| || < qo|| }|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_id	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/   generated_tokengenerated_token_idxgenerated_scoreleading_tokenleading_token_idxleading_score)rangelenr   r   appendr   get_allowed_tokensallowed_tokensnparray_softmaxargmax_select_arrayregular_tokensintstr	full_likeinfshapetolist)r
   r   scores_matrixallowed_tokens_matrixr,   prefixprefix_tupler   softmax_logitsoriginal_indicesoriginal_scoresoriginal_tokenspenalty_matrixrowenfored_softmax_logitsenforced_indicesenforced_scoresenforced_tokensdf_dictr   )r
   r)   r(   r   r      s>   



r   N)r   r   r   __doc__r   r   r   rA   npt	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!   keepdims)r;   expsum)rZ   e_arrr   r   r   r=   F   s   
r=   index_arrayc                 C   s"   t j| t j|ddddjddS )Nr    )r;   take_along_axisexpand_dimssqueeze)rZ   r_   r   r   r   r?   K   s   "r?   )typingr   r   r   numpyr;   numpy.typingrW   ImportErrorer    r   ndarrayr=   r?   r   r   r   r   <module>   s    

5 