


'''simple docstring'''
from typing import Callable, Dict, Optional, Tuple

import torch
from torch import nn
from torch.distributions import (
    AffineTransform,
    Distribution,
    Independent,
    NegativeBinomial,
    Normal,
    StudentT,
    TransformedDistribution,
)




class      lowerCamelCase_  (      __a ):






      def __init__(   self							:       List[Any]		,		_A							:       Distribution		,		_A							:       Union[str, Any]=None		,		_A							:       int=None		,		_A							:       Optional[Any]=0					):


          '''simple docstring'''


          UpperCAmelCase__     :						str						=							1.0 if scale is None else scale
          UpperCAmelCase__     :						Optional[int]						=							0.0 if loc is None else loc

          super().__init__(_A		,		[AffineTransform(loc=self.loc		,		scale=self.scale		,		event_dim=_A					)]					)






      @property
      def lowercase_				(   self							:       Union[str, Any]					):


          '''simple docstring'''


          return self.base_dist.mean * self.scale + self.loc






      @property
      def lowercase_				(   self							:       Dict					):


          '''simple docstring'''


          return self.base_dist.variance * self.scale**2






      @property
      def lowercase_				(   self							:       Optional[Any]					):


          '''simple docstring'''


          return self.variance.sqrt()




class      lowerCamelCase_  (      nn.Module ):






      def __init__(   self							:       Tuple		,		_A							:       int		,		_A							:       Dict[str, int]		,		_A							:       Callable[..., Tuple[torch.Tensor]]		,		**_A							:       Dict					):


          '''simple docstring'''


          super().__init__(**_A					)
          UpperCAmelCase__     :						str						=							args_dim
          UpperCAmelCase__     :						int						=							nn.ModuleList([nn.Linear(_A		,		_A					) for dim in args_dim.values()]					)
          UpperCAmelCase__     :						int						=							domain_map






      def lowercase_				(   self							:       Union[str, Any]		,		_A							:       torch.Tensor					):


          '''simple docstring'''


          UpperCAmelCase__     :						List[str]						=							[proj(_A					) for proj in self.proj]

          return self.domain_map(*_A					)




class      lowerCamelCase_  (      nn.Module ):






      def __init__(   self							:       Optional[int]		,		_A							:       Any					):


          '''simple docstring'''


          super().__init__()
          UpperCAmelCase__     :						Optional[Any]						=							function






      def lowercase_				(   self							:       Union[str, Any]		,		_A							:       Optional[int]		,		*_A							:       str					):


          '''simple docstring'''


          return self.function(_A		,		*_A					)




class      lowerCamelCase_  :
      lowerCAmelCase__							=	42
      lowerCAmelCase__							=	42
      lowerCAmelCase__							=	42






      def __init__(   self							:       List[Any]		,		_A							:       int = 1					):


          '''simple docstring'''


          UpperCAmelCase__     :						Optional[Any]						=							dim
          UpperCAmelCase__     :						str						=							{k: dim * self.args_dim[k] for k in self.args_dim}






      def lowercase_				(   self							:       List[Any]		,		_A							:       Optional[int]					):


          '''simple docstring'''


          if self.dim == 1:
              return self.distribution_class(*_A					)
          else:
              return Independent(self.distribution_class(*_A					)		,		1					)






      def lowercase_				(   self							:       int		,		_A							:       List[Any]		,		_A							:       Optional[torch.Tensor] = None		,		_A							:       Optional[torch.Tensor] = None		,		):


          '''simple docstring'''


          UpperCAmelCase__     :						Union[str, Any]						=							self._base_distribution(_A					)
          if loc is None and scale is None:
              return distr
          else:
              return AffineTransformed(_A		,		loc=_A		,		scale=_A		,		event_dim=self.event_dim					)






      @property
      def lowercase_				(   self							:       List[Any]					):


          '''simple docstring'''


          return () if self.dim == 1 else (self.dim,)






      @property
      def lowercase_				(   self							:       List[str]					):


          '''simple docstring'''


          return len(self.event_shape					)






      @property
      def lowercase_				(   self							:       str					):


          '''simple docstring'''


          return 0.0






      def lowercase_				(   self							:       Optional[int]		,		_A							:       int					):


          '''simple docstring'''


          return ParameterProjection(
              in_features=_A		,		args_dim=self.args_dim		,		domain_map=LambdaLayer(self.domain_map					)		,		)






      def lowercase_				(   self							:       Union[str, Any]		,		*_A							:       torch.Tensor					):


          '''simple docstring'''


          raise NotImplementedError()






      @staticmethod
      def lowercase_				(   _A							:       torch.Tensor					):


          '''simple docstring'''


          return (x + torch.sqrt(torch.square(_A					) + 4.0					)) / 2.0




