'''simple docstring'''

import copy

from ...configuration_utils import PretrainedConfig
from ...utils import add_start_docstrings


__a:			List[Any]	       =       R"""
    [`RagConfig`] stores the configuration of a *RagModel*. Configuration objects inherit from [`PretrainedConfig`] and
    can be used to control the model outputs. Read the documentation from [`PretrainedConfig`] for more information.

    Args:
        title_sep (`str`, *optional*, defaults to  `\" / \"`):
            Separator inserted between the title and the text of the retrieved document when calling [`RagRetriever`].
        doc_sep (`str`, *optional*, defaults to  `\" // \"`):
            Separator inserted between the text of the retrieved document and the original input when calling
            [`RagRetriever`].
        n_docs (`int`, *optional*, defaults to 5):
            Number of documents to retrieve.
        max_combined_length (`int`, *optional*, defaults to 300):
            Max length of contextualized input returned by [`~RagRetriever.__call__`].
        retrieval_vector_size (`int`, *optional*, defaults to 768):
            Dimensionality of the document embeddings indexed by [`RagRetriever`].
        retrieval_batch_size (`int`, *optional*, defaults to 8):
            Retrieval batch size, defined as the number of queries issues concurrently to the faiss index encapsulated
            [`RagRetriever`].
        dataset (`str`, *optional*, defaults to `\"wiki_dpr\"`):
            A dataset identifier of the indexed dataset in HuggingFace Datasets (list all available datasets and ids
            using `datasets.list_datasets()`).
        dataset_split (`str`, *optional*, defaults to `\"train\"`)
            Which split of the `dataset` to load.
        index_name (`str`, *optional*, defaults to `\"compressed\"`)
            The index name of the index associated with the `dataset`. One can choose between `\"legacy\"`, `\"exact\"` and
            `\"compressed\"`.
        index_path (`str`, *optional*)
            The path to the serialized faiss index on disk.
        passages_path (`str`, *optional*):
            A path to text passages compatible with the faiss index. Required if using
            [`~models.rag.retrieval_rag.LegacyIndex`]
        use_dummy_dataset (`bool`, *optional*, defaults to `False`)
            Whether to load a \"dummy\" variant of the dataset specified by `dataset`.
        label_smoothing (`float`, *optional*, defaults to 0.0):
            Only relevant if `return_loss` is set to `True`. Controls the `epsilon` parameter value for label smoothing
            in the loss calculation. If set to 0, no label smoothing is performed.
        do_marginalize (`bool`, *optional*, defaults to `False`):
            If `True`, the logits are marginalized over all documents by making use of
            `torch.nn.functional.log_softmax`.
        reduce_loss (`bool`, *optional*, defaults to `False`):
            Whether or not to reduce the NLL loss using the `torch.Tensor.sum` operation.
        do_deduplication (`bool`, *optional*, defaults to `True`):
            Whether or not to deduplicate the generations from different context documents for a given input. Has to be
            set to `False` if used while training with distributed backend.
        exclude_bos_score (`bool`, *optional*, defaults to `False`):
            Whether or not to disregard the BOS token when computing the loss.
        output_retrieved(`bool`, *optional*, defaults to `False`):
            If set to `True`, `retrieved_doc_embeds`, `retrieved_doc_ids`, `context_input_ids` and
            `context_attention_mask` are returned. See returned tensors for more detail.
        use_cache (`bool`, *optional*, defaults to `True`):
            Whether or not the model should return the last key/values attentions (not used by all models).
        forced_eos_token_id (`int`, *optional*):
            The id of the token to force as the last generated token when `max_length` is reached. Usually set to
            `eos_token_id`.
"""



