




import datasets

from .evaluate import evaluate


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

a													=			"\nThis metric wrap the official scoring script for version 1 of the Stanford Question Answering Dataset (SQuAD).\n\nStanford Question Answering Dataset (SQuAD) is a reading comprehension dataset, consisting of questions posed by\ncrowdworkers on a set of Wikipedia articles, where the answer to every question is a segment of text, or span,\nfrom the corresponding reading passage, or the question might be unanswerable.\n"

a													=			"\nComputes SQuAD scores (F1 and EM).\nArgs:\n    predictions: List of question-answers dictionaries with the following key-values:\n        - 'id': id of the question-answer pair as given in the references (see below)\n        - 'prediction_text': the text of the answer\n    references: List of question-answers dictionaries with the following key-values:\n        - 'id': id of the question-answer pair (see above),\n        - 'answers': a Dict in the SQuAD dataset format\n            {\n                'text': list of possible texts for the answer, as a list of strings\n                'answer_start': list of start positions for the answer, as a list of ints\n            }\n            Note that answer_start values are not taken into account to compute the metric.\nReturns:\n    'exact_match': Exact match (the normalized answer exactly match the gold answer)\n    'f1': The F-score of predicted tokens versus the gold answer\nExamples:\n\n    >>> predictions = [{'prediction_text': '1976', 'id': '56e10a3be3433e1400422b22'}]\n    >>> references = [{'answers': {'answer_start': [97], 'text': ['1976']}, 'id': '56e10a3be3433e1400422b22'}]\n    >>> squad_metric = datasets.load_metric(\"squad\")\n    >>> results = squad_metric.compute(predictions=predictions, references=references)\n    >>> print(results)\n    {'exact_match': 100.0, 'f1': 100.0}\n"




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






		def 				UpperCAmelCase (    self			):
								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 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								_UpperCAmelCase      =			{prediction["""id"""]: prediction["""prediction_text"""] for prediction in predictions}
								_UpperCAmelCase      =			[
								    {
								        """paragraphs""": [
								            {
								                """qas""": [
								                    {
								                        """answers""": [{"""text""": answer_text} for answer_text in ref["""answers"""]["""text"""]],
								                        """id""": ref["""id"""],
								                    }
								                    for ref in references
								                ]
								            }
								        ]
								    }
								]
								_UpperCAmelCase      =			evaluate(dataset=_SCREAMING_SNAKE_CASE						,		predictions=_SCREAMING_SNAKE_CASE			)
								return score





import io
import json

import fsspec
import pytest

from datasets import Dataset, DatasetDict, Features, NamedSplit, Value
from datasets.io.json import JsonDatasetReader, JsonDatasetWriter

from ..utils import assert_arrow_memory_doesnt_increase, assert_arrow_memory_increases




def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case       )						->				int:
						assert isinstance(snake_case			,     snake_case       )
						assert dataset.num_rows == 4
						assert dataset.num_columns == 3
						assert dataset.column_names == ["col_1", "col_2", "col_3"]
						for feature, expected_dtype in expected_features.items():
												assert dataset.features[feature].dtype == expected_dtype




@pytest.mark.parametrize("""keep_in_memory"""			,     [False, True]       )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				Optional[int]:
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						with assert_arrow_memory_increases() if keep_in_memory else assert_arrow_memory_doesnt_increase():
												_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     cache_dir=snake_case			,     keep_in_memory=snake_case       ).read()
						_check_json_dataset(snake_case			,     snake_case       )




@pytest.mark.parametrize(
    """features"""			,     [
        None,
        {"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""},
        {"""col_1""": """string""", """col_2""": """string""", """col_3""": """string"""},
        {"""col_1""": """int32""", """col_2""": """int32""", """col_3""": """int32"""},
        {"""col_1""": """float32""", """col_2""": """float32""", """col_3""": """float32"""},
    ]			,     )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				Optional[Any]:
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						_UpperCAmelCase      =			features.copy() if features else default_expected_features
						_UpperCAmelCase      =			(
						    Features({feature: Value(snake_case       ) for feature, dtype in features.items()}       ) if features is not None else None
						)
						_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     features=snake_case			,     cache_dir=snake_case       ).read()
						_check_json_dataset(snake_case			,     snake_case       )




