
import inspect
import unittest
import warnings

from transformers import DeiTConfig
from transformers.models.auto import get_values
from transformers.testing_utils import (
    require_accelerate,
    require_torch,
    require_torch_gpu,
    require_vision,
    slow,
    torch_device,
)
from transformers.utils import cached_property, is_torch_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
 import torch
 from torch import nn

 from transformers import (
     MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING,
     MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
     MODEL_MAPPING,
     DeiTForImageClassification,
     DeiTForImageClassificationWithTeacher,
     DeiTForMaskedImageModeling,
     DeiTModel,
 )
 from transformers.models.deit.modeling_deit import DEIT_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
 from PIL import Image

 from transformers import DeiTImageProcessor
class       _lowerCAmelCase  :

 """simple docstring"""

 def __init__(						self			:			Any					, SCREAMING_SNAKE_CASE__			:			str					, SCREAMING_SNAKE_CASE__			:			Optional[int]=13					, SCREAMING_SNAKE_CASE__			:			int=30					, SCREAMING_SNAKE_CASE__			:			Dict=2					, SCREAMING_SNAKE_CASE__			:			List[Any]=3					, SCREAMING_SNAKE_CASE__			:			Optional[Any]=True					, SCREAMING_SNAKE_CASE__			:			Dict=True					, SCREAMING_SNAKE_CASE__			:			Tuple=32					, SCREAMING_SNAKE_CASE__			:			Union[str, Any]=5					, SCREAMING_SNAKE_CASE__			:			List[Any]=4					, SCREAMING_SNAKE_CASE__			:			Dict=37					, SCREAMING_SNAKE_CASE__			:			Optional[Any]="gelu"					, SCREAMING_SNAKE_CASE__			:			List[Any]=0.1					, SCREAMING_SNAKE_CASE__			:			Dict=0.1					, SCREAMING_SNAKE_CASE__			:			Optional[Any]=10					, SCREAMING_SNAKE_CASE__			:			List[str]=0.02					, SCREAMING_SNAKE_CASE__			:			int=3					, SCREAMING_SNAKE_CASE__			:			str=None					, SCREAMING_SNAKE_CASE__			:			Any=2					, ):






      """simple docstring"""



      UpperCamelCase						    =					parent
      UpperCamelCase						    =					batch_size
      UpperCamelCase						    =					image_size
      UpperCamelCase						    =					patch_size
      UpperCamelCase						    =					num_channels
      UpperCamelCase						    =					is_training
      UpperCamelCase						    =					use_labels
      UpperCamelCase						    =					hidden_size
      UpperCamelCase						    =					num_hidden_layers
      UpperCamelCase						    =					num_attention_heads
      UpperCamelCase						    =					intermediate_size
      UpperCamelCase						    =					hidden_act
      UpperCamelCase						    =					hidden_dropout_prob
      UpperCamelCase						    =					attention_probs_dropout_prob
      UpperCamelCase						    =					type_sequence_label_size
      UpperCamelCase						    =					initializer_range
      UpperCamelCase						    =					scope
      UpperCamelCase						    =					encoder_stride

      # in DeiT, the seq length equals the number of patches + 2 (we add 2 for the [CLS] and distilation tokens)
      UpperCamelCase						    =					(image_size // patch_size) ** 2
      UpperCamelCase						    =					num_patches + 2

 def      __lowerCAmelCase  (						self			:			Any   ):






      """simple docstring"""



      UpperCamelCase						    =					floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]   )

      UpperCamelCase						    =					None
      if self.use_labels:
           UpperCamelCase						    =					ids_tensor([self.batch_size]					, self.type_sequence_label_size   )

      UpperCamelCase						    =					self.get_config()

      return config, pixel_values, labels

 def      __lowerCAmelCase  (						self			:			Tuple   ):






      """simple docstring"""



      return DeiTConfig(
          image_size=self.image_size					, patch_size=self.patch_size					, num_channels=self.num_channels					, hidden_size=self.hidden_size					, num_hidden_layers=self.num_hidden_layers					, num_attention_heads=self.num_attention_heads					, intermediate_size=self.intermediate_size					, hidden_act=self.hidden_act					, hidden_dropout_prob=self.hidden_dropout_prob					, attention_probs_dropout_prob=self.attention_probs_dropout_prob					, is_decoder=SCREAMING_SNAKE_CASE__					, initializer_range=self.initializer_range					, encoder_stride=self.encoder_stride					, )

 def      __lowerCAmelCase  (						self			:			Optional[int]					, SCREAMING_SNAKE_CASE__			:			List[Any]					, SCREAMING_SNAKE_CASE__			:			str					, SCREAMING_SNAKE_CASE__			:			Optional[int]   ):






      """simple docstring"""



      UpperCamelCase						    =					DeiTModel(config=SCREAMING_SNAKE_CASE__   )
      model.to(SCREAMING_SNAKE_CASE__   )
      model.eval()
      UpperCamelCase						    =					model(SCREAMING_SNAKE_CASE__   )
      self.parent.assertEqual(result.last_hidden_state.shape					, (self.batch_size, self.seq_length, self.hidden_size)   )

 def      __lowerCAmelCase  (						self			:			Optional[Any]					, SCREAMING_SNAKE_CASE__			:			Any					, SCREAMING_SNAKE_CASE__			:			Union[str, Any]					, SCREAMING_SNAKE_CASE__			:			int   ):






      """simple docstring"""



      UpperCamelCase						    =					DeiTForMaskedImageModeling(config=SCREAMING_SNAKE_CASE__   )
      model.to(SCREAMING_SNAKE_CASE__   )
      model.eval()
      UpperCamelCase						    =					model(SCREAMING_SNAKE_CASE__   )
      self.parent.assertEqual(
          result.reconstruction.shape					, (self.batch_size, self.num_channels, self.image_size, self.image_size)   )

      # test greyscale images
      UpperCamelCase						    =					1
      UpperCamelCase						    =					DeiTForMaskedImageModeling(SCREAMING_SNAKE_CASE__   )
      model.to(SCREAMING_SNAKE_CASE__   )
      model.eval()

      UpperCamelCase						    =					floats_tensor([self.batch_size, 1, self.image_size, self.image_size]   )
      UpperCamelCase						    =					model(SCREAMING_SNAKE_CASE__   )
      self.parent.assertEqual(result.reconstruction.shape					, (self.batch_size, 1, self.image_size, self.image_size)   )

 def      __lowerCAmelCase  (						self			:			Any					, SCREAMING_SNAKE_CASE__			:			Optional[int]					, SCREAMING_SNAKE_CASE__			:			Tuple					, SCREAMING_SNAKE_CASE__			:			Optional[int]   ):






      """simple docstring"""



      UpperCamelCase						    =					self.type_sequence_label_size
      UpperCamelCase						    =					DeiTForImageClassification(SCREAMING_SNAKE_CASE__   )
      model.to(SCREAMING_SNAKE_CASE__   )
      model.eval()
      UpperCamelCase						    =					model(SCREAMING_SNAKE_CASE__					, labels=SCREAMING_SNAKE_CASE__   )
      self.parent.assertEqual(result.logits.shape					, (self.batch_size, self.type_sequence_label_size)   )

      # test greyscale images
      UpperCamelCase						    =					1
      UpperCamelCase						    =					DeiTForImageClassification(SCREAMING_SNAKE_CASE__   )
      model.to(SCREAMING_SNAKE_CASE__   )
      model.eval()

      UpperCamelCase						    =					floats_tensor([self.batch_size, 1, self.image_size, self.image_size]   )
      UpperCamelCase						    =					model(SCREAMING_SNAKE_CASE__					, labels=SCREAMING_SNAKE_CASE__   )
      self.parent.assertEqual(result.logits.shape					, (self.batch_size, self.type_sequence_label_size)   )






 def      __lowerCAmelCase  (						self			:			Tuple   ):






      """simple docstring"""



      UpperCamelCase						    =					self.prepare_config_and_inputs()
      (
          (
          UpperCamelCase
      )    ,		(
          UpperCamelCase
      )    ,		(
          UpperCamelCase
      )    ,		
      )						    =					config_and_inputs
      UpperCamelCase						    =					{'pixel_values': pixel_values}
      return config, inputs_dict




