import re
import string

import numpy as np

import datasets


A_      =      "\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"

A_      =      "\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"

A_      =      "\n"






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

						def        __a		(	self				:      Optional[int]   )							->		Union[str, Any]:


									'''simple docstring'''

									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        __a		(	self				:      List[Any]							,							__lowerCamelCase				:      Any							,							__lowerCamelCase				:      Any							,							__lowerCamelCase				:      Optional[int]=None							,							__lowerCamelCase				:      Optional[Any]=False							,							__lowerCamelCase				:      int=False							,							__lowerCamelCase				:      Union[str, Any]=False							,							)							->		Any:


									'''simple docstring'''

									if regexes_to_ignore is not None:
												for s in regexes_to_ignore:
															lowercase							=		np.array([re.sub(_lowercase							,							''''''							,							_lowercase   ) for x in predictions]   )
															lowercase							=		np.array([re.sub(_lowercase							,							''''''							,							_lowercase   ) for x in references]   )
									else:
												lowercase							=		np.asarray(_lowercase   )
												lowercase							=		np.asarray(_lowercase   )

									if ignore_case:
												lowercase							=		np.char.lower(_lowercase   )
												lowercase							=		np.char.lower(_lowercase   )

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

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

									lowercase							=		predictions == references

									return {"exact_match": np.mean(_lowercase   ) * 1_00}






from __future__ import annotations

from collections.abc import MutableSequence






class      __lowercase					:

						def __init__(	self				:      Optional[Any]							,							__lowerCamelCase				:      int							,							__lowerCamelCase				:      MutableSequence[float]   )							->		None:


									'''simple docstring'''

									if len(__lowerCamelCase   ) != degree + 1:
												raise ValueError(
												    '''The number of coefficients should be equal to the degree + 1.'''   )

									lowercase							=		list(__lowerCamelCase   )
									lowercase							=		degree

						def __add__(	self				:      Any							,							__lowerCamelCase				:      Polynomial   )							->		Polynomial:


									'''simple docstring'''

									if self.degree > polynomial_a.degree:
												lowercase							=		self.coefficients[:]
												for i in range(polynomial_a.degree + 1   ):
															coefficients[i] += polynomial_a.coefficients[i]
												return Polynomial(self.degree							,							__lowerCamelCase   )
									else:
												lowercase							=		polynomial_a.coefficients[:]
												for i in range(self.degree + 1   ):
															coefficients[i] += self.coefficients[i]
												return Polynomial(polynomial_a.degree							,							__lowerCamelCase   )

						def __sub__(	self				:      str							,							__lowerCamelCase				:      Polynomial   )							->		Polynomial:


									'''simple docstring'''

									return self + polynomial_a * Polynomial(0							,							[-1]   )

						def __neg__(	self				:      str   )							->		Polynomial:


									'''simple docstring'''

									return Polynomial(self.degree							,							[-c for c in self.coefficients]   )

						def __mul__(	self				:      List[str]							,							__lowerCamelCase				:      Polynomial   )							->		Polynomial:


									'''simple docstring'''

									lowercase							=		[0] * (self.degree + polynomial_a.degree + 1)
									for i in range(self.degree + 1   ):
												for j in range(polynomial_a.degree + 1   ):
															coefficients[i + j] += (
															    self.coefficients[i] * polynomial_a.coefficients[j]
															)

									return Polynomial(self.degree + polynomial_a.degree							,							__lowerCamelCase   )

						def        __a		(	self				:      List[str]							,							__lowerCamelCase				:      int | float   )							->		int | float:


									'''simple docstring'''

									lowercase							=		0
									for i in range(self.degree + 1   ):
												result += self.coefficients[i] * (substitution**i)
									return result

						def __str__(	self				:      str   )							->		str:


									'''simple docstring'''

									lowercase							=		''''''
									for i in range(self.degree							,							-1							,							-1   ):
												if self.coefficients[i] == 0:
															continue
												elif self.coefficients[i] > 0:
															if polynomial:
																		polynomial += " + "
												else:
															polynomial += " - "

												if i == 0:
															polynomial += str(abs(self.coefficients[i]   )   )
												elif i == 1:
															polynomial += str(abs(self.coefficients[i]   )   ) + "x"
												else:
															polynomial += str(abs(self.coefficients[i]   )   ) + "x^" + str(__lowerCamelCase   )

									return polynomial

						def __repr__(	self				:      Tuple   )							->		str:


									'''simple docstring'''

									return self.__str__()

						def        __a		(	self				:      Union[str, Any]   )							->		Polynomial:


									'''simple docstring'''

									lowercase							=		[0] * self.degree
									for i in range(self.degree   ):
												lowercase							=		self.coefficients[i + 1] * (i + 1)
									return Polynomial(self.degree - 1							,							__lowerCamelCase   )

						def        __a		(	self				:      Union[str, Any]							,							__lowerCamelCase				:      int | float = 0   )							->		Polynomial:


									'''simple docstring'''

									lowercase							=		[0] * (self.degree + 2)
									lowercase							=		constant
									for i in range(self.degree + 1   ):
												lowercase							=		self.coefficients[i] / (i + 1)
									return Polynomial(self.degree + 1							,							__lowerCamelCase   )

						def __eq__(	self				:      Tuple							,							__lowerCamelCase				:      object   )							->		bool:


									'''simple docstring'''

									if not isinstance(__lowerCamelCase							,							__lowerCamelCase   ):
												return False

									if self.degree != polynomial_a.degree:
												return False

									for i in range(self.degree + 1   ):
												if self.coefficients[i] != polynomial_a.coefficients[i]:
															return False

									return True



						def __ne__(	self				:      Tuple							,							__lowerCamelCase				:      object   )							->		bool:


									'''simple docstring'''

									return not self.__eq__(__lowerCamelCase   )





