



"""simple docstring"""


import datasets

from .evaluate import (
    apply_no_ans_threshold,
    find_all_best_thresh,
    get_raw_scores,
    make_eval_dict,
    make_qid_to_has_ans,
    merge_eval,
)


snake_case_								=			"""\
@inproceedings{Rajpurkar2016SQuAD10,
  title={SQuAD: 100, 000+ Questions for Machine Comprehension of Text},
  author={Pranav Rajpurkar and Jian Zhang and Konstantin Lopyrev and Percy Liang},
  booktitle={EMNLP},
  year={2016}
}
"""

snake_case_								=			"""
This metric wrap the official scoring script for version 2 of the Stanford Question
Answering Dataset (SQuAD).

Stanford Question Answering Dataset (SQuAD) is a reading comprehension dataset, consisting of questions posed by
crowdworkers on a set of Wikipedia articles, where the answer to every question is a segment of text, or span,
from the corresponding reading passage, or the question might be unanswerable.

SQuAD2.0 combines the 100,000 questions in SQuAD1.1 with over 50,000 unanswerable questions
written adversarially by crowdworkers to look similar to answerable ones.
To do well on SQuAD2.0, systems must not only answer questions when possible, but also
determine when no answer is supported by the paragraph and abstain from answering.
"""

snake_case_								=			"""
Computes SQuAD v2 scores (F1 and EM).
Args:
    predictions: List of triple for question-answers to score with the following elements:
        - the question-answer 'id' field as given in the references (see below)
        - the text of the answer
        - the probability that the question has no answer
    references: List of question-answers dictionaries with the following key-values:
            - 'id': id of the question-answer pair (see above),
            - 'answers': a list of Dict {'text': text of the answer as a string}
    no_answer_threshold: float
        Probability threshold to decide that a question has no answer.
Returns:
    'exact': Exact match (the normalized answer exactly match the gold answer)
    'f1': The F-score of predicted tokens versus the gold answer
    'total': Number of score considered
    'HasAns_exact': Exact match (the normalized answer exactly match the gold answer)
    'HasAns_f1': The F-score of predicted tokens versus the gold answer
    'HasAns_total': Number of score considered
    'NoAns_exact': Exact match (the normalized answer exactly match the gold answer)
    'NoAns_f1': The F-score of predicted tokens versus the gold answer
    'NoAns_total': Number of score considered
    'best_exact': Best exact match (with varying threshold)
    'best_exact_thresh': No-answer probability threshold associated to the best exact match
    'best_f1': Best F1 (with varying threshold)
    'best_f1_thresh': No-answer probability threshold associated to the best F1
Examples:

    >>> predictions = [{'prediction_text': '1976', 'id': '56e10a3be3433e1400422b22', 'no_answer_probability': 0.}]
    >>> references = [{'answers': {'answer_start': [97], 'text': ['1976']}, 'id': '56e10a3be3433e1400422b22'}]
    >>> squad_v2_metric = datasets.load_metric(\"squad_v2\")
    >>> results = squad_v2_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'exact': 100.0, 'f1': 100.0, 'total': 1, 'HasAns_exact': 100.0, 'HasAns_f1': 100.0, 'HasAns_total': 1, 'best_exact': 100.0, 'best_exact_thresh': 0.0, 'best_f1': 100.0, 'best_f1_thresh': 0.0}
"""







@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION      ,  _KWARGS_DESCRIPTION							)
class  A_     (	datasets.Metric							):



						"""simple docstring"""






						def       UpperCAmelCase__	(   self					:Dict   )							->     Any:
												return datasets.MetricInfo(
												    description=_DESCRIPTION  ,    citation=_CITATION  ,    inputs_description=_KWARGS_DESCRIPTION  ,    features=datasets.Features(
												        {
												            'predictions': {
												                'id': datasets.Value('string'   ),
												                'prediction_text': datasets.Value('string'   ),
												                'no_answer_probability': datasets.Value('float32'   ),
												            },
												            'references': {
												                'id': datasets.Value('string'   ),
												                'answers': datasets.features.Sequence(
												                    {'text': datasets.Value('string'   ), 'answer_start': datasets.Value('int32'   )}   ),
												            },
												        }   )  ,    codebase_urls=['https://rajpurkar.github.io/SQuAD-explorer/']  ,    reference_urls=['https://rajpurkar.github.io/SQuAD-explorer/']  ,    )






						def       UpperCAmelCase__	(   self					:Optional[Any]  ,    lowercase_					:List[str]  ,    lowercase_					:Optional[int]  ,    lowercase_					:Union[str, Any]=1.0   )							->     Union[str, Any]:
												UpperCAmelCase			 =					{p['id']: p['no_answer_probability'] for p in predictions}
												UpperCAmelCase			 =					[{'paragraphs': [{'qas': references}]}]
												UpperCAmelCase			 =					{p['id']: p['prediction_text'] for p in predictions}

												UpperCAmelCase			 =					make_qid_to_has_ans(lowercase_   )  # maps qid to True/False
												UpperCAmelCase			 =					[k for k, v in qid_to_has_ans.items() if v]
												UpperCAmelCase			 =					[k for k, v in qid_to_has_ans.items() if not v]

												UpperCAmelCase ,       UpperCAmelCase			 =					get_raw_scores(lowercase_  ,    lowercase_   )
												UpperCAmelCase			 =					apply_no_ans_threshold(lowercase_  ,    lowercase_  ,    lowercase_  ,    lowercase_   )
												UpperCAmelCase			 =					apply_no_ans_threshold(lowercase_  ,    lowercase_  ,    lowercase_  ,    lowercase_   )
												UpperCAmelCase			 =					make_eval_dict(lowercase_  ,    lowercase_   )

												if has_ans_qids:
																		UpperCAmelCase			 =					make_eval_dict(lowercase_  ,    lowercase_  ,    qid_list=lowercase_   )
																		merge_eval(lowercase_  ,    lowercase_  ,    'HasAns'   )
												if no_ans_qids:
																		UpperCAmelCase			 =					make_eval_dict(lowercase_  ,    lowercase_  ,    qid_list=lowercase_   )
																		merge_eval(lowercase_  ,    lowercase_  ,    'NoAns'   )
												find_all_best_thresh(lowercase_  ,    lowercase_  ,    lowercase_  ,    lowercase_  ,    lowercase_  ,    lowercase_   )
												return dict(lowercase_   )