@require_torch
class       _lowerCAmelCase  (		__magic_name__			,	__magic_name__			,	unittest.TestCase							):

 """simple docstring"""
 SCREAMING_SNAKE_CASE_				:					Any       						=(
     (
         DeiTModel,
         DeiTForImageClassification,
         DeiTForImageClassificationWithTeacher,
         DeiTForMaskedImageModeling,
     )
     if is_torch_available()
     else ()
 )
 SCREAMING_SNAKE_CASE_				:					int       						=(
     {
         "feature-extraction": DeiTModel,
         "image-classification": (DeiTForImageClassification, DeiTForImageClassificationWithTeacher),
     }
     if is_torch_available()
     else {}
 )

 SCREAMING_SNAKE_CASE_				:					Union[str, Any]       						=False
 SCREAMING_SNAKE_CASE_				:					str       						=False
 SCREAMING_SNAKE_CASE_				:					Union[str, Any]       						=False

 def      __lowerCAmelCase  (						self			:			Optional[int]   ):






      """simple docstring"""



      UpperCamelCase						    =					DeiTModelTester(self   )
      UpperCamelCase						    =					ConfigTester(self					, config_class=SCREAMING_SNAKE_CASE__					, has_text_modality=SCREAMING_SNAKE_CASE__					, hidden_size=37   )

 def      __lowerCAmelCase  (						self			:			Optional[Any]   ):






      """simple docstring"""



      self.config_tester.run_common_tests()

 @unittest.skip(reason='DeiT does not use inputs_embeds'   )
 def      __lowerCAmelCase  (						self			:			Union[str, Any]   ):






      """simple docstring"""



      pass

 def      __lowerCAmelCase  (						self			:			Tuple   ):






      """simple docstring"""



      UpperCamelCase    ,		UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs_for_common()

      for model_class in self.all_model_classes:
           UpperCamelCase						    =					model_class(SCREAMING_SNAKE_CASE__   )
           self.assertIsInstance(model.get_input_embeddings()					, (nn.Module)   )
           UpperCamelCase						    =					model.get_output_embeddings()
           self.assertTrue(x is None or isinstance(SCREAMING_SNAKE_CASE__					, nn.Linear   )   )

 def      __lowerCAmelCase  (						self			:			Optional[Any]   ):






      """simple docstring"""



      UpperCamelCase    ,		UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs_for_common()

      for model_class in self.all_model_classes:
           UpperCamelCase						    =					model_class(SCREAMING_SNAKE_CASE__   )
           UpperCamelCase						    =					inspect.signature(model.forward   )
           # signature.parameters is an OrderedDict => so arg_names order is deterministic
           UpperCamelCase						    =					[*signature.parameters.keys()]

           UpperCamelCase						    =					['pixel_values']
           self.assertListEqual(arg_names[:1]					, SCREAMING_SNAKE_CASE__   )

 def      __lowerCAmelCase  (						self			:			Any   ):






      """simple docstring"""



      UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs()
      self.model_tester.create_and_check_model(*SCREAMING_SNAKE_CASE__   )

 def      __lowerCAmelCase  (						self			:			Tuple   ):






      """simple docstring"""



      UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs()
      self.model_tester.create_and_check_for_masked_image_modeling(*SCREAMING_SNAKE_CASE__   )

 def      __lowerCAmelCase  (						self			:			Dict   ):






      """simple docstring"""



      UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs()
      self.model_tester.create_and_check_for_image_classification(*SCREAMING_SNAKE_CASE__   )

 def      __lowerCAmelCase  (						self			:			Tuple					, SCREAMING_SNAKE_CASE__			:			Any					, SCREAMING_SNAKE_CASE__			:			List[str]					, SCREAMING_SNAKE_CASE__			:			int=False   ):






      """simple docstring"""



      UpperCamelCase						    =					super()._prepare_for_class(SCREAMING_SNAKE_CASE__					, SCREAMING_SNAKE_CASE__					, return_labels=SCREAMING_SNAKE_CASE__   )

      if return_labels:
           if model_class.__name__ == "DeiTForImageClassificationWithTeacher":
                del inputs_dict["labels"]

      return inputs_dict

 def      __lowerCAmelCase  (						self			:			Tuple   ):






      """simple docstring"""



      if not self.model_tester.is_training:
           return

      UpperCamelCase    ,		UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs_for_common()
      UpperCamelCase						    =					True

      for model_class in self.all_model_classes:
           # DeiTForImageClassificationWithTeacher supports inference-only
           if (
               model_class in get_values(SCREAMING_SNAKE_CASE__   )
               or model_class.__name__ == "DeiTForImageClassificationWithTeacher"
           ):
                continue
           UpperCamelCase						    =					model_class(SCREAMING_SNAKE_CASE__   )
           model.to(SCREAMING_SNAKE_CASE__   )
           model.train()
           UpperCamelCase						    =					self._prepare_for_class(SCREAMING_SNAKE_CASE__					, SCREAMING_SNAKE_CASE__					, return_labels=SCREAMING_SNAKE_CASE__   )
           UpperCamelCase						    =					model(**SCREAMING_SNAKE_CASE__   ).loss
           loss.backward()

 def      __lowerCAmelCase  (						self			:			List[str]   ):






      """simple docstring"""



      UpperCamelCase    ,		UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs_for_common()
      if not self.model_tester.is_training:
           return

      UpperCamelCase						    =					False
      UpperCamelCase						    =					True

      for model_class in self.all_model_classes:
           if model_class in get_values(SCREAMING_SNAKE_CASE__   ) or not model_class.supports_gradient_checkpointing:
                continue
           # DeiTForImageClassificationWithTeacher supports inference-only
           if model_class.__name__ == "DeiTForImageClassificationWithTeacher":
                continue
           UpperCamelCase						    =					model_class(SCREAMING_SNAKE_CASE__   )
           model.gradient_checkpointing_enable()
           model.to(SCREAMING_SNAKE_CASE__   )
           model.train()
           UpperCamelCase						    =					self._prepare_for_class(SCREAMING_SNAKE_CASE__					, SCREAMING_SNAKE_CASE__					, return_labels=SCREAMING_SNAKE_CASE__   )
           UpperCamelCase						    =					model(**SCREAMING_SNAKE_CASE__   ).loss
           loss.backward()

 def      __lowerCAmelCase  (						self			:			List[str]   ):






      """simple docstring"""



      UpperCamelCase    ,		UpperCamelCase						    =					self.model_tester.prepare_config_and_inputs_for_common()

      UpperCamelCase						    =					[
          {'title': 'multi_label_classification', 'num_labels': 2, 'dtype': torch.float},
          {'title': 'single_label_classification', 'num_labels': 1, 'dtype': torch.long},
          {'title': 'regression', 'num_labels': 1, 'dtype': torch.float},
      ]

      for model_class in self.all_model_classes:
           if (
               model_class
               not in [
                   *get_values(SCREAMING_SNAKE_CASE__   ),
                   *get_values(SCREAMING_SNAKE_CASE__   ),
               ]
               or model_class.__name__ == "DeiTForImageClassificationWithTeacher"
           ):
                continue

           for problem_type in problem_types:
                with self.subTest(msg=F'Testing {model_class} with {problem_type["title"]}'   ):
                     UpperCamelCase						    =					problem_type['title']
                     UpperCamelCase						    =					problem_type['num_labels']

                     UpperCamelCase						    =					model_class(SCREAMING_SNAKE_CASE__   )
                     model.to(SCREAMING_SNAKE_CASE__   )
                     model.train()

                     UpperCamelCase						    =					self._prepare_for_class(SCREAMING_SNAKE_CASE__					, SCREAMING_SNAKE_CASE__					, return_labels=SCREAMING_SNAKE_CASE__   )

                     if problem_type["num_labels"] > 1:
                          UpperCamelCase						    =					inputs['labels'].unsqueeze(1   ).repeat(1					, problem_type['num_labels']   )

                     UpperCamelCase						    =					inputs['labels'].to(problem_type['dtype']   )

                     # This tests that we do not trigger the warning form PyTorch "Using a target size that is different
                     # to the input size. This will likely lead to incorrect results due to broadcasting. Please ensure
                     # they have the same size." which is a symptom something in wrong for the regression problem.
                     # See https://github.com/huggingface/transformers/issues/11780
                     with warnings.catch_warnings(record=SCREAMING_SNAKE_CASE__   ) as warning_list:
                          UpperCamelCase						    =					model(**SCREAMING_SNAKE_CASE__   ).loss
                     for w in warning_list:
                          if "Using a target size that is different to the input size" in str(w.message   ):
                               raise ValueError(
                                   F'Something is going wrong in the regression problem: intercepted {w.message}'   )

                     loss.backward()






 @slow
 def      __lowerCAmelCase  (						self			:			List[str]   ):






      """simple docstring"""



      for model_name in DEIT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
           UpperCamelCase						    =					DeiTModel.from_pretrained(SCREAMING_SNAKE_CASE__   )
           self.assertIsNotNone(SCREAMING_SNAKE_CASE__   )




