from __future__ import annotations

import unittest

from transformers import OpenAIGPTConfig, is_tf_available
from transformers.testing_utils import require_tf, slow

from ...test_configuration_common import ConfigTester
from ...test_modeling_tf_common import TFModelTesterMixin, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_tf_available():
				import tensorflow as tf

				from transformers.models.openai.modeling_tf_openai import (
				    TF_OPENAI_GPT_PRETRAINED_MODEL_ARCHIVE_LIST,
				    TFOpenAIGPTDoubleHeadsModel,
				    TFOpenAIGPTForSequenceClassification,
				    TFOpenAIGPTLMHeadModel,
				    TFOpenAIGPTModel,
				)





class 					__snake_case    :




					def __init__(  self       ,			__UpperCamelCase       ,			)	->    Tuple:



									'''simple docstring'''







									snake_case__   :      List[Any]   				= parent
									snake_case__   :      Any   				= 13
									snake_case__   :      int   				= 7
									snake_case__   :      List[str]   				= True
									snake_case__   :      str   				= True
									snake_case__   :      Optional[int]   				= True
									snake_case__   :      List[Any]   				= True
									snake_case__   :      Dict   				= True
									snake_case__   :      str   				= 99
									snake_case__   :      List[str]   				= 32
									snake_case__   :      Tuple   				= 2
									snake_case__   :      Dict   				= 4
									snake_case__   :      Optional[int]   				= 37
									snake_case__   :      Any   				= 'gelu'
									snake_case__   :      int   				= 0.1
									snake_case__   :      List[Any]   				= 0.1
									snake_case__   :      List[str]   				= 512
									snake_case__   :      Tuple   				= 16
									snake_case__   :      List[Any]   				= 2
									snake_case__   :      Any   				= 0.0_2
									snake_case__   :      List[str]   				= 3
									snake_case__   :      List[str]   				= 4
									snake_case__   :      Optional[Any]   				= None
									snake_case__   :      List[Any]   				= self.vocab_size - 1




					def      __a     (  self						)	->    List[Any]:



									'''simple docstring'''







									snake_case__   :      int   				= ids_tensor([self.batch_size, self.seq_length]       ,			self.vocab_size						)

									snake_case__   :      str   				= None
									if self.use_input_mask:
													snake_case__   :      List[Any]   				= random_attention_mask([self.batch_size, self.seq_length]						)

									snake_case__   :      List[str]   				= None
									if self.use_token_type_ids:
													snake_case__   :      Any   				= ids_tensor([self.batch_size, self.seq_length]       ,			self.type_vocab_size						)

									snake_case__   :      Union[str, Any]   				= None
									if self.use_mc_token_ids:
													snake_case__   :      str   				= ids_tensor([self.batch_size, self.num_choices]       ,			self.seq_length						)

									snake_case__   :      Any   				= None
									snake_case__   :      List[str]   				= None
									snake_case__   :      Optional[int]   				= None
									if self.use_labels:
													snake_case__   :      int   				= ids_tensor([self.batch_size]       ,			self.type_sequence_label_size						)
													snake_case__   :      List[str]   				= ids_tensor([self.batch_size, self.seq_length]       ,			self.num_labels						)
													snake_case__   :      Union[str, Any]   				= ids_tensor([self.batch_size]       ,			self.num_choices						)

									snake_case__   :      str   				= OpenAIGPTConfig(
									    vocab_size=self.vocab_size       ,			n_embd=self.hidden_size       ,			n_layer=self.num_hidden_layers       ,			n_head=self.num_attention_heads       ,			n_positions=self.max_position_embeddings       ,			pad_token_id=self.pad_token_id       ,			)

									snake_case__   :      Optional[Any]   				= ids_tensor([self.num_hidden_layers, self.num_attention_heads]       ,			2						)

									return (
									    config,
									    input_ids,
									    input_mask,
									    head_mask,
									    token_type_ids,
									    mc_token_ids,
									    sequence_labels,
									    token_labels,
									    choice_labels,
									)




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			*__UpperCamelCase						)	->    Optional[int]:



									'''simple docstring'''







									snake_case__   :      Any   				= TFOpenAIGPTModel(config=_lowercase						)
									snake_case__   :      Dict   				= {'input_ids': input_ids, 'attention_mask': input_mask, 'token_type_ids': token_type_ids}
									snake_case__   :      Optional[int]   				= model(_lowercase						)

									snake_case__   :      Optional[int]   				= [input_ids, input_mask]
									snake_case__   :      Optional[int]   				= model(_lowercase						)

									snake_case__   :      Optional[int]   				= model(_lowercase						)

									self.parent.assertEqual(result.last_hidden_state.shape       ,			(self.batch_size, self.seq_length, self.hidden_size)						)




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			*__UpperCamelCase						)	->    Dict:



									'''simple docstring'''







									snake_case__   :      List[Any]   				= TFOpenAIGPTLMHeadModel(config=_lowercase						)
									snake_case__   :      Optional[int]   				= {'input_ids': input_ids, 'attention_mask': input_mask, 'token_type_ids': token_type_ids}
									snake_case__   :      List[Any]   				= model(_lowercase						)
									self.parent.assertEqual(result.logits.shape       ,			(self.batch_size, self.seq_length, self.vocab_size)						)




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			*__UpperCamelCase						)	->    Optional[int]:



									'''simple docstring'''







									snake_case__   :      Any   				= TFOpenAIGPTDoubleHeadsModel(config=_lowercase						)

									snake_case__   :      Optional[Any]   				= tf.tile(tf.expand_dims(_lowercase       ,			1						)       ,			(1, self.num_choices, 1)						)
									snake_case__   :      Dict   				= tf.tile(tf.expand_dims(_lowercase       ,			1						)       ,			(1, self.num_choices, 1)						)
									snake_case__   :      Union[str, Any]   				= tf.tile(tf.expand_dims(_lowercase       ,			1						)       ,			(1, self.num_choices, 1)						)

									snake_case__   :      List[str]   				= {
									    'input_ids': multiple_choice_inputs_ids,
									    'mc_token_ids': mc_token_ids,
									    'attention_mask': multiple_choice_input_mask,
									    'token_type_ids': multiple_choice_token_type_ids,
									}
									snake_case__   :      int   				= model(_lowercase						)
									self.parent.assertEqual(
									    result.logits.shape       ,			(self.batch_size, self.num_choices, self.seq_length, self.vocab_size)						)
									self.parent.assertEqual(result.mc_logits.shape       ,			(self.batch_size, self.num_choices)						)




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			*__UpperCamelCase						)	->    str:



									'''simple docstring'''







									snake_case__   :      Optional[int]   				= self.num_labels
									snake_case__   :      Union[str, Any]   				= ids_tensor([self.batch_size]       ,			self.type_sequence_label_size						)
									snake_case__   :      int   				= {
									    'input_ids': input_ids,
									    'attention_mask': input_mask,
									    'token_type_ids': token_type_ids,
									    'labels': sequence_labels,
									}
									snake_case__   :      List[str]   				= TFOpenAIGPTForSequenceClassification(_lowercase						)
									snake_case__   :      int   				= model(_lowercase						)
									self.parent.assertEqual(result.logits.shape       ,			(self.batch_size, self.num_labels)						)




					def      __a     (  self						)	->    Tuple:



									'''simple docstring'''







									snake_case__   :      Union[str, Any]   				= self.prepare_config_and_inputs()

									(
									    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,    (
									    snake_case__  
									)				,      
									)   :      Tuple   				= config_and_inputs

									snake_case__   :      Tuple   				= {'input_ids': input_ids, 'token_type_ids': token_type_ids, 'attention_mask': input_mask}
									return config, inputs_dict





