


import re
import string

import numpy as np

import datasets


A				:       int      =  '\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				:       Optional[Any]      =  '\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				:       int      =  '\n'






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


					def 				SCREAMING_SNAKE_CASE_	(    self						:		Tuple    )      ->						Tuple:




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




											'''simple docstring'''

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

											if ignore_case:
																	__snake_case				=		np.char.lower(SCREAMING_SNAKE_CASE    )
																	__snake_case				=		np.char.lower(SCREAMING_SNAKE_CASE    )

											if ignore_punctuation:
																	__snake_case				=		string.punctuation.maketrans(""  ,     ""  ,     string.punctuation    )
																	__snake_case				=		np.char.translate(SCREAMING_SNAKE_CASE  ,     table=SCREAMING_SNAKE_CASE    )
																	__snake_case				=		np.char.translate(SCREAMING_SNAKE_CASE  ,     table=SCREAMING_SNAKE_CASE    )

											if ignore_numbers:
																	__snake_case				=		string.digits.maketrans(""  ,     ""  ,     string.digits    )
																	__snake_case				=		np.char.translate(SCREAMING_SNAKE_CASE  ,     table=SCREAMING_SNAKE_CASE    )
																	__snake_case				=		np.char.translate(SCREAMING_SNAKE_CASE  ,     table=SCREAMING_SNAKE_CASE    )

											__snake_case				=		predictions == references

											return {"exact_match": np.mean(SCREAMING_SNAKE_CASE    ) * 1_0_0}









from __future__ import annotations






class      UpperCamelCase:


					def __init__(    self						:		Optional[int]  ,     SCREAMING_SNAKE_CASE						:		str  ,     SCREAMING_SNAKE_CASE						:		str    )      ->						str:




											'''simple docstring'''

											__snake_case		,       __snake_case				=		text, pattern
											__snake_case		,       __snake_case				=		len(SCREAMING_SNAKE_CASE    ), len(SCREAMING_SNAKE_CASE    )


					def 				SCREAMING_SNAKE_CASE_	(    self						:		Optional[Any]  ,     SCREAMING_SNAKE_CASE						:		str    )      ->						int:




											'''simple docstring'''

											for i in range(self.patLen - 1  ,     -1  ,     -1    ):
																	if char == self.pattern[i]:
																							return i
											return -1


					def 				SCREAMING_SNAKE_CASE_	(    self						:		int  ,     SCREAMING_SNAKE_CASE						:		int    )      ->						int:




											'''simple docstring'''

											for i in range(self.patLen - 1  ,     -1  ,     -1    ):
																	if self.pattern[i] != self.text[current_pos + i]:
																							return current_pos + i
											return -1






					def 				SCREAMING_SNAKE_CASE_	(    self						:		List[Any]    )      ->						list[int]:




											'''simple docstring'''

											__snake_case				=		[]
											for i in range(self.textLen - self.patLen + 1    ):
																	__snake_case				=		self.mismatch_in_text(SCREAMING_SNAKE_CASE    )
																	if mismatch_index == -1:
																							positions.append(SCREAMING_SNAKE_CASE    )
																	else:
																							__snake_case				=		self.match_in_pattern(self.text[mismatch_index]    )
																							__snake_case				=		(
																							    mismatch_index - match_index
																							)  # shifting index lgtm [py/multiple-definition]
											return positions




A				:       str      =  'ABAABA'
A				:       Optional[Any]      =  'AB'
A				:       Any      =  BoyerMooreSearch(text, pattern)
A				:       Tuple      =  bms.bad_character_heuristic()

if len(positions) == 0:
	print('No match found')
else:
	print('Pattern found in following positions: ')
	print(positions)





