'''simple docstring'''
from collections.abc import Callable
from math import log
from os import name, system
from random import gauss, seed
from typing import TypeVar







def 				__UpperCamelCase (					__UpperCAmelCase  :					float ,   __UpperCAmelCase  :					float ,   __UpperCAmelCase  :					int			)							->	list:
  seed(1			)
  return [gauss(__UpperCAmelCase ,   __UpperCAmelCase			) for _ in range(__UpperCAmelCase			)]







def 				__UpperCamelCase (					__UpperCAmelCase  :					int ,   __UpperCAmelCase  :					list			)							->	list:
  return [k for k in range(__UpperCAmelCase			) for _ in range(instance_count[k]			)]







def 				__UpperCamelCase (					__UpperCAmelCase  :					int ,   __UpperCAmelCase  :					list			)							->	float:
  return sum(__UpperCAmelCase			) / instance_count







def 				__UpperCamelCase (					__UpperCAmelCase  :					int ,   __UpperCAmelCase  :					int			)							->	float:
  return instance_count / total_count







def 				__UpperCamelCase (					__UpperCAmelCase  :					list ,   __UpperCAmelCase  :					list ,   __UpperCAmelCase  :					int			)							->	float:
  lowercase				:							List[Any]									=   []  # An empty list to store all squared differences
  # iterate over number of elements in items
  for i in range(len(__UpperCAmelCase			)			):
    # for loop iterates over number of elements in inner layer of items
    for j in range(len(items[i]			)			):
      # appending squared differences to 'squared_diff' list
      squared_diff.append((items[i][j] - means[i]) ** 2			)

    # one divided by (the number of all instances - number of classes) multiplied by
    # sum of all squared differences
  lowercase				:							List[str]									=   len(__UpperCAmelCase			)  # Number of classes in dataset
  return 1 / (total_count - n_classes) * sum(__UpperCAmelCase			)







def 				__UpperCamelCase (					__UpperCAmelCase  :					list ,   __UpperCAmelCase  :					list ,   __UpperCAmelCase  :					float ,   __UpperCAmelCase  :					list			)							->	list:
  lowercase				:							Union[str, Any]									=   []
  # for loop iterates over number of elements in list
  for i in range(len(__UpperCAmelCase			)			):
    # for loop iterates over number of inner items of each element
    for j in range(len(x_items[i]			)			):
      lowercase				:							Any									=   []  # to store all discriminant values of each item as a list
      # for loop iterates over number of classes we have in our dataset
      for k in range(len(__UpperCAmelCase			)			):
        # appending values of discriminants for each class to 'temp' list
        temp.append(
            x_items[i][j] * (means[k] / variance)
            - (means[k] ** 2 / (2 * variance))
            + log(probabilities[k]			)			)
      # appending discriminant values of each item to 'results' list
      results.append(__UpperCAmelCase			)

  return [result.index(max(__UpperCAmelCase			)			) for result in results]







def 				__UpperCamelCase (					__UpperCAmelCase  :					list ,   __UpperCAmelCase  :					list			)							->	float:
  lowercase				:							List[str]									=   sum(1 for i, j in zip(__UpperCAmelCase ,   __UpperCAmelCase			) if i == j			)
  # percentage of accuracy equals to number of correct predictions divided by number
  # of all data and multiplied by 100
  return (correct / len(__UpperCAmelCase			)) * 100


_A		:      Dict						   =TypeVar('''num''')







def 				__UpperCamelCase (					__UpperCAmelCase  :					Callable[[object], num] ,   __UpperCAmelCase  :					str ,   __UpperCAmelCase  :					str ,   __UpperCAmelCase  :					Callable[[num], bool] = lambda __UpperCAmelCase			: True ,   __UpperCAmelCase  :					str | None = None ,   )							->	num:
  while True:
    try:
      lowercase				:							int									=   input_type(input(__UpperCAmelCase			).strip() or default			)
      if condition(__UpperCAmelCase			):
        return user_input
      else:
        print(f"""{user_input}: {err_msg}"""			)
        continue
    except ValueError:
      print(
          f"""{user_input}: Incorrect input type, expected {input_type.__name__!r}"""			)







