


'''simple docstring'''
import re


def 			a      (			__a   )  ->	str:



					'''simple docstring'''






					if len(re.findall('''[ATCG]''' ,					__a   )   ) != len(__a   ):
										raise ValueError('''Invalid Strand'''   )

					return dna.translate(dna.maketrans('''ATCG''' ,					'''TAGC'''   )   )


if __name__ == "__main__":
		import doctest

		doctest.testmod()

'''simple docstring'''







import math
import time
from typing import Dict, List, Optional

from torch.utils.data import Dataset

from transformers import SeqaSeqTrainer, is_torch_tpu_available
from transformers.trainer_utils import PredictionOutput, speed_metrics


if is_torch_tpu_available(check_device=False):
							import torch_xla.core.xla_model as xm
							import torch_xla.debug.metrics as met






class  lowerCAmelCase__   (  lowerCamelCase_     ):






					def __init__(   self				,							*__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE=None				,							__SCREAMING_SNAKE_CASE=None				,							**__SCREAMING_SNAKE_CASE		):


											"""simple docstring"""





											super().__init__(*__SCREAMING_SNAKE_CASE				,							**__SCREAMING_SNAKE_CASE		)
											lowercase_	:     Tuple													=       eval_examples
											lowercase_	:     Tuple													=       post_process_function






					def 	_snake_case    (   self				,							__SCREAMING_SNAKE_CASE = None				,							__SCREAMING_SNAKE_CASE=None				,							__SCREAMING_SNAKE_CASE = None				,							__SCREAMING_SNAKE_CASE = "eval"				,							**__SCREAMING_SNAKE_CASE				,							):


											"""simple docstring"""





											lowercase_	:     Optional[int]													=       gen_kwargs.copy()
											lowercase_	:     List[str]													=       (
											    gen_kwargs['''max_length'''] if gen_kwargs.get('''max_length'''		) is not None else self.args.generation_max_length
											)
											lowercase_	:     str													=       (
											    gen_kwargs['''num_beams'''] if gen_kwargs.get('''num_beams'''		) is not None else self.args.generation_num_beams
											)
											lowercase_	:     Dict													=       gen_kwargs

											lowercase_	:     List[Any]													=       self.eval_dataset if eval_dataset is None else eval_dataset
											lowercase_	:     List[str]													=       self.get_eval_dataloader(__SCREAMING_SNAKE_CASE		)
											lowercase_	:     Optional[Any]													=       self.eval_examples if eval_examples is None else eval_examples

											# Temporarily disable metric computation, we will do it in the loop here.
											lowercase_	:     Union[str, Any]													=       self.compute_metrics
											lowercase_	:     Optional[int]													=       None
											lowercase_	:     Tuple													=       time.time()
											lowercase_	:     Tuple													=       self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
											try:
																	lowercase_	:     str													=       eval_loop(
																	    __SCREAMING_SNAKE_CASE				,							description='''Evaluation'''				,							prediction_loss_only=True if compute_metrics is None else None				,							ignore_keys=__SCREAMING_SNAKE_CASE				,							metric_key_prefix=__SCREAMING_SNAKE_CASE				,							)
											finally:
																	lowercase_	:     Any													=       compute_metrics
											lowercase_	:     Any													=       self.args.eval_batch_size * self.args.world_size
											if F'''{metric_key_prefix}_jit_compilation_time''' in output.metrics:
																	start_time += output.metrics[F'''{metric_key_prefix}_jit_compilation_time''']
											output.metrics.update(
											    speed_metrics(
											        __SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE				,							num_samples=output.num_samples				,							num_steps=math.ceil(output.num_samples / total_batch_size		)				,							)		)

											if self.post_process_function is not None and self.compute_metrics is not None and self.args.should_save:
																	# Only the main node write the results by default
																	lowercase_	:     Optional[Any]													=       self.post_process_function(__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE		)
																	lowercase_	:     Optional[int]													=       self.compute_metrics(__SCREAMING_SNAKE_CASE		)

																	# Prefix all keys with metric_key_prefix + '_'
																	for key in list(metrics.keys()		):
																							if not key.startswith(F'''{metric_key_prefix}_'''		):
																													lowercase_	:     List[Any]													=       metrics.pop(__SCREAMING_SNAKE_CASE		)

																	metrics.update(output.metrics		)
											else:
																	lowercase_	:     List[Any]													=       output.metrics

											if self.args.should_log:
																	# Only the main node log the results by default
																	self.log(__SCREAMING_SNAKE_CASE		)

											if self.args.tpu_metrics_debug or self.args.debug:
																	# tpu-comment: Logging debug metrics for PyTorch/XLA (compile, execute times, ops, etc.)
																	xm.master_print(met.metrics_report()		)

											lowercase_	:     List[Any]													=       self.callback_handler.on_evaluate(self.args				,							self.state				,							self.control				,							__SCREAMING_SNAKE_CASE		)
											return metrics






					def 	_snake_case    (   self				,							__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE=None				,							__SCREAMING_SNAKE_CASE = "test"				,							**__SCREAMING_SNAKE_CASE		):


											"""simple docstring"""





											lowercase_	:     Union[str, Any]													=       gen_kwargs.copy()

											lowercase_	:     Tuple													=       self.get_test_dataloader(__SCREAMING_SNAKE_CASE		)

											# Temporarily disable metric computation, we will do it in the loop here.
											lowercase_	:     Optional[Any]													=       self.compute_metrics
											lowercase_	:     Optional[int]													=       None
											lowercase_	:     List[Any]													=       time.time()
											lowercase_	:     int													=       self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
											try:
																	lowercase_	:     Tuple													=       eval_loop(
																	    __SCREAMING_SNAKE_CASE				,							description='''Prediction'''				,							prediction_loss_only=True if compute_metrics is None else None				,							ignore_keys=__SCREAMING_SNAKE_CASE				,							metric_key_prefix=__SCREAMING_SNAKE_CASE				,							)
											finally:
																	lowercase_	:     Any													=       compute_metrics

											lowercase_	:     Tuple													=       self.args.eval_batch_size * self.args.world_size
											if F'''{metric_key_prefix}_jit_compilation_time''' in output.metrics:
																	start_time += output.metrics[F'''{metric_key_prefix}_jit_compilation_time''']
											output.metrics.update(
											    speed_metrics(
											        __SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE				,							num_samples=output.num_samples				,							num_steps=math.ceil(output.num_samples / total_batch_size		)				,							)		)
											if self.post_process_function is None or self.compute_metrics is None:
																	return output

											lowercase_	:     Any													=       self.post_process_function(__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE				,							__SCREAMING_SNAKE_CASE				,							'''predict'''		)
											lowercase_	:     str													=       self.compute_metrics(__SCREAMING_SNAKE_CASE		)

											# Prefix all keys with metric_key_prefix + '_'
											for key in list(metrics.keys()		):
																	if not key.startswith(F'''{metric_key_prefix}_'''		):
																							lowercase_	:     Optional[int]													=       metrics.pop(__SCREAMING_SNAKE_CASE		)
											metrics.update(output.metrics		)
											return PredictionOutput(predictions=predictions.predictions				,							label_ids=predictions.label_ids				,							metrics=__SCREAMING_SNAKE_CASE		)