class      lowerCamelCase_  (      __a ):
      lowerCAmelCase__							=	{"df": 1, "loc": 1, "scale": 1}
      lowerCAmelCase__							=	StudentT






      @classmethod
      def lowercase_				(   cls							:       str		,		_A							:       torch.Tensor		,		_A							:       torch.Tensor		,		_A							:       torch.Tensor					):


          '''simple docstring'''


          UpperCAmelCase__     :						Dict						=							cls.squareplus(_A					).clamp_min(torch.finfo(scale.dtype					).eps					)
          UpperCAmelCase__     :						str						=							2.0 + cls.squareplus(_A					)
          return df.squeeze(-1					), loc.squeeze(-1					), scale.squeeze(-1					)




class      lowerCamelCase_  (      __a ):
      lowerCAmelCase__							=	{"loc": 1, "scale": 1}
      lowerCAmelCase__							=	Normal






      @classmethod
      def lowercase_				(   cls							:       Any		,		_A							:       torch.Tensor		,		_A							:       torch.Tensor					):


          '''simple docstring'''


          UpperCAmelCase__     :						Dict						=							cls.squareplus(_A					).clamp_min(torch.finfo(scale.dtype					).eps					)
          return loc.squeeze(-1					), scale.squeeze(-1					)




class      lowerCamelCase_  (      __a ):
      lowerCAmelCase__							=	{"total_count": 1, "logits": 1}
      lowerCAmelCase__							=	NegativeBinomial






      @classmethod
      def lowercase_				(   cls							:       List[Any]		,		_A							:       torch.Tensor		,		_A							:       torch.Tensor					):


          '''simple docstring'''


          UpperCAmelCase__     :						Union[str, Any]						=							cls.squareplus(_A					)
          return total_count.squeeze(-1					), logits.squeeze(-1					)






      def lowercase_				(   self							:       int		,		_A							:       Dict					):


          '''simple docstring'''


          UpperCAmelCase__		,		UpperCAmelCase__     :						Dict						=							distr_args
          if self.dim == 1:
              return self.distribution_class(total_count=_A		,		logits=_A					)
          else:
              return Independent(self.distribution_class(total_count=_A		,		logits=_A					)		,		1					)






      def lowercase_				(   self							:       str		,		_A							:       Any		,		_A							:       Optional[torch.Tensor] = None		,		_A							:       Optional[torch.Tensor] = None					):


          '''simple docstring'''


          UpperCAmelCase__		,		UpperCAmelCase__     :						Any						=							distr_args

          if scale is not None:
              # See scaling property of Gamma.
              logits += scale.log()

          return self._base_distribution((total_count, logits)					)




from __future__ import annotations

import inspect
import unittest

import numpy as np

from transformers import ResNetConfig
from transformers.testing_utils import require_tf, require_vision, slow
from transformers.utils import cached_property, is_tf_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_tf_common import TFModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_tf_available():
 import tensorflow as tf

 from transformers import TFResNetForImageClassification, TFResNetModel
 from transformers.models.resnet.modeling_tf_resnet import TF_RESNET_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
 from PIL import Image

 from transformers import AutoImageProcessor






