



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				:






   '''simple docstring'''






   def __init__(    self:     Union[str, Any]  ,lowerCamelCase_:     Union[str, Any]  ,)	->      Optional[Any]:
       UpperCAmelCase_     :       List[str]  		=					parent
       UpperCAmelCase_     :       Optional[int]  		=					13
       UpperCAmelCase_     :       Union[str, Any]  		=					7
       UpperCAmelCase_     :       Tuple  		=					True
       UpperCAmelCase_     :       Union[str, Any]  		=					True
       UpperCAmelCase_     :       List[str]  		=					True
       UpperCAmelCase_     :       Optional[Any]  		=					True
       UpperCAmelCase_     :       str  		=					True
       UpperCAmelCase_     :       Union[str, Any]  		=					99
       UpperCAmelCase_     :       List[str]  		=					32
       UpperCAmelCase_     :       int  		=					2
       UpperCAmelCase_     :       Optional[int]  		=					4
       UpperCAmelCase_     :       Dict  		=					37
       UpperCAmelCase_     :       Any  		=					"""gelu"""
       UpperCAmelCase_     :       str  		=					0.1
       UpperCAmelCase_     :       int  		=					0.1
       UpperCAmelCase_     :       List[str]  		=					512
       UpperCAmelCase_     :       List[str]  		=					16
       UpperCAmelCase_     :       List[str]  		=					2
       UpperCAmelCase_     :       Union[str, Any]  		=					0.0_2
       UpperCAmelCase_     :       Union[str, Any]  		=					3
       UpperCAmelCase_     :       Optional[Any]  		=					4
       UpperCAmelCase_     :       Tuple  		=					None
       UpperCAmelCase_     :       Union[str, Any]  		=					self.vocab_size - 1


   def       A__    (    self:     Tuple							)	->      Dict:
       UpperCAmelCase_     :       Optional[int]  		=					ids_tensor([self.batch_size, self.seq_length]  ,self.vocab_size							)

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

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

       UpperCAmelCase_     :       List[str]  		=					None
       if self.use_mc_token_ids:
           UpperCAmelCase_     :       Tuple  		=					ids_tensor([self.batch_size, self.num_choices]  ,self.seq_length							)

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

       UpperCAmelCase_     :       Union[str, Any]  		=					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  ,)

       UpperCAmelCase_     :       List[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:     str  ,lowerCamelCase_:     int  ,lowerCamelCase_:     str  ,lowerCamelCase_:     Any  ,lowerCamelCase_:     Optional[int]  ,lowerCamelCase_:     Union[str, Any]  ,*lowerCamelCase_:     Dict							)	->      int:
       UpperCAmelCase_     :       Dict  		=					TFOpenAIGPTModel(config=lowerCamelCase_							)
       UpperCAmelCase_     :       Optional[int]  		=					{"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
       UpperCAmelCase_     :       Optional[Any]  		=					model(lowerCamelCase_							)

       UpperCAmelCase_     :       Any  		=					[input_ids, input_mask]
       UpperCAmelCase_     :       int  		=					model(lowerCamelCase_							)

       UpperCAmelCase_     :       List[str]  		=					model(lowerCamelCase_							)

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


   def       A__    (    self:     Any  ,lowerCamelCase_:     Optional[Any]  ,lowerCamelCase_:     int  ,lowerCamelCase_:     str  ,lowerCamelCase_:     Union[str, Any]  ,lowerCamelCase_:     str  ,*lowerCamelCase_:     Dict							)	->      List[Any]:
       UpperCAmelCase_     :       Optional[Any]  		=					TFOpenAIGPTLMHeadModel(config=lowerCamelCase_							)
       UpperCAmelCase_     :       Optional[Any]  		=					{"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
       UpperCAmelCase_     :       Union[str, Any]  		=					model(lowerCamelCase_							)
       self.parent.assertEqual(result.logits.shape  ,(self.batch_size, self.seq_length, self.vocab_size)							)


   def       A__    (    self:     str  ,lowerCamelCase_:     Any  ,lowerCamelCase_:     Optional[Any]  ,lowerCamelCase_:     Tuple  ,lowerCamelCase_:     Optional[Any]  ,lowerCamelCase_:     List[str]  ,lowerCamelCase_:     int  ,*lowerCamelCase_:     str							)	->      int:
       UpperCAmelCase_     :       List[Any]  		=					TFOpenAIGPTDoubleHeadsModel(config=lowerCamelCase_							)

       UpperCAmelCase_     :       str  		=					tf.tile(tf.expand_dims(lowerCamelCase_  ,1							)  ,(1, self.num_choices, 1)							)
       UpperCAmelCase_     :       int  		=					tf.tile(tf.expand_dims(lowerCamelCase_  ,1							)  ,(1, self.num_choices, 1)							)
       UpperCAmelCase_     :       Tuple  		=					tf.tile(tf.expand_dims(lowerCamelCase_  ,1							)  ,(1, self.num_choices, 1)							)

       UpperCAmelCase_     :       Any  		=					{
           """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,
       }
       UpperCAmelCase_     :       int  		=					model(lowerCamelCase_							)
       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:     List[Any]  ,lowerCamelCase_:     Tuple  ,lowerCamelCase_:     int  ,lowerCamelCase_:     Tuple  ,lowerCamelCase_:     int  ,lowerCamelCase_:     Union[str, Any]  ,*lowerCamelCase_:     Dict							)	->      Union[str, Any]:
       UpperCAmelCase_     :       Union[str, Any]  		=					self.num_labels
       UpperCAmelCase_     :       str  		=					ids_tensor([self.batch_size]  ,self.type_sequence_label_size							)
       UpperCAmelCase_     :       List[Any]  		=					{
           """input_ids""": input_ids,
           """attention_mask""": input_mask,
           """token_type_ids""": token_type_ids,
           """labels""": sequence_labels,
       }
       UpperCAmelCase_     :       int  		=					TFOpenAIGPTForSequenceClassification(lowerCamelCase_							)
       UpperCAmelCase_     :       str  		=					model(lowerCamelCase_							)
       self.parent.assertEqual(result.logits.shape  ,(self.batch_size, self.num_labels)							)






   def       A__    (    self:     Dict							)	->      Optional[Any]:
       UpperCAmelCase_     :       Dict  		=					self.prepare_config_and_inputs()

       (
           (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, (
           UpperCAmelCase_
       )		, 
       )     :       List[Any]  		=					config_and_inputs

       UpperCAmelCase_     :       Union[str, Any]  		=					{"""input_ids""": input_ids, """token_type_ids""": token_type_ids, """attention_mask""": input_mask}
       return config, inputs_dict







@require_tf
class       _snake_case				(     __snake_case ,							__snake_case ,							unittest.TestCase ):






   '''simple docstring'''






   A__      : List[Any]       =						(
       (TFOpenAIGPTModel, TFOpenAIGPTLMHeadModel, TFOpenAIGPTDoubleHeadsModel, TFOpenAIGPTForSequenceClassification)
       if is_tf_available()
       else ()
   )
   A__      : List[Any]       =						(
       (TFOpenAIGPTLMHeadModel,) if is_tf_available() else ()
   )  # TODO (PVP): Add Double HeadsModel when generate() function is changed accordingly
   A__      : int       =						(
       {
           "feature-extraction": TFOpenAIGPTModel,
           "text-classification": TFOpenAIGPTForSequenceClassification,
           "text-generation": TFOpenAIGPTLMHeadModel,
           "zero-shot": TFOpenAIGPTForSequenceClassification,
       }
       if is_tf_available()
       else {}
   )
   A__      : List[Any]       =						False
   A__      : Union[str, Any]       =						False


   def       A__    (    self:     str  ,lowerCamelCase_:     Optional[int]  ,lowerCamelCase_:     Union[str, Any]  ,lowerCamelCase_:     Union[str, Any]  ,lowerCamelCase_:     Union[str, Any]  ,lowerCamelCase_:     Tuple							)	->      Tuple:
       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:     Dict							)	->      str:
       UpperCAmelCase_     :       Any  		=					TFOpenAIGPTModelTester(self							)
       UpperCAmelCase_     :       List[Any]  		=					ConfigTester(self  ,config_class=lowerCamelCase_  ,n_embd=37							)


   def       A__    (    self:     List[Any]							)	->      Union[str, Any]:
       self.config_tester.run_common_tests()


   def       A__    (    self:     int							)	->      Union[str, Any]:
       UpperCAmelCase_     :       Union[str, Any]  		=					self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_model(*lowerCamelCase_							)


   def       A__    (    self:     int							)	->      Tuple:
       UpperCAmelCase_     :       Any  		=					self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_lm_head(*lowerCamelCase_							)


   def       A__    (    self:     Union[str, Any]							)	->      int:
       UpperCAmelCase_     :       Dict  		=					self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_double_head(*lowerCamelCase_							)


   def       A__    (    self:     List[str]							)	->      Optional[Any]:
       UpperCAmelCase_     :       Optional[int]  		=					self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_for_sequence_classification(*lowerCamelCase_							)






   @slow
   def       A__    (    self:     List[str]							)	->      str:
       for model_name in TF_OPENAI_GPT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
           UpperCAmelCase_     :       str  		=					TFOpenAIGPTModel.from_pretrained(lowerCamelCase_							)
           self.assertIsNotNone(lowerCamelCase_							)







@require_tf
class       _snake_case				(     unittest.TestCase ):






   '''simple docstring'''






   @slow
   def       A__    (    self:     Dict							)	->      List[str]:
       UpperCAmelCase_     :       int  		=					TFOpenAIGPTLMHeadModel.from_pretrained("""openai-gpt"""							)
       UpperCAmelCase_     :       List[str]  		=					tf.convert_to_tensor([[481, 4735, 544]]  ,dtype=tf.intaa							)  # the president is
       UpperCAmelCase_     :       Union[str, 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

       UpperCAmelCase_     :       int  		=					model.generate(lowerCamelCase_  ,do_sample=lowerCamelCase_							)
       self.assertListEqual(output_ids[0].numpy().tolist()  ,lowerCamelCase_							)


def 					SCREAMING_SNAKE_CASE  (   __UpperCamelCase			:    list[int]							)			->							int:

				"""simple docstring"""







				if not isinstance(__UpperCamelCase				,    __UpperCamelCase							) or not all(
				    isinstance(__UpperCamelCase				,    __UpperCamelCase							) and item >= 0 for item in citations							):
								raise ValueError('''The citations should be a list of non negative integers.'''							)

				citations.sort()
				A__	:						str								=				len(__UpperCamelCase							)

				for i in range(__UpperCamelCase							):
								if citations[len_citations - 1 - i] <= i:
												return i

				return len_citations


if __name__ == "__main__":
					import doctest

					doctest.testmod()