

"""simple docstring"""





import collections
import inspect
import unittest

from transformers import DinatConfig
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 DinatBackbone, DinatForImageClassification, DinatModel
   from transformers.models.dinat.modeling_dinat import DINAT_PRETRAINED_MODEL_ARCHIVE_LIST

if is_vision_available():
   from PIL import Image

   from transformers import AutoImageProcessor




class       _lowerCAmelCase						:







 """simple docstring"""







 def __init__(    self							:    Tuple,      UpperCAmelCase__							:    Optional[Any],      UpperCAmelCase__							:    Union[str, Any]=1_3,      UpperCAmelCase__							:    List[str]=6_4,      UpperCAmelCase__							:    str=4,      UpperCAmelCase__							:    str=3,      UpperCAmelCase__							:    List[str]=1_6,      UpperCAmelCase__							:    str=[1, 2, 1],      UpperCAmelCase__							:    Any=[2, 4, 8],      UpperCAmelCase__							:    List[str]=3,      UpperCAmelCase__							:    str=[[3], [1, 2], [1]],      UpperCAmelCase__							:    List[str]=2.0,      UpperCAmelCase__							:    Union[str, Any]=True,      UpperCAmelCase__							:    Tuple=0.0,      UpperCAmelCase__							:    List[str]=0.0,      UpperCAmelCase__							:    Union[str, Any]=0.1,      UpperCAmelCase__							:    Dict="gelu",      UpperCAmelCase__							:    List[Any]=True,      UpperCAmelCase__							:    List[str]=0.02,      UpperCAmelCase__							:    List[Any]=1E-5,      UpperCAmelCase__							:    Any=True,      UpperCAmelCase__							:    str=None,      UpperCAmelCase__							:    Union[str, Any]=True,      UpperCAmelCase__							:    List[str]=1_0,      UpperCAmelCase__							:    Tuple=["stage1", "stage2"],      UpperCAmelCase__							:    List[Any]=[1, 2],      ):
    __lowercase			=		parent
    __lowercase			=		batch_size
    __lowercase			=		image_size
    __lowercase			=		patch_size
    __lowercase			=		num_channels
    __lowercase			=		embed_dim
    __lowercase			=		depths
    __lowercase			=		num_heads
    __lowercase			=		kernel_size
    __lowercase			=		dilations
    __lowercase			=		mlp_ratio
    __lowercase			=		qkv_bias
    __lowercase			=		hidden_dropout_prob
    __lowercase			=		attention_probs_dropout_prob
    __lowercase			=		drop_path_rate
    __lowercase			=		hidden_act
    __lowercase			=		patch_norm
    __lowercase			=		layer_norm_eps
    __lowercase			=		initializer_range
    __lowercase			=		is_training
    __lowercase			=		scope
    __lowercase			=		use_labels
    __lowercase			=		num_labels
    __lowercase			=		out_features
    __lowercase			=		out_indices


 def       _lowercase				(    self							:    Optional[Any]			):
    __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       _lowercase				(    self							:    Any			):
    return DinatConfig(
        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,      dilations=self.dilations,      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       _lowercase				(    self							:    Optional[Any],      UpperCAmelCase__							:    List[Any],      UpperCAmelCase__							:    int,      UpperCAmelCase__							:    Optional[int]			):
    __lowercase			=		DinatModel(config=UpperCAmelCase__			)
    model.to(UpperCAmelCase__			)
    model.eval()
    __lowercase			=		model(UpperCAmelCase__			)

    __lowercase			=		__lowercase			=		(config.image_size // config.patch_size) // (2 ** (len(config.depths			) - 1))
    __lowercase			=		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       _lowercase				(    self							:    Tuple,      UpperCAmelCase__							:    Any,      UpperCAmelCase__							:    Optional[int],      UpperCAmelCase__							:    Optional[int]			):
    __lowercase			=		DinatForImageClassification(UpperCAmelCase__			)
    model.to(UpperCAmelCase__			)
    model.eval()
    __lowercase			=		model(UpperCAmelCase__,      labels=UpperCAmelCase__			)
    self.parent.assertEqual(result.logits.shape,      (self.batch_size, self.num_labels)			)

    # test greyscale images
    __lowercase			=		1
    __lowercase			=		DinatForImageClassification(UpperCAmelCase__			)
    model.to(UpperCAmelCase__			)
    model.eval()

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


 def       _lowercase				(    self							:    Dict,      UpperCAmelCase__							:    Any,      UpperCAmelCase__							:    int,      UpperCAmelCase__							:    Optional[int]			):
    __lowercase			=		DinatBackbone(config=UpperCAmelCase__			)
    model.to(UpperCAmelCase__			)
    model.eval()
    __lowercase			=		model(UpperCAmelCase__			)

    # 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], 1_6, 1_6]			)

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

    # verify backbone works with out_features=None
    __lowercase			=		None
    __lowercase			=		DinatBackbone(config=UpperCAmelCase__			)
    model.to(UpperCAmelCase__			)
    model.eval()
    __lowercase			=		model(UpperCAmelCase__			)

    # 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       _lowercase				(    self							:    Optional[int]			):
    __lowercase			=		self.prepare_config_and_inputs()
    __lowercase	,__lowercase	,__lowercase			=		config_and_inputs
    __lowercase			=		{"pixel_values": pixel_values}
    return config, inputs_dict







@require_natten
@require_torch
class       _lowerCAmelCase						(			lowercase  ,lowercase  ,unittest.TestCase     ):







 """simple docstring"""







 __UpperCAmelCase			:      Optional[Any]     	=			(
     (
         DinatModel,
         DinatForImageClassification,
         DinatBackbone,
     )
     if is_torch_available()
     else ()
 )
 __UpperCAmelCase			:      Tuple     	=			(
     {"feature-extraction": DinatModel, "image-classification": DinatForImageClassification}
     if is_torch_available()
     else {}
 )
 __UpperCAmelCase			:      Optional[Any]     	=			False

 __UpperCAmelCase			:      Dict     	=			False
 __UpperCAmelCase			:      Tuple     	=			False
 __UpperCAmelCase			:      Union[str, Any]     	=			False
 __UpperCAmelCase			:      Tuple     	=			False


 def       _lowercase				(    self							:    Tuple			):
    __lowercase			=		DinatModelTester(self			)
    __lowercase			=		ConfigTester(self,      config_class=UpperCAmelCase__,      embed_dim=3_7			)


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


 def       _lowercase				(    self							:    Tuple			):
    __lowercase			=		self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_model(*UpperCAmelCase__			)


 def       _lowercase				(    self							:    int			):
    __lowercase			=		self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_for_image_classification(*UpperCAmelCase__			)


 def       _lowercase				(    self							:    int			):
    __lowercase			=		self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_backbone(*UpperCAmelCase__			)


 @unittest.skip(reason="Dinat does not use inputs_embeds"			)
 def       _lowercase				(    self							:    Optional[int]			):
    pass


 @unittest.skip(reason="Dinat does not use feedforward chunking"			)
 def       _lowercase				(    self							:    Dict			):
    pass


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

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


 def       _lowercase				(    self							:    Union[str, Any]			):
    __lowercase	,__lowercase			=		self.model_tester.prepare_config_and_inputs_for_common()

    for model_class in self.all_model_classes:
       __lowercase			=		model_class(UpperCAmelCase__			)
       __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],      UpperCAmelCase__			)


 def       _lowercase				(    self							:    Any			):
    self.skipTest("Dinat's attention operation is handled entirely by NATTEN."			)


 def       _lowercase				(    self							:    Optional[Any],      UpperCAmelCase__							:    Any,      UpperCAmelCase__							:    Any,      UpperCAmelCase__							:    int,      UpperCAmelCase__							:    List[Any]			):
    __lowercase			=		model_class(UpperCAmelCase__			)
    model.to(UpperCAmelCase__			)
    model.eval()

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

    __lowercase			=		outputs.hidden_states

    __lowercase			=		getattr(
        self.model_tester,      "expected_num_hidden_layers",      len(self.model_tester.depths			) + 1			)
    self.assertEqual(len(UpperCAmelCase__			),      UpperCAmelCase__			)

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

    __lowercase			=		image_size[0] // patch_size[0]
    __lowercase			=		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__ != "DinatBackbone":
       __lowercase			=		outputs.reshaped_hidden_states
       self.assertEqual(len(UpperCAmelCase__			),      UpperCAmelCase__			)

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


 def       _lowercase				(    self							:    str			):
    __lowercase	,__lowercase			=		self.model_tester.prepare_config_and_inputs_for_common()

    __lowercase			=		(
        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			=		True
       self.check_hidden_states_output(UpperCAmelCase__,      UpperCAmelCase__,      UpperCAmelCase__,      UpperCAmelCase__			)

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

       self.check_hidden_states_output(UpperCAmelCase__,      UpperCAmelCase__,      UpperCAmelCase__,      UpperCAmelCase__			)


 @slow
 def       _lowercase				(    self							:    Union[str, Any]			):
    for model_name in DINAT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
       __lowercase			=		DinatModel.from_pretrained(UpperCAmelCase__			)
       self.assertIsNotNone(UpperCAmelCase__			)



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

    __lowercase			=		_config_zero_init(UpperCAmelCase__			)
    for model_class in self.all_model_classes:
       __lowercase			=		model_class(config=UpperCAmelCase__			)
       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     ):







 """simple docstring"""







 @cached_property
 def       _lowercase				(    self							:    Any			):
    return AutoImageProcessor.from_pretrained("shi-labs/dinat-mini-in1k-224"			) if is_vision_available() else None



 @slow
 def       _lowercase				(    self							:    Dict			):
    __lowercase			=		DinatForImageClassification.from_pretrained("shi-labs/dinat-mini-in1k-224"			).to(UpperCAmelCase__			)
    __lowercase			=		self.default_image_processor

    __lowercase			=		Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png"			)
    __lowercase			=		image_processor(images=UpperCAmelCase__,      return_tensors="pt"			).to(UpperCAmelCase__			)

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

    # verify the logits
    __lowercase			=		torch.Size((1, 1_0_0_0)			)
    self.assertEqual(outputs.logits.shape,      UpperCAmelCase__			)
    __lowercase			=		torch.tensor([-0.1_545, -0.7_667, 0.4_642]			).to(UpperCAmelCase__			)
    self.assertTrue(torch.allclose(outputs.logits[0, :3],      UpperCAmelCase__,      atol=1E-4			)			)







