import json
from typing import List, Optional, Tuple

from tokenizers import normalizers

from ...tokenization_utils_base import BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import PaddingStrategy, logging
from .tokenization_realm import RealmTokenizer


lowerCamelCase_    :		Optional[Any]							=	logging.get_logger(__name__)

lowerCamelCase_    :		str							=	{"""vocab_file""": """vocab.txt""", """tokenizer_file""": """tokenizer.json"""}

lowerCamelCase_    :		Optional[Any]							=	{
    """vocab_file""": {
        """google/realm-cc-news-pretrained-embedder""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-embedder/resolve/main/vocab.txt"""
        ),
        """google/realm-cc-news-pretrained-encoder""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-encoder/resolve/main/vocab.txt"""
        ),
        """google/realm-cc-news-pretrained-scorer""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-scorer/resolve/main/vocab.txt"""
        ),
        """google/realm-cc-news-pretrained-openqa""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-openqa/aresolve/main/vocab.txt"""
        ),
        """google/realm-orqa-nq-openqa""": """https://huggingface.co/google/realm-orqa-nq-openqa/resolve/main/vocab.txt""",
        """google/realm-orqa-nq-reader""": """https://huggingface.co/google/realm-orqa-nq-reader/resolve/main/vocab.txt""",
        """google/realm-orqa-wq-openqa""": """https://huggingface.co/google/realm-orqa-wq-openqa/resolve/main/vocab.txt""",
        """google/realm-orqa-wq-reader""": """https://huggingface.co/google/realm-orqa-wq-reader/resolve/main/vocab.txt""",
    },
    """tokenizer_file""": {
        """google/realm-cc-news-pretrained-embedder""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-embedder/resolve/main/tokenizer.jsont"""
        ),
        """google/realm-cc-news-pretrained-encoder""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-encoder/resolve/main/tokenizer.json"""
        ),
        """google/realm-cc-news-pretrained-scorer""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-scorer/resolve/main/tokenizer.json"""
        ),
        """google/realm-cc-news-pretrained-openqa""": (
            """https://huggingface.co/google/realm-cc-news-pretrained-openqa/aresolve/main/tokenizer.json"""
        ),
        """google/realm-orqa-nq-openqa""": (
            """https://huggingface.co/google/realm-orqa-nq-openqa/resolve/main/tokenizer.json"""
        ),
        """google/realm-orqa-nq-reader""": (
            """https://huggingface.co/google/realm-orqa-nq-reader/resolve/main/tokenizer.json"""
        ),
        """google/realm-orqa-wq-openqa""": (
            """https://huggingface.co/google/realm-orqa-wq-openqa/resolve/main/tokenizer.json"""
        ),
        """google/realm-orqa-wq-reader""": (
            """https://huggingface.co/google/realm-orqa-wq-reader/resolve/main/tokenizer.json"""
        ),
    },
}

lowerCamelCase_    :		List[str]							=	{
    """google/realm-cc-news-pretrained-embedder""": 512,
    """google/realm-cc-news-pretrained-encoder""": 512,
    """google/realm-cc-news-pretrained-scorer""": 512,
    """google/realm-cc-news-pretrained-openqa""": 512,
    """google/realm-orqa-nq-openqa""": 512,
    """google/realm-orqa-nq-reader""": 512,
    """google/realm-orqa-wq-openqa""": 512,
    """google/realm-orqa-wq-reader""": 512,
}

lowerCamelCase_    :		Tuple							=	{
    """google/realm-cc-news-pretrained-embedder""": {"""do_lower_case""": True},
    """google/realm-cc-news-pretrained-encoder""": {"""do_lower_case""": True},
    """google/realm-cc-news-pretrained-scorer""": {"""do_lower_case""": True},
    """google/realm-cc-news-pretrained-openqa""": {"""do_lower_case""": True},
    """google/realm-orqa-nq-openqa""": {"""do_lower_case""": True},
    """google/realm-orqa-nq-reader""": {"""do_lower_case""": True},
    """google/realm-orqa-wq-openqa""": {"""do_lower_case""": True},
    """google/realm-orqa-wq-reader""": {"""do_lower_case""": True},
}


