





'''simple docstring'''




import inspect
import re
from hashlib import shaaaa
from typing import Dict, List

from .arrow import arrow
from .audiofolder import audiofolder
from .csv import csv
from .imagefolder import imagefolder
from .json import json
from .pandas import pandas
from .parquet import parquet
from .sql import sql  # noqa F401
from .text import text







def _lowerCAmelCase     (      _lowerCAmelCase    )->     str:
 __UpperCAmelCase					=   []
 for line in lines:
  __UpperCAmelCase					=   re.sub(r'#.*'       ,    ''       ,    _lowerCAmelCase    )  # remove comments
  if line:
   filtered_lines.append(_lowerCAmelCase    )
 __UpperCAmelCase					=   '\n'.join(_lowerCAmelCase    )

 # Make a hash from all this code
 __UpperCAmelCase					=   full_str.encode('utf-8'    )
 return shaaaa(_lowerCAmelCase    ).hexdigest()


# get importable module names and hash for caching
_A:					Optional[Any]							=				{
    """csv""": (csv.__name__, _hash_python_lines(inspect.getsource(csv).splitlines())),
    """json""": (json.__name__, _hash_python_lines(inspect.getsource(json).splitlines())),
    """pandas""": (pandas.__name__, _hash_python_lines(inspect.getsource(pandas).splitlines())),
    """parquet""": (parquet.__name__, _hash_python_lines(inspect.getsource(parquet).splitlines())),
    """arrow""": (arrow.__name__, _hash_python_lines(inspect.getsource(arrow).splitlines())),
    """text""": (text.__name__, _hash_python_lines(inspect.getsource(text).splitlines())),
    """imagefolder""": (imagefolder.__name__, _hash_python_lines(inspect.getsource(imagefolder).splitlines())),
    """audiofolder""": (audiofolder.__name__, _hash_python_lines(inspect.getsource(audiofolder).splitlines())),
}

# Used to infer the module to use based on the data files extensions
_A:					Optional[int]							=				{
    """.csv""": ("""csv""", {}),
    """.tsv""": ("""csv""", {"""sep""": """\t"""}),
    """.json""": ("""json""", {}),
    """.jsonl""": ("""json""", {}),
    """.parquet""": ("""parquet""", {}),
    """.arrow""": ("""arrow""", {}),
    """.txt""": ("""text""", {}),
}
_EXTENSION_TO_MODULE.update({ext: ("""imagefolder""", {}) for ext in imagefolder.ImageFolder.EXTENSIONS})
_EXTENSION_TO_MODULE.update({ext.upper(): ("""imagefolder""", {}) for ext in imagefolder.ImageFolder.EXTENSIONS})
_EXTENSION_TO_MODULE.update({ext: ("""audiofolder""", {}) for ext in audiofolder.AudioFolder.EXTENSIONS})
_EXTENSION_TO_MODULE.update({ext.upper(): ("""audiofolder""", {}) for ext in audiofolder.AudioFolder.EXTENSIONS})
_A:					Any							=				{"""imagefolder""", """audiofolder"""}

# Used to filter data files based on extensions given a module name
_A:					Dict[str, List[str]]							=				{}
for _ext, (_module, _) in _EXTENSION_TO_MODULE.items():
    _MODULE_TO_EXTENSIONS.setdefault(_module, []).append(_ext)

_MODULE_TO_EXTENSIONS["imagefolder"].append(""".zip""")

_MODULE_TO_EXTENSIONS["audiofolder"].append(""".zip""")












'''simple docstring'''




from sklearn.metrics import fa_score, matthews_corrcoef

import datasets

from .record_evaluation import evaluate as evaluate_record


_A:					Tuple							=				"""\
@article{wang2019superglue,
  title={SuperGLUE: A Stickier Benchmark for General-Purpose Language Understanding Systems},
  author={Wang, Alex and Pruksachatkun, Yada and Nangia, Nikita and Singh, Amanpreet and Michael, Julian and Hill, Felix and Levy, Omer and Bowman, Samuel R},
  journal={arXiv preprint arXiv:1905.00537},
  year={2019}
}
"""

_A:					List[Any]							=				"""\
SuperGLUE (https://super.gluebenchmark.com/) is a new benchmark styled after
GLUE with a new set of more difficult language understanding tasks, improved
resources, and a new public leaderboard.
"""

