

"""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				:     Dict,   UpperCAmelCase__				:     int,   UpperCAmelCase__				:     Any=1_3,   UpperCAmelCase__				:     str=6_4,   UpperCAmelCase__				:     Optional[int]=4,   UpperCAmelCase__				:     str=3,   UpperCAmelCase__				:     Optional[Any]=1_6,   UpperCAmelCase__				:     Tuple=[1, 2, 1],   UpperCAmelCase__				:     int=[2, 4, 8],   UpperCAmelCase__				:     Optional[Any]=3,   UpperCAmelCase__				:     str=[[3], [1, 2], [1]],   UpperCAmelCase__				:     Dict=2.0,   UpperCAmelCase__				:     Tuple=True,   UpperCAmelCase__				:     List[Any]=0.0,   UpperCAmelCase__				:     Tuple=0.0,   UpperCAmelCase__				:     Tuple=0.1,   UpperCAmelCase__				:     List[str]="gelu",   UpperCAmelCase__				:     Optional[Any]=True,   UpperCAmelCase__				:     Dict=0.02,   UpperCAmelCase__				:     Optional[Any]=1E-5,   UpperCAmelCase__				:     List[str]=True,   UpperCAmelCase__				:     int=None,   UpperCAmelCase__				:     Any=True,   UpperCAmelCase__				:     Optional[Any]=1_0,   UpperCAmelCase__				:     Any=["stage1", "stage2"],   UpperCAmelCase__				:     Union[str, 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[int]      ):
    __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				:     List[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__				:     Union[str, Any],   UpperCAmelCase__				:     Dict,   UpperCAmelCase__				:     List[str]      ):
    __lowercase								=		DinatModel(config=lowerCAmelCase__      )
    model.to(lowerCAmelCase__      )
    model.eval()
    __lowercase								=		model(lowerCAmelCase__      )

    __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				:     Any,   UpperCAmelCase__				:     Optional[int],   UpperCAmelCase__				:     List[Any],   UpperCAmelCase__				:     Optional[Any]      ):
    __lowercase								=		DinatForImageClassification(lowerCAmelCase__      )
    model.to(lowerCAmelCase__      )
    model.eval()
    __lowercase								=		model(lowerCAmelCase__,   labels=lowerCAmelCase__      )
    self.parent.assertEqual(result.logits.shape,   (self.batch_size, self.num_labels)      )

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

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


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

    # 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=lowerCAmelCase__      )
    model.to(lowerCAmelCase__      )
    model.eval()
    __lowercase								=		model(lowerCAmelCase__      )

    # 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				:     str      ):
    __lowercase								=		self.prepare_config_and_inputs()
    __lowercase								=		config_and_inputs
    __lowercase								=		{'''pixel_values''': pixel_values}
    return config, inputs_dict







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







 """simple docstring"""







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

 __UpperCAmelCase      :   Optional[int]  						=      False
 __UpperCAmelCase      :   Any  						=      False
 __UpperCAmelCase      :   Dict  						=      False
 __UpperCAmelCase      :   List[Any]  						=      False


 def    _lowercase					(     self				:     Union[str, Any]      ):
    __lowercase								=		DinatModelTester(self      )
    __lowercase								=		ConfigTester(self,   config_class=lowerCAmelCase__,   embed_dim=3_7      )


 def    _lowercase					(     self				:     Optional[int]      ):
    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				:     Dict      ):
    __lowercase								=		self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_model(*lowerCAmelCase__      )


 def    _lowercase					(     self				:     Optional[Any]      ):
    __lowercase								=		self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_for_image_classification(*lowerCAmelCase__      )


 def    _lowercase					(     self				:     Any      ):
    __lowercase								=		self.model_tester.prepare_config_and_inputs()
    self.model_tester.create_and_check_backbone(*lowerCAmelCase__      )


 @unittest.skip(reason="Dinat does not use inputs_embeds"      )
 def    _lowercase					(     self				:     str      ):
    pass


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


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

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


 def    _lowercase					(     self				:     Optional[Any]      ):
    __lowercase								=		self.model_tester.prepare_config_and_inputs_for_common()

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


 def    _lowercase					(     self				:     List[str]      ):
    self.skipTest("Dinat\'s attention operation is handled entirely by NATTEN."      )


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

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

    __lowercase								=		outputs.hidden_states

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

    # 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(lowerCAmelCase__      ),   lowerCAmelCase__      )

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


 def    _lowercase					(     self				:     Tuple      ):
    __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(lowerCAmelCase__,   lowerCAmelCase__,   lowerCAmelCase__,   lowerCAmelCase__      )

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

       self.check_hidden_states_output(lowerCAmelCase__,   lowerCAmelCase__,   lowerCAmelCase__,   lowerCAmelCase__      )


 @slow
 def    _lowercase					(     self				:     List[Any]      ):



    for model_name in DINAT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
       __lowercase								=		DinatModel.from_pretrained(lowerCAmelCase__      )
       self.assertIsNotNone(lowerCAmelCase__      )



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

    __lowercase								=		_config_zero_init(lowerCAmelCase__      )
    for model_class in self.all_model_classes:
       __lowercase								=		model_class(config=lowerCAmelCase__      )
       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				:     List[Any]      ):
    return AutoImageProcessor.from_pretrained("shi-labs/dinat-mini-in1k-224"      ) if is_vision_available() else None



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

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

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

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







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







 """simple docstring"""







 __UpperCAmelCase      :   Optional[int]  						=      (DinatBackbone,) if is_torch_available() else ()
 __UpperCAmelCase      :   int  						=      DinatConfig


 def    _lowercase					(     self				:     Any      ):
    __lowercase								=		DinatModelTester(self      )











"""simple docstring"""




import os

import requests
from bsa import BeautifulSoup
from fake_useragent import UserAgent

UpperCamelCase_	 ={"""UserAgent""": UserAgent().random}
UpperCamelCase_	 ="""https://www.mywaifulist.moe/random"""





def 			a_							(				_lowercase			,		_lowercase  ):
						_UpperCamelCase     :   Optional[Any]      =       requests.get(_lowercase			,		headers=_lowercase  )
						with open(_lowercase			,		'''wb'''  ) as file:
												file.write(image.content  )





def 			a_							(				):
						_UpperCamelCase     :   Union[str, Any]      =       BeautifulSoup(requests.get(_lowercase			,		headers=_lowercase  ).text			,		'''html.parser'''  )
						_UpperCamelCase     :   List[str]      =       soup.find('''meta'''			,		attrs={'''property''': '''og:title'''}  ).attrs['''content''']
						_UpperCamelCase     :   Optional[int]      =       soup.find('''meta'''			,		attrs={'''property''': '''og:image'''}  ).attrs['''content''']
						_UpperCamelCase     :   Any      =       soup.find('''p'''			,		id='''description'''  ).get_text()
						_UpperCamelCase  ,				_UpperCamelCase     :   Optional[int]      =       os.path.splitext(os.path.basename(_lowercase  )  )
						_UpperCamelCase     :   Dict      =       title.strip().replace(''' '''			,		'''_'''  )
						_UpperCamelCase     :   str      =       F"""{image_title}{image_extension}"""
						save_image(_lowercase			,		_lowercase  )
						return (title, description, image_title)


if __name__ == "__main__":
						UpperCamelCase_ ,      UpperCamelCase_ ,      UpperCamelCase_	 =random_anime_character()
						print(F"{title}\n\n{desc}\n\nImage saved : {image_title}")



