


'''simple docstring'''







import re
import tempfile
from pathlib import Path

import pytest
import yaml

from datasets.utils.readme import ReadMe


# @pytest.fixture
# def example_yaml_structure():

lowerCAmelCase     :  Dict											=    yaml.safe_load(
    """\
name: \"\"
allow_empty: false
allow_empty_text: true
subsections:
  - name: \"Dataset Card for X\" # First-level markdown heading
    allow_empty: false
    allow_empty_text: true
    subsections:
      - name: \"Table of Contents\"
        allow_empty: false
        allow_empty_text: false
        subsections: null
      - name: \"Dataset Description\"
        allow_empty: false
        allow_empty_text: false
        subsections:
          - name: \"Dataset Summary\"
            allow_empty: false
            allow_empty_text: false
            subsections: null
          - name: \"Supported Tasks and Leaderboards\"
            allow_empty: true
            allow_empty_text: true
            subsections: null
          - name: Languages
            allow_empty: false
            allow_empty_text: true
            subsections: null
"""
)


lowerCAmelCase     :  Union[str, Any]											=    {
    """name""": """root""",
    """text""": """""",
    """is_empty_text""": True,
    """subsections""": [
        {
            """name""": """Dataset Card for My Dataset""",
            """text""": """""",
            """is_empty_text""": True,
            """subsections""": [
                {"""name""": """Table of Contents""", """text""": """Some text here.""", """is_empty_text""": False, """subsections""": []},
                {
                    """name""": """Dataset Description""",
                    """text""": """Some text here.""",
                    """is_empty_text""": False,
                    """subsections""": [
                        {
                            """name""": """Dataset Summary""",
                            """text""": """Some text here.""",
                            """is_empty_text""": False,
                            """subsections""": [],
                        },
                        {
                            """name""": """Supported Tasks and Leaderboards""",
                            """text""": """""",
                            """is_empty_text""": True,
                            """subsections""": [],
                        },
                        {"""name""": """Languages""", """text""": """Language Text""", """is_empty_text""": False, """subsections""": []},
                    ],
                },
            ],
        }
    ],
}


lowerCAmelCase     :  List[Any]											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""


lowerCAmelCase     :  Optional[Any]											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
#### Extra Ignored Subsection
### Supported Tasks and Leaderboards
### Languages
Language Text
"""

lowerCAmelCase     :  Any											=    {
    """name""": """root""",
    """text""": """""",
    """is_empty_text""": True,
    """subsections""": [
        {
            """name""": """Dataset Card for My Dataset""",
            """text""": """""",
            """is_empty_text""": True,
            """subsections""": [
                {"""name""": """Table of Contents""", """text""": """Some text here.""", """is_empty_text""": False, """subsections""": []},
                {
                    """name""": """Dataset Description""",
                    """text""": """Some text here.""",
                    """is_empty_text""": False,
                    """subsections""": [
                        {
                            """name""": """Dataset Summary""",
                            """text""": """Some text here.""",
                            """is_empty_text""": False,
                            """subsections""": [
                                {
                                    """name""": """Extra Ignored Subsection""",
                                    """text""": """""",
                                    """is_empty_text""": True,
                                    """subsections""": [],
                                }
                            ],
                        },
                        {
                            """name""": """Supported Tasks and Leaderboards""",
                            """text""": """""",
                            """is_empty_text""": True,
                            """subsections""": [],
                        },
                        {"""name""": """Languages""", """text""": """Language Text""", """is_empty_text""": False, """subsections""": []},
                    ],
                },
            ],
        }
    ],
}

lowerCAmelCase     :  Dict											=    """\
---
---
# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""

lowerCAmelCase     :  Any											=    (
    """The following issues were found for the README at `{path}`:\n-\tEmpty YAML markers are present in the README."""
)

lowerCAmelCase     :  Optional[int]											=    """\
# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""

lowerCAmelCase     :  str											=    (
    """The following issues were found for the README at `{path}`:\n-\tNo YAML markers are present in the README."""
)

lowerCAmelCase     :  int											=    """\
---
# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""

lowerCAmelCase     :  List[str]											=    """The following issues were found for the README at `{path}`:\n-\tOnly the start of YAML tags present in the README."""