_A:					List[Any]							=				"""
Compute SuperGLUE evaluation metric associated to each SuperGLUE dataset.
Args:
    predictions: list of predictions to score. Depending on the SuperGlUE subset:
        - for 'record': list of question-answer dictionaries with the following keys:
            - 'idx': index of the question as specified by the dataset
            - 'prediction_text': the predicted answer text
        - for 'multirc': list of question-answer dictionaries with the following keys:
            - 'idx': index of the question-answer pair as specified by the dataset
            - 'prediction': the predicted answer label
        - otherwise: list of predicted labels
    references: list of reference labels. Depending on the SuperGLUE subset:
        - for 'record': list of question-answers dictionaries with the following keys:
            - 'idx': index of the question as specified by the dataset
            - 'answers': list of possible answers
        - otherwise: list of reference labels
Returns: depending on the SuperGLUE subset:
    - for 'record':
        - 'exact_match': Exact match between answer and gold answer
        - 'f1': F1 score
    - for 'multirc':
        - 'exact_match': Exact match between answer and gold answer
        - 'f1_m': Per-question macro-F1 score
        - 'f1_a': Average F1 score over all answers
    - for 'axb':
        'matthews_correlation': Matthew Correlation
    - for 'cb':
        - 'accuracy': Accuracy
        - 'f1': F1 score
    - for all others:
        - 'accuracy': Accuracy
Examples:

    >>> super_glue_metric = datasets.load_metric('super_glue', 'copa')  # any of [\"copa\", \"rte\", \"wic\", \"wsc\", \"wsc.fixed\", \"boolq\", \"axg\"]
    >>> predictions = [0, 1]
    >>> references = [0, 1]
    >>> results = super_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'accuracy': 1.0}

    >>> super_glue_metric = datasets.load_metric('super_glue', 'cb')
    >>> predictions = [0, 1]
    >>> references = [0, 1]
    >>> results = super_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'accuracy': 1.0, 'f1': 1.0}

    >>> super_glue_metric = datasets.load_metric('super_glue', 'record')
    >>> predictions = [{'idx': {'passage': 0, 'query': 0}, 'prediction_text': 'answer'}]
    >>> references = [{'idx': {'passage': 0, 'query': 0}, 'answers': ['answer', 'another_answer']}]
    >>> results = super_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'exact_match': 1.0, 'f1': 1.0}

    >>> super_glue_metric = datasets.load_metric('super_glue', 'multirc')
    >>> predictions = [{'idx': {'answer': 0, 'paragraph': 0, 'question': 0}, 'prediction': 0}, {'idx': {'answer': 1, 'paragraph': 2, 'question': 3}, 'prediction': 1}]
    >>> references = [0, 1]
    >>> results = super_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'exact_match': 1.0, 'f1_m': 1.0, 'f1_a': 1.0}

    >>> super_glue_metric = datasets.load_metric('super_glue', 'axb')
    >>> references = [0, 1]
    >>> predictions = [0, 1]
    >>> results = super_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'matthews_correlation': 1.0}
"""







def _lowerCAmelCase     (      _lowerCAmelCase       ,    _lowerCAmelCase    )->     str:
 return float((preds == labels).mean()    )







def _lowerCAmelCase     (      _lowerCAmelCase       ,    _lowerCAmelCase       ,    _lowerCAmelCase="binary"    )->     Tuple:
 __UpperCAmelCase					=   simple_accuracy(_lowerCAmelCase       ,    _lowerCAmelCase    )
 __UpperCAmelCase					=   float(fa_score(y_true=_lowerCAmelCase       ,    y_pred=_lowerCAmelCase       ,    average=_lowerCAmelCase    )    )
 return {
     "accuracy": acc,
     "f1": fa,
 }







