
    bi                     `    d dl mZmZmZmZ d dlZd dlmZmZm	Z	m
Z
 ddlmZmZ  G d d      Zy)    )AnyCallableOptionalUnionN)GenerationConfigPreTrainedTokenizerPreTrainedTokenizerFastset_seed   )SUPPORTED_ARCHITECTURESPreTrainedModelWrapperc                      e Zd Z	 	 	 	 ddedeeef   deee	   gee
   f   dededee   ded	ee   d
dfdZ	 	 ddeee   ej"                  eej"                     eee      f   dedeee	ej&                  f      d
eee	      fdZy)BestOfNSamplerNmodel	tokenizerqueries_to_scoreslength_samplersample_sizeseedn_candidatesgeneration_configreturnc	                 6   |t        |       t        |t        t        f      st	        dt        |             t        |t              st	        dt        |       dt               || _        || _        || _	        || _
        || _        || _        || _        y)a  
        Initialize the sampler for best-of-n generation

        Args:
            model (`PreTrainedModelWrapper`):
                The pretrained model to use for generation
            tokenizer (`PreTrainedTokenizer` or `PreTrainedTokenizerFast`):
                Tokenizer associated with the pretrained model
            queries_to_scores (`Callable[[list[str]], list[float]]`):
                Callable that takes a list of generated texts and returns the associated reward scores
            length_sampler (`Any`):
                Sampler used to sample the length of the generated text
            sample_size (`int`):
                Number of samples to generate for each query
            seed (`int`, *optional*):
                Random seed used to control generation
            n_candidates (`int`):
                Number of candidates to return for each query
            generation_config (`GenerationConfig`, *optional*):
                Generation config passed to the underlying model's `generate` method. See `GenerationConfig`
                (https://huggingface.co/docs/transformers/v4.29.1/en/main_classes/text_generation#transformers.GenerationConfig)
                for more details
        NzHtokenizer must be a PreTrainedTokenizer or PreTrainedTokenizerFast, got z,model must be a PreTrainedModelWrapper, got z  - supported architectures are: )r
   
isinstancer   r	   
ValueErrortyper   r   r   r   r   
gen_configr   r   )	selfr   r   r   r   r   r   r   r   s	            W/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/trl/extras/best_of_n_sampler.py__init__zBestOfNSampler.__init__   s    D TN)&9;R%STZ[_`i[jZkl  %"9;>tE{mKk  mD  lE  F  
"!2,+&(    tokenized_queryskip_special_tokensdevicec                    d}t        |t        j                        r!|j                  dk(  r|j	                  d      }nt        |t
              rt        |d         }|t        u r%t        j                  |      j	                  d      }nb|t        j                  u r|D cg c]  }|j                  d       }}n1|D cg c]&  }t        j                  |      j                  d      ( }}g }	|D ]  }|j                  | j                  df      } | j                  j                  |j                  |      f| j                         | j                   d|j#                         }
| j$                  j'                  |
|      }
t        j                  | j)                  |
            }|j+                  | j,                        j.                  D cg c]  }|
|   	 }
}|	j1                  |
        |	S c c}w c c}w c c}w )a  
        Generate the best of n samples for input queries

        Args:
            tokenized_query (`list[int]` or `torch.Tensor` or `list[torch.Tensor]` or `list[int]`):
                represents either a single tokenized query (a single tensor or a list of integers) or a batch of
                tokenized queries (a list of tensors or a list of lists of integers)
            skip_special_tokens (`bool`):
                Whether to remove the special tokens from the output
            device (`str` or `torch.device`, *optional*):
                The device on which the model will be loaded
            **generation_kwargs (`dict`, *optional*):
                Additional keyword arguments passed along to the underlying model's `generate` method. This is used to
                override generation config

        Returns:
            list[list[str]]: A list of lists of generated texts
        N   r   )r&   )max_new_tokensr   )r#   )r   torchTensorndim	unsqueezelistr   inttensorreshaperepeatr   r   generatetor   r   squeezer   batch_decoder   topkr   indicesappend)r   r"   r#   r$   generation_kwargsquerieselement_typer/   queryresultoutputscoresis                r   r2   zBestOfNSampler.generateO   s   2 ou||49M9MQR9R%//2G. 23Ls",,7AA!D-APQv6>>'2QQM\]E5<<.66w?]] 	"EllD$4$4a#89G(TZZ((

6"#224"&// $	
 gi  ^^00M`0aF\\$"8"8"@AF)/T5F5F)G)O)OPAfQiPFPMM&!	" ' R] Qs   G/>+G4G9)   Nr&   N)TN)__name__
__module____qualname__r   r   r   r	   r   r-   strfloatr   r.   r   r   r    r)   r*   boolr$   r2    r!   r   r   r      s    "8<5)%5) ,.EEF5) $T#YKe$<=	5)
 5) 5) sm5) 5) $$455) 
5)t %)59	5tCy%,,U\\8JDQUVYQZO[\5 "5 sELL012	5 
d3i5r!   r   )typingr   r   r   r   r)   transformersr   r   r	   r
   modelsr   r   r   rH   r!   r   <module>rL      s%    2 1  a a Dm mr!   