@require_tf
class 					__snake_case    (     lowercase__       ,lowercase__       ,unittest.TestCase      ):
					__lowerCamelCase			   =  (
					    (TFOpenAIGPTModel, TFOpenAIGPTLMHeadModel, TFOpenAIGPTDoubleHeadsModel, TFOpenAIGPTForSequenceClassification)
					    if is_tf_available()
					    else ()
					)
					__lowerCamelCase			   =  (
					    (TFOpenAIGPTLMHeadModel,) if is_tf_available() else ()
					)  # TODO (PVP): Add Double HeadsModel when generate() function is changed accordingly
					__lowerCamelCase			   =  (
					    {
					        """feature-extraction""": TFOpenAIGPTModel,
					        """text-classification""": TFOpenAIGPTForSequenceClassification,
					        """text-generation""": TFOpenAIGPTLMHeadModel,
					        """zero-shot""": TFOpenAIGPTForSequenceClassification,
					    }
					    if is_tf_available()
					    else {}
					)
					__lowerCamelCase			   =  False
					__lowerCamelCase			   =  False




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase						)	->    List[str]:



									'''simple docstring'''







									if pipeline_test_casse_name == "ZeroShotClassificationPipelineTests":
													# Get `tokenizer does not have a padding token` error for both fast/slow tokenizers.
													# `OpenAIGPTConfig` was never used in pipeline tests, either because of a missing checkpoint or because a
													# tiny config could not be created.
													return True

									return False




					def      __a     (  self						)	->    str:



									'''simple docstring'''







									snake_case__   :      Optional[Any]   				= TFOpenAIGPTModelTester(self						)
									snake_case__   :      Optional[Any]   				= ConfigTester(self       ,			config_class=_lowercase       ,			n_embd=37						)




					def      __a     (  self						)	->    Optional[int]:



									'''simple docstring'''







									self.config_tester.run_common_tests()




					def      __a     (  self						)	->    List[str]:



									'''simple docstring'''







									snake_case__   :      str   				= self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_openai_gpt_model(*_lowercase						)




					def      __a     (  self						)	->    List[Any]:



									'''simple docstring'''







									snake_case__   :      Tuple   				= self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_openai_gpt_lm_head(*_lowercase						)




					def      __a     (  self						)	->    List[Any]:



									'''simple docstring'''







									snake_case__   :      Any   				= self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_openai_gpt_double_head(*_lowercase						)




					def      __a     (  self						)	->    Union[str, Any]:



									'''simple docstring'''







									snake_case__   :      List[str]   				= self.model_tester.prepare_config_and_inputs()
									self.model_tester.create_and_check_openai_gpt_for_sequence_classification(*_lowercase						)




					@slow
					def      __a     (  self						)	->    Dict:



									'''simple docstring'''







									for model_name in TF_OPENAI_GPT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
													snake_case__   :      Union[str, Any]   				= TFOpenAIGPTModel.from_pretrained(_lowercase						)
													self.assertIsNotNone(_lowercase						)





