import collections
import types

import numpy as np

from ..utils import (
    add_end_docstrings,
    is_tensorflow_probability_available,
    is_tf_available,
    is_torch_available,
    requires_backends,
)
from .base import PIPELINE_INIT_ARGS, ArgumentHandler, Dataset, Pipeline, PipelineException


if is_torch_available():
				import torch

				from ..models.auto.modeling_auto import (
				    MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING,
				    MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING,
				)

if is_tf_available() and is_tensorflow_probability_available():
				import tensorflow as tf
				import tensorflow_probability as tfp

				from ..models.auto.modeling_tf_auto import (
				    TF_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING,
				    TF_MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING,
				)





class 					__snake_case    (     _lowerCamelCase      ):




					def __call__(  self       ,			__UpperCamelCase=None       ,			__UpperCamelCase=None       ,			**__UpperCamelCase						)	->    Any:



									'''simple docstring'''







									requires_backends(self       ,			'pandas'						)
									import pandas as pd

									if table is None:
													raise ValueError('Keyword argument `table` cannot be None.'						)
									elif query is None:
													if isinstance(__UpperCamelCase       ,			__UpperCamelCase						) and table.get('query'						) is not None and table.get('table'						) is not None:
																	snake_case__   :      Any   				= [table]
													elif isinstance(__UpperCamelCase       ,			__UpperCamelCase						) and len(__UpperCamelCase						) > 0:
																	if not all(isinstance(__UpperCamelCase       ,			__UpperCamelCase						) for d in table						):
																					raise ValueError(
																					    F"""Keyword argument `table` should be a list of dict, but is {(type(__UpperCamelCase						) for d in table)}"""						)

																	if table[0].get('query'						) is not None and table[0].get('table'						) is not None:
																					snake_case__   :      Optional[int]   				= table
																	else:
																					raise ValueError(
																					    'If keyword argument `table` is a list of dictionaries, each dictionary should have a `table`'
																					    F""" and `query` key, but only dictionary has keys {table[0].keys()} `table` and `query` keys."""						)
													elif Dataset is not None and isinstance(__UpperCamelCase       ,			__UpperCamelCase						) or isinstance(__UpperCamelCase       ,			types.GeneratorType						):
																	return table
													else:
																	raise ValueError(
																	    'Invalid input. Keyword argument `table` should be either of type `dict` or `list`, but '
																	    F"""is {type(__UpperCamelCase						)})"""						)
									else:
													snake_case__   :      Dict   				= [{'''table''': table, '''query''': query}]

									for tqa_pipeline_input in tqa_pipeline_inputs:
													if not isinstance(tqa_pipeline_input['table']       ,			pd.DataFrame						):
																	if tqa_pipeline_input["table"] is None:
																					raise ValueError('Table cannot be None.'						)

																	snake_case__   :      Optional[Any]   				= pd.DataFrame(tqa_pipeline_input['table']						)

									return tqa_pipeline_inputs