class 	__lowercase					:





      def __init__(		self    :       str       ,							__lowerCamelCase    :       Any       ,							__lowerCamelCase    :       Optional[int]=3       ,							__lowerCamelCase    :       Union[str, Any]=3_2       ,							__lowerCamelCase    :       List[str]=3       ,							__lowerCamelCase    :       Dict=1_0       ,							__lowerCamelCase    :       Optional[int]=[1_0, 2_0, 3_0, 4_0]       ,							__lowerCamelCase    :       Optional[int]=[1, 1, 2, 1]       ,							__lowerCamelCase    :       int=True       ,							__lowerCamelCase    :       str=True       ,							__lowerCamelCase    :       str="relu"       ,							__lowerCamelCase    :       str=3       ,							__lowerCamelCase    :       int=None       ,							)     -> Dict:






         """simple docstring"""







         UpperCAmelCase      					=  parent
         UpperCAmelCase      					=  batch_size
         UpperCAmelCase      					=  image_size
         UpperCAmelCase      					=  num_channels
         UpperCAmelCase      					=  embeddings_size
         UpperCAmelCase      					=  hidden_sizes
         UpperCAmelCase      					=  depths
         UpperCAmelCase      					=  is_training
         UpperCAmelCase      					=  use_labels
         UpperCAmelCase      					=  hidden_act
         UpperCAmelCase      					=  num_labels
         UpperCAmelCase      					=  scope
         UpperCAmelCase      					=  len(__lowerCamelCase							)





      def 							_lowercase					(		self    :       List[str]							)     -> Optional[Any]:






         """simple docstring"""







         UpperCAmelCase      					=  floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]							)

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

         UpperCAmelCase      					=  self.get_config()

         return config, pixel_values, labels





      def 							_lowercase					(		self    :       List[Any]							)     -> Dict:






         """simple docstring"""







         return ResNetConfig(
             num_channels=self.num_channels       ,							embeddings_size=self.embeddings_size       ,							hidden_sizes=self.hidden_sizes       ,							depths=self.depths       ,							hidden_act=self.hidden_act       ,							num_labels=self.num_labels       ,							image_size=self.image_size       ,							)





      def 							_lowercase					(		self    :       Tuple       ,							__lowerCamelCase    :       Optional[int]       ,							__lowerCamelCase    :       List[str]       ,							__lowerCamelCase    :       Tuple							)     -> str:






         """simple docstring"""







         UpperCAmelCase      					=  TFResNetModel(config=__lowerCamelCase							)
         UpperCAmelCase      					=  model(__lowerCamelCase							)
         # expected last hidden states: B, C, H // 32, W // 32
         self.parent.assertEqual(
             result.last_hidden_state.shape       ,							(self.batch_size, self.hidden_sizes[-1], self.image_size // 3_2, self.image_size // 3_2)       ,							)





      def 							_lowercase					(		self    :       Optional[Any]       ,							__lowerCamelCase    :       Any       ,							__lowerCamelCase    :       Optional[Any]       ,							__lowerCamelCase    :       int							)     -> Tuple:






         """simple docstring"""







         UpperCAmelCase      					=  self.num_labels
         UpperCAmelCase      					=  TFResNetForImageClassification(__lowerCamelCase							)
         UpperCAmelCase      					=  model(__lowerCamelCase       ,							labels=__lowerCamelCase							)
         self.parent.assertEqual(result.logits.shape       ,							(self.batch_size, self.num_labels)							)





      def 							_lowercase					(		self    :       Optional[int]							)     -> Tuple:






         """simple docstring"""







         UpperCAmelCase      					=  self.prepare_config_and_inputs()
         UpperCAmelCase					,	UpperCAmelCase					,	UpperCAmelCase      					=  config_and_inputs
         UpperCAmelCase      					=  {"""pixel_values""": pixel_values}
         return config, inputs_dict






@require_tf
class 	__lowercase					(	__snake_case			,       __snake_case			,       unittest.TestCase	):
      UpperCamelCase										=							(TFResNetModel, TFResNetForImageClassification) if is_tf_available() else ()
      UpperCamelCase										=							(
          {'''feature-extraction''': TFResNetModel, '''image-classification''': TFResNetForImageClassification}
          if is_tf_available()
          else {}
      )

      UpperCamelCase										=							False
      UpperCamelCase										=							False
      UpperCamelCase										=							False
      UpperCamelCase										=							False
      UpperCamelCase										=							False





      def 							_lowercase					(		self    :       str							)     -> List[Any]:






         """simple docstring"""







         UpperCAmelCase      					=  TFResNetModelTester(self							)
         UpperCAmelCase      					=  ConfigTester(self       ,							config_class=__lowerCamelCase       ,							has_text_modality=__lowerCamelCase							)





      def 							_lowercase					(		self    :       str							)     -> Dict:






         """simple docstring"""







         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    :       str							)     -> Dict:






         """simple docstring"""







         return





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






         """simple docstring"""







         pass





      @unittest.skip(reason="""ResNet does not support input and output embeddings"""							)
      def 							_lowercase					(		self    :       Union[str, Any]							)     -> Tuple:






         """simple docstring"""







         pass





      def 							_lowercase					(		self    :       Optional[Any]							)     -> Optional[int]:






         """simple docstring"""







         UpperCAmelCase					,	UpperCAmelCase      					=  self.model_tester.prepare_config_and_inputs_for_common()

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

            UpperCAmelCase      					=  ["""pixel_values"""]
            self.assertListEqual(arg_names[:1]       ,							__lowerCamelCase							)





      def 							_lowercase					(		self    :       str							)     -> List[Any]:






         """simple docstring"""







         UpperCAmelCase      					=  self.model_tester.prepare_config_and_inputs()
         self.model_tester.create_and_check_model(*__lowerCamelCase							)





      def 							_lowercase					(		self    :       List[Any]							)     -> List[str]:






         """simple docstring"""







         def check_hidden_states_output(__lowerCamelCase    :       str       ,							__lowerCamelCase    :       Dict       ,							__lowerCamelCase    :       Union[str, Any]							):
            UpperCAmelCase      					=  model_class(__lowerCamelCase							)
            UpperCAmelCase      					=  model(**self._prepare_for_class(__lowerCamelCase       ,							__lowerCamelCase							)							)

            UpperCAmelCase      					=  outputs.encoder_hidden_states if config.is_encoder_decoder else outputs.hidden_states

            UpperCAmelCase      					=  self.model_tester.num_stages
            self.assertEqual(len(__lowerCamelCase							)       ,							expected_num_stages + 1							)

            # ResNet's feature maps are of shape (batch_size, num_channels, height, width)
            self.assertListEqual(
                list(hidden_states[0].shape[-2:]							)       ,							[self.model_tester.image_size // 4, self.model_tester.image_size // 4]       ,							)

         UpperCAmelCase					,	UpperCAmelCase      					=  self.model_tester.prepare_config_and_inputs_for_common()
         UpperCAmelCase      					=  ["""basic""", """bottleneck"""]
         for model_class in self.all_model_classes:
            for layer_type in layers_type:
               UpperCAmelCase      					=  layer_type
               UpperCAmelCase      					=  True
               check_hidden_states_output(__lowerCamelCase       ,							__lowerCamelCase       ,							__lowerCamelCase							)

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

               check_hidden_states_output(__lowerCamelCase       ,							__lowerCamelCase       ,							__lowerCamelCase							)





      def 							_lowercase					(		self    :       Union[str, Any]							)     -> int:






         """simple docstring"""







         UpperCAmelCase      					=  self.model_tester.prepare_config_and_inputs()
         self.model_tester.create_and_check_for_image_classification(*__lowerCamelCase							)





      @slow
      def 							_lowercase					(		self    :       Tuple							)     -> List[str]:






         """simple docstring"""







         for model_name in TF_RESNET_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
            UpperCAmelCase      					=  TFResNetModel.from_pretrained(__lowerCamelCase							)
            self.assertIsNotNone(__lowerCamelCase							)

def 	_UpperCamelCase					(    )    ->int:
   UpperCAmelCase      					=  Image.open("""./tests/fixtures/tests_samples/COCO/000000039769.png""" )
   return image







@require_tf
@require_vision
class 	__lowercase					(	unittest.TestCase	):





      @cached_property
      def 							_lowercase					(		self    :       List[Any]							)     -> Dict:






         """simple docstring"""







         return (
             AutoImageProcessor.from_pretrained(TF_RESNET_PRETRAINED_MODEL_ARCHIVE_LIST[0]							)
             if is_vision_available()
             else None
         )





      @slow
      def 							_lowercase					(		self    :       Dict							)     -> str:






         """simple docstring"""







         UpperCAmelCase      					=  TFResNetForImageClassification.from_pretrained(TF_RESNET_PRETRAINED_MODEL_ARCHIVE_LIST[0]							)

         UpperCAmelCase      					=  self.default_image_processor
         UpperCAmelCase      					=  prepare_img()
         UpperCAmelCase      					=  image_processor(images=__lowerCamelCase       ,							return_tensors="""tf"""							)

         # forward pass
         UpperCAmelCase      					=  model(**__lowerCamelCase							)

         # verify the logits
         UpperCAmelCase      					=  tf.TensorShape((1, 1_0_0_0)							)
         self.assertEqual(outputs.logits.shape       ,							__lowerCamelCase							)

         UpperCAmelCase      					=  tf.constant([-11.1_069, -9.7_877, -8.3_777]							)

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