class 						a__							(       __lowercase		):
   A__    :       List[Any]        =      VOCAB_FILES_NAMES
   A__    :       Optional[int]        =      PRETRAINED_VOCAB_FILES_MAP
   A__    :       Union[str, Any]        =      PRETRAINED_INIT_CONFIGURATION
   A__    :       List[str]        =      PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
   A__    :       List[str]        =      RealmTokenizer



   def __init__(						self				,						UpperCAmelCase=None				,						UpperCAmelCase=None				,						UpperCAmelCase=True				,						UpperCAmelCase="[UNK]"				,						UpperCAmelCase="[SEP]"				,						UpperCAmelCase="[PAD]"				,						UpperCAmelCase="[CLS]"				,						UpperCAmelCase="[MASK]"				,						UpperCAmelCase=True				,						UpperCAmelCase=None				,						**UpperCAmelCase				,						)			->   Any:
        super().__init__(
            UpperCAmelCase__				,						tokenizer_file=UpperCAmelCase__				,						do_lower_case=UpperCAmelCase__				,						unk_token=UpperCAmelCase__				,						sep_token=UpperCAmelCase__				,						pad_token=UpperCAmelCase__				,						cls_token=UpperCAmelCase__				,						mask_token=UpperCAmelCase__				,						tokenize_chinese_chars=UpperCAmelCase__				,						strip_accents=UpperCAmelCase__				,						**UpperCAmelCase__				,						)

        __a		 =       json.loads(self.backend_tokenizer.normalizer.__getstate__()   )
        if (
            normalizer_state.get('lowercase'				,						UpperCAmelCase__   ) != do_lower_case
            or normalizer_state.get('strip_accents'				,						UpperCAmelCase__   ) != strip_accents
            or normalizer_state.get('handle_chinese_chars'				,						UpperCAmelCase__   ) != tokenize_chinese_chars
        ):
             __a		 =       getattr(UpperCAmelCase__				,						normalizer_state.pop('type'   )   )
             __a		 =       do_lower_case
             __a		 =       strip_accents
             __a		 =       tokenize_chinese_chars
             __a		 =       normalizer_class(**UpperCAmelCase__   )

        __a		 =       do_lower_case



   def __SCREAMING_SNAKE_CASE							(						self				,						UpperCAmelCase				,						**UpperCAmelCase   )			->   Optional[int]:
        __a		 =       PaddingStrategy.MAX_LENGTH

        __a		 =       text
        __a		 =       kwargs.pop('text_pair'				,						UpperCAmelCase__   )
        __a		 =       kwargs.pop('return_tensors'				,						UpperCAmelCase__   )

        __a		 =       {
            'input_ids': [],
            'attention_mask': [],
            'token_type_ids': [],
        }

        for idx, candidate_text in enumerate(UpperCAmelCase__   ):
             if batch_text_pair is not None:
                  __a		 =       batch_text_pair[idx]
             else:
                  __a		 =       None

             __a		 =       super().__call__(UpperCAmelCase__				,						UpperCAmelCase__				,						return_tensors=UpperCAmelCase__				,						**UpperCAmelCase__   )

             __a		 =       encoded_candidates.get('input_ids'   )
             __a		 =       encoded_candidates.get('attention_mask'   )
             __a		 =       encoded_candidates.get('token_type_ids'   )

             if encoded_input_ids is not None:
                  output_data["input_ids"].append(UpperCAmelCase__   )
             if encoded_attention_mask is not None:
                  output_data["attention_mask"].append(UpperCAmelCase__   )
             if encoded_token_type_ids is not None:
                  output_data["token_type_ids"].append(UpperCAmelCase__   )

        __a		 =       {key: item for key, item in output_data.items() if len(UpperCAmelCase__   ) != 0}

        return BatchEncoding(UpperCAmelCase__				,						tensor_type=UpperCAmelCase__   )



   def __SCREAMING_SNAKE_CASE							(						self				,						UpperCAmelCase				,						UpperCAmelCase=None   )			->   Optional[int]:
        __a		 =       [self.cls_token_id] + token_ids_a + [self.sep_token_id]

        if token_ids_a:
             output += token_ids_a + [self.sep_token_id]

        return output



   def __SCREAMING_SNAKE_CASE							(						self				,						UpperCAmelCase				,						UpperCAmelCase = None   )			->   List[int]:
        __a		 =       [self.sep_token_id]
        __a		 =       [self.cls_token_id]
        if token_ids_a is None:
             return len(cls + token_ids_a + sep   ) * [0]
        return len(cls + token_ids_a + sep   ) * [0] + len(token_ids_a + sep   ) * [1]







   def __SCREAMING_SNAKE_CASE							(						self				,						UpperCAmelCase				,						UpperCAmelCase = None   )			->   Tuple[str]:
        __a		 =       self._tokenizer.model.save(UpperCAmelCase__				,						name=UpperCAmelCase__   )
        return tuple(UpperCAmelCase__   )





import os
import tempfile
import unittest
from pathlib import Path

from transformers import AutoConfig, is_tf_available
from transformers.testing_utils import require_tf


if is_tf_available():
	import tensorflow as tf

	from transformers import TensorFlowBenchmark, TensorFlowBenchmarkArguments