"""simple docstring"""


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

from tokenizers import pre_tokenizers

from ...tokenization_utils_base import AddedToken, BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import logging
from .tokenization_deberta import DebertaTokenizer


if TYPE_CHECKING:
				from transformers.pipelines.conversational import Conversation


snake_case_								=			logging.get_logger(__name__)

snake_case_								=			{"""vocab_file""": """vocab.json""", """merges_file""": """merges.txt""", """tokenizer_file""": """tokenizer.json"""}

snake_case_								=			{
    """vocab_file""": {
        """microsoft/deberta-base""": """https://huggingface.co/microsoft/deberta-base/resolve/main/vocab.json""",
        """microsoft/deberta-large""": """https://huggingface.co/microsoft/deberta-large/resolve/main/vocab.json""",
        """microsoft/deberta-xlarge""": """https://huggingface.co/microsoft/deberta-xlarge/resolve/main/vocab.json""",
        """microsoft/deberta-base-mnli""": """https://huggingface.co/microsoft/deberta-base-mnli/resolve/main/vocab.json""",
        """microsoft/deberta-large-mnli""": """https://huggingface.co/microsoft/deberta-large-mnli/resolve/main/vocab.json""",
        """microsoft/deberta-xlarge-mnli""": (
            """https://huggingface.co/microsoft/deberta-xlarge-mnli/resolve/main/vocab.json"""
        ),
    },
    """merges_file""": {
        """microsoft/deberta-base""": """https://huggingface.co/microsoft/deberta-base/resolve/main/merges.txt""",
        """microsoft/deberta-large""": """https://huggingface.co/microsoft/deberta-large/resolve/main/merges.txt""",
        """microsoft/deberta-xlarge""": """https://huggingface.co/microsoft/deberta-xlarge/resolve/main/merges.txt""",
        """microsoft/deberta-base-mnli""": """https://huggingface.co/microsoft/deberta-base-mnli/resolve/main/merges.txt""",
        """microsoft/deberta-large-mnli""": """https://huggingface.co/microsoft/deberta-large-mnli/resolve/main/merges.txt""",
        """microsoft/deberta-xlarge-mnli""": (
            """https://huggingface.co/microsoft/deberta-xlarge-mnli/resolve/main/merges.txt"""
        ),
    },
}

snake_case_								=			{
    """microsoft/deberta-base""": 512,
    """microsoft/deberta-large""": 512,
    """microsoft/deberta-xlarge""": 512,
    """microsoft/deberta-base-mnli""": 512,
    """microsoft/deberta-large-mnli""": 512,
    """microsoft/deberta-xlarge-mnli""": 512,
}

snake_case_								=			{
    """microsoft/deberta-base""": {"""do_lower_case""": False},
    """microsoft/deberta-large""": {"""do_lower_case""": False},
}