def  __lowerCamelCase					( )       ->      str:
     UpperCamelCase						    =					Image.open('./tests/fixtures/tests_samples/COCO/000000039769.png'			)
     return image







@require_torch
@require_vision
class       _lowerCAmelCase  (		unittest.TestCase							):

 """simple docstring"""

 @cached_property
 def      __lowerCAmelCase  (						self			:			Any   ):






      """simple docstring"""



      return (
          DeiTImageProcessor.from_pretrained('facebook/deit-base-distilled-patch16-224'   )
          if is_vision_available()
          else None
      )

 @slow
 def      __lowerCAmelCase  (						self			:			Optional[Any]   ):






      """simple docstring"""



      UpperCamelCase						    =					DeiTForImageClassificationWithTeacher.from_pretrained('facebook/deit-base-distilled-patch16-224'   ).to(
          SCREAMING_SNAKE_CASE__   )

      UpperCamelCase						    =					self.default_image_processor
      UpperCamelCase						    =					prepare_img()
      UpperCamelCase						    =					image_processor(images=SCREAMING_SNAKE_CASE__					, return_tensors='pt'   ).to(SCREAMING_SNAKE_CASE__   )

      # forward pass
      with torch.no_grad():
           UpperCamelCase						    =					model(**SCREAMING_SNAKE_CASE__   )

      # verify the logits
      UpperCamelCase						    =					torch.Size((1, 10_00)   )
      self.assertEqual(outputs.logits.shape					, SCREAMING_SNAKE_CASE__   )

      UpperCamelCase						    =					torch.tensor([-1.0266, 0.1912, -1.2861]   ).to(SCREAMING_SNAKE_CASE__   )

      self.assertTrue(torch.allclose(outputs.logits[0, :3]					, SCREAMING_SNAKE_CASE__					, atol=1e-4   )   )






 @slow
 @require_accelerate
 @require_torch_gpu
 def      __lowerCAmelCase  (						self			:			Any   ):






      """simple docstring"""



      UpperCamelCase						    =					DeiTModel.from_pretrained(
          'facebook/deit-base-distilled-patch16-224'					, torch_dtype=torch.floataa					, device_map='auto'   )
      UpperCamelCase						    =					self.default_image_processor

      UpperCamelCase						    =					prepare_img()
      UpperCamelCase						    =					image_processor(images=SCREAMING_SNAKE_CASE__					, return_tensors='pt'   )
      UpperCamelCase						    =					inputs.pixel_values.to(SCREAMING_SNAKE_CASE__   )

      # forward pass to make sure inference works in fp16
      with torch.no_grad():
           UpperCamelCase						    =					model(SCREAMING_SNAKE_CASE__   )




def  __lowerCamelCase					( _lowercase			)       ->      str:
     return "".join(chr(ord(_lowercase			) - 32			) if 'a' <= char <= 'z' else char for char in word			)


if __name__ == "__main__":
 from doctest import testmod

 testmod()