lowerCAmelCase     :  List[str]											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
### Supported Tasks and Leaderboards
### Languages
Language Text
"""
lowerCAmelCase     :  str											=    """The following issues were found for the README at `{path}`:\n-\tExpected some content in section `Dataset Summary` but it is empty.\n-\tExpected some text in section `Dataset Summary` but it is empty (text in subsections are ignored)."""


lowerCAmelCase     :  Optional[int]											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
"""
lowerCAmelCase     :  Union[str, Any]											=    """The following issues were found for the README at `{path}`:\n-\tExpected some content in section `Dataset Card for My Dataset` but it is empty.\n-\tSection `Dataset Card for My Dataset` expected the following subsections: `Table of Contents`, `Dataset Description`. Found 'None'."""

lowerCAmelCase     :  Any											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Languages
Language Text
"""

lowerCAmelCase     :  Optional[int]											=    """The following issues were found for the README at `{path}`:\n-\tSection `Dataset Description` is missing subsection: `Supported Tasks and Leaderboards`."""


lowerCAmelCase     :  str											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
"""

lowerCAmelCase     :  List[Any]											=    """The following issues were found for the README at `{path}`:\n-\tExpected some content in section `Languages` but it is empty."""

lowerCAmelCase     :  List[Any]											=    """\
---
language:
- zh
- en
---

## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""
lowerCAmelCase     :  str											=    """The following issues were found for the README at `{path}`:\n-\tThe README has no first-level headings. One heading is expected. Skipping further validation for this README."""

lowerCAmelCase     :  Union[str, Any]											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
# Dataset Card My Dataset
"""

lowerCAmelCase     :  List[Any]											=    """The following issues were found for the README at `{path}`:\n-\tThe README has several first-level headings: `Dataset Card for My Dataset`, `Dataset Card My Dataset`. Only one heading is expected. Skipping further validation for this README."""

lowerCAmelCase     :  Optional[Any]											=    """\
---
language:
- zh
- en
---

# Dataset Card My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""

lowerCAmelCase     :  int											=    """The following issues were found for the README at `{path}`:\n-\tNo first-level heading starting with `Dataset Card for` found in README. Skipping further validation for this README."""

lowerCAmelCase     :  Any											=    """"""

lowerCAmelCase     :  int											=    """The following issues were found for the README at `{path}`:\n-\tThe README has no first-level headings. One heading is expected. Skipping further validation for this README.\n-\tNo YAML markers are present in the README."""

lowerCAmelCase     :  Dict											=    """\
---
language:
- zh
- en
---

