






"""simple docstring"""





from __future__ import annotations

import inspect
import unittest

from transformers import ViTConfig
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 TFViTForImageClassification, TFViTModel


if is_vision_available():
						from PIL import Image

						from transformers import ViTImageProcessor





class        _lowerCamelCase      :


						def __init__(self   ,							__a   ,							__a=13   ,							__a=30   ,							__a=2   ,							__a=3   ,							__a=True   ,							__a=True   ,							__a=32   ,							__a=2   ,							__a=4   ,							__a=37   ,							__a="gelu"   ,							__a=0.1   ,							__a=0.1   ,							__a=10   ,							__a=0.02   ,							__a=3   ,							__a=None   ,							) ->   int:
								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

								# in ViT, the seq length equals the number of patches + 1 (we add 1 for the [CLS] token)
								UpperCamelCase   =	(image_size // patch_size) ** 2
								UpperCamelCase   =	num_patches + 1


						def     snake_case_   (self		) ->   Optional[Any]:
								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     snake_case_   (self		) ->   List[str]:
								return ViTConfig(
								    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   ,							)


						def     snake_case_   (self   ,							__a   ,							__a   ,							__a		) ->   Tuple:
								UpperCamelCase   =	TFViTModel(config=__A		)
								UpperCamelCase   =	model(__A   ,							training=__A		)
								self.parent.assertEqual(result.last_hidden_state.shape   ,							(self.batch_size, self.seq_length, self.hidden_size)		)

								# Test with an image with different size than the one specified in config.
								UpperCamelCase   =	self.image_size // 2
								UpperCamelCase   =	pixel_values[:, :, :image_size, :image_size]
								UpperCamelCase   =	model(__A   ,							interpolate_pos_encoding=__A   ,							training=__A		)
								UpperCamelCase   =	(image_size // self.patch_size) ** 2 + 1
								self.parent.assertEqual(result.last_hidden_state.shape   ,							(self.batch_size, seq_length, self.hidden_size)		)


						def     snake_case_   (self   ,							__a   ,							__a   ,							__a		) ->   Optional[Any]:
								UpperCamelCase   =	self.type_sequence_label_size
								UpperCamelCase   =	TFViTForImageClassification(__A		)
								UpperCamelCase   =	model(__A   ,							labels=__A   ,							training=__A		)
								self.parent.assertEqual(result.logits.shape   ,							(self.batch_size, self.type_sequence_label_size)		)

								# Test with an image with different size than the one specified in config.
								UpperCamelCase   =	self.image_size // 2
								UpperCamelCase   =	pixel_values[:, :, :image_size, :image_size]
								UpperCamelCase   =	model(__A   ,							interpolate_pos_encoding=__A   ,							training=__A		)
								self.parent.assertEqual(result.logits.shape   ,							(self.batch_size, self.type_sequence_label_size)		)

								# test greyscale images
								UpperCamelCase   =	1
								UpperCamelCase   =	TFViTForImageClassification(__A		)
								UpperCamelCase   =	floats_tensor([self.batch_size, 1, self.image_size, self.image_size]		)
								UpperCamelCase   =	model(__A		)
								self.parent.assertEqual(result.logits.shape   ,							(self.batch_size, self.type_sequence_label_size)		)




						def     snake_case_   (self		) ->   str:
								UpperCamelCase   =	self.prepare_config_and_inputs()
								UpperCamelCase   =	config_and_inputs
								UpperCamelCase   =	{"pixel_values": pixel_values}
								return config, inputs_dict





@require_tf
class        _lowerCamelCase      (       UpperCamelCase_  ,			UpperCamelCase_  ,			unittest.TestCase ):
						UpperCAmelCase_ =			(TFViTModel, TFViTForImageClassification) if is_tf_available() else ()
						UpperCAmelCase_ =			(
						    {"feature-extraction": TFViTModel, "image-classification": TFViTForImageClassification}
						    if is_tf_available()
						    else {}
						)

						UpperCAmelCase_ =			False
						UpperCAmelCase_ =			False
						UpperCAmelCase_ =			False


						def     snake_case_   (self		) ->   Tuple:
								UpperCamelCase   =	TFViTModelTester(self		)
								UpperCamelCase   =	ConfigTester(self   ,							config_class=__A   ,							has_text_modality=__A   ,							hidden_size=37		)


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


						@unittest.skip(reason="ViT does not use inputs_embeds"		)
						def     snake_case_   (self		) ->   Dict:
								pass


						@unittest.skip(reason="ViT does not use inputs_embeds"		)
						def     snake_case_   (self		) ->   Dict:
								pass


						def     snake_case_   (self		) ->   str:
								UpperCamelCase   =	self.model_tester.prepare_config_and_inputs_for_common()

								for model_class in self.all_model_classes:
										UpperCamelCase   =	model_class(__A		)
										self.assertIsInstance(model.get_input_embeddings()   ,							(tf.keras.layers.Layer)		)
										UpperCamelCase   =	model.get_output_embeddings()
										self.assertTrue(x is None or isinstance(__A   ,							tf.keras.layers.Layer		)		)


						def     snake_case_   (self		) ->   Optional[Any]:
								UpperCamelCase   =	self.model_tester.prepare_config_and_inputs_for_common()

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

										UpperCamelCase   =	["pixel_values"]
										self.assertListEqual(arg_names[:1]   ,							__A		)


						def     snake_case_   (self		) ->   List[Any]:
								UpperCamelCase   =	self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_model(*__A		)


						def     snake_case_   (self		) ->   Optional[Any]:
								UpperCamelCase   =	self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_for_image_classification(*__A		)




						@slow
						def     snake_case_   (self		) ->   Dict:
								UpperCamelCase   =	TFViTModel.from_pretrained("google/vit-base-patch16-224"		)
								self.assertIsNotNone(__A		)



def       a__					(					):




		"""simple docstring"""


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






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


						@cached_property
						def     snake_case_   (self		) ->   Union[str, Any]:
								return ViTImageProcessor.from_pretrained("google/vit-base-patch16-224"		) if is_vision_available() else None




						@slow
						def     snake_case_   (self		) ->   Union[str, Any]:
								UpperCamelCase   =	TFViTForImageClassification.from_pretrained("google/vit-base-patch16-224"		)

								UpperCamelCase   =	self.default_image_processor
								UpperCamelCase   =	prepare_img()
								UpperCamelCase   =	image_processor(images=__A   ,							return_tensors="tf"		)

								# forward pass
								UpperCamelCase   =	model(**__A		)

								# verify the logits
								UpperCamelCase   =	tf.TensorShape((1, 10_00)		)
								self.assertEqual(outputs.logits.shape   ,							__A		)

								UpperCamelCase   =	tf.constant([-0.2744, 0.8215, -0.0836]		)

								tf.debugging.assert_near(outputs.logits[0, :3]   ,							__A   ,							atol=1e-4		)













"""simple docstring"""





def       a__					(					_SCREAMING_SNAKE_CASE    ):




		"""simple docstring"""


		return number & 1 == 0


if __name__ == "__main__":
						import doctest

						doctest.testmod()






