

"""simple docstring"""




from __future__ import annotations

import inspect
import unittest

import numpy as np

from transformers import DeiTConfig
from transformers.testing_utils import require_tf, require_vision, slow
from transformers.utils import cached_property, is_tf_available, is_vision_available

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


if is_tf_available():
      import tensorflow as tf

      from transformers import (
          TFDeiTForImageClassification,
          TFDeiTForImageClassificationWithTeacher,
          TFDeiTForMaskedImageModeling,
          TFDeiTModel,
      )
      from transformers.models.deit.modeling_tf_deit import TF_DEIT_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
      from PIL import Image

      from transformers import DeiTImageProcessor







class      __lowercase			:

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






   '''simple docstring'''
   UpperCAmelCase__					:  List[Any]					   =					parent
   UpperCAmelCase__					:  str					   =					batch_size
   UpperCAmelCase__					:  Tuple					   =					image_size
   UpperCAmelCase__					:  int					   =					patch_size
   UpperCAmelCase__					:  Dict					   =					num_channels
   UpperCAmelCase__					:  List[Any]					   =					is_training
   UpperCAmelCase__					:  Optional[Any]					   =					use_labels
   UpperCAmelCase__					:  Tuple					   =					hidden_size
   UpperCAmelCase__					:  List[str]					   =					num_hidden_layers
   UpperCAmelCase__					:  Dict					   =					num_attention_heads
   UpperCAmelCase__					:  List[Any]					   =					intermediate_size
   UpperCAmelCase__					:  Optional[Any]					   =					hidden_act
   UpperCAmelCase__					:  Optional[Any]					   =					hidden_dropout_prob
   UpperCAmelCase__					:  str					   =					attention_probs_dropout_prob
   UpperCAmelCase__					:  Dict					   =					type_sequence_label_size
   UpperCAmelCase__					:  Optional[int]					   =					initializer_range
   UpperCAmelCase__					:  Tuple					   =					scope
   UpperCAmelCase__					:  str					   =					encoder_stride

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

  def    __lowercase       (  self		:			List[Any]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Union[str, Any]					   =					floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]    )

   UpperCAmelCase__					:  List[str]					   =					None
   if self.use_labels:
    UpperCAmelCase__					:  Optional[Any]					   =					ids_tensor([self.batch_size]					,self.type_sequence_label_size    )

   UpperCAmelCase__					:  int					   =					self.get_config()

   return config, pixel_values, labels

  def    __lowercase       (  self		:			Optional[Any]    ):






   '''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=A					,initializer_range=self.initializer_range					,encoder_stride=self.encoder_stride					,)

  def    __lowercase       (  self		:			Union[str, Any]					,A		:			Optional[int]					,A		:			Optional[Any]					,A		:			Optional[Any]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Dict					   =					TFDeiTModel(config=A    )
   UpperCAmelCase__					:  Dict					   =					model(A    )
   self.parent.assertEqual(result.last_hidden_state.shape					,(self.batch_size, self.seq_length, self.hidden_size)    )

  def    __lowercase       (  self		:			Optional[int]					,A		:			Union[str, Any]					,A		:			Optional[int]					,A		:			str    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Dict					   =					TFDeiTForMaskedImageModeling(config=A    )
   UpperCAmelCase__					:  Any					   =					model(A    )
   self.parent.assertEqual(
       result.reconstruction.shape					,(self.batch_size, self.num_channels, self.image_size, self.image_size)    )

   # test greyscale images
   UpperCAmelCase__					:  Union[str, Any]					   =					1
   UpperCAmelCase__					:  Any					   =					TFDeiTForMaskedImageModeling(A    )

   UpperCAmelCase__					:  str					   =					floats_tensor([self.batch_size, 1, self.image_size, self.image_size]    )
   UpperCAmelCase__					:  str					   =					model(A    )
   self.parent.assertEqual(result.reconstruction.shape					,(self.batch_size, 1, self.image_size, self.image_size)    )

  def    __lowercase       (  self		:			Dict					,A		:			Any					,A		:			Optional[Any]					,A		:			List[Any]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  int					   =					self.type_sequence_label_size
   UpperCAmelCase__					:  int					   =					TFDeiTForImageClassification(A    )
   UpperCAmelCase__					:  int					   =					model(A					,labels=A    )
   self.parent.assertEqual(result.logits.shape					,(self.batch_size, self.type_sequence_label_size)    )

   # test greyscale images
   UpperCAmelCase__					:  Optional[int]					   =					1
   UpperCAmelCase__					:  int					   =					TFDeiTForImageClassification(A    )

   UpperCAmelCase__					:  List[str]					   =					floats_tensor([self.batch_size, 1, self.image_size, self.image_size]    )
   UpperCAmelCase__					:  str					   =					model(A					,labels=A    )
   self.parent.assertEqual(result.logits.shape					,(self.batch_size, self.type_sequence_label_size)    )




  def    __lowercase       (  self		:			int    ):






   '''simple docstring'''
   UpperCAmelCase__					:  List[Any]					   =					self.prepare_config_and_inputs()
   UpperCAmelCase__   ,      UpperCAmelCase__   ,      UpperCAmelCase__					:  Optional[Any]					   =					config_and_inputs
   UpperCAmelCase__					:  Dict					   =					{"""pixel_values""": pixel_values}
   return config, inputs_dict







@require_tf
class      __lowercase			(    __lowerCamelCase	,			__lowerCamelCase	,			unittest.TestCase					):
  snake_case_				       =       (
      (
          TFDeiTModel,
          TFDeiTForImageClassification,
          TFDeiTForImageClassificationWithTeacher,
          TFDeiTForMaskedImageModeling,
      )
      if is_tf_available()
      else ()
  )
  snake_case_				       =       (
      {
          """feature-extraction""": TFDeiTModel,
          """image-classification""": (TFDeiTForImageClassification, TFDeiTForImageClassificationWithTeacher),
      }
      if is_tf_available()
      else {}
  )

  snake_case_				       =       False
  snake_case_				       =       False
  snake_case_				       =       False
  snake_case_				       =       False

  def    __lowercase       (  self		:			Optional[int]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  List[Any]					   =					TFDeiTModelTester(self    )
   UpperCAmelCase__					:  int					   =					ConfigTester(self					,config_class=A					,has_text_modality=A					,hidden_size=37    )

  def    __lowercase       (  self		:			Union[str, Any]    ):






   '''simple docstring'''
   self.config_tester.run_common_tests()

  @unittest.skip(reason="""DeiT does not use inputs_embeds"""    )
  def    __lowercase       (  self		:			str    ):






   '''simple docstring'''
   pass

  def    __lowercase       (  self		:			Any    ):






   '''simple docstring'''
   UpperCAmelCase__   ,      UpperCAmelCase__					:  Dict					   =					self.model_tester.prepare_config_and_inputs_for_common()

   for model_class in self.all_model_classes:
    UpperCAmelCase__					:  int					   =					model_class(A    )
    self.assertIsInstance(model.get_input_embeddings()					,(tf.keras.layers.Layer)    )
    UpperCAmelCase__					:  Tuple					   =					model.get_output_embeddings()
    self.assertTrue(x is None or isinstance(A					,tf.keras.layers.Dense    )    )

  def    __lowercase       (  self		:			Tuple    ):






   '''simple docstring'''
   UpperCAmelCase__   ,      UpperCAmelCase__					:  List[Any]					   =					self.model_tester.prepare_config_and_inputs_for_common()

   for model_class in self.all_model_classes:
    UpperCAmelCase__					:  Dict					   =					model_class(A    )
    UpperCAmelCase__					:  Any					   =					inspect.signature(model.call    )
    # signature.parameters is an OrderedDict => so arg_names order is deterministic
    UpperCAmelCase__					:  List[Any]					   =					[*signature.parameters.keys()]

    UpperCAmelCase__					:  Optional[int]					   =					["""pixel_values"""]
    self.assertListEqual(arg_names[:1]					,A    )

  def    __lowercase       (  self		:			Any    ):






   '''simple docstring'''
   UpperCAmelCase__					:  List[Any]					   =					self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_model(*A    )

  def    __lowercase       (  self		:			int    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Union[str, Any]					   =					self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_for_masked_image_modeling(*A    )

  def    __lowercase       (  self		:			List[str]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  int					   =					self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_for_image_classification(*A    )

  def    __lowercase       (  self		:			str					,A		:			List[str]					,A		:			Optional[int]					,A		:			Union[str, Any]=False    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Any					   =					super()._prepare_for_class(A					,A					,return_labels=A    )

   if return_labels:
    if "labels" in inputs_dict and "labels" not in inspect.signature(model_class.call    ).parameters:
     del inputs_dict["labels"]

   return inputs_dict




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






   '''simple docstring'''
   for model_name in TF_DEIT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
    UpperCAmelCase__					:  List[Any]					   =					TFDeiTModel.from_pretrained(A    )
    self.assertIsNotNone(A    )







def   lowerCAmelCase						(					):
 '''simple docstring'''





 UpperCAmelCase__					:  Tuple					   =					Image.open("""./tests/fixtures/tests_samples/COCO/000000039769.png"""      )
 return image







@require_tf
@require_vision
class      __lowercase			(    unittest.TestCase					):

  @cached_property
  def    __lowercase       (  self		:			int    ):






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




  @slow
  def    __lowercase       (  self		:			Optional[int]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  str					   =					TFDeiTForImageClassificationWithTeacher.from_pretrained("""facebook/deit-base-distilled-patch16-224"""    )

   UpperCAmelCase__					:  Union[str, Any]					   =					self.default_image_processor
   UpperCAmelCase__					:  Optional[int]					   =					prepare_img()
   UpperCAmelCase__					:  Optional[int]					   =					image_processor(images=A					,return_tensors="""tf"""    )

   # forward pass
   UpperCAmelCase__					:  Optional[Any]					   =					model(**A    )

   # verify the logits
   UpperCAmelCase__					:  int					   =					tf.TensorShape((1, 1_000)    )
   self.assertEqual(outputs.logits.shape					,A    )

   UpperCAmelCase__					:  Any					   =					tf.constant([-1.0_2_6_6, 0.1_9_1_2, -1.2_8_6_1]    )

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








"""simple docstring"""




import argparse
import os
import re

import packaging.version


__UpperCAmelCase =				'examples/'
__UpperCAmelCase =				{
    'examples': (re.compile(r'^check_min_version\("[^"]+"\)\s*$', re.MULTILINE), 'check_min_version("VERSION")\n'),
    'init': (re.compile(r'^__version__\s+=\s+"([^"]+)"\s*$', re.MULTILINE), '__version__ = "VERSION"\n'),
    'setup': (re.compile(r'^(\s*)version\s*=\s*"[^"]+",', re.MULTILINE), r'\1version="VERSION",'),
    'doc': (re.compile(r'^(\s*)release\s*=\s*"[^"]+"$', re.MULTILINE), 'release = "VERSION"\n'),
}
__UpperCAmelCase =				{
    'init': 'src/transformers/__init__.py',
    'setup': 'setup.py',
}
__UpperCAmelCase =				'README.md'
def   lowerCAmelCase						(					__UpperCamelCase							,    __UpperCamelCase							,    __UpperCamelCase      ):
 '''simple docstring'''





 with open(__UpperCamelCase							,    """r"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  UpperCAmelCase__					:  Dict					   =					f.read()
 UpperCAmelCase__   ,      UpperCAmelCase__					:  Any					   =					REPLACE_PATTERNS[pattern]
 UpperCAmelCase__					:  List[str]					   =					replace.replace("""VERSION"""							,    __UpperCamelCase      )
 UpperCAmelCase__					:  Tuple					   =					re_pattern.sub(__UpperCamelCase							,    __UpperCamelCase      )
 with open(__UpperCamelCase							,    """w"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  f.write(__UpperCamelCase      )
def   lowerCAmelCase						(					__UpperCamelCase      ):
 '''simple docstring'''





 for folder, directories, fnames in os.walk(__UpperCamelCase      ):
  # Removing some of the folders with non-actively maintained examples from the walk
  if "research_projects" in directories:
   directories.remove("""research_projects"""      )
  if "legacy" in directories:
   directories.remove("""legacy"""      )
  for fname in fnames:
   if fname.endswith(""".py"""      ):
    update_version_in_file(os.path.join(__UpperCamelCase							,    __UpperCamelCase      )							,    __UpperCamelCase							,    pattern="""examples"""      )
def   lowerCAmelCase						(					__UpperCamelCase							,    __UpperCamelCase=False      ):
 '''simple docstring'''





 for pattern, fname in REPLACE_FILES.items():
  update_version_in_file(__UpperCamelCase							,    __UpperCamelCase							,    __UpperCamelCase      )
 if not patch:
  update_version_in_examples(__UpperCamelCase      )
def   lowerCAmelCase						(					):
 '''simple docstring'''





 UpperCAmelCase__					:  Dict					   =					"""🤗 Transformers currently provides the following architectures"""
 UpperCAmelCase__					:  Union[str, Any]					   =					"""1. Want to contribute a new model?"""
 with open(__UpperCamelCase							,    """r"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  UpperCAmelCase__					:  str					   =					f.readlines()

 # Find the start of the list.
 UpperCAmelCase__					:  List[Any]					   =					0
 while not lines[start_index].startswith(_start_prompt      ):
  start_index += 1
 start_index += 1

 UpperCAmelCase__					:  int					   =					start_index
 # Update the lines in the model list.
 while not lines[index].startswith(_end_prompt      ):
  if lines[index].startswith("""1."""      ):
   UpperCAmelCase__					:  List[Any]					   =					lines[index].replace(
       """https://huggingface.co/docs/transformers/main/model_doc"""							,    """https://huggingface.co/docs/transformers/model_doc"""							,    )
  index += 1

 with open(__UpperCamelCase							,    """w"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  f.writelines(__UpperCamelCase      )
def   lowerCAmelCase						(					):
 '''simple docstring'''





 with open(REPLACE_FILES["""init"""]							,    """r"""      ) as f:
  UpperCAmelCase__					:  Optional[Any]					   =					f.read()
 UpperCAmelCase__					:  int					   =					REPLACE_PATTERNS["""init"""][0].search(__UpperCamelCase      ).groups()[0]
 return packaging.version.parse(__UpperCamelCase      )
def   lowerCAmelCase						(					__UpperCamelCase=False      ):
 '''simple docstring'''





 UpperCAmelCase__					:  List[str]					   =					get_version()
 if patch and default_version.is_devrelease:
  raise ValueError("""Can't create a patch version from the dev branch, checkout a released version!"""      )
 if default_version.is_devrelease:
  UpperCAmelCase__					:  List[str]					   =					default_version.base_version
 elif patch:
  UpperCAmelCase__					:  Any					   =					F"{default_version.major}.{default_version.minor}.{default_version.micro + 1}"
 else:
  UpperCAmelCase__					:  Optional[Any]					   =					F"{default_version.major}.{default_version.minor + 1}.0"

 # Now let's ask nicely if that's the right one.
 UpperCAmelCase__					:  Optional[int]					   =					input(F"Which version are you releasing? [{default_version}]"      )
 if len(__UpperCamelCase      ) == 0:
  UpperCAmelCase__					:  Union[str, Any]					   =					default_version

 print(F"Updating version to {version}."      )
 global_version_update(__UpperCamelCase							,    patch=__UpperCamelCase      )
 if not patch:
  print("""Cleaning main README, don't forget to run `make fix-copies`."""      )
  clean_main_ref_in_model_list()
def   lowerCAmelCase						(					):
 '''simple docstring'''





 UpperCAmelCase__					:  Optional[Any]					   =					get_version()
 UpperCAmelCase__					:  Any					   =					F"{current_version.major}.{current_version.minor + 1}.0.dev0"
 UpperCAmelCase__					:  List[Any]					   =					current_version.base_version

 # Check with the user we got that right.
 UpperCAmelCase__					:  Dict					   =					input(F"Which version are we developing now? [{dev_version}]"      )
 if len(__UpperCamelCase      ) == 0:
  UpperCAmelCase__					:  List[Any]					   =					dev_version

 print(F"Updating version to {version}."      )
 global_version_update(__UpperCamelCase      )
 print("""Cleaning main README, don't forget to run `make fix-copies`."""      )
 clean_main_ref_in_model_list()


if __name__ == "__main__":
      __UpperCAmelCase =				argparse.ArgumentParser()
      parser.add_argument('--post_release', action='store_true', help='Whether this is pre or post release.')
      parser.add_argument('--patch', action='store_true', help='Whether or not this is a patch release.')
      __UpperCAmelCase =				parser.parse_args()
      if not args.post_release:
            pre_release_work(patch=args.patch)
      elif args.patch:
            print('Nothing to do after a patch :-)')
      else:
            post_release_work()





