


'''simple docstring'''



import builtins
import sys

from ...utils.imports import _is_package_available
from . import cursor, input
from .helpers import Direction, clear_line, forceWrite, linebreak, move_cursor, reset_cursor, writeColor
from .keymap import KEYMAP


__lowercase	:						Dict       =	False
try:
	__lowercase	:						Union[str, Any]       =	_is_package_available('google.colab')
except ModuleNotFoundError:
	pass





@input.register
class 							__UpperCamelCase				:




	def __init__(   self						,				__a = None						,				__a = []							):

						'''simple docstring'''





						__a			:       Optional[int]					    =  0
						__a			:       Optional[int]					    =  choices
						__a			:       List[Any]					    =  prompt
						if sys.platform == "win32":
											__a			:       List[Any]					    =  '*'
						else:
											__a			:       Union[str, Any]					    =  '➔ '




	def       __UpperCAmelCase							(   self						,				__a						,				__a = ""							):

						'''simple docstring'''





						if sys.platform != "win32":
											writeColor(self.choices[index]						,				32						,				__a							)
						else:
											forceWrite(self.choices[index]						,				__a							)




	def       __UpperCAmelCase							(   self						,				__a							):

						'''simple docstring'''





						if index == self.position:
											forceWrite(f""" {self.arrow_char} """							)
											self.write_choice(__a							)
						else:
											forceWrite(f"""    {self.choices[index]}"""							)
						reset_cursor()




	def       __UpperCAmelCase							(   self						,				__a						,				__a = 1							):

						'''simple docstring'''





						__a			:       List[Any]					    =  self.position
						if direction == Direction.DOWN:
											if self.position + 1 >= len(self.choices							):
																return
											self.position += num_spaces
						else:
											if self.position - 1 < 0:
																return
											self.position -= num_spaces
						clear_line()
						self.print_choice(__a							)
						move_cursor(__a						,				direction.name							)
						self.print_choice(self.position							)




	@input.mark(KEYMAP['up']							)
	def       __UpperCAmelCase							(   self							):

						'''simple docstring'''





						self.move_direction(Direction.UP							)




	@input.mark(KEYMAP['down']							)
	def       __UpperCAmelCase							(   self							):

						'''simple docstring'''





						self.move_direction(Direction.DOWN							)




	@input.mark(KEYMAP['newline']							)
	def       __UpperCAmelCase							(   self							):

						'''simple docstring'''





						move_cursor(len(self.choices							) - self.position						,				'DOWN'							)
						return self.position




	@input.mark(KEYMAP['interrupt']							)
	def       __UpperCAmelCase							(   self							):

						'''simple docstring'''





						move_cursor(len(self.choices							) - self.position						,				'DOWN'							)
						raise KeyboardInterrupt




	@input.mark_multiple(*[KEYMAP[str(__a							)] for number in range(10							)]							)
	def       __UpperCAmelCase							(   self							):

						'''simple docstring'''





						__a			:       List[Any]					    =  int(chr(self.current_selection							)							)
						__a			:       Any					    =  index - self.position
						if index == self.position:
											return
						if index < len(self.choices							):
											if self.position > index:
																self.move_direction(Direction.UP						,				-movement							)
											elif self.position < index:
																self.move_direction(Direction.DOWN						,				__a							)
											else:
																return
						else:
											return





	def       __UpperCAmelCase							(   self						,				__a = 0							):

						'''simple docstring'''





						if self.prompt:
											linebreak()
											forceWrite(self.prompt						,				'\n'							)
											if in_colab:
																forceWrite('Please input a choice index (starting from 0), and press enter'						,				'\n'							)
											else:
																forceWrite('Please select a choice using the arrow or number keys, and selecting with enter'						,				'\n'							)
						__a			:       str					    =  default_choice
						for i in range(len(self.choices							)							):
											self.print_choice(__a							)
											forceWrite('\n'							)
						move_cursor(len(self.choices							) - self.position						,				'UP'							)
						with cursor.hide():
											while True:
																if in_colab:
																					try:
																										__a			:       List[Any]					    =  int(builtins.input()							)
																					except ValueError:
																										__a			:       Any					    =  default_choice
																else:
																					__a			:       List[Any]					    =  self.handle_input()
																if choice is not None:
																					reset_cursor()
																					for _ in range(len(self.choices							) + 1							):
																										move_cursor(1						,				'UP'							)
																										clear_line()
																					self.write_choice(__a						,				'\n'							)
																					return choice







'''simple docstring'''



import re
import string

import numpy as np

import datasets


__lowercase	:						Tuple       =	'\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'

__lowercase	:						List[str]       =	'\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'

__lowercase	:						Any       =	'\n'





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




	def       __UpperCAmelCase							(   self							):

						'''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       __UpperCAmelCase							(   self						,				__a						,				__a						,				__a=None						,				__a=False						,				__a=False						,				__a=False						,				):

						'''simple docstring'''





						if regexes_to_ignore is not None:
											for s in regexes_to_ignore:
																__a			:       Tuple					    =  np.array([re.sub(__a						,				''						,				__a							) for x in predictions]							)
																__a			:       List[Any]					    =  np.array([re.sub(__a						,				''						,				__a							) for x in references]							)
						else:
											__a			:       int					    =  np.asarray(__a							)
											__a			:       str					    =  np.asarray(__a							)

						if ignore_case:
											__a			:       Dict					    =  np.char.lower(__a							)
											__a			:       List[str]					    =  np.char.lower(__a							)

						if ignore_punctuation:
											__a			:       Dict					    =  string.punctuation.maketrans(''						,				''						,				string.punctuation							)
											__a			:       Tuple					    =  np.char.translate(__a						,				table=__a							)
											__a			:       Dict					    =  np.char.translate(__a						,				table=__a							)

						if ignore_numbers:
											__a			:       Optional[int]					    =  string.digits.maketrans(''						,				''						,				string.digits							)
											__a			:       Tuple					    =  np.char.translate(__a						,				table=__a							)
											__a			:       Optional[int]					    =  np.char.translate(__a						,				table=__a							)

						__a			:       Any					    =  predictions == references

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



