

'''simple docstring'''






import inspect
import unittest
import warnings
from math import ceil, floor

from transformers import LevitConfig
from transformers.file_utils import cached_property, is_torch_available, is_vision_available
from transformers.models.auto import get_values
from transformers.testing_utils import require_torch, require_vision, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
 import torch

 from transformers import (
     MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING,
     MODEL_MAPPING,
     LevitForImageClassification,
     LevitForImageClassificationWithTeacher,
     LevitModel,
 )
 from transformers.models.levit.modeling_levit import LEVIT_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
 from PIL import Image

 from transformers import LevitImageProcessor






class     lowercase_			(lowerCamelCase__   ):




  """simple docstring"""




  def       SCREAMING_SNAKE_CASE   (   self     :  Any    ):
   __lowercase													=				self.config_class(**self.inputs_dict    )
   self.parent.assertTrue(hasattr(lowercase__      ,'''hidden_sizes'''    )    )
   self.parent.assertTrue(hasattr(lowercase__      ,'''num_attention_heads'''    )    )






class     lowercase_			:




  """simple docstring"""




  def __init__(   self     :  Optional[Any]      ,lowercase__     :  Any      ,lowercase__     :  Optional[int]=1_3      ,lowercase__     :  Union[str, Any]=6_4      ,lowercase__     :  List[str]=3      ,lowercase__     :  Any=3      ,lowercase__     :  Any=2      ,lowercase__     :  Optional[int]=1      ,lowercase__     :  Tuple=1_6      ,lowercase__     :  List[str]=[1_2_8, 2_5_6, 3_8_4]      ,lowercase__     :  List[str]=[4, 6, 8]      ,lowercase__     :  Tuple=[2, 3, 4]      ,lowercase__     :  str=[1_6, 1_6, 1_6]      ,lowercase__     :  Optional[int]=0      ,lowercase__     :  List[Any]=[2, 2, 2]      ,lowercase__     :  List[str]=[2, 2, 2]      ,lowercase__     :  Optional[int]=0.0_2      ,lowercase__     :  List[str]=True      ,lowercase__     :  Optional[Any]=True      ,lowercase__     :  Any=2      ,):
   __lowercase													=				parent
   __lowercase													=				batch_size
   __lowercase													=				image_size
   __lowercase													=				num_channels
   __lowercase													=				kernel_size
   __lowercase													=				stride
   __lowercase													=				padding
   __lowercase													=				hidden_sizes
   __lowercase													=				num_attention_heads
   __lowercase													=				depths
   __lowercase													=				key_dim
   __lowercase													=				drop_path_rate
   __lowercase													=				patch_size
   __lowercase													=				attention_ratio
   __lowercase													=				mlp_ratio
   __lowercase													=				initializer_range
   __lowercase													=				[
       ['''Subsample''', key_dim[0], hidden_sizes[0] // key_dim[0], 4, 2, 2],
       ['''Subsample''', key_dim[0], hidden_sizes[1] // key_dim[0], 4, 2, 2],
   ]
   __lowercase													=				is_training
   __lowercase													=				use_labels
   __lowercase													=				num_labels
   __lowercase													=				initializer_range






  def       SCREAMING_SNAKE_CASE   (   self     :  List[str]    ):
   __lowercase													=				floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]    )

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

   __lowercase													=				self.get_config()
   return config, pixel_values, labels






  def       SCREAMING_SNAKE_CASE   (   self     :  List[Any]    ):
   return LevitConfig(
       image_size=self.image_size      ,num_channels=self.num_channels      ,kernel_size=self.kernel_size      ,stride=self.stride      ,padding=self.padding      ,patch_size=self.patch_size      ,hidden_sizes=self.hidden_sizes      ,num_attention_heads=self.num_attention_heads      ,depths=self.depths      ,key_dim=self.key_dim      ,drop_path_rate=self.drop_path_rate      ,mlp_ratio=self.mlp_ratio      ,attention_ratio=self.attention_ratio      ,initializer_range=self.initializer_range      ,down_ops=self.down_ops      ,)






  def       SCREAMING_SNAKE_CASE   (   self     :  List[Any]      ,lowercase__     :  Union[str, Any]      ,lowercase__     :  str      ,lowercase__     :  Any    ):
   __lowercase													=				LevitModel(config=lowercase__    )
   model.to(lowercase__    )
   model.eval()
   __lowercase													=				model(lowercase__    )
   __lowercase													=				(self.image_size, self.image_size)
   __lowercase						,			__lowercase													=				image_size[0], image_size[1]
   for _ in range(4    ):
    __lowercase													=				floor(((height + 2 * self.padding - self.kernel_size) / self.stride) + 1    )
    __lowercase													=				floor(((width + 2 * self.padding - self.kernel_size) / self.stride) + 1    )
   self.parent.assertEqual(
       result.last_hidden_state.shape      ,(self.batch_size, ceil(height / 4    ) * ceil(width / 4    ), self.hidden_sizes[-1])      ,)






  def       SCREAMING_SNAKE_CASE   (   self     :  int      ,lowercase__     :  List[str]      ,lowercase__     :  Optional[Any]      ,lowercase__     :  str    ):
   __lowercase													=				self.num_labels
   __lowercase													=				LevitForImageClassification(lowercase__    )
   model.to(lowercase__    )
   model.eval()
   __lowercase													=				model(lowercase__      ,labels=lowercase__    )
   self.parent.assertEqual(result.logits.shape      ,(self.batch_size, self.num_labels)    )






  def       SCREAMING_SNAKE_CASE   (   self     :  Tuple    ):
   __lowercase													=				self.prepare_config_and_inputs()
   __lowercase						,			__lowercase						,			__lowercase													=				config_and_inputs
   __lowercase													=				{'''pixel_values''': pixel_values}
   return config, inputs_dict