@add_start_docstrings(a__ )
class       UpperCAmelCase  (						a__ ):





       '''simple docstring'''



       SCREAMING_SNAKE_CASE 		=   "rag"
       SCREAMING_SNAKE_CASE 		=   True

       def __init__(						self     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=True     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=" / "     ,       __lowerCAmelCase=" // "     ,       __lowerCAmelCase=5     ,       __lowerCAmelCase=300     ,       __lowerCAmelCase=768     ,       __lowerCAmelCase=8     ,       __lowerCAmelCase="wiki_dpr"     ,       __lowerCAmelCase="train"     ,       __lowerCAmelCase="compressed"     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=False     ,       __lowerCAmelCase=False     ,       __lowerCAmelCase=0.0     ,       __lowerCAmelCase=True     ,       __lowerCAmelCase=False     ,       __lowerCAmelCase=False     ,       __lowerCAmelCase=False     ,       __lowerCAmelCase=True     ,       __lowerCAmelCase=None     ,       **__lowerCAmelCase     ,       )  ->  Optional[Any]:
        super().__init__(
            bos_token_id=__lowerCAmelCase     ,       pad_token_id=__lowerCAmelCase     ,       eos_token_id=__lowerCAmelCase     ,       decoder_start_token_id=__lowerCAmelCase     ,       forced_eos_token_id=__lowerCAmelCase     ,       is_encoder_decoder=__lowerCAmelCase     ,       prefix=__lowerCAmelCase     ,       vocab_size=__lowerCAmelCase     ,       **__lowerCAmelCase     ,       )
        assert (
            "question_encoder" in kwargs and "generator" in kwargs
        ), "Config has to be initialized with question_encoder and generator config"
        lowercase__    :   Tuple						= kwargs.pop('''question_encoder'''			)
        lowercase__    :   Union[str, Any]						= question_encoder_config.pop('''model_type'''			)
        lowercase__    :   int						= kwargs.pop('''generator'''			)
        lowercase__    :   str						= decoder_config.pop('''model_type'''			)

        from ..auto.configuration_auto import AutoConfig

        lowercase__    :   Optional[Any]						= AutoConfig.for_model(__lowerCAmelCase     ,       **__lowerCAmelCase			)
        lowercase__    :   Dict						= AutoConfig.for_model(__lowerCAmelCase     ,       **__lowerCAmelCase			)

        lowercase__    :   int						= reduce_loss
        lowercase__    :   List[Any]						= label_smoothing
        lowercase__    :   List[str]						= exclude_bos_score
        lowercase__    :   Any						= do_marginalize

        lowercase__    :   List[Any]						= title_sep
        lowercase__    :   Tuple						= doc_sep
        lowercase__    :   Any						= n_docs
        lowercase__    :   str						= max_combined_length

        lowercase__    :   int						= dataset
        lowercase__    :   int						= dataset_split
        lowercase__    :   str						= index_name

        lowercase__    :   Optional[int]						= retrieval_vector_size
        lowercase__    :   str						= retrieval_batch_size
        lowercase__    :   int						= passages_path
        lowercase__    :   Union[str, Any]						= index_path
        lowercase__    :   Optional[int]						= use_dummy_dataset

        lowercase__    :   Union[str, Any]						= output_retrieved

        lowercase__    :   Optional[Any]						= do_deduplication

        lowercase__    :   Optional[Any]						= use_cache

        if self.forced_eos_token_id is None:
         lowercase__    :   List[str]						= getattr(self.generator     ,       '''forced_eos_token_id'''     ,       __lowerCAmelCase			)

       @classmethod
       def _lowerCAmelCase(						cls     ,       __lowerCAmelCase     ,       __lowerCAmelCase     ,       **__lowerCAmelCase			)  ->  PretrainedConfig:
        return cls(question_encoder=question_encoder_config.to_dict()     ,       generator=generator_config.to_dict()     ,       **__lowerCAmelCase			)


       def _lowerCAmelCase(						self			)  ->  Optional[int]:
        lowercase__    :   List[Any]						= copy.deepcopy(self.__dict__			)
        lowercase__    :   List[str]						= self.question_encoder.to_dict()
        lowercase__    :   int						= self.generator.to_dict()
        lowercase__    :   Dict						= self.__class__.model_type
        return output


'''simple docstring'''

import json
from typing import TYPE_CHECKING, List, Optional, Tuple

from tokenizers import pre_tokenizers

from ...tokenization_utils_base import BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import logging


if TYPE_CHECKING:
  from transformers.pipelines.conversational import Conversation


__a:			Union[str, Any]	       =       logging.get_logger(__name__)

__a:			Tuple	       =       {"""tokenizer_file""": """tokenizer.json"""}

__a:			Union[str, Any]	       =       {
    """tokenizer_file""": {
        """bigscience/tokenizer""": """https://huggingface.co/bigscience/tokenizer/blob/main/tokenizer.json""",
        """bigscience/bloom-560m""": """https://huggingface.co/bigscience/bloom-560m/blob/main/tokenizer.json""",
        """bigscience/bloom-1b1""": """https://huggingface.co/bigscience/bloom-1b1/blob/main/tokenizer.json""",
        """bigscience/bloom-1b7""": """https://huggingface.co/bigscience/bloom-1b7/blob/main/tokenizer.json""",
        """bigscience/bloom-3b""": """https://huggingface.co/bigscience/bloom-3b/blob/main/tokenizer.json""",
        """bigscience/bloom-7b1""": """https://huggingface.co/bigscience/bloom-7b1/blob/main/tokenizer.json""",
        """bigscience/bloom""": """https://huggingface.co/bigscience/bloom/blob/main/tokenizer.json""",
    },
}



