"""simple docstring"""


import warnings
from contextlib import contextmanager

from ...processing_utils import ProcessorMixin
class   UpperCAmelCase_	(				lowercase__   ):
    snake_case_											=      ["""image_processor""", """tokenizer"""]
    snake_case_											=      """AutoImageProcessor"""
    snake_case_											=      """AutoTokenizer"""
    def __init__(	self			:       Optional[Any]   ,						_lowercase			:       Dict=None   ,						_lowercase			:       Dict=None   ,						**_lowercase			:       Union[str, Any]		)						->    Dict:
       _lowercase							     =       None
       if "feature_extractor" in kwargs:
          warnings.warn(
              "The `feature_extractor` argument is deprecated and will be removed in v5, use `image_processor`"
              " instead."   ,						_lowercase   ,						)
          _lowercase							     =       kwargs.pop("feature_extractor"		)

       _lowercase							     =       image_processor if image_processor is not None else feature_extractor
       if image_processor is None:
          raise ValueError("You need to specify an `image_processor`."		)
       if tokenizer is None:
          raise ValueError("You need to specify a `tokenizer`."		)

       super().__init__(_lowercase   ,						_lowercase		)
       _lowercase							     =       self.image_processor
       _lowercase							     =       False
    def __call__(	self			:       List[str]   ,						*_lowercase			:       Optional[Any]   ,						**_lowercase			:       Tuple		)						->    Dict:
       # For backward compatibility
       if self._in_target_context_manager:
          return self.current_processor(*_lowercase   ,						**_lowercase		)

       _lowercase							     =       kwargs.pop("images"   ,						_lowercase		)
       _lowercase							     =       kwargs.pop("text"   ,						_lowercase		)
       if len(_lowercase		) > 0:
          _lowercase							     =       args[0]
          _lowercase							     =       args[1:]

       if images is None and text is None:
          raise ValueError("You need to specify either an `images` or `text` input to process."		)

       if images is not None:
          _lowercase							     =       self.image_processor(_lowercase   ,						*_lowercase   ,						**_lowercase		)
       if text is not None:
          _lowercase							     =       self.tokenizer(_lowercase   ,						**_lowercase		)

       if text is None:
          return inputs
       elif images is None:
          return encodings
       else:
          _lowercase							     =       encodings["input_ids"]
          return inputs
    def 		_lowerCamelCase      (	self			:       List[Any]   ,						*_lowercase			:       Union[str, Any]   ,						**_lowercase			:       Union[str, Any]		)						->    Any:
       return self.tokenizer.batch_decode(*_lowercase   ,						**_lowercase		)
    def 		_lowerCamelCase      (	self			:       Dict   ,						*_lowercase			:       Optional[Any]   ,						**_lowercase			:       Dict		)						->    int:
       return self.tokenizer.decode(*_lowercase   ,						**_lowercase		)
    @contextmanager
    def 		_lowerCamelCase      (	self			:       Tuple		)						->    Tuple:
       warnings.warn(
           "`as_target_processor` is deprecated and will be removed in v5 of Transformers. You can process your "
           "labels by using the argument `text` of the regular `__call__` method (either in the same call as "
           "your images inputs, or in a separate call."		)
       _lowercase							     =       True
       _lowercase							     =       self.tokenizer
       yield
       _lowercase							     =       self.image_processor
       _lowercase							     =       False
    @property
    def 		_lowerCamelCase      (	self			:       int		)						->    List[str]:
       warnings.warn(
           "`feature_extractor_class` is deprecated and will be removed in v5. Use `image_processor_class` instead."   ,						_lowercase   ,						)
       return self.image_processor_class




    @property
    def 		_lowerCamelCase      (	self			:       List[Any]		)						->    List[str]:
       warnings.warn(
           "`feature_extractor` is deprecated and will be removed in v5. Use `image_processor` instead."   ,						_lowercase   ,						)
       return self.image_processor