@require_tf
class 					__snake_case    (     unittest.TestCase      ):




					@slow
					def      __a     (  self						)	->    Union[str, Any]:



									'''simple docstring'''







									snake_case__   :      Optional[Any]   				= TFOpenAIGPTLMHeadModel.from_pretrained('openai-gpt'						)
									snake_case__   :      Optional[int]   				= tf.convert_to_tensor([[481, 4735, 544]]       ,			dtype=tf.intaa						)  # the president is
									snake_case__   :      Any   				= [
									    481,
									    4735,
									    544,
									    246,
									    963,
									    870,
									    762,
									    239,
									    244,
									    40477,
									    244,
									    249,
									    719,
									    881,
									    487,
									    544,
									    240,
									    244,
									    603,
									    481,
									]  # the president is a very good man. " \n " i\'m sure he is, " said the

									snake_case__   :      str   				= model.generate(_lowercase       ,			do_sample=_lowercase						)
									self.assertListEqual(output_ids[0].numpy().tolist()       ,			_lowercase						)



"""simple docstring"""


from typing import Literal

__UpperCamelCase       :    int         =		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"


def   __UpperCAmelCase     (	_snake_case		:       str,				_snake_case		:       str,				_snake_case		:       Literal["encrypt", "decrypt"]       ):
   _lowercase							     =       LETTERS if mode == "decrypt" else key
   _lowercase							     =       key if mode == "decrypt" else LETTERS
   _lowercase							     =       ""
   # loop through each symbol in the message
   for symbol in message:
      if symbol.upper() in chars_a:
         # encrypt/decrypt the symbol
         _lowercase							     =       chars_a.find(symbol.upper()       )
         if symbol.isupper():
            translated += chars_b[sym_index].upper()
         else:
            translated += chars_b[sym_index].lower()
      else:
         # symbol is not in LETTERS, just add it
         translated += symbol
   return translated


def   __UpperCAmelCase     (	_snake_case		:       str,				_snake_case		:       str       ):
   return translate_message(_snake_case,				_snake_case,				"encrypt"       )


def   __UpperCAmelCase     (	_snake_case		:       str,				_snake_case		:       str       ):
   return translate_message(_snake_case,				_snake_case,				"decrypt"       )


def   __UpperCAmelCase     (	):
   _lowercase							     =       "Hello World"
   _lowercase							     =       "QWERTYUIOPASDFGHJKLZXCVBNM"
   _lowercase							     =       "decrypt"  # set to 'encrypt' or 'decrypt'

   if mode == "encrypt":
      _lowercase							     =       encrypt_message(_snake_case,				_snake_case       )
   elif mode == "decrypt":
      _lowercase							     =       decrypt_message(_snake_case,				_snake_case       )
   print(f"""Using the key {key}, the {mode}ed message is: {translated}"""       )


if __name__ == "__main__":
  import doctest

  doctest.testmod()
  main()