


'''simple docstring'''
from __future__ import annotations

from collections import deque
class      lowercase			:

		"""simple docstring"""

		def __init__(	self					,     UpperCamelCase_							):

							'''simple docstring'''


							UpperCamelCase__     :list[dict]							      =				[]
							self.adlist.append(
							    {'''value''': '''''', '''next_states''': [], '''fail_state''': 0, '''output''': []}							)

							for keyword in keywords:
												self.add_keyword(UpperCamelCase_							)
							self.set_fail_transitions()




		def 					lowerCAmelCase__       (	self					,     UpperCamelCase_					,     UpperCamelCase_							):

							'''simple docstring'''


							for state in self.adlist[current_state]["next_states"]:
												if char == self.adlist[state]["value"]:
																	return state
							return None




		def 					lowerCAmelCase__       (	self					,     UpperCamelCase_							):

							'''simple docstring'''


							UpperCamelCase__     :List[Any]							      =				0
							for character in keyword:
												UpperCamelCase__     :Dict							      =				self.find_next_state(UpperCamelCase_					,     UpperCamelCase_							)
												if next_state is None:
																	self.adlist.append(
																	    {
																	        '''value''': character,
																	        '''next_states''': [],
																	        '''fail_state''': 0,
																	        '''output''': [],
																	    }							)
																	self.adlist[current_state]["next_states"].append(len(self.adlist							) - 1							)
																	UpperCamelCase__     :str							      =				len(self.adlist							) - 1
												else:
																	UpperCamelCase__     :Dict							      =				next_state
							self.adlist[current_state]["output"].append(UpperCamelCase_							)




		def 					lowerCAmelCase__       (	self							):

							'''simple docstring'''


							UpperCamelCase__     :deque							      =				deque()
							for node in self.adlist[0]["next_states"]:
												q.append(UpperCamelCase_							)
												UpperCamelCase__     :int							      =				0
							while q:
												UpperCamelCase__     :List[Any]							      =				q.popleft()
												for child in self.adlist[r]["next_states"]:
																	q.append(UpperCamelCase_							)
																	UpperCamelCase__     :str							      =				self.adlist[r]['''fail_state''']
																	while (
																	    self.find_next_state(UpperCamelCase_					,     self.adlist[child]['''value''']							) is None
																	    and state != 0
																	):
																						UpperCamelCase__     :int							      =				self.adlist[state]['''fail_state''']
																	UpperCamelCase__     :Dict							      =				self.find_next_state(
																	    UpperCamelCase_					,     self.adlist[child]['''value''']							)
																	if self.adlist[child]["fail_state"] is None:
																						UpperCamelCase__     :List[Any]							      =				0
																	UpperCamelCase__     :str							      =				(
																	    self.adlist[child]['''output''']
																	    + self.adlist[self.adlist[child]['''fail_state''']]['''output''']
																	)




		def 					lowerCAmelCase__       (	self					,     UpperCamelCase_							):

							'''simple docstring'''


							UpperCamelCase__     :dict							      =				{}  # returns a dict with keywords and list of its occurrences
							UpperCamelCase__     :Optional[int]							      =				0
							for i in range(len(UpperCamelCase_							)							):
												while (
												    self.find_next_state(UpperCamelCase_					,     string[i]							) is None
												    and current_state != 0
												):
																	UpperCamelCase__     :Any							      =				self.adlist[current_state]['''fail_state''']
												UpperCamelCase__     :int							      =				self.find_next_state(UpperCamelCase_					,     string[i]							)
												if next_state is None:
																	UpperCamelCase__     :Optional[int]							      =				0
												else:
																	UpperCamelCase__     :List[Any]							      =				next_state
																	for key in self.adlist[current_state]["output"]:
																						if key not in result:
																											UpperCamelCase__     :int							      =				[]
																						result[key].append(i - len(UpperCamelCase_							) + 1							)
							return result


if __name__ == "__main__":
		import doctest

		doctest.testmod()



'''simple docstring'''
import json
import logging
import os
import sys
from time import time
from unittest.mock import patch

from transformers.testing_utils import TestCasePlus, require_torch_tpu


logging.basicConfig(level=logging.DEBUG)

__snake_case							   =  logging.getLogger()


def     a   (    __a     )						->			Dict:



					'''simple docstring'''






					UpperCamelCase__     :str							      =				{}
					UpperCamelCase__     :Dict							      =				os.path.join(__a				,      '''all_results.json'''     )
					if os.path.exists(__a     ):
										with open(__a				,      '''r'''     ) as f:
															UpperCamelCase__     :int							      =				json.load(__a     )
					else:
										raise ValueError(f'''can\'t find {path}'''     )
					return results


__snake_case							   =  logging.StreamHandler(sys.stdout)
logger.addHandler(stream_handler)







@require_torch_tpu
class      lowercase			(							A__      ):

		"""simple docstring"""

		def 					lowerCAmelCase__       (	self							):

							'''simple docstring'''


							import xla_spawn

							UpperCamelCase__     :Any							      =				self.get_auto_remove_tmp_dir()
							UpperCamelCase__     :List[str]							      =				F'''
            ./examples/pytorch/text-classification/run_glue.py
            --num_cores=8
            ./examples/pytorch/text-classification/run_glue.py
            --model_name_or_path distilbert-base-uncased
            --output_dir {tmp_dir}
            --overwrite_output_dir
            --train_file ./tests/fixtures/tests_samples/MRPC/train.csv
            --validation_file ./tests/fixtures/tests_samples/MRPC/dev.csv
            --do_train
            --do_eval
            --debug tpu_metrics_debug
            --per_device_train_batch_size=2
            --per_device_eval_batch_size=1
            --learning_rate=1e-4
            --max_steps=10
            --warmup_steps=2
            --seed=42
            --max_seq_length=128
            '''.split()

							with patch.object(UpperCamelCase_					,     '''argv'''					,     UpperCamelCase_							):
												UpperCamelCase__     :List[Any]							      =				time()
												xla_spawn.main()
												UpperCamelCase__     :List[Any]							      =				time()

												UpperCamelCase__     :Tuple							      =				get_results(UpperCamelCase_							)
												self.assertGreaterEqual(result['''eval_accuracy''']					,     0.75							)

												# Assert that the script takes less than 500 seconds to make sure it doesn't hang.
												self.assertLess(end - start					,     500							)




		def 					lowerCAmelCase__       (	self							):

							'''simple docstring'''


							import xla_spawn

							UpperCamelCase__     :Tuple							      =				'''
            ./tests/test_trainer_tpu.py
            --num_cores=8
            ./tests/test_trainer_tpu.py
            '''.split()
							with patch.object(UpperCamelCase_					,     '''argv'''					,     UpperCamelCase_							):
												xla_spawn.main()