@require_torch
class     lowercase_			(lowerCamelCase__       , lowerCamelCase__       , unittest.TestCase   ):




  """simple docstring"""




  SCREAMING_SNAKE_CASE					:						Optional[Any]           =    (
      (LevitModel, LevitForImageClassification, LevitForImageClassificationWithTeacher)
      if is_torch_available()
      else ()
  )
  SCREAMING_SNAKE_CASE					:						Union[str, Any]           =    (
      {
          'feature-extraction': LevitModel,
          'image-classification': (LevitForImageClassification, LevitForImageClassificationWithTeacher),
      }
      if is_torch_available()
      else {}
  )

  SCREAMING_SNAKE_CASE					:						int           =    False
  SCREAMING_SNAKE_CASE					:						Union[str, Any]           =    False
  SCREAMING_SNAKE_CASE					:						Tuple           =    False
  SCREAMING_SNAKE_CASE					:						Optional[int]           =    False
  SCREAMING_SNAKE_CASE					:						Tuple           =    False






  def       SCREAMING_SNAKE_CASE   (   self     :  Union[str, Any]    ):
   __lowercase													=				LevitModelTester(self    )
   __lowercase													=				ConfigTester(self      ,config_class=lowercase__      ,has_text_modality=lowercase__      ,hidden_size=3_7    )






  def       SCREAMING_SNAKE_CASE   (   self     :  List[Any]    ):
   self.create_and_test_config_common_properties()
   self.config_tester.create_and_test_config_to_json_string()
   self.config_tester.create_and_test_config_to_json_file()
   self.config_tester.create_and_test_config_from_and_save_pretrained()
   self.config_tester.create_and_test_config_with_num_labels()
   self.config_tester.check_config_can_be_init_without_params()
   self.config_tester.check_config_arguments_init()






  def       SCREAMING_SNAKE_CASE   (   self     :  Any    ):
   return






  @unittest.skip(reason='''Levit does not use inputs_embeds'''    )
  def       SCREAMING_SNAKE_CASE   (   self     :  List[Any]    ):
   pass






  @unittest.skip(reason='''Levit does not support input and output embeddings'''    )
  def       SCREAMING_SNAKE_CASE   (   self     :  Tuple    ):
   pass






  @unittest.skip(reason='''Levit does not output attentions'''    )
  def       SCREAMING_SNAKE_CASE   (   self     :  List[Any]    ):
   pass






  def       SCREAMING_SNAKE_CASE   (   self     :  Any    ):
   __lowercase						,			__lowercase													=				self.model_tester.prepare_config_and_inputs_for_common()

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

    __lowercase													=				['''pixel_values''']
    self.assertListEqual(arg_names[:1]      ,lowercase__    )






  def       SCREAMING_SNAKE_CASE   (   self     :  List[str]    ):
   def check_hidden_states_output(lowercase__     :  str      ,lowercase__     :  Optional[Any]      ,lowercase__     :  Union[str, Any]    ):
    __lowercase													=				model_class(lowercase__    )
    model.to(lowercase__    )
    model.eval()

    with torch.no_grad():
     __lowercase													=				model(**self._prepare_for_class(lowercase__      ,lowercase__    )    )

    __lowercase													=				outputs.hidden_states

    __lowercase													=				len(self.model_tester.depths    ) + 1
    self.assertEqual(len(lowercase__    )      ,lowercase__    )

    __lowercase													=				(self.model_tester.image_size, self.model_tester.image_size)
    __lowercase						,			__lowercase													=				image_size[0], image_size[1]
    for _ in range(4    ):
     __lowercase													=				floor(
         (
             (height + 2 * self.model_tester.padding - self.model_tester.kernel_size)
             / self.model_tester.stride
         )
         + 1    )
     __lowercase													=				floor(
         (
             (width + 2 * self.model_tester.padding - self.model_tester.kernel_size)
             / self.model_tester.stride
         )
         + 1    )
    # verify the first hidden states (first block)
    self.assertListEqual(
        list(hidden_states[0].shape[-2:]    )      ,[
            height * width,
            self.model_tester.hidden_sizes[0],
        ]      ,)

   __lowercase						,			__lowercase													=				self.model_tester.prepare_config_and_inputs_for_common()

   for model_class in self.all_model_classes:
    __lowercase													=				True
    check_hidden_states_output(lowercase__      ,lowercase__      ,lowercase__    )

    # check that output_hidden_states also work using config
    del inputs_dict["output_hidden_states"]
    __lowercase													=				True

    check_hidden_states_output(lowercase__      ,lowercase__      ,lowercase__    )






  @unittest.skip('''Will be fixed soon by reducing the size of the model used for common tests.'''    )
  def       SCREAMING_SNAKE_CASE   (   self     :  Tuple    ):
   pass






  def       SCREAMING_SNAKE_CASE   (   self     :  List[str]      ,lowercase__     :  List[str]      ,lowercase__     :  Tuple      ,lowercase__     :  Tuple=False    ):
   __lowercase													=				super()._prepare_for_class(lowercase__      ,lowercase__      ,return_labels=lowercase__    )

   if return_labels:
    if model_class.__name__ == "LevitForImageClassificationWithTeacher":
     del inputs_dict["labels"]

   return inputs_dict






  def       SCREAMING_SNAKE_CASE   (   self     :  Optional[Any]    ):
   __lowercase													=				self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_model(*lowercase__    )






  def       SCREAMING_SNAKE_CASE   (   self     :  List[Any]    ):
   __lowercase													=				self.model_tester.prepare_config_and_inputs()
   self.model_tester.create_and_check_for_image_classification(*lowercase__    )






  def       SCREAMING_SNAKE_CASE   (   self     :  List[str]    ):
   if not self.model_tester.is_training:
    return

   __lowercase						,			__lowercase													=				self.model_tester.prepare_config_and_inputs_for_common()
   __lowercase													=				True

   for model_class in self.all_model_classes:
    # LevitForImageClassificationWithTeacher supports inference-only
    if (
        model_class in get_values(lowercase__    )
        or model_class.__name__ == "LevitForImageClassificationWithTeacher"
    ):
     continue
    __lowercase													=				model_class(lowercase__    )
    model.to(lowercase__    )
    model.train()
    __lowercase													=				self._prepare_for_class(lowercase__      ,lowercase__      ,return_labels=lowercase__    )
    __lowercase													=				model(**lowercase__    ).loss
    loss.backward()






  def       SCREAMING_SNAKE_CASE   (   self     :  int    ):
   __lowercase						,			__lowercase													=				self.model_tester.prepare_config_and_inputs_for_common()
   if not self.model_tester.is_training:
    return

   __lowercase													=				False
   __lowercase													=				True

   for model_class in self.all_model_classes:
    if model_class in get_values(lowercase__    ) or not model_class.supports_gradient_checkpointing:
     continue
    # LevitForImageClassificationWithTeacher supports inference-only
    if model_class.__name__ == "LevitForImageClassificationWithTeacher":
     continue
    __lowercase													=				model_class(lowercase__    )
    model.gradient_checkpointing_enable()
    model.to(lowercase__    )
    model.train()
    __lowercase													=				self._prepare_for_class(lowercase__      ,lowercase__      ,return_labels=lowercase__    )
    __lowercase													=				model(**lowercase__    ).loss
    loss.backward()






  def       SCREAMING_SNAKE_CASE   (   self     :  List[str]    ):
   __lowercase						,			__lowercase													=				self.model_tester.prepare_config_and_inputs_for_common()

   __lowercase													=				[
       {'''title''': '''multi_label_classification''', '''num_labels''': 2, '''dtype''': torch.float},
       {'''title''': '''single_label_classification''', '''num_labels''': 1, '''dtype''': torch.long},
       {'''title''': '''regression''', '''num_labels''': 1, '''dtype''': torch.float},
   ]

   for model_class in self.all_model_classes:
    if (
        model_class
        not in [
            *get_values(lowercase__    ),
        ]
        or model_class.__name__ == "LevitForImageClassificationWithTeacher"
    ):
     continue

    for problem_type in problem_types:
     with self.subTest(msg=F"Testing {model_class} with {problem_type['title']}"    ):
      __lowercase													=				problem_type['''title''']
      __lowercase													=				problem_type['''num_labels''']

      __lowercase													=				model_class(lowercase__    )
      model.to(lowercase__    )
      model.train()

      __lowercase													=				self._prepare_for_class(lowercase__      ,lowercase__      ,return_labels=lowercase__    )

      if problem_type["num_labels"] > 1:
       __lowercase													=				inputs['''labels'''].unsqueeze(1    ).repeat(1      ,problem_type['''num_labels''']    )

      __lowercase													=				inputs['''labels'''].to(problem_type['''dtype''']    )

      # This tests that we do not trigger the warning form PyTorch "Using a target size that is different
      # to the input size. This will likely lead to incorrect results due to broadcasting. Please ensure
      # they have the same size." which is a symptom something in wrong for the regression problem.
      # See https://github.com/huggingface/transformers/issues/11780
      with warnings.catch_warnings(record=lowercase__    ) as warning_list:
       __lowercase													=				model(**lowercase__    ).loss
      for w in warning_list:
       if "Using a target size that is different to the input size" in str(w.message    ):
        raise ValueError(
            F"Something is going wrong in the regression problem: intercepted {w.message}"    )

      loss.backward()






  @slow
  def       SCREAMING_SNAKE_CASE   (   self     :  Union[str, Any]    ):
   for model_name in LEVIT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
    __lowercase													=				LevitModel.from_pretrained(lowercase__    )
    self.assertIsNotNone(lowercase__    )