@require_tf
class 						a__							(       unittest.TestCase		):



			def __SCREAMING_SNAKE_CASE							(						self				,						UpperCAmelCase   )			->   Optional[Any]:
								for model_result in results.values():
													for batch_size, sequence_length in zip(model_result['bs']				,						model_result['ss']   ):
																		__a		 =       model_result['result'][batch_size][sequence_length]
																		self.assertIsNotNone(UpperCAmelCase   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Optional[Any]:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						eager_mode=UpperCAmelCase				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Optional[int]:
								__a		 =       'sgugger/tiny-distilbert-classification'
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						multi_process=UpperCAmelCase				,						only_pretrain_model=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Any:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Optional[int]:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       AutoConfig.from_pretrained(UpperCAmelCase   )
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						eager_mode=UpperCAmelCase				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase				,						[config]   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Any:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       AutoConfig.from_pretrained(UpperCAmelCase   )
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase				,						[config]   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Optional[int]:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_train_result   )
								self.check_results_dict_not_empty(results.memory_train_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Optional[Any]:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       AutoConfig.from_pretrained(UpperCAmelCase   )
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase				,						[config]   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_train_result   )
								self.check_results_dict_not_empty(results.memory_train_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   List[str]:
								__a		 =       'patrickvonplaten/t5-tiny-random'
								__a		 =       AutoConfig.from_pretrained(UpperCAmelCase   )
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase				,						configs=[config]   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			@unittest.skipIf(is_tf_available() and len(tf.config.list_physical_devices('GPU'   )   ) == 0				,						'Cannot do xla on CPU.'   )
			def __SCREAMING_SNAKE_CASE							(						self   )			->   str:
								__a		 =       'sshleifer/tiny-gpt2'
								__a		 =       TensorFlowBenchmarkArguments(
								    models=[MODEL_ID]				,						training=UpperCAmelCase				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						use_xla=UpperCAmelCase				,						multi_process=UpperCAmelCase				,						)
								__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
								__a		 =       benchmark.run()
								self.check_results_dict_not_empty(results.time_inference_result   )
								self.check_results_dict_not_empty(results.memory_inference_result   )



			def __SCREAMING_SNAKE_CASE							(						self   )			->   Dict:
								__a		 =       'sshleifer/tiny-gpt2'
								with tempfile.TemporaryDirectory() as tmp_dir:
													__a		 =       TensorFlowBenchmarkArguments(
													    models=[MODEL_ID]				,						inference=UpperCAmelCase				,						save_to_csv=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						inference_time_csv_file=os.path.join(UpperCAmelCase				,						'inf_time.csv'   )				,						inference_memory_csv_file=os.path.join(UpperCAmelCase				,						'inf_mem.csv'   )				,						env_info_csv_file=os.path.join(UpperCAmelCase				,						'env.csv'   )				,						multi_process=UpperCAmelCase				,						)
													__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
													benchmark.run()
													self.assertTrue(Path(os.path.join(UpperCAmelCase				,						'inf_time.csv'   )   ).exists()   )
													self.assertTrue(Path(os.path.join(UpperCAmelCase				,						'inf_mem.csv'   )   ).exists()   )
													self.assertTrue(Path(os.path.join(UpperCAmelCase				,						'env.csv'   )   ).exists()   )







			def __SCREAMING_SNAKE_CASE							(						self   )			->   Tuple:
								__a		 =       'sshleifer/tiny-gpt2'

								def _check_summary_is_not_empty(UpperCAmelCase   ):
													self.assertTrue(hasattr(UpperCAmelCase				,						'sequential'   )   )
													self.assertTrue(hasattr(UpperCAmelCase				,						'cumulative'   )   )
													self.assertTrue(hasattr(UpperCAmelCase				,						'current'   )   )
													self.assertTrue(hasattr(UpperCAmelCase				,						'total'   )   )

								with tempfile.TemporaryDirectory() as tmp_dir:
													__a		 =       TensorFlowBenchmarkArguments(
													    models=[MODEL_ID]				,						inference=UpperCAmelCase				,						sequence_lengths=[8]				,						batch_sizes=[1]				,						log_filename=os.path.join(UpperCAmelCase				,						'log.txt'   )				,						log_print=UpperCAmelCase				,						trace_memory_line_by_line=UpperCAmelCase				,						eager_mode=UpperCAmelCase				,						multi_process=UpperCAmelCase				,						)
													__a		 =       TensorFlowBenchmark(UpperCAmelCase   )
													__a		 =       benchmark.run()
													_check_summary_is_not_empty(result.inference_summary   )
													self.assertTrue(Path(os.path.join(UpperCAmelCase				,						'log.txt'   )   ).exists()   )