class  A_     (	SCREAMING_SNAKE_CASE_							):



						"""simple docstring"""
						__UpperCamelCase													=				VOCAB_FILES_NAMES
						__UpperCamelCase													=				PRETRAINED_VOCAB_FILES_MAP
						__UpperCamelCase													=				PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
						__UpperCamelCase													=				["""input_ids""", """attention_mask""", """token_type_ids"""]
						__UpperCamelCase													=				DebertaTokenizer






						def __init__(   self					:Optional[Any]  ,    lowercase_					:List[str]=None  ,    lowercase_					:List[str]=None  ,    lowercase_					:List[Any]=None  ,    lowercase_					:Optional[Any]="replace"  ,    lowercase_					:int="[CLS]"  ,    lowercase_					:Union[str, Any]="[SEP]"  ,    lowercase_					:int="[SEP]"  ,    lowercase_					:int="[CLS]"  ,    lowercase_					:Optional[int]="[UNK]"  ,    lowercase_					:int="[PAD]"  ,    lowercase_					:List[Any]="[MASK]"  ,    lowercase_					:Union[str, Any]=False  ,    **lowercase_					:int  ,    )							->     Tuple:
												super().__init__(
												    lowercase_  ,    lowercase_  ,    tokenizer_file=lowercase_  ,    errors=lowercase_  ,    bos_token=lowercase_  ,    eos_token=lowercase_  ,    unk_token=lowercase_  ,    sep_token=lowercase_  ,    cls_token=lowercase_  ,    pad_token=lowercase_  ,    mask_token=lowercase_  ,    add_prefix_space=lowercase_  ,    **lowercase_  ,    )
												UpperCAmelCase			 =					kwargs.pop('add_bos_token'  ,    lowercase_   )

												UpperCAmelCase			 =					json.loads(self.backend_tokenizer.pre_tokenizer.__getstate__()   )
												if pre_tok_state.get('add_prefix_space'  ,    lowercase_   ) != add_prefix_space:
																		UpperCAmelCase			 =					getattr(lowercase_  ,    pre_tok_state.pop('type'   )   )
																		UpperCAmelCase			 =					add_prefix_space
																		UpperCAmelCase			 =					pre_tok_class(**lowercase_   )

												UpperCAmelCase			 =					add_prefix_space






						@property
						def       UpperCAmelCase__	(   self					:str   )							->     str:
												if self._mask_token is None:
																		if self.verbose:
																								logger.error('Using mask_token, but it is not set yet.'   )
																		return None
												return str(self._mask_token   )






						@mask_token.setter
						def       UpperCAmelCase__	(   self					:Any  ,    lowercase_					:Any   )							->     Any:
												UpperCAmelCase			 =					AddedToken(lowercase_  ,    lstrip=lowercase_  ,    rstrip=lowercase_   ) if isinstance(lowercase_  ,    lowercase_   ) else value
												UpperCAmelCase			 =					value






						def       UpperCAmelCase__	(   self					:Optional[Any]  ,    lowercase_					:List[int]  ,    lowercase_					:Optional[List[int]] = None   )							->     List[int]:
												if token_ids_a is None:
																		return [self.cls_token_id] + token_ids_a + [self.sep_token_id]
												UpperCAmelCase			 =					[self.cls_token_id]
												UpperCAmelCase			 =					[self.sep_token_id]
												return cls + token_ids_a + sep + token_ids_a + sep






						def       UpperCAmelCase__	(   self					:Dict  ,    lowercase_					:List[int]  ,    lowercase_					:Optional[List[int]] = None   )							->     List[int]:
												UpperCAmelCase			 =					[self.sep_token_id]
												UpperCAmelCase			 =					[self.cls_token_id]

												if token_ids_a is None:
																		return len(cls + token_ids_a + sep   ) * [0]
												return len(cls + token_ids_a + sep   ) * [0] + len(token_ids_a + sep   ) * [1]






						def       UpperCAmelCase__	(   self					:int  ,    *lowercase_					:str  ,    **lowercase_					:Optional[Any]   )							->     BatchEncoding:
												UpperCAmelCase			 =					kwargs.get('is_split_into_words'  ,    lowercase_   )
												assert self.add_prefix_space or not is_split_into_words, (
												    f"""You need to instantiate {self.__class__.__name__} with add_prefix_space=True """
												    "to use it with pretokenized inputs."
												)

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






						def       UpperCAmelCase__	(   self					:Optional[Any]  ,    *lowercase_					:Dict  ,    **lowercase_					:Any   )							->     BatchEncoding:
												UpperCAmelCase			 =					kwargs.get('is_split_into_words'  ,    lowercase_   )

												assert self.add_prefix_space or not is_split_into_words, (
												    f"""You need to instantiate {self.__class__.__name__} with add_prefix_space=True """
												    "to use it with pretokenized inputs."
												)

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






						def       UpperCAmelCase__	(   self					:Union[str, Any]  ,    lowercase_					:str  ,    lowercase_					:Optional[str] = None   )							->     Tuple[str]:
												UpperCAmelCase			 =					self._tokenizer.model.save(lowercase_  ,    name=lowercase_   )
												return tuple(lowercase_   )






						def       UpperCAmelCase__	(   self					:int  ,    lowercase_					:"Conversation"   )							->     List[int]:
												UpperCAmelCase			 =					[]
												for is_user, text in conversation.iter_texts():
																		input_ids.extend(self.encode(lowercase_  ,    add_special_tokens=lowercase_   ) + [self.eos_token_id]   )

												if len(lowercase_   ) > self.model_max_length:
																		UpperCAmelCase			 =					input_ids[-self.model_max_length :]
												return input_ids