# Dataset Card for My Dataset
# Dataset Card for My Dataset
## Table of Contents
Some text here.
## Dataset Description
Some text here.
### Dataset Summary
Some text here.
### Supported Tasks and Leaderboards
### Languages
Language Text
"""

lowerCAmelCase     :  Dict											=    """The following issues were found while parsing the README at `{path}`:\n-\tMultiple sections with the same heading `Dataset Card for My Dataset` have been found. Please keep only one of these sections."""






@pytest.mark.parametrize(
    'readme_md, expected_dict' ,    [
        (README_CORRECT, CORRECT_DICT),
        (README_CORRECT_FOUR_LEVEL, CORRECT_DICT_FOUR_LEVEL),
    ] ,    )
def       lowercase					(_A ,    _A       ):







       """simple docstring"""







       assert ReadMe.from_string(_A ,    _A       ).to_dict() == expected_dict






@pytest.mark.parametrize(
    'readme_md, expected_error' ,    [
        (README_NO_YAML, EXPECTED_ERROR_README_NO_YAML),
        (README_EMPTY_YAML, EXPECTED_ERROR_README_EMPTY_YAML),
        (README_INCORRECT_YAML, EXPECTED_ERROR_README_INCORRECT_YAML),
        (README_EMPTY, EXPECTED_ERROR_README_EMPTY),
        (README_NONE_SUBSECTION, EXPECTED_ERROR_README_NONE_SUBSECTION),
        (README_MISSING_FIRST_LEVEL, EXPECTED_ERROR_README_MISSING_FIRST_LEVEL),
        (README_MISSING_SUBSECTION, EXPECTED_ERROR_README_MISSING_SUBSECTION),
        (README_MISSING_TEXT, EXPECTED_ERROR_README_MISSING_TEXT),
        (README_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_WRONG_FIRST_LEVEL),
        (README_MULTIPLE_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_MULTIPLE_WRONG_FIRST_LEVEL),
        (README_MISSING_CONTENT, EXPECTED_ERROR_README_MISSING_CONTENT),
    ] ,    )
def       lowercase					(_A ,    _A       ):







       """simple docstring"""







       with pytest.raises(_A ,    match=re.escape(expected_error.format(path='root'       )       )       ):
              _lowerCAmelCase     :				Any       =							ReadMe.from_string(_A ,    _A       )
              readme.validate()






@pytest.mark.parametrize(
    'readme_md, expected_error' ,    [
        (README_MULTIPLE_SAME_HEADING_1, EXPECTED_ERROR_README_MULTIPLE_SAME_HEADING_1),
    ] ,    )
def       lowercase					(_A ,    _A       ):







       """simple docstring"""







       with pytest.raises(_A ,    match=re.escape(expected_error.format(path='root'       )       )       ):
              ReadMe.from_string(_A ,    _A       )






@pytest.mark.parametrize(
    'readme_md,' ,    [
        (README_MULTIPLE_SAME_HEADING_1),
    ] ,    )
def       lowercase					(_A       ):







       """simple docstring"""







       ReadMe.from_string(_A ,    _A ,    suppress_parsing_errors=_A       )






@pytest.mark.parametrize(
    'readme_md, expected_dict' ,    [
        (README_CORRECT, CORRECT_DICT),
        (README_CORRECT_FOUR_LEVEL, CORRECT_DICT_FOUR_LEVEL),
    ] ,    )
def       lowercase					(_A ,    _A       ):







       """simple docstring"""







       with tempfile.TemporaryDirectory() as tmp_dir:
              _lowerCAmelCase     :				List[Any]       =							Path(_A       ) / 'README.md'
              with open(_A ,    'w+'       ) as readme_file:
                     readme_file.write(_A       )
              _lowerCAmelCase     :				Any       =							ReadMe.from_readme(_A ,    _A       ).to_dict()
              assert out["name"] == path
              assert out["text"] == ""
              assert out["is_empty_text"]
              assert out["subsections"] == expected_dict["subsections"]






@pytest.mark.parametrize(
    'readme_md, expected_error' ,    [
        (README_NO_YAML, EXPECTED_ERROR_README_NO_YAML),
        (README_EMPTY_YAML, EXPECTED_ERROR_README_EMPTY_YAML),
        (README_INCORRECT_YAML, EXPECTED_ERROR_README_INCORRECT_YAML),
        (README_EMPTY, EXPECTED_ERROR_README_EMPTY),
        (README_NONE_SUBSECTION, EXPECTED_ERROR_README_NONE_SUBSECTION),
        (README_MISSING_FIRST_LEVEL, EXPECTED_ERROR_README_MISSING_FIRST_LEVEL),
        (README_MISSING_SUBSECTION, EXPECTED_ERROR_README_MISSING_SUBSECTION),
        (README_MISSING_TEXT, EXPECTED_ERROR_README_MISSING_TEXT),
        (README_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_WRONG_FIRST_LEVEL),
        (README_MULTIPLE_WRONG_FIRST_LEVEL, EXPECTED_ERROR_README_MULTIPLE_WRONG_FIRST_LEVEL),
        (README_MISSING_CONTENT, EXPECTED_ERROR_README_MISSING_CONTENT),
    ] ,    )
def       lowercase					(_A ,    _A       ):







       """simple docstring"""







       with tempfile.TemporaryDirectory() as tmp_dir:
              _lowerCAmelCase     :				str       =							Path(_A       ) / 'README.md'
              with open(_A ,    'w+'       ) as readme_file:
                     readme_file.write(_A       )
              _lowerCAmelCase     :				str       =							expected_error.format(path=_A       )
              with pytest.raises(_A ,    match=re.escape(_A       )       ):
                     _lowerCAmelCase     :				Tuple       =							ReadMe.from_readme(_A ,    _A       )
                     readme.validate()






@pytest.mark.parametrize(
    'readme_md, expected_error' ,    [
        (README_MULTIPLE_SAME_HEADING_1, EXPECTED_ERROR_README_MULTIPLE_SAME_HEADING_1),
    ] ,    )
def       lowercase					(_A ,    _A       ):







       """simple docstring"""







       with tempfile.TemporaryDirectory() as tmp_dir:
              _lowerCAmelCase     :				Union[str, Any]       =							Path(_A       ) / 'README.md'
              with open(_A ,    'w+'       ) as readme_file:
                     readme_file.write(_A       )
              _lowerCAmelCase     :				Tuple       =							expected_error.format(path=_A       )
              with pytest.raises(_A ,    match=re.escape(_A       )       ):
                     ReadMe.from_readme(_A ,    _A       )






@pytest.mark.parametrize(
    'readme_md,' ,    [
        (README_MULTIPLE_SAME_HEADING_1),
    ] ,    )
def       lowercase					(_A       ):







       """simple docstring"""







       with tempfile.TemporaryDirectory() as tmp_dir:
              _lowerCAmelCase     :				Tuple       =							Path(_A       ) / 'README.md'
              with open(_A ,    'w+'       ) as readme_file:
                     readme_file.write(_A       )
              ReadMe.from_readme(_A ,    _A ,    suppress_parsing_errors=_A       )





'''simple docstring'''







import copy

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


lowerCAmelCase     :  Tuple											=    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(SCREAMING_SNAKE_CASE_						)
class 						UpperCamelCase__       (			SCREAMING_SNAKE_CASE_						):



     """simple docstring"""






     __magic_name__           =     "rag"
     __magic_name__           =     True







     def __init__(			self   ,						snake_case__=None   ,						snake_case__=True   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__=" / "   ,						snake_case__=" // "   ,						snake_case__=5   ,						snake_case__=300   ,						snake_case__=768   ,						snake_case__=8   ,						snake_case__="wiki_dpr"   ,						snake_case__="train"   ,						snake_case__="compressed"   ,						snake_case__=None   ,						snake_case__=None   ,						snake_case__=False   ,						snake_case__=False   ,						snake_case__=0.0   ,						snake_case__=True   ,						snake_case__=False   ,						snake_case__=False   ,						snake_case__=False   ,						snake_case__=True   ,						snake_case__=None   ,						**snake_case__   ,						):

            '''simple docstring'''

            super().__init__(
                bos_token_id=snake_case__   ,						pad_token_id=snake_case__   ,						eos_token_id=snake_case__   ,						decoder_start_token_id=snake_case__   ,						forced_eos_token_id=snake_case__   ,						is_encoder_decoder=snake_case__   ,						prefix=snake_case__   ,						vocab_size=snake_case__   ,						**snake_case__   ,						)
            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     :				List[Any]       =							question_encoder_config.pop('model_type' )
            _lowerCAmelCase     :				List[str]       =							kwargs.pop('generator' )
            _lowerCAmelCase     :				Tuple       =							decoder_config.pop('model_type' )

            from ..auto.configuration_auto import AutoConfig

            _lowerCAmelCase     :				Union[str, Any]       =							AutoConfig.for_model(snake_case__   ,						**snake_case__ )
            _lowerCAmelCase     :				List[str]       =							AutoConfig.for_model(snake_case__   ,						**snake_case__ )

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

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

            _lowerCAmelCase     :				Dict       =							dataset
            _lowerCAmelCase     :				Optional[int]       =							dataset_split
            _lowerCAmelCase     :				str       =							index_name

            _lowerCAmelCase     :				Tuple       =							retrieval_vector_size
            _lowerCAmelCase     :				Any       =							retrieval_batch_size
            _lowerCAmelCase     :				Any       =							passages_path
            _lowerCAmelCase     :				Tuple       =							index_path
            _lowerCAmelCase     :				Any       =							use_dummy_dataset

            _lowerCAmelCase     :				Union[str, Any]       =							output_retrieved

            _lowerCAmelCase     :				List[str]       =							do_deduplication

            _lowerCAmelCase     :				Optional[int]       =							use_cache

            if self.forced_eos_token_id is None:
                   _lowerCAmelCase     :				Tuple       =							getattr(self.generator   ,						'forced_eos_token_id'   ,						snake_case__ )







     @classmethod
     def a						(			cls   ,						snake_case__   ,						snake_case__   ,						**snake_case__ ):

            '''simple docstring'''

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







     def a						(			self ):

            '''simple docstring'''

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

