


"""simple docstring"""
import collections
import inspect
import unittest

from transformers import FocalNetConfig
from transformers.testing_utils import require_torch, require_vision, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_vision_available

from ...test_backbone_common import BackboneTesterMixin
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 (
			    FocalNetBackbone,
			    FocalNetForImageClassification,
			    FocalNetForMaskedImageModeling,
			    FocalNetModel,
			)
			from transformers.models.focalnet.modeling_focalnet import FOCALNET_PRETRAINED_MODEL_ARCHIVE_LIST

if is_vision_available():
			from PIL import Image

			from transformers import AutoImageProcessor



class 			_UpperCAmelCase :






		'''simple docstring'''

		def __init__(self				,       a_				,       a_=13				,       a_=32				,       a_=2				,       a_=3				,       a_=16				,       a_=[32, 64, 1_28]				,       a_=[1, 2, 1]				,       a_=[2, 2, 4]				,       a_=2				,       a_=2.0				,       a_=True				,       a_=0.0				,       a_=0.0				,       a_=0.1				,       a_="gelu"				,       a_=False				,       a_=True				,       a_=0.02				,       a_=1E-5				,       a_=True				,       a_=None				,       a_=True				,       a_=10				,       a_=8				,       a_=["stage1", "stage2"]				,       a_=[1, 2]				,       ):





			'''simple docstring'''

			__snake_case	:						Any						=				parent
			__snake_case	:						Any						=				batch_size
			__snake_case	:						str						=				image_size
			__snake_case	:						int						=				patch_size
			__snake_case	:						Optional[int]						=				num_channels
			__snake_case	:						Tuple						=				embed_dim
			__snake_case	:						Tuple						=				hidden_sizes
			__snake_case	:						Tuple						=				depths
			__snake_case	:						str						=				num_heads
			__snake_case	:						Optional[int]						=				window_size
			__snake_case	:						Optional[Any]						=				mlp_ratio
			__snake_case	:						Any						=				qkv_bias
			__snake_case	:						Optional[Any]						=				hidden_dropout_prob
			__snake_case	:						Any						=				attention_probs_dropout_prob
			__snake_case	:						int						=				drop_path_rate
			__snake_case	:						List[str]						=				hidden_act
			__snake_case	:						Dict						=				use_absolute_embeddings
			__snake_case	:						Any						=				patch_norm
			__snake_case	:						Tuple						=				layer_norm_eps
			__snake_case	:						int						=				initializer_range
			__snake_case	:						Tuple						=				is_training
			__snake_case	:						Tuple						=				scope
			__snake_case	:						List[Any]						=				use_labels
			__snake_case	:						Dict						=				type_sequence_label_size
			__snake_case	:						Any						=				encoder_stride
			__snake_case	:						List[Any]						=				out_features
			__snake_case	:						List[Any]						=				out_indices



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[Any]						=				floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]					)

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

			__snake_case	:						Optional[int]						=				self.get_config()

			return config, pixel_values, labels



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return FocalNetConfig(
			    image_size=self.image_size				,       patch_size=self.patch_size				,       num_channels=self.num_channels				,       embed_dim=self.embed_dim				,       hidden_sizes=self.hidden_sizes				,       depths=self.depths				,       num_heads=self.num_heads				,       window_size=self.window_size				,       mlp_ratio=self.mlp_ratio				,       qkv_bias=self.qkv_bias				,       hidden_dropout_prob=self.hidden_dropout_prob				,       attention_probs_dropout_prob=self.attention_probs_dropout_prob				,       drop_path_rate=self.drop_path_rate				,       hidden_act=self.hidden_act				,       use_absolute_embeddings=self.use_absolute_embeddings				,       path_norm=self.patch_norm				,       layer_norm_eps=self.layer_norm_eps				,       initializer_range=self.initializer_range				,       encoder_stride=self.encoder_stride				,       out_features=self.out_features				,       out_indices=self.out_indices				,       )



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_					):





			'''simple docstring'''

			__snake_case	:						str						=				FocalNetModel(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						Tuple						=				model(a_					)

			__snake_case	:						List[Any]						=				((config.image_size // config.patch_size) ** 2) // (4 ** (len(config.depths					) - 1))
			__snake_case	:						Dict						=				int(config.embed_dim * 2 ** (len(config.depths					) - 1)					)

			self.parent.assertEqual(result.last_hidden_state.shape				,       (self.batch_size, expected_seq_len, expected_dim)					)



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_					):





			'''simple docstring'''

			__snake_case	:						Union[str, Any]						=				FocalNetBackbone(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						List[str]						=				model(a_					)

			# verify feature maps
			self.parent.assertEqual(len(result.feature_maps					)				,       len(config.out_features					)					)
			self.parent.assertListEqual(list(result.feature_maps[0].shape					)				,       [self.batch_size, self.image_size, 8, 8]					)

			# verify channels
			self.parent.assertEqual(len(model.channels					)				,       len(config.out_features					)					)
			self.parent.assertListEqual(model.channels				,       config.hidden_sizes[:-1]					)

			# verify backbone works with out_features=None
			__snake_case	:						Tuple						=				None
			__snake_case	:						List[str]						=				FocalNetBackbone(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						str						=				model(a_					)

			# verify feature maps
			self.parent.assertEqual(len(result.feature_maps					)				,       1					)
			self.parent.assertListEqual(list(result.feature_maps[0].shape					)				,       [self.batch_size, self.image_size * 2, 4, 4]					)

			# verify channels
			self.parent.assertEqual(len(model.channels					)				,       1					)
			self.parent.assertListEqual(model.channels				,       [config.hidden_sizes[-1]]					)



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_					):





			'''simple docstring'''

			__snake_case	:						List[str]						=				FocalNetForMaskedImageModeling(config=a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						List[Any]						=				model(a_					)
			self.parent.assertEqual(
			    result.reconstruction.shape				,       (self.batch_size, self.num_channels, self.image_size, self.image_size)					)

			# test greyscale images
			__snake_case	:						str						=				1
			__snake_case	:						List[Any]						=				FocalNetForMaskedImageModeling(a_					)
			model.to(a_					)
			model.eval()

			__snake_case	:						Any						=				floats_tensor([self.batch_size, 1, self.image_size, self.image_size]					)
			__snake_case	:						int						=				model(a_					)
			self.parent.assertEqual(result.reconstruction.shape				,       (self.batch_size, 1, self.image_size, self.image_size)					)



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_					):





			'''simple docstring'''

			__snake_case	:						List[Any]						=				self.type_sequence_label_size
			__snake_case	:						Dict						=				FocalNetForImageClassification(a_					)
			model.to(a_					)
			model.eval()
			__snake_case	:						Optional[int]						=				model(a_				,       labels=a_					)
			self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.type_sequence_label_size)					)

			# test greyscale images
			__snake_case	:						List[str]						=				1
			__snake_case	:						Tuple						=				FocalNetForImageClassification(a_					)
			model.to(a_					)
			model.eval()

			__snake_case	:						Tuple						=				floats_tensor([self.batch_size, 1, self.image_size, self.image_size]					)
			__snake_case	:						Union[str, Any]						=				model(a_					)
			self.parent.assertEqual(result.logits.shape				,       (self.batch_size, self.type_sequence_label_size)					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Any						=				self.prepare_config_and_inputs()

			__snake_case	,							__snake_case	,							__snake_case	:						Dict						=				config_and_inputs
			__snake_case	:						Union[str, Any]						=				{'''pixel_values''': pixel_values}
			return config, inputs_dict



@require_torch
class 			_UpperCAmelCase (							__snake_case,				__snake_case,				unittest.TestCase				):






		'''simple docstring'''

		lowerCamelCase__				=(
		    (
		        FocalNetModel,
		        FocalNetForImageClassification,
		        FocalNetForMaskedImageModeling,
		        FocalNetBackbone,
		    )
		    if is_torch_available()
		    else ()
		)
		lowerCamelCase__				=(
		    {'feature-extraction': FocalNetModel, 'image-classification': FocalNetForImageClassification}
		    if is_torch_available()
		    else {}
		)
		lowerCamelCase__				=False

		lowerCamelCase__				=False
		lowerCamelCase__				=False
		lowerCamelCase__				=False
		lowerCamelCase__				=False



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Dict						=				FocalNetModelTester(self					)
			__snake_case	:						Dict						=				ConfigTester(self				,       config_class=a_				,       embed_dim=37				,       has_text_modality=a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			self.create_and_test_config_common_properties()
			self.config_tester.create_and_test_config_to_json_string()
			self.config_tester.create_and_test_config_to_json_file()
			self.config_tester.create_and_test_config_from_and_save_pretrained()
			self.config_tester.create_and_test_config_with_num_labels()
			self.config_tester.check_config_can_be_init_without_params()
			self.config_tester.check_config_arguments_init()



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Any						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_model(*a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Any						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_backbone(*a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[str]						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_for_masked_image_modeling(*a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[Any]						=				self.model_tester.prepare_config_and_inputs()
			self.model_tester.create_and_check_for_image_classification(*a_					)



		@unittest.skip(reason='''FocalNet does not use inputs_embeds'''					)
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			pass



		@unittest.skip(reason='''FocalNet does not use feedforward chunking'''					)
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			pass



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	,							__snake_case	:						str						=				self.model_tester.prepare_config_and_inputs_for_common()

			for model_class in self.all_model_classes[:-1]:
				__snake_case	:						List[Any]						=				model_class(a_					)
				self.assertIsInstance(model.get_input_embeddings()				,       (nn.Module)					)
				__snake_case	:						Dict						=				model.get_output_embeddings()
				self.assertTrue(x is None or isinstance(a_				,       nn.Linear					)					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	,							__snake_case	:						Union[str, Any]						=				self.model_tester.prepare_config_and_inputs_for_common()

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

				__snake_case	:						List[str]						=				['''pixel_values''']
				self.assertListEqual(arg_names[:1]				,       a_					)



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_				,       a_				,       a_					):





			'''simple docstring'''

			__snake_case	:						Tuple						=				model_class(a_					)
			model.to(a_					)
			model.eval()

			with torch.no_grad():
				__snake_case	:						Dict						=				model(**self._prepare_for_class(a_				,       a_					)					)

			__snake_case	:						Union[str, Any]						=				outputs.hidden_states

			__snake_case	:						Optional[Any]						=				getattr(
			    self.model_tester				,       '''expected_num_hidden_layers'''				,       len(self.model_tester.depths					) + 1					)
			self.assertEqual(len(a_					)				,       a_					)

			# FocalNet has a different seq_length
			__snake_case	:						List[str]						=				(
			    config.patch_size
			    if isinstance(config.patch_size				,       collections.abc.Iterable					)
			    else (config.patch_size, config.patch_size)
			)

			__snake_case	:						str						=				(image_size[1] // patch_size[1]) * (image_size[0] // patch_size[0])

			self.assertListEqual(
			    list(hidden_states[0].shape[-2:]					)				,       [num_patches, self.model_tester.embed_dim]				,       )

			__snake_case	:						List[Any]						=				outputs.reshaped_hidden_states
			self.assertEqual(len(a_					)				,       a_					)

			__snake_case	,							__snake_case	,							__snake_case	,							__snake_case	:						List[Any]						=				reshaped_hidden_states[0].shape
			__snake_case	:						Any						=				(
			    reshaped_hidden_states[0].view(a_				,       a_				,       height * width					).permute(0				,       2				,       1					)
			)
			self.assertListEqual(
			    list(reshaped_hidden_states.shape[-2:]					)				,       [num_patches, self.model_tester.embed_dim]				,       )



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	,							__snake_case	:						Dict						=				self.model_tester.prepare_config_and_inputs_for_common()

			__snake_case	:						Optional[Any]						=				(
			    self.model_tester.image_size
			    if isinstance(self.model_tester.image_size				,       collections.abc.Iterable					)
			    else (self.model_tester.image_size, self.model_tester.image_size)
			)

			for model_class in self.all_model_classes[:-1]:
				__snake_case	:						str						=				True
				self.check_hidden_states_output(a_				,       a_				,       a_				,       a_					)

				# check that output_hidden_states also work using config
				del inputs_dict["output_hidden_states"]
				__snake_case	:						Tuple						=				True

				self.check_hidden_states_output(a_				,       a_				,       a_				,       a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	,							__snake_case	:						Dict						=				self.model_tester.prepare_config_and_inputs_for_common()
			__snake_case	:						str						=				3

			__snake_case	:						int						=				(
			    self.model_tester.image_size
			    if isinstance(self.model_tester.image_size				,       collections.abc.Iterable					)
			    else (self.model_tester.image_size, self.model_tester.image_size)
			)
			__snake_case	:						Optional[Any]						=				(
			    config.patch_size
			    if isinstance(config.patch_size				,       collections.abc.Iterable					)
			    else (config.patch_size, config.patch_size)
			)

			__snake_case	:						Tuple						=				image_size[0] + patch_size[0] - (image_size[0] % patch_size[0])
			__snake_case	:						str						=				image_size[1] + patch_size[1] - (image_size[1] % patch_size[1])

			for model_class in self.all_model_classes[:-1]:
				__snake_case	:						List[str]						=				True
				self.check_hidden_states_output(a_				,       a_				,       a_				,       (padded_height, padded_width)					)

				# check that output_hidden_states also work using config
				del inputs_dict["output_hidden_states"]
				__snake_case	:						List[str]						=				True
				self.check_hidden_states_output(a_				,       a_				,       a_				,       (padded_height, padded_width)					)



		@slow
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			for model_name in FOCALNET_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
				__snake_case	:						Any						=				FocalNetModel.from_pretrained(a_					)
				self.assertIsNotNone(a_					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	,							__snake_case	:						Tuple						=				self.model_tester.prepare_config_and_inputs_for_common()

			__snake_case	:						Union[str, Any]						=				_config_zero_init(a_					)
			for model_class in self.all_model_classes:
				__snake_case	:						Union[str, Any]						=				model_class(config=a_					)
				for name, param in model.named_parameters():
					if "embeddings" not in name and 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"""				,       )



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






		'''simple docstring'''

		@cached_property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return AutoImageProcessor.from_pretrained('''microsoft/focalnet-tiny'''					) if is_vision_available() else None



		@slow
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Optional[int]						=				FocalNetForImageClassification.from_pretrained('''microsoft/focalnet-tiny'''					).to(a_					)
			__snake_case	:						Optional[Any]						=				self.default_image_processor

			__snake_case	:						Any						=				Image.open('''./tests/fixtures/tests_samples/COCO/000000039769.png'''					)
			__snake_case	:						Optional[int]						=				image_processor(images=a_				,       return_tensors='''pt'''					).to(a_					)

			# forward pass
			with torch.no_grad():
				__snake_case	:						Dict						=				model(**a_					)

			# verify the logits
			__snake_case	:						List[str]						=				torch.Size((1, 10_00)					)
			self.assertEqual(outputs.logits.shape				,       a_					)
			__snake_case	:						Optional[Any]						=				torch.tensor([0.2166, -0.4368, 0.2191]					).to(a_					)
			self.assertTrue(torch.allclose(outputs.logits[0, :3]				,       a_				,       atol=1E-4					)					)
			self.assertTrue(outputs.logits.argmax(dim=-1					).item()				,       2_81					)



@require_torch
class 			_UpperCAmelCase (							__snake_case,				unittest.TestCase				):






		'''simple docstring'''

		lowerCamelCase__				=(FocalNetBackbone,) if is_torch_available() else ()
		lowerCamelCase__				=FocalNetConfig

		lowerCamelCase__				=False



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[str]						=				FocalNetModelTester(self					)









'''simple docstring'''






def 				UpperCamelCase_			(    A__					:   str							,    A__					:   list[str]					):
  '''simple docstring'''





  lowerCAmelCase_			:      Dict			=   """"""
  for word_or_phrase in separated:
    if not isinstance(A__							,    A__					):
      raise Exception("""join() accepts only strings to be joined"""					)
    joined += word_or_phrase + separator
  return joined.strip(A__					)


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

  testmod()



