o
    i                     @   s  d dl Z d dlmZmZmZmZmZmZ zd dlm	Z	 d dl
mZmZ d dlmZ W n ey5   edw zd dlZW n eyG   edw dd	lmZ dd
lmZmZ ddlmZ G dd deZG dd dZdededeeeeef  fddZdedee defddZ		d'dededee defddZG dd dZ deeef dede fd d!Z!d"e	deeef ded#e"deee"f f
d$d%Z#g d&Z$dS )(    N)AnyCallableListOptionalTupleUnion)AutoModelForCausalLM)LogitsProcessor PrefixConstrainedLogitsProcessor)PreTrainedTokenizerBasezWtransformers is not installed. Please install it with "pip install transformers[torch]"zfpytorch is not installed. See https://pytorch.org/get-started/locally/ for installation instructions."   )CharacterLevelParser)TokenEnforcerTokenEnforcerTokenizerData)FormatEnforcerAnalyzerc                   @   s:   e Zd ZdeddfddZdejdejdejfdd	ZdS )
LogitsSaverWarperanalyzerreturnNc                 C   
   || _ d S N)r   )selfr    r   g/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/lmformatenforcer/integrations/transformers.py__init__      
zLogitsSaverWarper.__init__	input_idsscoresc                 C   s6   |  }|  }t||D ]\}}| j|| q|S r   )tolistzipr   report_raw_logits)r   r   r   
cpu_inputs
cpu_scoressingle_batch_inputssingle_batch_scoresr   r   r   __call__   s
   zLogitsSaverWarper.__call__)	__name__
__module____qualname__r   r   torch
LongTensorFloatTensorr$   r   r   r   r   r      s     r   c                   @   s:   e Zd ZU eed< dedefddZdddZd	d
 Z	dS )LogitsSaverManagerwarpermodelr   c                 C   s   || _ d | _d | _|| _d S r   )r-   r,   
old_warperr   )r   r-   r   r   r   r   r   !   s   
zLogitsSaverManager.__init__Nc                    s$   j j_ fdd}|j _d S )Nc                    sF    | }tj_|dj  d ur!t d}|d| |S )Nr      )r.   r   r   r,   insertr
   )generation_configwarpers	processorfilter_funcr   r   r   new_logits_warper*   s   

zCLogitsSaverManager.replace_logits_warper.<locals>.new_logits_warper)r-   _get_logits_warperr.   )r   r5   r6   r   r4   r   replace_logits_warper'   s   
z(LogitsSaverManager.replace_logits_warperc                 C   s   | j | j_d S r   )r.   r-   r7   )r   r   r   r   unreplace_logits_warper4   s   z*LogitsSaverManager.unreplace_logits_warperr   )
r%   r&   r'   r   __annotations__r   r   r   r8   r9   r   r   r   r   r+      s
   
 
r+   	tokenizer
vocab_sizer   c                 C   sr   |  dd }g }t|D ])}|| jv rq| ||gdd  }| |g}t|t|k}||||f q|S )N0r/   )encoderangeall_special_idsdecodelenappend)r;   r<   token_0regular_tokens	token_idxdecoded_after_0decoded_regularis_word_start_tokenr   r   r   _build_regular_tokens_list8   s   
rK   tokensc                 C   s   |  |}|d}|S )Nu   �)rB   rstrip)r;   rL   decodedcleanedr   r   r   _decode_functionF   s   

rP   Fuse_bitmaskc                 C   s4   |pt | }t| |}tt| }t||| j||S r   )rC   rK   	functoolspartialrP   r   eos_token_id)r;   rQ   r<   rF   	decode_fnr   r   r   #build_token_enforcer_tokenizer_dataL   s   
rV   c                   @   s6   e Zd ZdefddZdedejdee fddZ	d	S )
!TransformersPrefixAllowedTokensFntoken_enforcerc                 C   r   r   )rX   )r   rX   r   r   r   r   W   r   z*TransformersPrefixAllowedTokensFn.__init__batch_idsentr   c                 C   s   |  }| j|jS r   )r   rX   get_allowed_tokensallowed_tokens)r   rY   rZ   token_sequencer   r   r   r$   Z   s   z*TransformersPrefixAllowedTokensFn.__call__N)
r%   r&   r'   r   r   intr(   Tensorr   r$   r   r   r   r   rW   V   s     rW   tokenizer_datacharacter_level_parserc                 C   s$   t | tr	t| } t| |}t|S )a  Build the prefix allowed tokens function that transformers will use to filter the tokens generated by the model. The result
    can be passed to the prefix_allowed_tokens_fn parameter of the generate() method of transformers models or pipeline configurations.)
isinstancer   rV   r   rW   )r`   ra   rX   r   r   r   +build_transformers_prefix_allowed_tokens_fn_   s   

rc   r-   kwargsc                 K   s   t ||}|d jd dk}|dddk}|p| }|dd}|dd}	|o,|	o,|}
|
rdt|j}t| |}|| |}z| jdi |}W |  n|  w |	|d	 d 
 }||_|S | jdi |d
|i}|S )a  Generate text from a model while enforcing a given format, generating enforcing diagnostic information. 
    This can be used instead of calling model.generate().
    If return_dict_in_generate and output_scores parameters are True, diagnostic information will be returned in the result.
    If you don't need this, consider using prefix_allowed_tokens_fn + build_transformers_prefix_allowed_tokens_fn() insteadr   r   r/   	num_beamsreturn_dict_in_generateFoutput_scoresN	sequencesprefix_allowed_tokens_fnr   )rc   shapegetr   rX   r+   r8   generater9   generate_report_dictr   enforced_scores)r-   r;   ra   rd   "transformers_filter_allowed_tokensis_multi_inputsis_multi_beamssupport_diagnosticsrf   rg   should_run_in_advanced_moder   logits_savergenerate_kwargsoutputdf_dictr   r   r   generate_enforcedi   s(   
	



rx   )rc   rx   rV   )FN)%rR   typingr   r   r   r   r   r   transformersr   &transformers.generation.logits_processr	   r
   transformers.tokenization_utilsr   ImportErrorr(   characterlevelparserr   tokenenforcerr   r   r   r   r   r+   r^   strboolrK   rP   rV   rW   rc   dictrx   __all__r   r   r   r   <module>   s\     $

	




'