"""simple docstring"""


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   UpperCAmelCase_	:
    def __init__(	self			:       Tuple   ,						_lowercase			:       List[str]   ,						)						->    Tuple:
       _lowercase							     =       parent
       _lowercase							     =       1_3
       _lowercase							     =       7
       _lowercase							     =       True
       _lowercase							     =       True
       _lowercase							     =       True
       _lowercase							     =       True
       _lowercase							     =       True
       _lowercase							     =       9_9
       _lowercase							     =       3_2
       _lowercase							     =       2
       _lowercase							     =       4
       _lowercase							     =       3_7
       _lowercase							     =       "gelu"
       _lowercase							     =       0.1
       _lowercase							     =       0.1
       _lowercase							     =       5_1_2
       _lowercase							     =       1_6
       _lowercase							     =       2
       _lowercase							     =       0.02
       _lowercase							     =       3
       _lowercase							     =       4
       _lowercase							     =       None
       _lowercase							     =       self.vocab_size - 1
    def 		_lowerCamelCase      (	self			:       int		)						->    List[Any]:
       _lowercase							     =       ids_tensor([self.batch_size, self.seq_length]   ,						self.vocab_size		)

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

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

       _lowercase							     =       None
       if self.use_mc_token_ids:
          _lowercase							     =       ids_tensor([self.batch_size, self.num_choices]   ,						self.seq_length		)

       _lowercase							     =       None
       _lowercase							     =       None
       _lowercase							     =       None
       if self.use_labels:
          _lowercase							     =       ids_tensor([self.batch_size]   ,						self.type_sequence_label_size		)
          _lowercase							     =       ids_tensor([self.batch_size, self.seq_length]   ,						self.num_labels		)
          _lowercase							     =       ids_tensor([self.batch_size]   ,						self.num_choices		)

       _lowercase							     =       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   ,						)

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

       _lowercase							     =       [input_ids, input_mask]
       _lowercase							     =       model(_lowercase		)

       _lowercase							     =       model(_lowercase		)

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

       _lowercase							     =       tf.tile(tf.expand_dims(_lowercase   ,						1		)   ,						(1, self.num_choices, 1)		)
       _lowercase							     =       tf.tile(tf.expand_dims(_lowercase   ,						1		)   ,						(1, self.num_choices, 1)		)
       _lowercase							     =       tf.tile(tf.expand_dims(_lowercase   ,						1		)   ,						(1, self.num_choices, 1)		)

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




    def 		_lowerCamelCase      (	self			:       str		)						->    Tuple:
       _lowercase							     =       self.prepare_config_and_inputs()

       (
           (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  (
           _lowercase
       )     ,  
       )							     =       config_and_inputs

       _lowercase							     =       {"input_ids": input_ids, "token_type_ids": token_type_ids, "attention_mask": input_mask}
       return config, inputs_dict
@require_tf
class   UpperCAmelCase_	(				lowercase__,    lowercase__,    unittest.TestCase   ):
    snake_case_											=      (
        (TFOpenAIGPTModel, TFOpenAIGPTLMHeadModel, TFOpenAIGPTDoubleHeadsModel, TFOpenAIGPTForSequenceClassification)
        if is_tf_available()
        else ()
    )
    snake_case_											=      (
        (TFOpenAIGPTLMHeadModel,) if is_tf_available() else ()
    )  # TODO (PVP): Add Double HeadsModel when generate() function is changed accordingly
    snake_case_											=      (
        {
            """feature-extraction""": TFOpenAIGPTModel,
            """text-classification""": TFOpenAIGPTForSequenceClassification,
            """text-generation""": TFOpenAIGPTLMHeadModel,
            """zero-shot""": TFOpenAIGPTForSequenceClassification,
        }
        if is_tf_available()
        else {}
    )
    snake_case_											=      False
    snake_case_											=      False
    def 		_lowerCamelCase      (	self			:       Optional[int]   ,						_lowercase			:       Optional[int]   ,						_lowercase			:       List[str]   ,						_lowercase			:       Tuple   ,						_lowercase			:       Union[str, Any]   ,						_lowercase			:       Any		)						->    List[str]:
       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 		_lowerCamelCase      (	self			:       Union[str, Any]		)						->    str:
       _lowercase							     =       TFOpenAIGPTModelTester(self		)
       _lowercase							     =       ConfigTester(self   ,						config_class=_lowercase   ,						n_embd=3_7		)
    def 		_lowerCamelCase      (	self			:       List[Any]		)						->    Optional[int]:
       self.config_tester.run_common_tests()
    def 		_lowerCamelCase      (	self			:       Any		)						->    List[str]:
       _lowercase							     =       self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_model(*_lowercase		)
    def 		_lowerCamelCase      (	self			:       Optional[int]		)						->    List[Any]:
       _lowercase							     =       self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_lm_head(*_lowercase		)
    def 		_lowerCamelCase      (	self			:       Optional[Any]		)						->    List[Any]:
       _lowercase							     =       self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_double_head(*_lowercase		)
    def 		_lowerCamelCase      (	self			:       int		)						->    Union[str, Any]:
       _lowercase							     =       self.model_tester.prepare_config_and_inputs()
       self.model_tester.create_and_check_openai_gpt_for_sequence_classification(*_lowercase		)




    @slow
    def 		_lowerCamelCase      (	self			:       Tuple		)						->    Dict:
       for model_name in TF_OPENAI_GPT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
          _lowercase							     =       TFOpenAIGPTModel.from_pretrained(_lowercase		)
          self.assertIsNotNone(_lowercase		)
@require_tf
class   UpperCAmelCase_	(				unittest.TestCase   ):
    @slow
    def 		_lowerCamelCase      (	self			:       Optional[Any]		)						->    Union[str, Any]:
       _lowercase							     =       TFOpenAIGPTLMHeadModel.from_pretrained("openai-gpt"		)
       _lowercase							     =       tf.convert_to_tensor([[4_8_1, 4_7_3_5, 5_4_4]]   ,						dtype=tf.intaa		)  # the president is
       _lowercase							     =       [
           4_8_1,
           4_7_3_5,
           5_4_4,
           2_4_6,
           9_6_3,
           8_7_0,
           7_6_2,
           2_3_9,
           2_4_4,
           4_0_4_7_7,
           2_4_4,
           2_4_9,
           7_1_9,
           8_8_1,
           4_8_7,
           5_4_4,
           2_4_0,
           2_4_4,
           6_0_3,
           4_8_1,
       ]  # the president is a very good man. " \n " i\'m sure he is, " said the

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