


'''simple docstring'''



from ...configuration_utils import PretrainedConfig
from ...utils import logging
from ...utils.backbone_utils import BackboneConfigMixin, get_aligned_output_features_output_indices


__A	=logging.get_logger(__name__)

__A	={
    'shi-labs/nat-mini-in1k-224': 'https://huggingface.co/shi-labs/nat-mini-in1k-224/resolve/main/config.json',
    # See all Nat models at https://huggingface.co/models?filter=nat
}


class 		_snake_case					(     __lowercase       ,   __lowercase	):
					lowerCAmelCase      :Any   =					'''nat'''

					lowerCAmelCase      :List[str]   =					{
					    '''num_attention_heads''': '''num_heads''',
					    '''num_hidden_layers''': '''num_layers''',
					}




					def __init__(      self							,							_lowerCamelCase=4							,							_lowerCamelCase=3							,							_lowerCamelCase=64							,							_lowerCamelCase=[3, 4, 6, 5]							,							_lowerCamelCase=[2, 4, 8, 16]							,							_lowerCamelCase=7							,							_lowerCamelCase=3.0							,							_lowerCamelCase=True							,							_lowerCamelCase=0.0							,							_lowerCamelCase=0.0							,							_lowerCamelCase=0.1							,							_lowerCamelCase="gelu"							,							_lowerCamelCase=0.02							,							_lowerCamelCase=1e-5							,							_lowerCamelCase=0.0							,							_lowerCamelCase=None							,							_lowerCamelCase=None							,							**_lowerCamelCase							,							):
								super().__init__(**__a)

								UpperCAmelCase__  :					Any        =     patch_size
								UpperCAmelCase__  :					Any        =     num_channels
								UpperCAmelCase__  :					int        =     embed_dim
								UpperCAmelCase__  :					Tuple        =     depths
								UpperCAmelCase__  :					Optional[int]        =     len(__a)
								UpperCAmelCase__  :					Union[str, Any]        =     num_heads
								UpperCAmelCase__  :					Any        =     kernel_size
								UpperCAmelCase__  :					Dict        =     mlp_ratio
								UpperCAmelCase__  :					Tuple        =     qkv_bias
								UpperCAmelCase__  :					Optional[int]        =     hidden_dropout_prob
								UpperCAmelCase__  :					Tuple        =     attention_probs_dropout_prob
								UpperCAmelCase__  :					Optional[int]        =     drop_path_rate
								UpperCAmelCase__  :					Union[str, Any]        =     hidden_act
								UpperCAmelCase__  :					int        =     layer_norm_eps
								UpperCAmelCase__  :					List[Any]        =     initializer_range
								# we set the hidden_size attribute in order to make Nat work with VisionEncoderDecoderModel
								# this indicates the channel dimension after the last stage of the model
								UpperCAmelCase__  :					int        =     int(embed_dim * 2 ** (len(__a) - 1))
								UpperCAmelCase__  :					Dict        =     layer_scale_init_value
								UpperCAmelCase__  :					int        =     ["""stem"""] + [f'''stage{idx}''' for idx in range(1							,							len(__a) + 1)]
								UpperCAmelCase__  :					Optional[int]        =     get_aligned_output_features_output_indices(
								    out_features=__a							,							out_indices=__a							,							stage_names=self.stage_names)



'''simple docstring'''



from __future__ import annotations

import unittest

from transformers import MobileBertConfig, is_tf_available
from transformers.models.auto import get_values
from transformers.testing_utils import require_tf, slow

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


if is_tf_available():
		import tensorflow as tf

		from transformers import (
		    TF_MODEL_FOR_PRETRAINING_MAPPING,
		    TFMobileBertForMaskedLM,
		    TFMobileBertForMultipleChoice,
		    TFMobileBertForNextSentencePrediction,
		    TFMobileBertForPreTraining,
		    TFMobileBertForQuestionAnswering,
		    TFMobileBertForSequenceClassification,
		    TFMobileBertForTokenClassification,
		    TFMobileBertModel,
		)


