





import re
import string

import numpy as np

import datasets


UpperCAmelCase_           =	"\nReturns the rate at which the input predicted strings exactly match their references, ignoring any strings input as part of the regexes_to_ignore list.\n"

UpperCAmelCase_           =	"\nArgs:\n    predictions: List of predicted texts.\n    references: List of reference texts.\n    regexes_to_ignore: List, defaults to None. Regex expressions of characters to\n        ignore when calculating the exact matches. Note: these regexes are removed\n        from the input data before the changes based on the options below (e.g. ignore_case,\n        ignore_punctuation, ignore_numbers) are applied.\n    ignore_case: Boolean, defaults to False. If true, turns everything\n        to lowercase so that capitalization differences are ignored.\n    ignore_punctuation: Boolean, defaults to False. If true, removes all punctuation before\n        comparing predictions and references.\n    ignore_numbers: Boolean, defaults to False. If true, removes all punctuation before\n        comparing predictions and references.\nReturns:\n    exact_match: Dictionary containing exact_match rate. Possible values are between 0.0 and 100.0, inclusive.\nExamples:\n    >>> exact_match = datasets.load_metric(\"exact_match\")\n    >>> refs = [\"the cat\", \"theater\", \"YELLING\", \"agent007\"]\n    >>> preds = [\"cat?\", \"theater\", \"yelling\", \"agent\"]\n    >>> results = exact_match.compute(references=refs, predictions=preds)\n    >>> print(round(results[\"exact_match\"], 1))\n    25.0\n\n    >>> exact_match = datasets.load_metric(\"exact_match\")\n    >>> refs = [\"the cat\", \"theater\", \"YELLING\", \"agent007\"]\n    >>> preds = [\"cat?\", \"theater\", \"yelling\", \"agent\"]\n    >>> results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=[\"the \", \"yell\"], ignore_case=True, ignore_punctuation=True)\n    >>> print(round(results[\"exact_match\"], 1))\n    50.0\n\n\n    >>> exact_match = datasets.load_metric(\"exact_match\")\n    >>> refs = [\"the cat\", \"theater\", \"YELLING\", \"agent007\"]\n    >>> preds = [\"cat?\", \"theater\", \"yelling\", \"agent\"]\n    >>> results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=[\"the \", \"yell\", \"YELL\"], ignore_case=True, ignore_punctuation=True)\n    >>> print(round(results[\"exact_match\"], 1))\n    75.0\n\n    >>> exact_match = datasets.load_metric(\"exact_match\")\n    >>> refs = [\"the cat\", \"theater\", \"YELLING\", \"agent007\"]\n    >>> preds = [\"cat?\", \"theater\", \"yelling\", \"agent\"]\n    >>> results = exact_match.compute(references=refs, predictions=preds, regexes_to_ignore=[\"the \", \"yell\", \"YELL\"], ignore_case=True, ignore_punctuation=True, ignore_numbers=True)\n    >>> print(round(results[\"exact_match\"], 1))\n    100.0\n\n    >>> exact_match = datasets.load_metric(\"exact_match\")\n    >>> refs = [\"The cat sat on the mat.\", \"Theaters are great.\", \"It's like comparing oranges and apples.\"]\n    >>> preds = [\"The cat sat on the mat?\", \"Theaters are great.\", \"It's like comparing apples and oranges.\"]\n    >>> results = exact_match.compute(references=refs, predictions=preds)\n    >>> print(round(results[\"exact_match\"], 1))\n    33.3\n\n"

UpperCAmelCase_           =	"\n"




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





     def 		UpperCamelCase(     self					):
        return datasets.MetricInfo(
            description=_DESCRIPTION				,							citation=_CITATION				,							inputs_description=_KWARGS_DESCRIPTION				,							features=datasets.Features(
                {
                    '''predictions''': datasets.Value('''string'''				,							id='''sequence'''					),
                    '''references''': datasets.Value('''string'''				,							id='''sequence'''					),
                }					)				,							reference_urls=[]				,							)





     def 		UpperCamelCase(     self				,							_UpperCamelCase				,							_UpperCamelCase				,							_UpperCamelCase=None				,							_UpperCamelCase=False				,							_UpperCamelCase=False				,							_UpperCamelCase=False				,							):
        if regexes_to_ignore is not None:
           for s in regexes_to_ignore:
              _UpperCAmelCase           =   np.array([re.sub(_UpperCamelCase				,							''''''				,							_UpperCamelCase					) for x in predictions]					)
              _UpperCAmelCase           =   np.array([re.sub(_UpperCamelCase				,							''''''				,							_UpperCamelCase					) for x in references]					)
        else:
           _UpperCAmelCase           =   np.asarray(_UpperCamelCase					)
           _UpperCAmelCase           =   np.asarray(_UpperCamelCase					)

        if ignore_case:
           _UpperCAmelCase           =   np.char.lower(_UpperCamelCase					)
           _UpperCAmelCase           =   np.char.lower(_UpperCamelCase					)

        if ignore_punctuation:
           _UpperCAmelCase           =   string.punctuation.maketrans(''''''				,							''''''				,							string.punctuation					)
           _UpperCAmelCase           =   np.char.translate(_UpperCamelCase				,							table=_UpperCamelCase					)
           _UpperCAmelCase           =   np.char.translate(_UpperCamelCase				,							table=_UpperCamelCase					)

        if ignore_numbers:
           _UpperCAmelCase           =   string.digits.maketrans(''''''				,							''''''				,							string.digits					)
           _UpperCAmelCase           =   np.char.translate(_UpperCamelCase				,							table=_UpperCamelCase					)
           _UpperCAmelCase           =   np.char.translate(_UpperCamelCase				,							table=_UpperCamelCase					)

        _UpperCAmelCase           =   predictions == references

        return {"exact_match": np.mean(_UpperCamelCase					) * 100}






from dataclasses import dataclass, field
from typing import ClassVar, Dict

from ..features import Features, Value
from .base import TaskTemplate




@dataclass(frozen=A__    )
class 			__UpperCamelCase    (							A__    ):
     __A	:  str							  =   field(default="""language-modeling"""	, metadata={"""include_in_asdict_even_if_is_default""": True}    )

     __A	:  ClassVar[Features]							  =   Features({"""text""": Value("""string"""    )}    )
     __A	:  ClassVar[Features]							  =   Features({}    )
     __A	:  str							  =   "text"





     @property
     def 		UpperCamelCase(     self					):
        return {self.text_column: "text"}