o
    5ti                  
   @   s   d dl Z d dlmZ d dlZd dlZ	ddedeej ded fdd	ZdddZ	de
ejB d
eje
B fddZG dd dejZdejdee
 deded
ejf
ddZdS )    N)Literalright
max_lengthtensorspadding_side)r   leftc                 C   s   |dks|dksJ d| dt |D ]V\}}t|jdkr$|d}|jd }|| k rc|dkrJtj|tj| | tj|jdgdd	d||< qtjtj| | tj|jd|gdd	d||< q|	d||< qtj|ddS )	z
    Method for padding a list of tensors given the maximum tensor
    length in the batch. Used for batching inputs and continuations in
    seq2seq models.
    r   r   zUnrecognized padding type: 'z' not 'left' or 'right'   r   )dtypedevice)dim)
	enumeratelenshapesqueezetorchcatzeroslongr
   	unsqueeze)r   r   r   itensor
tensor_len r   K/home/ubuntu/.local/lib/python3.10/site-packages/lm_eval/models/utils_hf.pypad_and_concat   sF   





r   returnc                   C   s   t   tj  d S )N)gccollectr   cudaempty_cacher   r   r   r   clear_torch_cache;   s   r    r	   c                 C   s(   t | tr| dkrtt| }|S | }|S )zdConverts `dtype` from `str` to torch.dtype when possible. Does not use an instantiated HF AutoConfigauto)
isinstancestrgetattrr   )r	   _torch_dtyper   r   r   	get_dtype@   s
   
r&   c                
   @   s>   e Zd ZdZdedejdededdf
dd	Zde	fd
dZ
dS )MultiTokenEOSCriteriaz7Criteria to stop on the specified multi-token sequence.sequence	tokenizerinitial_decoder_input_length
batch_sizer   Nc                 C   sB   || _ dg| | _|| _|j|dd| _t| jd | _|| _d S )NF)add_special_tokensr   )r*   done_trackerr(   encodesequence_idsr   sequence_id_lenr)   )selfr(   r)   r*   r+   r   r   r   __init__M   s   

zMultiTokenEOSCriteria.__init__c                 K   sp   |d d | j d f }|d d | j d f }| j|}t| jD ]\}}|s2| j|| v | j|< q"d| jvS )NF)r*   r0   r)   batch_decoder   r-   r(   )r1   	input_idsscoreskwargslookback_ids_batchlookback_tokens_batchr   doner   r   r   __call__d   s   
zMultiTokenEOSCriteria.__call__)__name__
__module____qualname____doc__r#   transformersPreTrainedTokenizerintr2   boolr:   r   r   r   r   r'   J   s    
r'   r)   stop_sequencesr*   r+   c                    s    t g  fdd|D S )Nc                    s   g | ]	}t | qS r   )r'   ).0r(   r+   r*   r)   r   r   
<listcomp>z   s    z+stop_sequences_criteria.<locals>.<listcomp>)r?   StoppingCriteriaList)r)   rC   r*   r+   r   rE   r   stop_sequences_criteriar   s   rH   )r   )r   N)r   typingr   r   r?   rA   listTensorr   r    r#   r	   r&   StoppingCriteriar'   r@   rG   rH   r   r   r   r   <module>   s4    

3
(