


import collections
import inspect
import unittest

from transformers import NatConfig
from transformers.testing_utils import require_natten, 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 NatBackbone, NatForImageClassification, NatModel
							from transformers.models.nat.modeling_nat import NAT_PRETRAINED_MODEL_ARCHIVE_LIST

if is_vision_available():
							from PIL import Image

							from transformers import AutoImageProcessor



class    __lowercase  :

							"""simple docstring"""


							def __init__(    self				, A_				, A_=13				, A_=64				, A_=4				, A_=3				, A_=16				, A_=[1, 2, 1]				, A_=[2, 4, 8]				, A_=3				, A_=2.0				, A_=True				, A_=0.0				, A_=0.0				, A_=0.1				, A_="gelu"				, A_=True				, A_=0.02				, A_=1e-5				, A_=True				, A_=None				, A_=True				, A_=10				, A_=["stage1", "stage2"]				, A_=[1, 2]				, )->	int:
											_SCREAMING_SNAKE_CASE      = parent
											_SCREAMING_SNAKE_CASE      = batch_size
											_SCREAMING_SNAKE_CASE      = image_size
											_SCREAMING_SNAKE_CASE      = patch_size
											_SCREAMING_SNAKE_CASE      = num_channels
											_SCREAMING_SNAKE_CASE      = embed_dim
											_SCREAMING_SNAKE_CASE      = depths
											_SCREAMING_SNAKE_CASE      = num_heads
											_SCREAMING_SNAKE_CASE      = kernel_size
											_SCREAMING_SNAKE_CASE      = mlp_ratio
											_SCREAMING_SNAKE_CASE      = qkv_bias
											_SCREAMING_SNAKE_CASE      = hidden_dropout_prob
											_SCREAMING_SNAKE_CASE      = attention_probs_dropout_prob
											_SCREAMING_SNAKE_CASE      = drop_path_rate
											_SCREAMING_SNAKE_CASE      = hidden_act
											_SCREAMING_SNAKE_CASE      = patch_norm
											_SCREAMING_SNAKE_CASE      = layer_norm_eps
											_SCREAMING_SNAKE_CASE      = initializer_range
											_SCREAMING_SNAKE_CASE      = is_training
											_SCREAMING_SNAKE_CASE      = scope
											_SCREAMING_SNAKE_CASE      = use_labels
											_SCREAMING_SNAKE_CASE      = num_labels
											_SCREAMING_SNAKE_CASE      = out_features
											_SCREAMING_SNAKE_CASE      = out_indices





							def 		__magic_name__			(    self	)->	Optional[Any]:
											_SCREAMING_SNAKE_CASE      = floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]	)

											_SCREAMING_SNAKE_CASE      = None
											if self.use_labels:
															_SCREAMING_SNAKE_CASE      = ids_tensor([self.batch_size]				, self.num_labels	)

											_SCREAMING_SNAKE_CASE      = self.get_config()

											return config, pixel_values, labels





							def 		__magic_name__			(    self	)->	Optional[Any]:
											return NatConfig(
											    num_labels=self.num_labels				, image_size=self.image_size				, patch_size=self.patch_size				, num_channels=self.num_channels				, embed_dim=self.embed_dim				, depths=self.depths				, num_heads=self.num_heads				, kernel_size=self.kernel_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				, patch_norm=self.patch_norm				, layer_norm_eps=self.layer_norm_eps				, initializer_range=self.initializer_range				, out_features=self.out_features				, out_indices=self.out_indices				, )





							def 		__magic_name__			(    self				, A_				, A_				, A_	)->	Optional[Any]:
											_SCREAMING_SNAKE_CASE      = NatModel(config=A_	)
											model.to(A_	)
											model.eval()
											_SCREAMING_SNAKE_CASE      = model(A_	)

											_SCREAMING_SNAKE_CASE      = _SCREAMING_SNAKE_CASE      = (config.image_size // config.patch_size) // (2 ** (len(config.depths	) - 1))
											_SCREAMING_SNAKE_CASE      = int(config.embed_dim * 2 ** (len(config.depths	) - 1)	)

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





							def 		__magic_name__			(    self				, A_				, A_				, A_	)->	List[Any]:
											_SCREAMING_SNAKE_CASE      = NatForImageClassification(A_	)
											model.to(A_	)
											model.eval()
											_SCREAMING_SNAKE_CASE      = model(A_				, labels=A_	)
											self.parent.assertEqual(result.logits.shape				, (self.batch_size, self.num_labels)	)

											# test greyscale images
											_SCREAMING_SNAKE_CASE      = 1
											_SCREAMING_SNAKE_CASE      = NatForImageClassification(A_	)
											model.to(A_	)
											model.eval()

											_SCREAMING_SNAKE_CASE      = floats_tensor([self.batch_size, 1, self.image_size, self.image_size]	)
											_SCREAMING_SNAKE_CASE      = model(A_	)
											self.parent.assertEqual(result.logits.shape				, (self.batch_size, self.num_labels)	)





							def 		__magic_name__			(    self				, A_				, A_				, A_	)->	int:
											_SCREAMING_SNAKE_CASE      = NatBackbone(config=A_	)
											model.to(A_	)
											model.eval()
											_SCREAMING_SNAKE_CASE      = model(A_	)

											# verify hidden states
											self.parent.assertEqual(len(result.feature_maps	)				, len(config.out_features	)	)
											self.parent.assertListEqual(list(result.feature_maps[0].shape	)				, [self.batch_size, model.channels[0], 16, 16]	)

											# verify channels
											self.parent.assertEqual(len(model.channels	)				, len(config.out_features	)	)

											# verify backbone works with out_features=None
											_SCREAMING_SNAKE_CASE      = None
											_SCREAMING_SNAKE_CASE      = NatBackbone(config=A_	)
											model.to(A_	)
											model.eval()
											_SCREAMING_SNAKE_CASE      = 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, model.channels[-1], 4, 4]	)

											# verify channels
											self.parent.assertEqual(len(model.channels	)				, 1	)





							def 		__magic_name__			(    self	)->	Dict:
											_SCREAMING_SNAKE_CASE      = self.prepare_config_and_inputs()
											_SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      = config_and_inputs
											_SCREAMING_SNAKE_CASE      = {'pixel_values': pixel_values}
											return config, inputs_dict