@require_torch
@require_natten
class       _lowerCAmelCase						(			unittest.TestCase  ,lowercase     ):







 """simple docstring"""







 __UpperCAmelCase			:      Tuple     	=			(DinatBackbone,) if is_torch_available() else ()
 __UpperCAmelCase			:      Union[str, Any]     	=			DinatConfig


 def       _lowercase				(    self							:    Optional[Any]			):
    __lowercase			=		DinatModelTester(self			)




"""simple docstring"""





import shutil

import requests




def 						_A						(						UpperCamelCase_  : str,    UpperCamelCase_  : bool = False,    UpperCamelCase_  : str = ".")			->		dict:
   '''simple docstring'''


   __lowercase			=		"https://api.nasa.gov/planetary/apod"
   return requests.get(UpperCamelCase_,    params={"api_key": api_key}).json()




def 						_A						(						UpperCamelCase_  : str,    UpperCamelCase_  : str = ".")			->		dict:
   '''simple docstring'''


   __lowercase			=		get_apod_data(UpperCamelCase_)
   __lowercase			=		apod_data["url"]
   __lowercase			=		img_url.split("/")[-1]
   __lowercase			=		requests.get(UpperCamelCase_,    stream=UpperCamelCase_)

   with open(F"""{path}/{img_name}""",    "wb+") as img_file:
      shutil.copyfileobj(response.raw,    UpperCamelCase_)
   del response
   return apod_data




def 						_A						(						UpperCamelCase_  : str)			->		dict:
   '''simple docstring'''


   __lowercase			=		"https://images-api.nasa.gov/search"
   return requests.get(UpperCamelCase_,    params={"q": query}).json()


if __name__ == "__main__":
   print(save_apod('YOUR API KEY'))
   _a				   =							get_archive_data('apollo 2011')['collection']['items']
   print(apollo_aaaa_items[0]['data'][0]['description'])




