"""simple docstring"""






import inspect
import unittest

from transformers import DataaVecVisionConfig
from transformers.models.auto import get_values
from transformers.testing_utils import require_torch, require_torch_multi_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, _config_zero_init, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
				import torch
				from torch import nn

				from transformers import (
				    MODEL_MAPPING,
				    DataaVecVisionForImageClassification,
				    DataaVecVisionForSemanticSegmentation,
				    DataaVecVisionModel,
				)
				from transformers.models.dataavec.modeling_dataavec_vision import DATA2VEC_VISION_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
				from PIL import Image

				from transformers import BeitImageProcessor
class   UpperCAmelCase__				:


	"""simple docstring"""







	def __init__(			self       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE=1_0_0       ,     _SCREAMING_SNAKE_CASE=1_3       ,     _SCREAMING_SNAKE_CASE=3_0       ,     _SCREAMING_SNAKE_CASE=2       ,     _SCREAMING_SNAKE_CASE=3       ,     _SCREAMING_SNAKE_CASE=True       ,     _SCREAMING_SNAKE_CASE=True       ,     _SCREAMING_SNAKE_CASE=3_2       ,     _SCREAMING_SNAKE_CASE=4       ,     _SCREAMING_SNAKE_CASE=4       ,     _SCREAMING_SNAKE_CASE=3_7       ,     _SCREAMING_SNAKE_CASE="gelu"       ,     _SCREAMING_SNAKE_CASE=0.1       ,     _SCREAMING_SNAKE_CASE=0.1       ,     _SCREAMING_SNAKE_CASE=1_0       ,     _SCREAMING_SNAKE_CASE=0.0_2       ,     _SCREAMING_SNAKE_CASE=3       ,     _SCREAMING_SNAKE_CASE=None       ,     _SCREAMING_SNAKE_CASE=[0, 1, 2, 3]       ,     )    ->	List[str]:
							a_							:			Union[str, Any]     		=					parent
							a_							:			List[Any]     		=					1_0_0
							a_							:			List[str]     		=					batch_size
							a_							:			Tuple     		=					image_size
							a_							:			Optional[Any]     		=					patch_size
							a_							:			str     		=					num_channels
							a_							:			str     		=					is_training
							a_							:			Union[str, Any]     		=					use_labels
							a_							:			List[Any]     		=					hidden_size
							a_							:			Optional[Any]     		=					num_hidden_layers
							a_							:			Tuple     		=					num_attention_heads
							a_							:			List[str]     		=					intermediate_size
							a_							:			Optional[Any]     		=					hidden_act
							a_							:			Optional[int]     		=					hidden_dropout_prob
							a_							:			List[Any]     		=					attention_probs_dropout_prob
							a_							:			str     		=					type_sequence_label_size
							a_							:			List[Any]     		=					initializer_range
							a_							:			Tuple     		=					scope
							a_							:			str     		=					out_indices
							a_							:			Optional[Any]     		=					num_labels

							# in BeiT, the seq length equals the number of patches + 1 (we add 1 for the [CLS] token)
							a_							:			List[Any]     		=					(image_size // patch_size) ** 2
							a_							:			Dict     		=					num_patches + 1







	def       A    (			self )    ->	Any:
							a_							:			int     		=					floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size] )

							a_							:			Tuple     		=					None
							a_							:			int     		=					None
							if self.use_labels:
													a_							:			List[str]     		=					ids_tensor([self.batch_size]       ,     self.type_sequence_label_size )
													a_							:			Optional[int]     		=					ids_tensor([self.batch_size, self.image_size, self.image_size]       ,     self.num_labels )

							a_							:			int     		=					self.get_config()

							return config, pixel_values, labels, pixel_labels







	def       A    (			self )    ->	Optional[int]:
							return DataaVecVisionConfig(
							    vocab_size=self.vocab_size       ,     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       ,     out_indices=self.out_indices       ,     )







	def       A    (			self       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE )    ->	List[str]:
							a_							:			Dict     		=					DataaVecVisionModel(config=_SCREAMING_SNAKE_CASE )
							model.to(_SCREAMING_SNAKE_CASE )
							model.eval()
							a_							:			List[str]     		=					model(_SCREAMING_SNAKE_CASE )
							# expected sequence length = num_patches + 1 (we add 1 for the [CLS] token)
							a_							:			Optional[int]     		=					(self.image_size // self.patch_size) ** 2
							self.parent.assertEqual(result.last_hidden_state.shape       ,     (self.batch_size, num_patches + 1, self.hidden_size) )







	def       A    (			self       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE )    ->	List[Any]:
							a_							:			int     		=					self.type_sequence_label_size
							a_							:			str     		=					DataaVecVisionForImageClassification(_SCREAMING_SNAKE_CASE )
							model.to(_SCREAMING_SNAKE_CASE )
							model.eval()
							a_							:			List[str]     		=					model(_SCREAMING_SNAKE_CASE       ,     labels=_SCREAMING_SNAKE_CASE )
							self.parent.assertEqual(result.logits.shape       ,     (self.batch_size, self.type_sequence_label_size) )







	def       A    (			self       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE )    ->	List[Any]:
							a_							:			str     		=					self.num_labels
							a_							:			Union[str, Any]     		=					DataaVecVisionForSemanticSegmentation(_SCREAMING_SNAKE_CASE )
							model.to(_SCREAMING_SNAKE_CASE )
							model.eval()
							a_							:			Any     		=					model(_SCREAMING_SNAKE_CASE )
							self.parent.assertEqual(
							    result.logits.shape       ,     (self.batch_size, self.num_labels, self.image_size * 2, self.image_size * 2) )
							a_							:			Optional[int]     		=					model(_SCREAMING_SNAKE_CASE       ,     labels=_SCREAMING_SNAKE_CASE )
							self.parent.assertEqual(
							    result.logits.shape       ,     (self.batch_size, self.num_labels, self.image_size * 2, self.image_size * 2) )







	def       A    (			self )    ->	Tuple:
							a_							:			int     		=					self.prepare_config_and_inputs()
							a_		,					a_		,					a_		,					a_							:			Union[str, Any]     		=					config_and_inputs
							a_							:			Union[str, Any]     		=					{"pixel_values": pixel_values}
							return config, inputs_dict




@require_torch
class   UpperCAmelCase__				(    __lowerCamelCase,      __lowerCamelCase,      unittest.TestCase			):


	"""simple docstring"""
	lowerCAmelCase__    :					int						      =							(
	    (DataaVecVisionModel, DataaVecVisionForImageClassification, DataaVecVisionForSemanticSegmentation)
	    if is_torch_available()
	    else ()
	)
	lowerCAmelCase__    :					Tuple						      =							(
	    {
	        """feature-extraction""": DataaVecVisionModel,
	        """image-classification""": DataaVecVisionForImageClassification,
	        """image-segmentation""": DataaVecVisionForSemanticSegmentation,
	    }
	    if is_torch_available()
	    else {}
	)

	lowerCAmelCase__    :					int						      =							False
	lowerCAmelCase__    :					str						      =							False
	lowerCAmelCase__    :					Union[str, Any]						      =							False







	def       A    (			self )    ->	Union[str, Any]:
							a_							:			int     		=					DataaVecVisionModelTester(self )
							a_							:			str     		=					ConfigTester(
							    self       ,     config_class=_SCREAMING_SNAKE_CASE       ,     has_text_modality=_SCREAMING_SNAKE_CASE       ,     hidden_size=3_7 )







	def       A    (			self )    ->	int:
							self.config_tester.run_common_tests()







	def       A    (			self )    ->	Dict:
							# Data2VecVision does not use inputs_embeds
							pass







	@require_torch_multi_gpu
	@unittest.skip(
	    reason="Data2VecVision has some layers using `add_module` which doesn't work well with `nn.DataParallel`" )
	def       A    (			self )    ->	Union[str, Any]:
							pass







	def       A    (			self )    ->	Any:
							a_		,					a_							:			Optional[Any]     		=					self.model_tester.prepare_config_and_inputs_for_common()

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







	def       A    (			self )    ->	Optional[Any]:
							a_		,					a_							:			Optional[Any]     		=					self.model_tester.prepare_config_and_inputs_for_common()

							for model_class in self.all_model_classes:
													a_							:			int     		=					model_class(_SCREAMING_SNAKE_CASE )
													a_							:			Optional[int]     		=					inspect.signature(model.forward )
													# signature.parameters is an OrderedDict => so arg_names order is deterministic
													a_							:			List[str]     		=					[*signature.parameters.keys()]

													a_							:			List[Any]     		=					["pixel_values"]
													self.assertListEqual(arg_names[:1]       ,     _SCREAMING_SNAKE_CASE )







	def       A    (			self )    ->	Optional[int]:
							a_							:			Optional[Any]     		=					self.model_tester.prepare_config_and_inputs()
							self.model_tester.create_and_check_model(*_SCREAMING_SNAKE_CASE )







	def       A    (			self )    ->	List[Any]:
							a_							:			Optional[int]     		=					self.model_tester.prepare_config_and_inputs()
							self.model_tester.create_and_check_for_image_segmentation(*_SCREAMING_SNAKE_CASE )







	def       A    (			self )    ->	Dict:
							if not self.model_tester.is_training:
													return

							a_		,					a_							:			int     		=					self.model_tester.prepare_config_and_inputs_for_common()
							a_							:			str     		=					True

							for model_class in self.all_model_classes:
													if model_class in [*get_values(_SCREAMING_SNAKE_CASE )]:
																			continue

													a_							:			List[Any]     		=					model_class(_SCREAMING_SNAKE_CASE )
													model.to(_SCREAMING_SNAKE_CASE )
													model.train()
													a_							:			Dict     		=					self._prepare_for_class(_SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     return_labels=_SCREAMING_SNAKE_CASE )
													a_							:			Optional[int]     		=					model(**_SCREAMING_SNAKE_CASE ).loss
													loss.backward()







	def       A    (			self )    ->	List[str]:
							a_		,					a_							:			Union[str, Any]     		=					self.model_tester.prepare_config_and_inputs_for_common()
							if not self.model_tester.is_training:
													return

							a_							:			str     		=					False
							a_							:			Any     		=					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
													# TODO: remove the following 3 lines once we have a MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING
													# this can then be incorporated into _prepare_for_class in test_modeling_common.py
													elif model_class.__name__ == "Data2VecVisionForSemanticSegmentation":
																			a_		,					a_		,					a_		,					a_							:			str     		=					inputs_dict["pixel_values"].shape
																			a_							:			Dict     		=					torch.zeros(
																			    [self.model_tester.batch_size, height, width]       ,     device=_SCREAMING_SNAKE_CASE ).long()
													a_							:			List[Any]     		=					model_class(_SCREAMING_SNAKE_CASE )
													model.gradient_checkpointing_enable()
													model.to(_SCREAMING_SNAKE_CASE )
													model.train()
													a_							:			Optional[Any]     		=					self._prepare_for_class(_SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     return_labels=_SCREAMING_SNAKE_CASE )
													a_							:			int     		=					model(**_SCREAMING_SNAKE_CASE ).loss
													loss.backward()







	def       A    (			self )    ->	Optional[Any]:
							a_		,					a_							:			str     		=					self.model_tester.prepare_config_and_inputs_for_common()

							a_							:			List[Any]     		=					_config_zero_init(_SCREAMING_SNAKE_CASE )
							for model_class in self.all_model_classes:
													a_							:			Optional[int]     		=					model_class(config=_SCREAMING_SNAKE_CASE )
													for name, param in model.named_parameters():
																			# we skip lambda parameters as these require special initial values
																			# determined by config.layer_scale_init_value
																			if "lambda" in name:
																									continue
																			if param.requires_grad:
																									self.assertIn(
																									    ((param.data.mean() * 1E9).round() / 1E9).item()       ,     [0.0, 1.0]       ,     msg=f'''Parameter {name} of model {model_class} seems not properly initialized'''       ,     )







	def       A    (			self       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE=2E-4       ,     _SCREAMING_SNAKE_CASE="outputs"       ,     _SCREAMING_SNAKE_CASE=None )    ->	Tuple:
							# We override with a slightly higher tol value, as semseg models tend to diverge a bit more
							super().check_pt_tf_outputs(_SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE       ,     _SCREAMING_SNAKE_CASE )







	def       A    (			self )    ->	int:
							a_							:			Optional[Any]     		=					self.model_tester.prepare_config_and_inputs()
							self.model_tester.create_and_check_for_image_classification(*_SCREAMING_SNAKE_CASE )







	@slow
	def       A    (			self )    ->	Optional[int]:
							for model_name in DATA2VEC_VISION_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
													a_							:			Tuple     		=					DataaVecVisionModel.from_pretrained(_SCREAMING_SNAKE_CASE )
													self.assertIsNotNone(_SCREAMING_SNAKE_CASE )




def  lowerCAmelCase_      ()				-> List[Any]:
						a_							:			Optional[Any]     		=					Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png"  )
						return image



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


	"""simple docstring"""







	@cached_property
	def       A    (			self )    ->	Tuple:
							return (
							    BeitImageProcessor.from_pretrained("facebook/data2vec-vision-base-ft1k" ) if is_vision_available() else None
							)







	@slow
	def       A    (			self )    ->	Optional[Any]:
							a_							:			Any     		=					DataaVecVisionForImageClassification.from_pretrained("facebook/data2vec-vision-base-ft1k" ).to(
							    _SCREAMING_SNAKE_CASE )

							a_							:			Any     		=					self.default_image_processor
							a_							:			Dict     		=					prepare_img()
							a_							:			List[Any]     		=					image_processor(images=_SCREAMING_SNAKE_CASE       ,     return_tensors="pt" ).to(_SCREAMING_SNAKE_CASE )

							# forward pass
							with torch.no_grad():
													a_							:			Optional[Any]     		=					model(**_SCREAMING_SNAKE_CASE )
							a_							:			int     		=					outputs.logits

							# verify the logits
							a_							:			Union[str, Any]     		=					torch.Size((1, 1_0_0_0) )
							self.assertEqual(logits.shape       ,     _SCREAMING_SNAKE_CASE )

							a_							:			Tuple     		=					torch.tensor([0.3_2_7_7, -0.1_3_9_5, 0.0_9_1_1] ).to(_SCREAMING_SNAKE_CASE )

							self.assertTrue(torch.allclose(logits[0, :3]       ,     _SCREAMING_SNAKE_CASE       ,     atol=1E-4 ) )

							a_							:			List[str]     		=					[model.config.labelaid[i] for i in ["remote control, remote", "tabby, tabby cat"]]
							self.assertEqual(logits[0].topk(2 ).indices.cpu().tolist()       ,     _SCREAMING_SNAKE_CASE )





"""simple docstring"""






def  lowerCAmelCase_      (_SCREAMING_SNAKE_CASE	:str  )				-> int:
						a_							:			Optional[int]     		=					0
						for letter in data:
												a_							:			Union[str, Any]     		=					(hash_ << 4) + ord(_SCREAMING_SNAKE_CASE  )
												a_							:			Optional[int]     		=					hash_ & 0xf000_0000
												if x != 0:
																		hash_ ^= x >> 24
												hash_ &= ~x
						return hash_


if __name__ == "__main__":
				import doctest

				doctest.testmod()