@require_natten
@require_torch
class    __lowercase  (       UpperCamelCase      ,     UpperCamelCase      ,     unittest.TestCase							):

							"""simple docstring"""


							SCREAMING_SNAKE_CASE   :					Tuple        =						(
							    (
							        NatModel,
							        NatForImageClassification,
							        NatBackbone,
							    )
							    if is_torch_available()
							    else ()
							)
							SCREAMING_SNAKE_CASE   :					Any        =						(
							    {"feature-extraction": NatModel, "image-classification": NatForImageClassification}
							    if is_torch_available()
							    else {}
							)
							SCREAMING_SNAKE_CASE   :					Union[str, Any]        =						False

							SCREAMING_SNAKE_CASE   :					List[Any]        =						False
							SCREAMING_SNAKE_CASE   :					Any        =						False
							SCREAMING_SNAKE_CASE   :					Union[str, Any]        =						False
							SCREAMING_SNAKE_CASE   :					List[str]        =						False





							def 		__magic_name__			(    self	)->	List[str]:
											_SCREAMING_SNAKE_CASE      = NatModelTester(self	)
											_SCREAMING_SNAKE_CASE      = ConfigTester(self				, config_class=A_				, embed_dim=37	)





							def 		__magic_name__			(    self	)->	str:
											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 		__magic_name__			(    self	)->	Optional[int]:
											return





							def 		__magic_name__			(    self	)->	int:
											_SCREAMING_SNAKE_CASE      = self.model_tester.prepare_config_and_inputs()
											self.model_tester.create_and_check_model(*A_	)





							def 		__magic_name__			(    self	)->	Optional[Any]:
											_SCREAMING_SNAKE_CASE      = self.model_tester.prepare_config_and_inputs()
											self.model_tester.create_and_check_for_image_classification(*A_	)





							def 		__magic_name__			(    self	)->	Dict:
											_SCREAMING_SNAKE_CASE      = self.model_tester.prepare_config_and_inputs()
											self.model_tester.create_and_check_backbone(*A_	)





							@unittest.skip(reason='Nat does not use inputs_embeds'	)
							def 		__magic_name__			(    self	)->	str:
											pass





							@unittest.skip(reason='Nat does not use feedforward chunking'	)
							def 		__magic_name__			(    self	)->	List[str]:
											pass





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

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





							def 		__magic_name__			(    self	)->	Tuple:
											_SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      = self.model_tester.prepare_config_and_inputs_for_common()

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

															_SCREAMING_SNAKE_CASE      = ['pixel_values']
															self.assertListEqual(arg_names[:1]				, A_	)





							def 		__magic_name__			(    self	)->	List[str]:
											self.skipTest('Nat\'s attention operation is handled entirely by NATTEN.'	)





							def 		__magic_name__			(    self				, A_				, A_				, A_				, A_	)->	List[str]:
											_SCREAMING_SNAKE_CASE      = model_class(A_	)
											model.to(A_	)
											model.eval()

											with torch.no_grad():
															_SCREAMING_SNAKE_CASE      = model(**self._prepare_for_class(A_				, A_	)	)

											_SCREAMING_SNAKE_CASE      = outputs.hidden_states

											_SCREAMING_SNAKE_CASE      = getattr(
											    self.model_tester				, 'expected_num_hidden_layers'				, len(self.model_tester.depths	) + 1	)
											self.assertEqual(len(A_	)				, A_	)

											# Nat has a different seq_length
											_SCREAMING_SNAKE_CASE      = (
											    config.patch_size
											    if isinstance(config.patch_size				, collections.abc.Iterable	)
											    else (config.patch_size, config.patch_size)
											)

											_SCREAMING_SNAKE_CASE      = image_size[0] // patch_size[0]
											_SCREAMING_SNAKE_CASE      = image_size[1] // patch_size[1]

											self.assertListEqual(
											    list(hidden_states[0].shape[-3:]	)				, [height, width, self.model_tester.embed_dim]				, )

											if model_class.__name__ != "NatBackbone":
															_SCREAMING_SNAKE_CASE      = outputs.reshaped_hidden_states
															self.assertEqual(len(A_	)				, A_	)

															_SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      = reshaped_hidden_states[0].shape
															_SCREAMING_SNAKE_CASE      = (
															    reshaped_hidden_states[0].view(A_				, A_				, A_				, A_	).permute(0				, 2				, 3				, 1	)
															)
															self.assertListEqual(
															    list(reshaped_hidden_states.shape[-3:]	)				, [height, width, self.model_tester.embed_dim]				, )





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

											_SCREAMING_SNAKE_CASE      = (
											    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:
															_SCREAMING_SNAKE_CASE      = 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"]
															_SCREAMING_SNAKE_CASE      = True

															self.check_hidden_states_output(A_				, A_				, A_				, A_	)





							@slow
							def 		__magic_name__			(    self	)->	Optional[int]:
											for model_name in NAT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
															_SCREAMING_SNAKE_CASE      = NatModel.from_pretrained(A_	)
															self.assertIsNotNone(A_	)





							def 		__magic_name__			(    self	)->	List[Any]:
											_SCREAMING_SNAKE_CASE      ,      _SCREAMING_SNAKE_CASE      = self.model_tester.prepare_config_and_inputs_for_common()

											_SCREAMING_SNAKE_CASE      = _config_zero_init(A_	)
											for model_class in self.all_model_classes:
															_SCREAMING_SNAKE_CASE      = 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_natten
@require_vision
@require_torch
class    __lowercase  (       unittest.TestCase							):

							"""simple docstring"""


							@cached_property
							def 		__magic_name__			(    self	)->	Any:
											return AutoImageProcessor.from_pretrained('shi-labs/nat-mini-in1k-224'	) if is_vision_available() else None





							@slow
							def 		__magic_name__			(    self	)->	str:
											_SCREAMING_SNAKE_CASE      = NatForImageClassification.from_pretrained('shi-labs/nat-mini-in1k-224'	).to(A_	)
											_SCREAMING_SNAKE_CASE      = self.default_image_processor

											_SCREAMING_SNAKE_CASE      = Image.open('./tests/fixtures/tests_samples/COCO/000000039769.png'	)
											_SCREAMING_SNAKE_CASE      = image_processor(images=A_				, return_tensors='pt'	).to(A_	)

											# forward pass
											with torch.no_grad():
															_SCREAMING_SNAKE_CASE      = model(**A_	)

											# verify the logits
											_SCREAMING_SNAKE_CASE      = torch.Size((1, 1000)	)
											self.assertEqual(outputs.logits.shape				, A_	)
											_SCREAMING_SNAKE_CASE      = torch.tensor([0.3805, -0.8676, -0.3912]	).to(A_	)
											self.assertTrue(torch.allclose(outputs.logits[0, :3]				, A_				, atol=1e-4	)	)







@require_torch
@require_natten
class    __lowercase  (       unittest.TestCase      ,     UpperCamelCase							):

							"""simple docstring"""


							SCREAMING_SNAKE_CASE   :					Tuple        =						(NatBackbone,) if is_torch_available() else ()
							SCREAMING_SNAKE_CASE   :					Union[str, Any]        =						NatConfig





							def 		__magic_name__			(    self	)->	List[str]:
											_SCREAMING_SNAKE_CASE      = NatModelTester(self	)




from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available, is_vision_available


snake_case			:      Optional[int] 							=   {'configuration_vit_hybrid': ['VIT_HYBRID_PRETRAINED_CONFIG_ARCHIVE_MAP', 'ViTHybridConfig']}

try:
							if not is_torch_available():
														raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
							pass
else:
							snake_case			:      int 							=   [
							    'VIT_HYBRID_PRETRAINED_MODEL_ARCHIVE_LIST',
							    'ViTHybridForImageClassification',
							    'ViTHybridModel',
							    'ViTHybridPreTrainedModel',
							]

try:
							if not is_vision_available():
														raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
							pass
else:
							snake_case			:      Any 							=   ['ViTHybridImageProcessor']


if TYPE_CHECKING:
							from .configuration_vit_hybrid import VIT_HYBRID_PRETRAINED_CONFIG_ARCHIVE_MAP, ViTHybridConfig

							try:
														if not is_torch_available():
																					raise OptionalDependencyNotAvailable()
							except OptionalDependencyNotAvailable:
														pass
							else:
														from .modeling_vit_hybrid import (
														    VIT_HYBRID_PRETRAINED_MODEL_ARCHIVE_LIST,
														    ViTHybridForImageClassification,
														    ViTHybridModel,
														    ViTHybridPreTrainedModel,
														)

							try:
														if not is_vision_available():
																					raise OptionalDependencyNotAvailable()
							except OptionalDependencyNotAvailable:
														pass
							else:
														from .image_processing_vit_hybrid import ViTHybridImageProcessor


else:
							import sys

							snake_case			:      Optional[int] 							=   _LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)
