
     `i                        d dl Z d dlmZmZmZmZmZmZ 	 d dlm	Z	 d dl
mZmZ d dlmZ n# e$ r  ed          w xY w	 d dlZn# e$ r  ed          w xY wdd	lmZ dd
lmZmZ ddlmZ  G d de          Z G d d          Zdededeeeeef                  fdZdedee         defdZ	 	 d"dededee         defdZ G d d          Z deeef         dede fdZ!de	deeef         dede"deee"f         f
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                   P    e Zd ZdeddfdZdej        dej        dej        fdZdS )LogitsSaverWarperanalyzerreturnNc                     || _         d S N)r   )selfr   s     ~/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/lmformatenforcer/integrations/transformers.py__init__zLogitsSaverWarper.__init__   s         	input_idsscoresc                     |                                 }|                                 }t          ||          D ] \  }}| j                            ||           !|S r   )tolistzipr   report_raw_logits)r   r   r   
cpu_inputs
cpu_scoressingle_batch_inputssingle_batch_scoress          r   __call__zLogitsSaverWarper.__call__   sd    %%''
]]__
8;J
8S8S 	V 	V4!4M++,?ATUUUUr   )	__name__
__module____qualname__r   r   torch
LongTensorFloatTensorr&    r   r   r   r      sj        !!7 !D ! ! ! !%"2 E<M RWRc      r   r   c                   8    e Zd ZU eed<   dedefdZddZd Z	dS )	LogitsSaverManagerwarpermodelr   c                 >    || _         d | _        d | _        || _        d S r   )r1   r0   
old_warperr   )r   r1   r   s      r   r   zLogitsSaverManager.__init__!   s"    
 r   Nc                 P      j         j         _         fd}| j         _        d S )Nc                                          |           }t          j                  _        |                    dj                   &t          d          }|                    d|           |S )Nr      )r3   r   r   r0   insertr   )generation_configwarpers	processorfilter_funcr   s      r   new_logits_warperzCLogitsSaverManager.replace_logits_warper.<locals>.new_logits_warper*   sj    oo&788G+DM::DKNN1dk***&<[!LL	q),,,Nr   )r1   _get_logits_warperr3   )r   r;   r<   s   `` r   replace_logits_warperz(LogitsSaverManager.replace_logits_warper'   s@    *7	 	 	 	 	 	 ):
%%%r   c                 (    | j         | j        _        d S r   )r3   r1   r=   )r   s    r   unreplace_logits_warperz*LogitsSaverManager.unreplace_logits_warper4   s    (,
%%%r   r   )
r'   r(   r)   r   __annotations__r	   r   r   r>   r@   r-   r   r   r/   r/      si         !2 !>T ! ! ! !: : : :8 8 8 8 8r   r/   	tokenizer
vocab_sizer   c                 R   |                      d          d         }g }t          |          D ]y}|| j        v r|                     ||g          dd          }|                     |g          }t	          |          t	          |          k    }|                    |||f           z|S )N0r6   )encoderangeall_special_idsdecodelenappend)rB   rC   token_0regular_tokens	token_idxdecoded_after_0decoded_regularis_word_start_tokens           r   _build_regular_tokens_listrS   8   s    s##B'GN:&& Q Q		111#**GY+?@@D#**I;77!/22S5I5IIy/;NOPPPPr   tokensc                 Z    |                      |          }|                    d          }|S )Nu   �)rJ   rstrip)rB   rT   decodedcleaneds       r   _decode_functionrY   F   s+    v&&GnnU##GNr   Fuse_bitmaskc                     |pt          |           }t          | |          }t          j        t          |           }t          ||| j        ||          S r   )rK   rS   	functoolspartialrY   r   eos_token_id)rB   rZ   rC   rN   	decode_fns        r   #build_token_enforcer_tokenizer_datar`   L   sQ     -s9~~J/	:FFN!"2I>>I%niAWYdfpqqqr   c                   D    e Zd ZdefdZdedej        dee         fdZ	dS )!TransformersPrefixAllowedTokensFntoken_enforcerc                     || _         d S r   )rc   )r   rc   s     r   r   z*TransformersPrefixAllowedTokensFn.__init__W   s    ,r   batch_idsentr   c                 h    |                                 }| j                            |          j        S r   )r   rc   get_allowed_tokensallowed_tokens)r   re   rf   token_sequences       r   r&   z*TransformersPrefixAllowedTokensFn.__call__Z   s)    "55nEETTr   N)
r'   r(   r)   r   r   intr*   Tensorr   r&   r-   r   r   rb   rb   V   sg        -} - - - -U UEL UT#Y U U U U U Ur   rb   tokenizer_datacharacter_level_parserc                     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   r`   r   rb   )rm   rn   rc   s      r   +build_transformers_prefix_allowed_tokens_fnrq   _   sC     ."9:: M<^LL">3IJJN,^<<<r   r1   kwargsc                    t          ||          }|d         j        d         dk    }|                    dd          dk    }|p| }|                    dd          }|                    dd          }	|o|	o|}
|
rt          |j                  }t          | |          }|                    |           |}	  | j        di |}|                                 n# |                                 w xY w|	                    |d	         d         
                                          }||_        n | 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   r6   	num_beamsreturn_dict_in_generateFoutput_scoresN	sequencesprefix_allowed_tokens_fnr-   )rq   shapegetr   rc   r/   r>   generater@   generate_report_dictr   enforced_scores)r1   rB   rn   rr   "transformers_filter_allowed_tokensis_multi_inputsis_multi_beamssupport_diagnosticsru   rv   should_run_in_advanced_moder   logits_savergenerate_kwargsoutputdf_dicts                   r   generate_enforcedr   i   sw    *UU^`v)w)w&[)/2Q6OZZQ//!3N.@.A$jj)BEJJJJ55M #:"cm"cPc" g)*L*[\\)%::**+MNNN 	3#U^66o66F002222L002222//{0CA0F0M0M0O0OPP!(ff&ffCefffMs   7C C/)rq   r   r`   )FN)%r\   typingr   r   r   r   r   r   transformersr	   &transformers.generation.logits_processr
   r   transformers.tokenization_utilsr   ImportErrorr*   characterlevelparserr   tokenenforcerr   r   r   r   r   r/   rk   strboolrS   rY   r`   rb   rq   dictr   __all__r-   r   r   <module>r      s       > > > > > > > > > > > > > > > >q111111hhhhhhhhGGGGGGG q q q
+o
p
ppq@LLLL @ @ @
+~

@ 8 7 7 7 7 7 E E E E E E E E - - - - - -	 	 	 	 	 	 	 	8 8 8 8 8 8 8 84*A s W[\abegjlpbp\qWr     7 c s     =BDHr r3J r59r4<SMr .Hr r r rU U U U U U U U=F]_yFy@z =H\= bC= = = =%1 %!&'>@Z'Z![%.B% !%% */sDy)9% % % %N  s   + < A A