class       UpperCAmelCase  (						a__ ):





       '''simple docstring'''



       SCREAMING_SNAKE_CASE 		=   VOCAB_FILES_NAMES
       SCREAMING_SNAKE_CASE 		=   PRETRAINED_VOCAB_FILES_MAP
       SCREAMING_SNAKE_CASE 		=   ["input_ids", "attention_mask"]
       SCREAMING_SNAKE_CASE 		=   None

       def __init__(						self     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase=None     ,       __lowerCAmelCase="<unk>"     ,       __lowerCAmelCase="<s>"     ,       __lowerCAmelCase="</s>"     ,       __lowerCAmelCase="<pad>"     ,       __lowerCAmelCase=False     ,       __lowerCAmelCase=False     ,       **__lowerCAmelCase     ,       )  ->  Union[str, Any]:
        super().__init__(
            __lowerCAmelCase     ,       __lowerCAmelCase     ,       tokenizer_file=__lowerCAmelCase     ,       unk_token=__lowerCAmelCase     ,       bos_token=__lowerCAmelCase     ,       eos_token=__lowerCAmelCase     ,       pad_token=__lowerCAmelCase     ,       add_prefix_space=__lowerCAmelCase     ,       clean_up_tokenization_spaces=__lowerCAmelCase     ,       **__lowerCAmelCase     ,       )
        lowercase__    :   int						= json.loads(self.backend_tokenizer.pre_tokenizer.__getstate__()			)
        if pre_tok_state.get('''add_prefix_space'''     ,       __lowerCAmelCase			) != add_prefix_space:
         lowercase__    :   int						= getattr(__lowerCAmelCase     ,       pre_tok_state.pop('''type'''			)			)
         lowercase__    :   Tuple						= add_prefix_space
         lowercase__    :   List[str]						= pre_tok_class(**__lowerCAmelCase			)

        lowercase__    :   Union[str, Any]						= add_prefix_space

       def _lowerCAmelCase(						self     ,       *__lowerCAmelCase     ,       **__lowerCAmelCase			)  ->  BatchEncoding:
        lowercase__    :   Dict						= kwargs.get('''is_split_into_words'''     ,       __lowerCAmelCase			)
        if not (self.add_prefix_space or not is_split_into_words):
         raise Exception(
             F"""You need to instantiate {self.__class__.__name__} with add_prefix_space=True to use it with"""
             ''' pretokenized inputs.'''			)

        return super()._batch_encode_plus(*__lowerCAmelCase     ,       **__lowerCAmelCase			)

       def _lowerCAmelCase(						self     ,       *__lowerCAmelCase     ,       **__lowerCAmelCase			)  ->  BatchEncoding:
        lowercase__    :   str						= kwargs.get('''is_split_into_words'''     ,       __lowerCAmelCase			)

        if not (self.add_prefix_space or not is_split_into_words):
         raise Exception(
             F"""You need to instantiate {self.__class__.__name__} with add_prefix_space=True to use it with"""
             ''' pretokenized inputs.'''			)

        return super()._encode_plus(*__lowerCAmelCase     ,       **__lowerCAmelCase			)

       def _lowerCAmelCase(						self     ,       __lowerCAmelCase     ,       __lowerCAmelCase = None			)  ->  Tuple[str]:
        lowercase__    :   List[Any]						= self._tokenizer.model.save(__lowerCAmelCase     ,       name=__lowerCAmelCase			)
        return tuple(__lowerCAmelCase			)


       def _lowerCAmelCase(						self     ,       __lowerCAmelCase			)  ->  List[int]:
        lowercase__    :   Dict						= []
        for is_user, text in conversation.iter_texts():
         input_ids.extend(self.encode(__lowerCAmelCase     ,       add_special_tokens=__lowerCAmelCase			) + [self.eos_token_id]			)

        if len(__lowerCAmelCase			) > self.model_max_length:
         lowercase__    :   Optional[Any]						= input_ids[-self.model_max_length :]
        return input_ids