@add_end_docstrings(_lowerCamelCase      )
class 					__snake_case    (     _lowerCamelCase      ):
					__lowerCamelCase			   =  "table,query"




					def __init__(  self       ,			__UpperCamelCase=TableQuestionAnsweringArgumentHandler()       ,			*__UpperCamelCase       ,			**__UpperCamelCase						)	->    str:



									'''simple docstring'''







									super().__init__(*__UpperCamelCase       ,			**__UpperCamelCase						)
									snake_case__   :      List[str]   				= args_parser

									self.check_model_type(
									    dict(
									        TF_MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING.items()
									        + TF_MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING.items()						)
									    if self.framework == 'tf'
									    else dict(
									        MODEL_FOR_TABLE_QUESTION_ANSWERING_MAPPING.items() + MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING.items()						)						)

									snake_case__   :      Union[str, Any]   				= bool(getattr(self.model.config       ,			'aggregation_labels'       ,			__UpperCamelCase						)						) and bool(
									    getattr(self.model.config       ,			'num_aggregation_labels'       ,			__UpperCamelCase						)						)
									snake_case__   :      Optional[int]   				= '''tapas''' if hasattr(self.model.config       ,			'aggregation_labels'						) else None




					def      __a     (  self       ,			**__UpperCamelCase						)	->    str:



									'''simple docstring'''







									return self.model(**__UpperCamelCase						)




					def      __a     (  self       ,			**__UpperCamelCase						)	->    Dict:



									'''simple docstring'''







									if self.framework == "pt":
													snake_case__   :      Any   				= []
													snake_case__   :      Union[str, Any]   				= []
													snake_case__   :      int   				= None
													snake_case__   :      int   				= inputs['''input_ids'''].shape[0]

													snake_case__   :      List[Any]   				= inputs['''input_ids'''].to(self.device						)
													snake_case__   :      Optional[int]   				= inputs['''attention_mask'''].to(self.device						)
													snake_case__   :      Any   				= inputs['''token_type_ids'''].to(self.device						)
													snake_case__   :      str   				= None

													for index in range(__UpperCamelCase						):
																	# If sequences have already been processed, the token type IDs will be created according to the previous
																	# answer.
																	if prev_answers is not None:
																					snake_case__   :      Union[str, Any]   				= token_type_ids_example[:, 3]  # shape (seq_len,)
																					snake_case__   :      Optional[Any]   				= np.zeros_like(prev_labels_example.cpu().numpy()						)  # shape (seq_len,)

																					snake_case__   :      Dict   				= token_type_ids[index]  # shape (seq_len, 7)
																					for i in range(model_labels.shape[0]						):
																									snake_case__   :      Any   				= token_type_ids_example[:, 0].tolist()[i]
																									snake_case__   :      Union[str, Any]   				= token_type_ids_example[:, 1].tolist()[i] - 1
																									snake_case__   :      Union[str, Any]   				= token_type_ids_example[:, 2].tolist()[i] - 1

																									if row_id >= 0 and col_id >= 0 and segment_id == 1:
																													snake_case__   :      Any   				= int(prev_answers[(col_id, row_id)]						)

																					snake_case__   :      Optional[int]   				= torch.from_numpy(__UpperCamelCase						).type(torch.long						).to(self.device						)

																	snake_case__   :      Optional[Any]   				= input_ids[index]
																	snake_case__   :      Dict   				= attention_mask[index]  # shape (seq_len,)
																	snake_case__   :      str   				= token_type_ids[index]  # shape (seq_len, 7)
																	snake_case__   :      Union[str, Any]   				= self.model(
																	    input_ids=input_ids_example.unsqueeze(0						)       ,			attention_mask=attention_mask_example.unsqueeze(0						)       ,			token_type_ids=token_type_ids_example.unsqueeze(0						)       ,			)
																	snake_case__   :      Any   				= outputs.logits

																	if self.aggregate:
																					all_aggregations.append(outputs.logits_aggregation						)

																	all_logits.append(__UpperCamelCase						)

																	snake_case__   :      Optional[Any]   				= torch.distributions.Bernoulli(logits=__UpperCamelCase						)
																	snake_case__   :      List[Any]   				= dist_per_token.probs * attention_mask_example.type(torch.floataa						).to(
																	    dist_per_token.probs.device						)

																	snake_case__   :      Optional[Any]   				= collections.defaultdict(__UpperCamelCase						)
																	for i, p in enumerate(probabilities.squeeze().tolist()						):
																					snake_case__   :      List[str]   				= token_type_ids_example[:, 0].tolist()[i]
																					snake_case__   :      Any   				= token_type_ids_example[:, 1].tolist()[i] - 1
																					snake_case__   :      List[Any]   				= token_type_ids_example[:, 2].tolist()[i] - 1
																					if col >= 0 and row >= 0 and segment_id == 1:
																									coords_to_probs[(col, row)].append(__UpperCamelCase						)

																	snake_case__   :      str   				= {key: np.array(coords_to_probs[key]						).mean() > 0.5 for key in coords_to_probs}

													snake_case__   :      str   				= torch.cat(tuple(__UpperCamelCase						)       ,			0						)

													return (logits_batch,) if not self.aggregate else (logits_batch, torch.cat(tuple(__UpperCamelCase						)       ,			0						))
									else:
													snake_case__   :      Dict   				= []
													snake_case__   :      Optional[Any]   				= []
													snake_case__   :      Optional[Any]   				= None
													snake_case__   :      int   				= inputs['''input_ids'''].shape[0]

													snake_case__   :      int   				= inputs['''input_ids''']
													snake_case__   :      int   				= inputs['''attention_mask''']
													snake_case__   :      Tuple   				= inputs['''token_type_ids'''].numpy()
													snake_case__   :      Union[str, Any]   				= None

													for index in range(__UpperCamelCase						):
																	# If sequences have already been processed, the token type IDs will be created according to the previous
																	# answer.
																	if prev_answers is not None:
																					snake_case__   :      Union[str, Any]   				= token_type_ids_example[:, 3]  # shape (seq_len,)
																					snake_case__   :      int   				= np.zeros_like(__UpperCamelCase       ,			dtype=np.intaa						)  # shape (seq_len,)

																					snake_case__   :      Any   				= token_type_ids[index]  # shape (seq_len, 7)
																					for i in range(model_labels.shape[0]						):
																									snake_case__   :      List[Any]   				= token_type_ids_example[:, 0].tolist()[i]
																									snake_case__   :      str   				= token_type_ids_example[:, 1].tolist()[i] - 1
																									snake_case__   :      Union[str, Any]   				= token_type_ids_example[:, 2].tolist()[i] - 1

																									if row_id >= 0 and col_id >= 0 and segment_id == 1:
																													snake_case__   :      List[Any]   				= int(prev_answers[(col_id, row_id)]						)

																					snake_case__   :      Dict   				= model_labels

																	snake_case__   :      Tuple   				= input_ids[index]
																	snake_case__   :      List[Any]   				= attention_mask[index]  # shape (seq_len,)
																	snake_case__   :      List[Any]   				= token_type_ids[index]  # shape (seq_len, 7)
																	snake_case__   :      str   				= self.model(
																	    input_ids=np.expand_dims(__UpperCamelCase       ,			axis=0						)       ,			attention_mask=np.expand_dims(__UpperCamelCase       ,			axis=0						)       ,			token_type_ids=np.expand_dims(__UpperCamelCase       ,			axis=0						)       ,			)
																	snake_case__   :      Union[str, Any]   				= outputs.logits

																	if self.aggregate:
																					all_aggregations.append(outputs.logits_aggregation						)

																	all_logits.append(__UpperCamelCase						)

																	snake_case__   :      List[str]   				= tfp.distributions.Bernoulli(logits=__UpperCamelCase						)
																	snake_case__   :      Dict   				= dist_per_token.probs_parameter() * tf.cast(__UpperCamelCase       ,			tf.floataa						)

																	snake_case__   :      Union[str, Any]   				= collections.defaultdict(__UpperCamelCase						)
																	snake_case__   :      List[str]   				= token_type_ids_example
																	for i, p in enumerate(tf.squeeze(__UpperCamelCase						).numpy().tolist()						):
																					snake_case__   :      Optional[Any]   				= token_type_ids_example[:, 0].tolist()[i]
																					snake_case__   :      Optional[Any]   				= token_type_ids_example[:, 1].tolist()[i] - 1
																					snake_case__   :      Optional[int]   				= token_type_ids_example[:, 2].tolist()[i] - 1
																					if col >= 0 and row >= 0 and segment_id == 1:
																									coords_to_probs[(col, row)].append(__UpperCamelCase						)

																	snake_case__   :      List[Any]   				= {key: np.array(coords_to_probs[key]						).mean() > 0.5 for key in coords_to_probs}

													snake_case__   :      int   				= tf.concat(tuple(__UpperCamelCase						)       ,			0						)

													return (logits_batch,) if not self.aggregate else (logits_batch, tf.concat(tuple(__UpperCamelCase						)       ,			0						))




					def __call__(  self       ,			*__UpperCamelCase       ,			**__UpperCamelCase						)	->    int:



									'''simple docstring'''







									snake_case__   :      Dict   				= self._args_parser(*__UpperCamelCase       ,			**__UpperCamelCase						)

									snake_case__   :      Optional[int]   				= super().__call__(__UpperCamelCase       ,			**__UpperCamelCase						)
									if len(__UpperCamelCase						) == 1:
													return results[0]
									return results




					def      __a     (  self       ,			__UpperCamelCase=None       ,			__UpperCamelCase=None       ,			__UpperCamelCase=None       ,			**__UpperCamelCase						)	->    str:



									'''simple docstring'''







									snake_case__   :      Union[str, Any]   				= {}
									if padding is not None:
													snake_case__   :      Optional[int]   				= padding
									if truncation is not None:
													snake_case__   :      Dict   				= truncation

									snake_case__   :      str   				= {}
									if sequential is not None:
													snake_case__   :      List[str]   				= sequential
									return preprocess_params, forward_params, {}




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase=None       ,			__UpperCamelCase=True       ,			__UpperCamelCase=None						)	->    int:



									'''simple docstring'''







									if truncation is None:
													if self.type == "tapas":
																	snake_case__   :      Optional[int]   				= '''drop_rows_to_fit'''
													else:
																	snake_case__   :      List[Any]   				= '''do_not_truncate'''

									snake_case__   :      List[Any]   				= pipeline_input['''table'''], pipeline_input['''query''']
									if table.empty:
													raise ValueError('table is empty'						)
									if query is None or query == "":
													raise ValueError('query is empty'						)
									snake_case__   :      List[Any]   				= self.tokenizer(__UpperCamelCase       ,			__UpperCamelCase       ,			return_tensors=self.framework       ,			truncation=__UpperCamelCase       ,			padding=__UpperCamelCase						)
									snake_case__   :      List[str]   				= table
									return inputs




					def      __a     (  self       ,			__UpperCamelCase       ,			__UpperCamelCase=False						)	->    Dict:



									'''simple docstring'''







									snake_case__   :      List[str]   				= model_inputs.pop('table'						)

									if self.type == "tapas":
													if sequential:
																	snake_case__   :      int   				= self.sequential_inference(**__UpperCamelCase						)
													else:
																	snake_case__   :      List[Any]   				= self.batch_inference(**__UpperCamelCase						)
									else:
													snake_case__   :      List[str]   				= self.model.generate(**__UpperCamelCase						)
									snake_case__   :      Dict   				= {'''model_inputs''': model_inputs, '''table''': table, '''outputs''': outputs}
									return model_outputs




					def      __a     (  self       ,			__UpperCamelCase						)	->    Optional[Any]:



									'''simple docstring'''







									snake_case__   :      int   				= model_outputs['''model_inputs''']
									snake_case__   :      Optional[int]   				= model_outputs['''table''']
									snake_case__   :      List[str]   				= model_outputs['''outputs''']
									if self.type == "tapas":
													if self.aggregate:
																	snake_case__   :      List[Any]   				= outputs[:2]
																	snake_case__   :      Union[str, Any]   				= self.tokenizer.convert_logits_to_predictions(__UpperCamelCase       ,			__UpperCamelCase       ,			__UpperCamelCase						)
																	snake_case__   :      Any   				= predictions
																	snake_case__   :      Any   				= {i: self.model.config.aggregation_labels[pred] for i, pred in enumerate(__UpperCamelCase						)}

																	snake_case__   :      str   				= self.model.config.no_aggregation_label_index
																	snake_case__   :      Optional[int]   				= {
																	    i: aggregators[i] + ''' > ''' for i, pred in enumerate(__UpperCamelCase						) if pred != no_agg_label_index
																	}
													else:
																	snake_case__   :      List[str]   				= outputs[0]
																	snake_case__   :      List[str]   				= self.tokenizer.convert_logits_to_predictions(__UpperCamelCase       ,			__UpperCamelCase						)
																	snake_case__   :      Optional[Any]   				= predictions[0]
																	snake_case__   :      int   				= {}
																	snake_case__   :      Optional[Any]   				= {}
													snake_case__   :      List[Any]   				= []
													for index, coordinates in enumerate(__UpperCamelCase						):
																	snake_case__   :      Union[str, Any]   				= [table.iat[coordinate] for coordinate in coordinates]
																	snake_case__   :      Union[str, Any]   				= aggregators.get(__UpperCamelCase       ,			''						)
																	snake_case__   :      Union[str, Any]   				= aggregators_prefix.get(__UpperCamelCase       ,			''						)
																	snake_case__   :      str   				= {
																	    '''answer''': aggregator_prefix + ''', '''.join(__UpperCamelCase						),
																	    '''coordinates''': coordinates,
																	    '''cells''': [table.iat[coordinate] for coordinate in coordinates],
																	}
																	if aggregator:
																					snake_case__   :      List[str]   				= aggregator

																	answers.append(__UpperCamelCase						)
													if len(__UpperCamelCase						) == 0:
																	raise PipelineException('Empty answer'						)
									else:
													snake_case__   :      Tuple   				= [{'''answer''': answer} for answer in self.tokenizer.batch_decode(__UpperCamelCase       ,			skip_special_tokens=__UpperCamelCase						)]

									return answers if len(__UpperCamelCase						) > 1 else answers[0]