def 				__UpperCamelCase (					)							->	Optional[int]:
  while True:
    print(''' Linear Discriminant Analysis '''.center(50 ,   '''*'''			)			)
    print('''*''' * 50 ,   '''\n'''			)
    print('''First of all we should specify the number of classes that'''			)
    print('''we want to generate as training dataset'''			)
    # Trying to get number of classes
    lowercase				:							List[str]									=   valid_input(
        input_type=__UpperCAmelCase ,   condition=lambda __UpperCAmelCase			: x > 0 ,   input_msg='''Enter the number of classes (Data Groupings): ''' ,   err_msg='''Number of classes should be positive!''' ,   )

    print('''-''' * 100			)

    # Trying to get the value of standard deviation
    lowercase				:							Dict									=   valid_input(
        input_type=__UpperCAmelCase ,   condition=lambda __UpperCAmelCase			: x >= 0 ,   input_msg=(
            '''Enter the value of standard deviation'''
            '''(Default value is 1.0 for all classes): '''
        ) ,   err_msg='''Standard deviation should not be negative!''' ,   default='''1.0''' ,   )

    print('''-''' * 100			)

    # Trying to get number of instances in classes and theirs means to generate
    # dataset
    lowercase				:							str									=   []  # An empty list to store instance counts of classes in dataset
    for i in range(__UpperCAmelCase			):
      lowercase				:							List[Any]									=   valid_input(
          input_type=__UpperCAmelCase ,   condition=lambda __UpperCAmelCase			: x > 0 ,   input_msg=(f"""Enter The number of instances for class_{i+1}: """) ,   err_msg='''Number of instances should be positive!''' ,   )
      counts.append(__UpperCAmelCase			)
    print('''-''' * 100			)

    # An empty list to store values of user-entered means of classes
    lowercase				:							int									=   []
    for a in range(__UpperCAmelCase			):
      lowercase				:							int									=   valid_input(
          input_type=__UpperCAmelCase ,   input_msg=(f"""Enter the value of mean for class_{a+1}: """) ,   err_msg='''This is an invalid value.''' ,   )
      user_means.append(__UpperCAmelCase			)
    print('''-''' * 100			)

    print('''Standard deviation: ''' ,   __UpperCAmelCase			)
    # print out the number of instances in classes in separated line
    for i, count in enumerate(__UpperCAmelCase ,   1			):
      print(f"""Number of instances in class_{i} is: {count}"""			)
    print('''-''' * 100			)

    # print out mean values of classes separated line
    for i, user_mean in enumerate(__UpperCAmelCase ,   1			):
      print(f"""Mean of class_{i} is: {user_mean}"""			)
    print('''-''' * 100			)

    # Generating training dataset drawn from gaussian distribution
    lowercase				:							Union[str, Any]									=   [
        gaussian_distribution(user_means[j] ,   __UpperCAmelCase ,   counts[j]			)
        for j in range(__UpperCAmelCase			)
    ]
    print('''Generated Normal Distribution: \n''' ,   __UpperCAmelCase			)
    print('''-''' * 100			)

    # Generating Ys to detecting corresponding classes
    lowercase				:							List[str]									=   y_generator(__UpperCAmelCase ,   __UpperCAmelCase			)
    print('''Generated Corresponding Ys: \n''' ,   __UpperCAmelCase			)
    print('''-''' * 100			)

    # Calculating the value of actual mean for each class
    lowercase				:							int									=   [calculate_mean(counts[k] ,   x[k]			) for k in range(__UpperCAmelCase			)]
    # for loop iterates over number of elements in 'actual_means' list and print
    # out them in separated line
    for i, actual_mean in enumerate(__UpperCAmelCase ,   1			):
      print(f"""Actual(Real) mean of class_{i} is: {actual_mean}"""			)
    print('''-''' * 100			)

    # Calculating the value of probabilities for each class
    lowercase				:							Optional[int]									=   [
        calculate_probabilities(counts[i] ,   sum(__UpperCAmelCase			)			) for i in range(__UpperCAmelCase			)
    ]

    # for loop iterates over number of elements in 'probabilities' list and print
    # out them in separated line
    for i, probability in enumerate(__UpperCAmelCase ,   1			):
      print(f"""Probability of class_{i} is: {probability}"""			)
    print('''-''' * 100			)

    # Calculating the values of variance for each class
    lowercase				:							Tuple									=   calculate_variance(__UpperCAmelCase ,   __UpperCAmelCase ,   sum(__UpperCAmelCase			)			)
    print('''Variance: ''' ,   __UpperCAmelCase			)
    print('''-''' * 100			)

    # Predicting Y values
    # storing predicted Y values in 'pre_indexes' variable
    lowercase				:							Any									=   predict_y_values(__UpperCAmelCase ,   __UpperCAmelCase ,   __UpperCAmelCase ,   __UpperCAmelCase			)
    print('''-''' * 100			)

    # Calculating Accuracy of the model
    print(f"""Accuracy: {accuracy(__UpperCAmelCase ,   __UpperCAmelCase			)}"""			)
    print('''-''' * 100			)
    print(''' DONE '''.center(100 ,   '''+'''			)			)

    if input('''Press any key to restart or \'q\' for quit: '''			).strip().lower() == "q":
      print('''\n''' + '''GoodBye!'''.center(100 ,   '''-'''			) + '''\n'''			)
      break
    system('''cls''' if name == '''nt''' else '''clear'''			)  # noqa: S605


if __name__ == "__main__":
 main()
'''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     )