@pytest.mark.parametrize(
    """features"""			,     [
        None,
        {"""col_3""": """float64""", """col_1""": """string""", """col_2""": """int64"""},
    ]			,     )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				int:
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_3""": """float64""", """col_1""": """string""", """col_2""": """int64"""}
						_UpperCAmelCase      =			features.copy() if features else default_expected_features
						_UpperCAmelCase      =			(
						    Features({feature: Value(snake_case       ) for feature, dtype in features.items()}       ) if features is not None else None
						)
						_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     features=snake_case			,     cache_dir=snake_case       ).read()
						assert isinstance(snake_case			,     snake_case       )
						assert dataset.num_rows == 2
						assert dataset.num_columns == 3
						assert dataset.column_names == ["col_3", "col_1", "col_2"]
						for feature, expected_dtype in expected_features.items():
												assert dataset.features[feature].dtype == expected_dtype




def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case       )						->				Optional[int]:
						# jsonl_312_path features are {"col_3": "float64", "col_1": "string", "col_2": "int64"}
						_UpperCAmelCase      =			{"""col_2""": """int64""", """col_3""": """float64""", """col_1""": """string"""}
						_UpperCAmelCase      =			features.copy()
						_UpperCAmelCase      =			(
						    Features({feature: Value(snake_case       ) for feature, dtype in features.items()}       ) if features is not None else None
						)
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     features=snake_case			,     cache_dir=snake_case       ).read()
						assert isinstance(snake_case			,     snake_case       )
						assert dataset.num_rows == 2
						assert dataset.num_columns == 3
						assert dataset.column_names == ["col_2", "col_3", "col_1"]
						for feature, expected_dtype in expected_features.items():
												assert dataset.features[feature].dtype == expected_dtype




@pytest.mark.parametrize("""split"""			,     [None, NamedSplit("""train"""       ), """train""", """test"""]       )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				List[Any]:
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     cache_dir=snake_case			,     split=snake_case       ).read()
						_check_json_dataset(snake_case			,     snake_case       )
						assert dataset.split == split if split else "train"




@pytest.mark.parametrize("""path_type"""			,     [str, list]       )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				Any:
						if issubclass(snake_case			,     snake_case       ):
												_UpperCAmelCase      =			jsonl_path
						elif issubclass(snake_case			,     snake_case       ):
												_UpperCAmelCase      =			[jsonl_path]
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     cache_dir=snake_case       ).read()
						_check_json_dataset(snake_case			,     snake_case       )




def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case=("train",)       )						->				str:
						assert isinstance(snake_case			,     snake_case       )
						for split in splits:
												_UpperCAmelCase      =			dataset_dict[split]
												assert dataset.num_rows == 4
												assert dataset.num_columns == 3
												assert dataset.column_names == ["col_1", "col_2", "col_3"]
												for feature, expected_dtype in expected_features.items():
																		assert dataset.features[feature].dtype == expected_dtype




@pytest.mark.parametrize("""keep_in_memory"""			,     [False, True]       )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				str:
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						with assert_arrow_memory_increases() if keep_in_memory else assert_arrow_memory_doesnt_increase():
												_UpperCAmelCase      =			JsonDatasetReader({"""train""": jsonl_path}			,     cache_dir=snake_case			,     keep_in_memory=snake_case       ).read()
						_check_json_datasetdict(snake_case			,     snake_case       )




@pytest.mark.parametrize(
    """features"""			,     [
        None,
        {"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""},
        {"""col_1""": """string""", """col_2""": """string""", """col_3""": """string"""},
        {"""col_1""": """int32""", """col_2""": """int32""", """col_3""": """int32"""},
        {"""col_1""": """float32""", """col_2""": """float32""", """col_3""": """float32"""},
    ]			,     )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				Tuple:
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						_UpperCAmelCase      =			features.copy() if features else default_expected_features
						_UpperCAmelCase      =			(
						    Features({feature: Value(snake_case       ) for feature, dtype in features.items()}       ) if features is not None else None
						)
						_UpperCAmelCase      =			JsonDatasetReader({"""train""": jsonl_path}			,     features=snake_case			,     cache_dir=snake_case       ).read()
						_check_json_datasetdict(snake_case			,     snake_case       )




@pytest.mark.parametrize("""split"""			,     [None, NamedSplit("""train"""       ), """train""", """test"""]       )
def        _SCREAMING_SNAKE_CASE      (		snake_case			,     snake_case			,     snake_case       )						->				Optional[Any]:
						if split:
												_UpperCAmelCase      =			{split: jsonl_path}
						else:
												_UpperCAmelCase      =			"""train"""
												_UpperCAmelCase      =			{"""train""": jsonl_path, """test""": jsonl_path}
						_UpperCAmelCase      =			tmp_path / """cache"""
						_UpperCAmelCase      =			{"""col_1""": """string""", """col_2""": """int64""", """col_3""": """float64"""}
						_UpperCAmelCase      =			JsonDatasetReader(snake_case			,     cache_dir=snake_case       ).read()
						_check_json_datasetdict(snake_case			,     snake_case			,     splits=list(path.keys()       )       )
						assert all(dataset[split].split == split for split in path.keys()       )




def        _SCREAMING_SNAKE_CASE      (		snake_case       )						->				List[Any]:
						return json.load(snake_case       )




def        _SCREAMING_SNAKE_CASE      (		snake_case       )						->				List[Any]:
						return [json.loads(snake_case       ) for line in buffer]




class       _A				:






		@pytest.mark.parametrize("""lines, load_json_function"""						,		[(True, load_json_lines), (False, load_json)]			)
		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								with io.BytesIO() as buffer:
														JsonDatasetWriter(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		lines=_SCREAMING_SNAKE_CASE			).write()
														buffer.seek(0			)
														_UpperCAmelCase      =			load_json_function(_SCREAMING_SNAKE_CASE			)
								assert isinstance(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			)
								assert isinstance(exported_content[0]						,		_SCREAMING_SNAKE_CASE			)
								assert len(_SCREAMING_SNAKE_CASE			) == 10






		@pytest.mark.parametrize(
		    """orient, container, keys, len_at"""						,		[
		        ("""records""", list, {"""tokens""", """labels""", """answers""", """id"""}, None),
		        ("""split""", dict, {"""columns""", """data"""}, """data"""),
		        ("""index""", dict, set("""0123456789"""			), None),
		        ("""columns""", dict, {"""tokens""", """labels""", """answers""", """id"""}, """tokens"""),
		        ("""values""", list, None, None),
		        ("""table""", dict, {"""schema""", """data"""}, """data"""),
		    ]						,		)
		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								with io.BytesIO() as buffer:
														JsonDatasetWriter(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		lines=_SCREAMING_SNAKE_CASE						,		orient=_SCREAMING_SNAKE_CASE			).write()
														buffer.seek(0			)
														_UpperCAmelCase      =			load_json(_SCREAMING_SNAKE_CASE			)
								assert isinstance(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			)
								if keys:
														if container is dict:
																				assert exported_content.keys() == keys
														else:
																				assert exported_content[0].keys() == keys
								else:
														assert not hasattr(_SCREAMING_SNAKE_CASE						,		"""keys"""			) and not hasattr(exported_content[0]						,		"""keys"""			)
								if len_at:
														assert len(exported_content[len_at]			) == 10
								else:
														assert len(_SCREAMING_SNAKE_CASE			) == 10






		@pytest.mark.parametrize("""lines, load_json_function"""						,		[(True, load_json_lines), (False, load_json)]			)
		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								with io.BytesIO() as buffer:
														JsonDatasetWriter(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		lines=_SCREAMING_SNAKE_CASE						,		num_proc=2			).write()
														buffer.seek(0			)
														_UpperCAmelCase      =			load_json_function(_SCREAMING_SNAKE_CASE			)
								assert isinstance(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			)
								assert isinstance(exported_content[0]						,		_SCREAMING_SNAKE_CASE			)
								assert len(_SCREAMING_SNAKE_CASE			) == 10






		@pytest.mark.parametrize(
		    """orient, container, keys, len_at"""						,		[
		        ("""records""", list, {"""tokens""", """labels""", """answers""", """id"""}, None),
		        ("""split""", dict, {"""columns""", """data"""}, """data"""),
		        ("""index""", dict, set("""0123456789"""			), None),
		        ("""columns""", dict, {"""tokens""", """labels""", """answers""", """id"""}, """tokens"""),
		        ("""values""", list, None, None),
		        ("""table""", dict, {"""schema""", """data"""}, """data"""),
		    ]						,		)
		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								with io.BytesIO() as buffer:
														JsonDatasetWriter(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		lines=_SCREAMING_SNAKE_CASE						,		orient=_SCREAMING_SNAKE_CASE						,		num_proc=2			).write()
														buffer.seek(0			)
														_UpperCAmelCase      =			load_json(_SCREAMING_SNAKE_CASE			)
								assert isinstance(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			)
								if keys:
														if container is dict:
																				assert exported_content.keys() == keys
														else:
																				assert exported_content[0].keys() == keys
								else:
														assert not hasattr(_SCREAMING_SNAKE_CASE						,		"""keys"""			) and not hasattr(exported_content[0]						,		"""keys"""			)
								if len_at:
														assert len(exported_content[len_at]			) == 10
								else:
														assert len(_SCREAMING_SNAKE_CASE			) == 10






		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE			):
								with pytest.raises(_SCREAMING_SNAKE_CASE			):
														with io.BytesIO() as buffer:
																				JsonDatasetWriter(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		num_proc=0			)






		@pytest.mark.parametrize("""compression, extension"""						,		[("""gzip""", """gz"""), ("""bz2""", """bz2"""), ("""xz""", """xz""")]			)
		def 				UpperCAmelCase (    self						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE			):
								_UpperCAmelCase      =			tmp_path_factory.mktemp("""data"""			) / F"test.json.{extension}"
								_UpperCAmelCase      =			str(shared_datadir / F"test_file.json.{extension}"			)
								JsonDatasetWriter(_SCREAMING_SNAKE_CASE						,		_SCREAMING_SNAKE_CASE						,		compression=_SCREAMING_SNAKE_CASE			).write()

								with fsspec.open(_SCREAMING_SNAKE_CASE						,		"""rb"""						,		compression="""infer"""			) as f:
														_UpperCAmelCase      =			f.read()
								with fsspec.open(_SCREAMING_SNAKE_CASE						,		"""rb"""						,		compression="""infer"""			) as f:
														_UpperCAmelCase      =			f.read()
								assert exported_content == original_content