'''simple docstring'''
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 _lowerCAmelCase			:







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







      def      lowerCamelCase__      (  self     ):
        lowercase				:							Optional[Any]									=   floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]     )

        lowercase				:							Any									=   None
        if self.use_labels:
          lowercase				:							Tuple									=   ids_tensor([self.batch_size]  ,    self.num_labels     )

        lowercase				:							List[str]									=   self.get_config()

        return config, pixel_values, labels







      def      lowerCamelCase__      (  self     ):
        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      lowerCamelCase__      (  self  ,    lowercase  ,    lowercase  ,    lowercase     ):
        lowercase				:							Any									=   NatModel(config=lowercase     )
        model.to(lowercase     )
        model.eval()
        lowercase				:							int									=   model(lowercase     )

        lowercase				:							List[str]									=   (config.image_size // config.patch_size) // (2 ** (len(config.depths     ) - 1))
        lowercase				:							Optional[int]									=   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      lowerCamelCase__      (  self  ,    lowercase  ,    lowercase  ,    lowercase     ):
        lowercase				:							Optional[int]									=   NatForImageClassification(lowercase     )
        model.to(lowercase     )
        model.eval()
        lowercase				:							Dict									=   model(lowercase  ,    labels=lowercase     )
        self.parent.assertEqual(result.logits.shape  ,    (self.batch_size, self.num_labels)     )

        # test greyscale images
        lowercase				:							Dict									=   1
        lowercase				:							Optional[Any]									=   NatForImageClassification(lowercase     )
        model.to(lowercase     )
        model.eval()

        lowercase				:							Tuple									=   floats_tensor([self.batch_size, 1, self.image_size, self.image_size]     )
        lowercase				:							Dict									=   model(lowercase     )
        self.parent.assertEqual(result.logits.shape  ,    (self.batch_size, self.num_labels)     )







      def      lowerCamelCase__      (  self  ,    lowercase  ,    lowercase  ,    lowercase     ):
        lowercase				:							int									=   NatBackbone(config=lowercase     )
        model.to(lowercase     )
        model.eval()
        lowercase				:							List[Any]									=   model(lowercase     )

        # 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
        lowercase				:							List[Any]									=   None
        lowercase				:							int									=   NatBackbone(config=lowercase     )
        model.to(lowercase     )
        model.eval()
        lowercase				:							Optional[int]									=   model(lowercase     )

        # 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      lowerCamelCase__      (  self     ):
        lowercase				:							int									=   self.prepare_config_and_inputs()
        lowercase				,      lowercase				,      lowercase				:							Optional[int]									=   config_and_inputs
        lowercase				:							List[Any]									=   {'''pixel_values''': pixel_values}
        return config, inputs_dict





@require_natten
@require_torch
class _lowerCAmelCase			(	snake_case							,   snake_case							,   unittest.TestCase					):
      UpperCAmelCase_	:						List[str]	 =       (
          (
              NatModel,
              NatForImageClassification,
              NatBackbone,
          )
          if is_torch_available()
          else ()
      )
      UpperCAmelCase_	:						List[str]	 =       (
          {"feature-extraction": NatModel, "image-classification": NatForImageClassification}
          if is_torch_available()
          else {}
      )
      UpperCAmelCase_	:						List[str]	 =       False

      UpperCAmelCase_	:						str	 =       False
      UpperCAmelCase_	:						Any	 =       False
      UpperCAmelCase_	:						Dict	 =       False
      UpperCAmelCase_	:						Optional[Any]	 =       False







      def      lowerCamelCase__      (  self     ):
        lowercase				:							Optional[int]									=   NatModelTester(self     )
        lowercase				:							Union[str, Any]									=   ConfigTester(self  ,    config_class=lowercase  ,    embed_dim=37     )







      def      lowerCamelCase__      (  self     ):
        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      lowerCamelCase__      (  self     ):
        return







      def      lowerCamelCase__      (  self     ):
        lowercase				:							List[str]									=   self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_model(*lowercase     )







      def      lowerCamelCase__      (  self     ):
        lowercase				:							Tuple									=   self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_for_image_classification(*lowercase     )







      def      lowerCamelCase__      (  self     ):
        lowercase				:							Union[str, Any]									=   self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_backbone(*lowercase     )







      @unittest.skip(reason='''Nat does not use inputs_embeds'''     )
      def      lowerCamelCase__      (  self     ):
        pass







      @unittest.skip(reason='''Nat does not use feedforward chunking'''     )
      def      lowerCamelCase__      (  self     ):
        pass







      def      lowerCamelCase__      (  self     ):
        lowercase				,      lowercase				:							List[str]									=   self.model_tester.prepare_config_and_inputs_for_common()

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







      def      lowerCamelCase__      (  self     ):
        lowercase				,      lowercase				:							List[Any]									=   self.model_tester.prepare_config_and_inputs_for_common()

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

          lowercase				:							Tuple									=   ['''pixel_values''']
          self.assertListEqual(arg_names[:1]  ,    lowercase     )







      def      lowerCamelCase__      (  self     ):
        self.skipTest('''Nat\'s attention operation is handled entirely by NATTEN.'''     )







      def      lowerCamelCase__      (  self  ,    lowercase  ,    lowercase  ,    lowercase  ,    lowercase     ):
        lowercase				:							Dict									=   model_class(lowercase     )
        model.to(lowercase     )
        model.eval()

        with torch.no_grad():
          lowercase				:							Tuple									=   model(**self._prepare_for_class(lowercase  ,    lowercase     )     )

        lowercase				:							List[Any]									=   outputs.hidden_states

        lowercase				:							Tuple									=   getattr(
            self.model_tester  ,    '''expected_num_hidden_layers'''  ,    len(self.model_tester.depths     ) + 1     )
        self.assertEqual(len(lowercase     )  ,    lowercase     )

        # Nat has a different seq_length
        lowercase				:							Optional[Any]									=   (
            config.patch_size
            if isinstance(config.patch_size  ,    collections.abc.Iterable     )
            else (config.patch_size, config.patch_size)
        )

        lowercase				:							Union[str, Any]									=   image_size[0] // patch_size[0]
        lowercase				:							List[str]									=   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":
          lowercase				:							str									=   outputs.reshaped_hidden_states
          self.assertEqual(len(lowercase     )  ,    lowercase     )

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







      def      lowerCamelCase__      (  self     ):
        lowercase				,      lowercase				:							Optional[Any]									=   self.model_tester.prepare_config_and_inputs_for_common()

        lowercase				:							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:
          lowercase				:							Union[str, Any]									=   True
          self.check_hidden_states_output(lowercase  ,    lowercase  ,    lowercase  ,    lowercase     )

          # check that output_hidden_states also work using config
          del inputs_dict["output_hidden_states"]
          lowercase				:							Union[str, Any]									=   True

          self.check_hidden_states_output(lowercase  ,    lowercase  ,    lowercase  ,    lowercase     )







      @slow
      def      lowerCamelCase__      (  self     ):
        for model_name in NAT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
          lowercase				:							Any									=   NatModel.from_pretrained(lowercase     )
          self.assertIsNotNone(lowercase     )







      def      lowerCamelCase__      (  self     ):
        lowercase				,      lowercase				:							Tuple									=   self.model_tester.prepare_config_and_inputs_for_common()

        lowercase				:							Dict									=   _config_zero_init(lowercase     )
        for model_class in self.all_model_classes:
          lowercase				:							int									=   model_class(config=lowercase     )
          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 _lowerCAmelCase			(	unittest.TestCase					):







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







      @slow
      def      lowerCamelCase__      (  self     ):
        lowercase				:							int									=   NatForImageClassification.from_pretrained('''shi-labs/nat-mini-in1k-224'''     ).to(lowercase     )
        lowercase				:							Union[str, Any]									=   self.default_image_processor

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

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

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





@require_torch
@require_natten
class _lowerCAmelCase			(	unittest.TestCase							,   snake_case					):
      UpperCAmelCase_	:						Union[str, Any]	 =       (NatBackbone,) if is_torch_available() else ()
      UpperCAmelCase_	:						Optional[int]	 =       NatConfig







      def      lowerCamelCase__      (  self     ):
        lowercase				:							Optional[int]									=   NatModelTester(self     )