

import datasets

from .evaluate import evaluate


lowerCAmelCase_       	=	'''\
@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}
}
'''

lowerCAmelCase_       	=	'''
This metric wrap the official scoring script for version 1 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.
'''

lowerCAmelCase_       	=	'''
Computes SQuAD scores (F1 and EM).
Args:
    predictions: List of question-answers dictionaries with the following key-values:
        - \'id\': id of the question-answer pair as given in the references (see below)
        - \'prediction_text\': the text of the answer
    references: List of question-answers dictionaries with the following key-values:
        - \'id\': id of the question-answer pair (see above),
        - \'answers\': a Dict in the SQuAD dataset format
            {
                \'text\': list of possible texts for the answer, as a list of strings
                \'answer_start\': list of start positions for the answer, as a list of ints
            }
            Note that answer_start values are not taken into account to compute the metric.
Returns:
    \'exact_match\': Exact match (the normalized answer exactly match the gold answer)
    \'f1\': The F-score of predicted tokens versus the gold answer
Examples:

    >>> predictions = [{\'prediction_text\': \'1976\', \'id\': \'56e10a3be3433e1400422b22\'}]
    >>> references = [{\'answers\': {\'answer_start\': [97], \'text\': [\'1976\']}, \'id\': \'56e10a3be3433e1400422b22\'}]
    >>> squad_metric = datasets.load_metric("squad")
    >>> results = squad_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {\'exact_match\': 100.0, \'f1\': 100.0}
'''





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







			'''simple docstring'''

			def 				snake_case__(     self :				str							)      ->Union[str, 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'''							)},
									            '''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 				snake_case__(     self :				int							,   _UpperCamelCase :				str							,   _UpperCamelCase :				Any							)      ->List[str]:
									snake_case_   =	{prediction['''id''']: prediction['''prediction_text'''] for prediction in predictions}
									snake_case_   =	[
									    {
									        '''paragraphs''': [
									            {
									                '''qas''': [
									                    {
									                        '''answers''': [{'''text''': answer_text} for answer_text in ref['''answers''']['''text''']],
									                        '''id''': ref['''id'''],
									                    }
									                    for ref in references
									                ]
									            }
									        ]
									    }
									]
									snake_case_   =	evaluate(dataset=_UpperCamelCase							,   predictions=_UpperCamelCase							)
									return score


from ..utils import DummyObject, requires_backends





class 	snake_case_   (		metaclass=__A					):







			'''simple docstring'''

			SCREAMING_SNAKE_CASE     :   Union[str, Any]									=				["note_seq"]







			def __init__(     self :				Optional[int]							,   *_UpperCamelCase :				str							,   **_UpperCamelCase :				Optional[int]							)      ->Any:
									requires_backends(self							,   ['''note_seq''']							)







			@classmethod
			def 				snake_case__(     cls :				int							,   *_UpperCamelCase :				Any							,   **_UpperCamelCase :				List[Any]							)      ->int:
									requires_backends(cls							,   ['''note_seq''']							)







			@classmethod
			def 				snake_case__(     cls :				Dict							,   *_UpperCamelCase :				Optional[int]							,   **_UpperCamelCase :				Union[str, Any]							)      ->List[str]:
									requires_backends(cls							,   ['''note_seq''']							)