@require_tf
class 		_snake_case					(     a__       ,   a__       ,   unittest.TestCase	):
					lowerCAmelCase      :Optional[int]   =					(
					    (
					        TFMobileBertModel,
					        TFMobileBertForMaskedLM,
					        TFMobileBertForNextSentencePrediction,
					        TFMobileBertForPreTraining,
					        TFMobileBertForQuestionAnswering,
					        TFMobileBertForSequenceClassification,
					        TFMobileBertForTokenClassification,
					        TFMobileBertForMultipleChoice,
					    )
					    if is_tf_available()
					    else ()
					)
					lowerCAmelCase      :Union[str, Any]   =					(
					    {
					        '''feature-extraction''': TFMobileBertModel,
					        '''fill-mask''': TFMobileBertForMaskedLM,
					        '''question-answering''': TFMobileBertForQuestionAnswering,
					        '''text-classification''': TFMobileBertForSequenceClassification,
					        '''token-classification''': TFMobileBertForTokenClassification,
					        '''zero-shot''': TFMobileBertForSequenceClassification,
					    }
					    if is_tf_available()
					    else {}
					)
					lowerCAmelCase      :Optional[Any]   =					False
					lowerCAmelCase      :Dict   =					False




					def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase=False):
								UpperCAmelCase__  :					int        =     super()._prepare_for_class(_lowerCamelCase							,							_lowerCamelCase							,							return_labels=_lowerCamelCase)

								if return_labels:
											if model_class in get_values(_lowerCamelCase):
														UpperCAmelCase__  :					Tuple        =     tf.zeros(self.model_tester.batch_size							,							dtype=tf.intaa)

								return inputs_dict


					class 		_snake_case					(     a__	):




										def __init__(      self							,							_lowerCamelCase							,							_lowerCamelCase=13							,							_lowerCamelCase=7							,							_lowerCamelCase=True							,							_lowerCamelCase=True							,							_lowerCamelCase=True							,							_lowerCamelCase=True							,							_lowerCamelCase=99							,							_lowerCamelCase=32							,							_lowerCamelCase=32							,							_lowerCamelCase=2							,							_lowerCamelCase=4							,							_lowerCamelCase=37							,							_lowerCamelCase="gelu"							,							_lowerCamelCase=0.1							,							_lowerCamelCase=0.1							,							_lowerCamelCase=512							,							_lowerCamelCase=16							,							_lowerCamelCase=2							,							_lowerCamelCase=0.02							,							_lowerCamelCase=3							,							_lowerCamelCase=4							,							_lowerCamelCase=None							,							):
													UpperCAmelCase__  :					Optional[Any]        =     parent
													UpperCAmelCase__  :					List[str]        =     batch_size
													UpperCAmelCase__  :					Any        =     seq_length
													UpperCAmelCase__  :					Dict        =     is_training
													UpperCAmelCase__  :					str        =     use_input_mask
													UpperCAmelCase__  :					int        =     use_token_type_ids
													UpperCAmelCase__  :					Optional[Any]        =     use_labels
													UpperCAmelCase__  :					Any        =     vocab_size
													UpperCAmelCase__  :					Optional[Any]        =     hidden_size
													UpperCAmelCase__  :					Optional[int]        =     num_hidden_layers
													UpperCAmelCase__  :					List[Any]        =     num_attention_heads
													UpperCAmelCase__  :					Dict        =     intermediate_size
													UpperCAmelCase__  :					str        =     hidden_act
													UpperCAmelCase__  :					int        =     hidden_dropout_prob
													UpperCAmelCase__  :					Union[str, Any]        =     attention_probs_dropout_prob
													UpperCAmelCase__  :					Optional[int]        =     max_position_embeddings
													UpperCAmelCase__  :					Union[str, Any]        =     type_vocab_size
													UpperCAmelCase__  :					Optional[int]        =     type_sequence_label_size
													UpperCAmelCase__  :					Optional[int]        =     initializer_range
													UpperCAmelCase__  :					Union[str, Any]        =     num_labels
													UpperCAmelCase__  :					List[str]        =     num_choices
													UpperCAmelCase__  :					str        =     scope
													UpperCAmelCase__  :					Optional[int]        =     embedding_size




										def 				snake_case__						(      self):
													UpperCAmelCase__  :					str        =     ids_tensor([self.batch_size, self.seq_length]							,							self.vocab_size)

													UpperCAmelCase__  :					Optional[Any]        =     None
													if self.use_input_mask:
																UpperCAmelCase__  :					Tuple        =     random_attention_mask([self.batch_size, self.seq_length])

													UpperCAmelCase__  :					Union[str, Any]        =     None
													if self.use_token_type_ids:
																UpperCAmelCase__  :					List[Any]        =     ids_tensor([self.batch_size, self.seq_length]							,							self.type_vocab_size)

													UpperCAmelCase__  :					int        =     None
													UpperCAmelCase__  :					List[Any]        =     None
													UpperCAmelCase__  :					Any        =     None
													if self.use_labels:
																UpperCAmelCase__  :					Dict        =     ids_tensor([self.batch_size]							,							self.type_sequence_label_size)
																UpperCAmelCase__  :					Optional[Any]        =     ids_tensor([self.batch_size, self.seq_length]							,							self.num_labels)
																UpperCAmelCase__  :					Optional[int]        =     ids_tensor([self.batch_size]							,							self.num_choices)

													UpperCAmelCase__  :					str        =     MobileBertConfig(
													    vocab_size=self.vocab_size							,							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							,							max_position_embeddings=self.max_position_embeddings							,							type_vocab_size=self.type_vocab_size							,							initializer_range=self.initializer_range							,							embedding_size=self.embedding_size							,							)

													return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					str        =     TFMobileBertModel(config=_lowerCamelCase)
													UpperCAmelCase__  :					Dict        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					int        =     model(_lowerCamelCase)

													UpperCAmelCase__  :					Dict        =     [input_ids, input_mask]
													UpperCAmelCase__  :					List[Any]        =     model(_lowerCamelCase)

													UpperCAmelCase__  :					Optional[int]        =     model(_lowerCamelCase)

													self.parent.assertEqual(
													    result.last_hidden_state.shape							,							(self.batch_size, self.seq_length, self.hidden_size))
													self.parent.assertEqual(result.pooler_output.shape							,							(self.batch_size, self.hidden_size))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					List[str]        =     TFMobileBertForMaskedLM(config=_lowerCamelCase)
													UpperCAmelCase__  :					List[str]        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					Dict        =     model(_lowerCamelCase)
													self.parent.assertEqual(result.logits.shape							,							(self.batch_size, self.seq_length, self.vocab_size))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					Union[str, Any]        =     TFMobileBertForNextSentencePrediction(config=_lowerCamelCase)
													UpperCAmelCase__  :					str        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					List[str]        =     model(_lowerCamelCase)
													self.parent.assertEqual(result.logits.shape							,							(self.batch_size, 2))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					List[str]        =     TFMobileBertForPreTraining(config=_lowerCamelCase)
													UpperCAmelCase__  :					Optional[Any]        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					Any        =     model(_lowerCamelCase)
													self.parent.assertEqual(
													    result.prediction_logits.shape							,							(self.batch_size, self.seq_length, self.vocab_size))
													self.parent.assertEqual(result.seq_relationship_logits.shape							,							(self.batch_size, 2))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					Any        =     self.num_labels
													UpperCAmelCase__  :					Optional[Any]        =     TFMobileBertForSequenceClassification(config=_lowerCamelCase)
													UpperCAmelCase__  :					Optional[int]        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					Tuple        =     model(_lowerCamelCase)
													self.parent.assertEqual(result.logits.shape							,							(self.batch_size, self.num_labels))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					Tuple        =     self.num_choices
													UpperCAmelCase__  :					Dict        =     TFMobileBertForMultipleChoice(config=_lowerCamelCase)
													UpperCAmelCase__  :					int        =     tf.tile(tf.expand_dims(_lowerCamelCase							,							1)							,							(1, self.num_choices, 1))
													UpperCAmelCase__  :					str        =     tf.tile(tf.expand_dims(_lowerCamelCase							,							1)							,							(1, self.num_choices, 1))
													UpperCAmelCase__  :					Optional[Any]        =     tf.tile(tf.expand_dims(_lowerCamelCase							,							1)							,							(1, self.num_choices, 1))
													UpperCAmelCase__  :					Optional[int]        =     {
													    """input_ids""": multiple_choice_inputs_ids,
													    """attention_mask""": multiple_choice_input_mask,
													    """token_type_ids""": multiple_choice_token_type_ids,
													}
													UpperCAmelCase__  :					List[str]        =     model(_lowerCamelCase)
													self.parent.assertEqual(result.logits.shape							,							(self.batch_size, self.num_choices))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					List[Any]        =     self.num_labels
													UpperCAmelCase__  :					Optional[Any]        =     TFMobileBertForTokenClassification(config=_lowerCamelCase)
													UpperCAmelCase__  :					Dict        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					List[Any]        =     model(_lowerCamelCase)
													self.parent.assertEqual(result.logits.shape							,							(self.batch_size, self.seq_length, self.num_labels))




										def 				snake_case__						(      self							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase							,							_lowerCamelCase):
													UpperCAmelCase__  :					Any        =     TFMobileBertForQuestionAnswering(config=_lowerCamelCase)
													UpperCAmelCase__  :					Optional[int]        =     {"""input_ids""": input_ids, """attention_mask""": input_mask, """token_type_ids""": token_type_ids}
													UpperCAmelCase__  :					List[str]        =     model(_lowerCamelCase)
													self.parent.assertEqual(result.start_logits.shape							,							(self.batch_size, self.seq_length))
													self.parent.assertEqual(result.end_logits.shape							,							(self.batch_size, self.seq_length))




										def 				snake_case__						(      self):
													UpperCAmelCase__  :					Any        =     self.prepare_config_and_inputs()
													(
													    (
													    UpperCAmelCase__
													)   ,       (
													    UpperCAmelCase__
													)   ,       (
													    UpperCAmelCase__
													)   ,       (
													    UpperCAmelCase__
													)   ,       (
													    UpperCAmelCase__
													)   ,       (
													    UpperCAmelCase__
													)   ,       (
													    UpperCAmelCase__
													)   ,       
													)  :					Any        =     config_and_inputs
													UpperCAmelCase__  :					Union[str, Any]        =     {"""input_ids""": input_ids, """token_type_ids""": token_type_ids, """attention_mask""": input_mask}
													return config, inputs_dict




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					str        =     TFMobileBertModelTest.TFMobileBertModelTester(self)
								UpperCAmelCase__  :					List[Any]        =     ConfigTester(self							,							config_class=_lowerCamelCase							,							hidden_size=37)




					def 				snake_case__						(      self):
								self.config_tester.run_common_tests()




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					int        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_model(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					Optional[int]        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_masked_lm(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					Optional[Any]        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_multiple_choice(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					List[Any]        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_next_sequence_prediction(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					Optional[Any]        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_pretraining(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					Any        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_question_answering(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					str        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_sequence_classification(*_lowerCamelCase)




					def 				snake_case__						(      self):
								UpperCAmelCase__  :					Tuple        =     self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_mobilebert_for_token_classification(*_lowerCamelCase)




					@slow
					def 				snake_case__						(      self):
								# for model_name in TF_MOBILEBERT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
								for model_name in ["google/mobilebert-uncased"]:
											UpperCAmelCase__  :					Optional[Any]        =     TFMobileBertModel.from_pretrained(_lowerCamelCase)
											self.assertIsNotNone(_lowerCamelCase)


@require_tf
class 		_snake_case					(     unittest.TestCase	):




					@slow
					def 				snake_case__						(      self):
								UpperCAmelCase__  :					Any        =     TFMobileBertForPreTraining.from_pretrained("""google/mobilebert-uncased""")
								UpperCAmelCase__  :					str        =     tf.constant([[0, 1, 2, 3, 4, 5]])
								UpperCAmelCase__  :					Optional[int]        =     model(_lowerCamelCase)[0]

								UpperCAmelCase__  :					List[str]        =     [1, 6, 3_0522]
								self.assertEqual(output.shape							,							_lowerCamelCase)

								UpperCAmelCase__  :					List[Any]        =     tf.constant(
								    [
								        [
								            [-4.5919547, -9.248295, -9.645256],
								            [-6.7306175, -6.440284, -6.6052837],
								            [-7.2743506, -6.7847915, -6.024673],
								        ]
								    ])
								tf.debugging.assert_near(output[:, :3, :3]							,							_lowerCamelCase							,							atol=1e-4)