
import copy

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


lowerCamelCase__          =		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(__magic_name__	)
class      A__							(     __magic_name__	):
				lowercase			    =  'rag'
				lowercase			    =  True






				def __init__(						self					:      Optional[int]    ,     a					:      Optional[Any]=None    ,     a					:      Any=True    ,     a					:      List[str]=None    ,     a					:      str=None    ,     a					:      Dict=None    ,     a					:      Dict=None    ,     a					:      int=None    ,     a					:      Optional[int]=" / "    ,     a					:      Dict=" // "    ,     a					:      List[str]=5    ,     a					:      int=300    ,     a					:      Optional[int]=768    ,     a					:      str=8    ,     a					:      int="wiki_dpr"    ,     a					:      Any="train"    ,     a					:      Optional[int]="compressed"    ,     a					:      Union[str, Any]=None    ,     a					:      List[str]=None    ,     a					:      Tuple=False    ,     a					:      List[str]=False    ,     a					:      Any=0.0    ,     a					:      Tuple=True    ,     a					:      Union[str, Any]=False    ,     a					:      List[Any]=False    ,     a					:      Union[str, Any]=False    ,     a					:      int=True    ,     a					:      List[Any]=None    ,     **a					:      List[str]    ,     ):






							'''simple docstring'''







							super().__init__(
							    bos_token_id=a    ,     pad_token_id=a    ,     eos_token_id=a    ,     decoder_start_token_id=a    ,     forced_eos_token_id=a    ,     is_encoder_decoder=a    ,     prefix=a    ,     vocab_size=a    ,     **a    ,     )
							assert (
							    "question_encoder" in kwargs and "generator" in kwargs
							), "Config has to be initialized with question_encoder and generator config"
							lowerCAmelCase__      :      Optional[Any]         =		kwargs.pop('question_encoder'   )
							lowerCAmelCase__      :      Any         =		question_encoder_config.pop('model_type'   )
							lowerCAmelCase__      :      Optional[Any]         =		kwargs.pop('generator'   )
							lowerCAmelCase__      :      str         =		decoder_config.pop('model_type'   )

							from ..auto.configuration_auto import AutoConfig

							lowerCAmelCase__      :      Union[str, Any]         =		AutoConfig.for_model(a    ,     **a   )
							lowerCAmelCase__      :      Tuple         =		AutoConfig.for_model(a    ,     **a   )

							lowerCAmelCase__      :      Dict         =		reduce_loss
							lowerCAmelCase__      :      Any         =		label_smoothing
							lowerCAmelCase__      :      Optional[int]         =		exclude_bos_score
							lowerCAmelCase__      :      Optional[Any]         =		do_marginalize

							lowerCAmelCase__      :      int         =		title_sep
							lowerCAmelCase__      :      List[Any]         =		doc_sep
							lowerCAmelCase__      :      Optional[int]         =		n_docs
							lowerCAmelCase__      :      List[str]         =		max_combined_length

							lowerCAmelCase__      :      Optional[int]         =		dataset
							lowerCAmelCase__      :      List[Any]         =		dataset_split
							lowerCAmelCase__      :      int         =		index_name

							lowerCAmelCase__      :      Optional[int]         =		retrieval_vector_size
							lowerCAmelCase__      :      Optional[int]         =		retrieval_batch_size
							lowerCAmelCase__      :      Tuple         =		passages_path
							lowerCAmelCase__      :      List[Any]         =		index_path
							lowerCAmelCase__      :      Optional[Any]         =		use_dummy_dataset

							lowerCAmelCase__      :      Tuple         =		output_retrieved

							lowerCAmelCase__      :      Union[str, Any]         =		do_deduplication

							lowerCAmelCase__      :      int         =		use_cache

							if self.forced_eos_token_id is None:
										lowerCAmelCase__      :      List[Any]         =		getattr(self.generator    ,     'forced_eos_token_id'    ,     a   )






				@classmethod
				def 							_lowerCamelCase		(						cls					:      Union[str, Any]    ,     a					:      PretrainedConfig    ,     a					:      PretrainedConfig    ,     **a					:      Optional[Any]   ):






							'''simple docstring'''







							return cls(question_encoder=question_encoder_config.to_dict()    ,     generator=generator_config.to_dict()    ,     **a   )






				def 							_lowerCamelCase		(						self					:      Optional[Any]   ):






							'''simple docstring'''







							lowerCAmelCase__      :      Union[str, Any]         =		copy.deepcopy(self.__dict__   )
							lowerCAmelCase__      :      Optional[Any]         =		self.question_encoder.to_dict()
							lowerCAmelCase__      :      List[str]         =		self.generator.to_dict()
							lowerCAmelCase__      :      Optional[Any]         =		self.__class__.model_type
							return output

import os
from distutils.util import strtobool
def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_     )				->		Optional[Any]:
			for e in env_keys:
						lowerCAmelCase__      :      Union[str, Any]         =		int(os.environ.get(SCREAMING_SNAKE_CASE_       ,							-1     )     )
						if val >= 0:
									return val
			return default
def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_=False     )				->		List[str]:
			lowerCAmelCase__      :      Optional[int]         =		os.environ.get(SCREAMING_SNAKE_CASE_       ,							str(SCREAMING_SNAKE_CASE_     )     )
			return strtobool(SCREAMING_SNAKE_CASE_     ) == 1  # As its name indicates `strtobool` actually returns an int...







def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_="no"     )				->		List[str]:
			lowerCAmelCase__      :      Optional[int]         =		os.environ.get(SCREAMING_SNAKE_CASE_       ,							str(SCREAMING_SNAKE_CASE_     )     )
			return value