def 	_A  (					):






 """simple docstring"""



 __lowercase													=				Image.open('''./tests/fixtures/tests_samples/COCO/000000039769.png'''   )
 return image






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




  """simple docstring"""




  @cached_property
  def       SCREAMING_SNAKE_CASE   (   self     :  Any    ):
   return LevitImageProcessor.from_pretrained(LEVIT_PRETRAINED_MODEL_ARCHIVE_LIST[0]    )






  @slow
  def       SCREAMING_SNAKE_CASE   (   self     :  Union[str, Any]    ):
   __lowercase													=				LevitForImageClassificationWithTeacher.from_pretrained(LEVIT_PRETRAINED_MODEL_ARCHIVE_LIST[0]    ).to(
       lowercase__    )

   __lowercase													=				self.default_image_processor
   __lowercase													=				prepare_img()
   __lowercase													=				image_processor(images=lowercase__      ,return_tensors='''pt'''    ).to(lowercase__    )

   # forward pass
   with torch.no_grad():
    __lowercase													=				model(**lowercase__    )

   # verify the logits
   __lowercase													=				torch.Size((1, 1_0_0_0)    )
   self.assertEqual(outputs.logits.shape      ,lowercase__    )

   __lowercase													=				torch.tensor([1.0_4_4_8, -0.3_7_4_5, -1.8_3_1_7]    ).to(lowercase__    )

   self.assertTrue(torch.allclose(outputs.logits[0, :3]      ,lowercase__      ,atol=1e-4    )    )




'''simple docstring'''






from collections.abc import Callable

import numpy as np


def 	_A  (					A__  ,       A__  ,       A__  ,       A__  ,       A__   ):






 """simple docstring"""



 __lowercase													=				int(np.ceil((x_end - xa) / step_size   )   )
 __lowercase													=				np.zeros((n + 1,)   )
 __lowercase													=				ya
 __lowercase													=				xa

 for k in range(A__   ):
  __lowercase													=				y[k] + step_size * ode_func(A__  ,       y[k]   )
  x += step_size

 return y


if __name__ == "__main__":
 import doctest

 doctest.testmod()