def _lowerCAmelCase     (      _lowerCAmelCase       ,    _lowerCAmelCase    )->     str:
 __UpperCAmelCase					=   {}
 for id_pred, label in zip(_lowerCAmelCase       ,    _lowerCAmelCase    ):
  __UpperCAmelCase					=   F'{id_pred["idx"]["paragraph"]}-{id_pred["idx"]["question"]}'
  __UpperCAmelCase					=   id_pred['prediction']
  if question_id in question_map:
   question_map[question_id].append((pred, label)    )
  else:
   __UpperCAmelCase					=   [(pred, label)]
 __UpperCAmelCase					,    __UpperCAmelCase					=   [], []
 for question, preds_labels in question_map.items():
  __UpperCAmelCase					,    __UpperCAmelCase					=   zip(*_lowerCAmelCase    )
  __UpperCAmelCase					=   fa_score(y_true=_lowerCAmelCase       ,    y_pred=_lowerCAmelCase       ,    average='macro'    )
  fas.append(_lowerCAmelCase    )
  __UpperCAmelCase					=   int(sum(pred == label for pred, label in preds_labels    ) == len(_lowerCAmelCase    )    )
  ems.append(_lowerCAmelCase    )
 __UpperCAmelCase					=   float(sum(_lowerCAmelCase    ) / len(_lowerCAmelCase    )    )
 __UpperCAmelCase					=   sum(_lowerCAmelCase    ) / len(_lowerCAmelCase    )
 __UpperCAmelCase					=   float(fa_score(y_true=_lowerCAmelCase       ,    y_pred=[id_pred['prediction'] for id_pred in ids_preds]    )    )
 return {"exact_match": em, "f1_m": fa_m, "f1_a": fa_a}






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



    def 					__lowerCamelCase						(  self					):
     if self.config_name not in [
         "boolq",
         "cb",
         "copa",
         "multirc",
         "record",
         "rte",
         "wic",
         "wsc",
         "wsc.fixed",
         "axb",
         "axg",
     ]:
      raise KeyError(
          'You should supply a configuration name selected in '
          '["boolq", "cb", "copa", "multirc", "record", "rte", "wic", "wsc", "wsc.fixed", "axb", "axg",]'					)
     return datasets.MetricInfo(
         description=_DESCRIPTION     ,			citation=_CITATION     ,			inputs_description=_KWARGS_DESCRIPTION     ,			features=datasets.Features(self._get_feature_types()					)     ,			codebase_urls=[]     ,			reference_urls=[]     ,			format='numpy' if not self.config_name == 'record' and not self.config_name == 'multirc' else None     ,			)



    def 					__lowerCamelCase						(  self					):
     if self.config_name == "record":
      return {
          "predictions": {
              "idx": {
                  "passage": datasets.Value('int64'					),
                  "query": datasets.Value('int64'					),
              },
              "prediction_text": datasets.Value('string'					),
          },
          "references": {
              "idx": {
                  "passage": datasets.Value('int64'					),
                  "query": datasets.Value('int64'					),
              },
              "answers": datasets.Sequence(datasets.Value('string'					)					),
          },
      }
     elif self.config_name == "multirc":
      return {
          "predictions": {
              "idx": {
                  "answer": datasets.Value('int64'					),
                  "paragraph": datasets.Value('int64'					),
                  "question": datasets.Value('int64'					),
              },
              "prediction": datasets.Value('int64'					),
          },
          "references": datasets.Value('int64'					),
      }
     else:
      return {
          "predictions": datasets.Value('int64'					),
          "references": datasets.Value('int64'					),
      }




    def 					__lowerCamelCase						(  self     ,			__A     ,			__A					):
     if self.config_name == "axb":
      return {"matthews_correlation": matthews_corrcoef(__A     ,			__A					)}
     elif self.config_name == "cb":
      return acc_and_fa(__A     ,			__A     ,			fa_avg='macro'					)
     elif self.config_name == "record":
      __UpperCAmelCase					=   [
          {
              'qas': [
                  {'id': ref['idx']['query'], 'answers': [{'text': ans} for ans in ref['answers']]}
                  for ref in references
              ]
          }
      ]
      __UpperCAmelCase					=   {pred['idx']['query']: pred['prediction_text'] for pred in predictions}
      return evaluate_record(__A     ,			__A					)[0]
     elif self.config_name == "multirc":
      return evaluate_multirc(__A     ,			__A					)
     elif self.config_name in ["copa", "rte", "wic", "wsc", "wsc.fixed", "boolq", "axg"]:
      return {"accuracy": simple_accuracy(__A     ,			__A					)}
     else:
      raise KeyError(
          'You should supply a configuration name selected in '
          '["boolq", "cb", "copa", "multirc", "record", "rte", "wic", "wsc", "wsc.fixed", "axb", "axg",]'					)





