






from dataclasses import dataclass, field
from typing import Tuple

from ..utils import cached_property, is_tf_available, logging, requires_backends
from .benchmark_args_utils import BenchmarkArguments


if is_tf_available():
   import tensorflow as tf


__A					=	logging.get_logger(__name__)



@dataclass
class 				_A			(     UpperCamelCase				):
    """simple docstring"""

    lowerCamelCase	:							Optional[int]				= [
        'no_inference',
        'no_cuda',
        'no_tpu',
        'no_speed',
        'no_memory',
        'no_env_print',
        'no_multi_process',
    ]



    def __init__(				self      :     Any ,     **__SCREAMING_SNAKE_CASE      :     Union[str, Any]      )      ->							Dict:
           for deprecated_arg in self.deprecated_args:
                  if deprecated_arg in kwargs:
                         __UpperCAmelCase     				=deprecated_arg[3:]
                         __UpperCAmelCase     				=not kwargs.pop(__SCREAMING_SNAKE_CASE      )
                         logger.warning(
                             f'''{deprecated_arg} is depreciated. Please use --no-{positive_arg} or'''
                             f''' {positive_arg}={kwargs[positive_arg]}'''      )
           __UpperCAmelCase     				=kwargs.pop("""tpu_name""" ,     self.tpu_name      )
           __UpperCAmelCase     				=kwargs.pop("""device_idx""" ,     self.device_idx      )
           __UpperCAmelCase     				=kwargs.pop("""eager_mode""" ,     self.eager_mode      )
           __UpperCAmelCase     				=kwargs.pop("""use_xla""" ,     self.use_xla      )
           super().__init__(**__SCREAMING_SNAKE_CASE      )

    lowerCamelCase	:							str				= field(
        default=UpperCamelCase					,					metadata={'help': 'Name of TPU'}					,					)
    lowerCamelCase	:							int				= field(
        default=0					,					metadata={'help': 'CPU / GPU device index. Defaults to 0.'}					,					)
    lowerCamelCase	:							bool				= field(default=UpperCamelCase					,					metadata={'help': 'Benchmark models in eager model.'}				)
    lowerCamelCase	:							bool				= field(
        default=UpperCamelCase					,					metadata={
            'help': 'Benchmark models using XLA JIT compilation. Note that `eager_model` has to be set to `False`.'
        }					,					)



    @cached_property
    def _a							(				self      :     List[str]      )      ->							Tuple["tf.distribute.cluster_resolver.TPUClusterResolver"]:
           requires_backends(self ,     ["""tf"""]      )
           __UpperCAmelCase     				=None
           if self.tpu:
                  try:
                         if self.tpu_name:
                                __UpperCAmelCase     				=tf.distribute.cluster_resolver.TPUClusterResolver(self.tpu_name      )
                         else:
                                __UpperCAmelCase     				=tf.distribute.cluster_resolver.TPUClusterResolver()
                  except ValueError:
                         __UpperCAmelCase     				=None
           return tpu



    @cached_property
    def _a							(				self      :     Tuple      )      ->							Tuple["tf.distribute.Strategy", "tf.distribute.cluster_resolver.TPUClusterResolver"]:
           requires_backends(self ,     ["""tf"""]      )
           if self.is_tpu:
                  tf.config.experimental_connect_to_cluster(self._setup_tpu      )
                  tf.tpu.experimental.initialize_tpu_system(self._setup_tpu      )

                  __UpperCAmelCase     				=tf.distribute.TPUStrategy(self._setup_tpu      )
           else:
                  # currently no multi gpu is allowed
                  if self.is_gpu:
                         # TODO: Currently only single GPU is supported
                         tf.config.set_visible_devices(self.gpu_list[self.device_idx] ,     """GPU"""      )
                         __UpperCAmelCase     				=tf.distribute.OneDeviceStrategy(device=f'''/gpu:{self.device_idx}'''      )
                  else:
                         tf.config.set_visible_devices([] ,     """GPU"""      )  # disable GPU
                         __UpperCAmelCase     				=tf.distribute.OneDeviceStrategy(device=f'''/cpu:{self.device_idx}'''      )

           return strategy



    @property
    def _a							(				self      :     Optional[Any]      )      ->							bool:
           requires_backends(self ,     ["""tf"""]      )
           return self._setup_tpu is not None



    @property
    def _a							(				self      :     str      )      ->							"tf.distribute.Strategy":
           requires_backends(self ,     ["""tf"""]      )
           return self._setup_strategy



    @property
    def _a							(				self      :     Dict      )      ->							Optional[int]:
           requires_backends(self ,     ["""tf"""]      )
           return tf.config.list_physical_devices("""GPU"""      )



    @property
    def _a							(				self      :     List[str]      )      ->							int:
           requires_backends(self ,     ["""tf"""]      )
           if self.cuda:
                  return len(self.gpu_list      )
           return 0



    @property
    def _a							(				self      :     List[str]      )      ->							bool:
           return self.n_gpu > 0








"""simple docstring"""

from typing import Optional

import torch
import torch.utils.checkpoint
from torch import Tensor, nn
from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss

from ...activations import ACTaFN
from ...file_utils import add_code_sample_docstrings, add_start_docstrings, add_start_docstrings_to_model_forward
from ...modeling_outputs import (
    BaseModelOutputWithNoAttention,
    BaseModelOutputWithPoolingAndNoAttention,
    ImageClassifierOutputWithNoAttention,
)
from ...modeling_utils import PreTrainedModel
from ...utils import logging
from .configuration_regnet import RegNetConfig


UpperCAmelCase__					=logging.get_logger(__name__)

# General docstring
UpperCAmelCase__					="RegNetConfig"

# Base docstring
UpperCAmelCase__					="facebook/regnet-y-040"
UpperCAmelCase__					=[1, 1088, 7, 7]

# Image classification docstring
UpperCAmelCase__					="facebook/regnet-y-040"
UpperCAmelCase__					="tabby, tabby cat"

UpperCAmelCase__					=[
    "facebook/regnet-y-040",
    # See all regnet models at https://huggingface.co/models?filter=regnet
]





class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						int   ,							A_						:						int   ,							A_						:						int   ,							A_						:						int = 3   ,							A_						:						int = 1   ,							A_						:						int = 1   ,							A_						:						Optional[str] = "relu"   ,							):






       '''simple docstring'''


       super().__init__()
       __lowercase						=						nn.Convad(
           A_   ,							A_   ,							kernel_size=A_   ,							stride=A_   ,							padding=kernel_size // 2   ,							groups=A_   ,							bias=A_   ,							)
       __lowercase						=						nn.BatchNormad(A_				)
       __lowercase						=						ACTaFN[activation] if activation is not None else nn.Identity()






      def SCREAMING_SNAKE_CASE_						(		self						:						Tuple   ,							A_						:						Optional[int]				):






       '''simple docstring'''


       __lowercase						=						self.convolution(A_				)
       __lowercase						=						self.normalization(A_				)
       __lowercase						=						self.activation(A_				)
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						Dict   ,							A_						:						RegNetConfig				):






       '''simple docstring'''


       super().__init__()
       __lowercase						=						RegNetConvLayer(
           config.num_channels   ,							config.embedding_size   ,							kernel_size=3   ,							stride=2   ,							activation=config.hidden_act				)
       __lowercase						=						config.num_channels






      def SCREAMING_SNAKE_CASE_						(		self						:						Tuple   ,							A_						:						Optional[int]				):






       '''simple docstring'''


       __lowercase						=						pixel_values.shape[1]
       if num_channels != self.num_channels:
        raise ValueError(
            """Make sure that the channel dimension of the pixel values match with the one set in the configuration."""				)
       __lowercase						=						self.embedder(A_				)
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						Optional[int]   ,							A_						:						int   ,							A_						:						int   ,							A_						:						int = 2				):






       '''simple docstring'''


       super().__init__()
       __lowercase						=						nn.Convad(A_   ,							A_   ,							kernel_size=1   ,							stride=A_   ,							bias=A_				)
       __lowercase						=						nn.BatchNormad(A_				)






      def SCREAMING_SNAKE_CASE_						(		self						:						Dict   ,							A_						:						Tensor				):






       '''simple docstring'''


       __lowercase						=						self.convolution(A_				)
       __lowercase						=						self.normalization(A_				)
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						int   ,							A_						:						int   ,							A_						:						int				):






       '''simple docstring'''


       super().__init__()

       __lowercase						=						nn.AdaptiveAvgPoolad((1, 1)				)
       __lowercase						=						nn.Sequential(
           nn.Convad(A_   ,							A_   ,							kernel_size=1				)   ,							nn.ReLU()   ,							nn.Convad(A_   ,							A_   ,							kernel_size=1				)   ,							nn.Sigmoid()   ,							)






      def SCREAMING_SNAKE_CASE_						(		self						:						Optional[int]   ,							A_						:						List[Any]				):






       '''simple docstring'''


       __lowercase						=						self.pooler(A_				)
       __lowercase						=						self.attention(A_				)
       __lowercase						=						hidden_state * attention
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						Any   ,							A_						:						RegNetConfig   ,							A_						:						int   ,							A_						:						int   ,							A_						:						int = 1				):






       '''simple docstring'''


       super().__init__()
       __lowercase						=						in_channels != out_channels or stride != 1
       __lowercase						=						max(1   ,							out_channels // config.groups_width				)
       __lowercase						=						(
           RegNetShortCut(A_   ,							A_   ,							stride=A_				) if should_apply_shortcut else nn.Identity()
       )
       __lowercase						=						nn.Sequential(
           RegNetConvLayer(A_   ,							A_   ,							kernel_size=1   ,							activation=config.hidden_act				)   ,							RegNetConvLayer(A_   ,							A_   ,							stride=A_   ,							groups=A_   ,							activation=config.hidden_act				)   ,							RegNetConvLayer(A_   ,							A_   ,							kernel_size=1   ,							activation=A_				)   ,							)
       __lowercase						=						ACTaFN[config.hidden_act]






      def SCREAMING_SNAKE_CASE_						(		self						:						List[Any]   ,							A_						:						Tuple				):






       '''simple docstring'''


       __lowercase						=						hidden_state
       __lowercase						=						self.layer(A_				)
       __lowercase						=						self.shortcut(A_				)
       hidden_state += residual
       __lowercase						=						self.activation(A_				)
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						List[str]   ,							A_						:						RegNetConfig   ,							A_						:						int   ,							A_						:						int   ,							A_						:						int = 1				):






       '''simple docstring'''


       super().__init__()
       __lowercase						=						in_channels != out_channels or stride != 1
       __lowercase						=						max(1   ,							out_channels // config.groups_width				)
       __lowercase						=						(
           RegNetShortCut(A_   ,							A_   ,							stride=A_				) if should_apply_shortcut else nn.Identity()
       )
       __lowercase						=						nn.Sequential(
           RegNetConvLayer(A_   ,							A_   ,							kernel_size=1   ,							activation=config.hidden_act				)   ,							RegNetConvLayer(A_   ,							A_   ,							stride=A_   ,							groups=A_   ,							activation=config.hidden_act				)   ,							RegNetSELayer(A_   ,							reduced_channels=int(round(in_channels / 4				)				)				)   ,							RegNetConvLayer(A_   ,							A_   ,							kernel_size=1   ,							activation=A_				)   ,							)
       __lowercase						=						ACTaFN[config.hidden_act]






      def SCREAMING_SNAKE_CASE_						(		self						:						Dict   ,							A_						:						Tuple				):






       '''simple docstring'''


       __lowercase						=						hidden_state
       __lowercase						=						self.layer(A_				)
       __lowercase						=						self.shortcut(A_				)
       hidden_state += residual
       __lowercase						=						self.activation(A_				)
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						Optional[int]   ,							A_						:						RegNetConfig   ,							A_						:						int   ,							A_						:						int   ,							A_						:						int = 2   ,							A_						:						int = 2   ,							):






       '''simple docstring'''


       super().__init__()

       __lowercase						=						RegNetXLayer if config.layer_type == """x""" else RegNetYLayer

       __lowercase						=						nn.Sequential(
           # downsampling is done in the first layer with stride of 2
           layer(
               A_   ,							A_   ,							A_   ,							stride=A_   ,							)   ,							*[layer(A_   ,							A_   ,							A_				) for _ in range(depth - 1				)]   ,							)






      def SCREAMING_SNAKE_CASE_						(		self						:						Optional[Any]   ,							A_						:						Union[str, Any]				):






       '''simple docstring'''


       __lowercase						=						self.layers(A_				)
       return hidden_state






class  lowerCamelCase__    (		nn.Module     ):
      def __init__(		self						:						Tuple   ,							A_						:						RegNetConfig				):






       '''simple docstring'''


       super().__init__()
       __lowercase						=						nn.ModuleList([]				)
       # based on `downsample_in_first_stage`, the first layer of the first stage may or may not downsample the input
       self.stages.append(
           RegNetStage(
               A_   ,							config.embedding_size   ,							config.hidden_sizes[0]   ,							stride=2 if config.downsample_in_first_stage else 1   ,							depth=config.depths[0]   ,							)				)
       __lowercase						=						zip(config.hidden_sizes   ,							config.hidden_sizes[1:]				)
       for (in_channels, out_channels), depth in zip(A_   ,							config.depths[1:]				):
        self.stages.append(RegNetStage(A_   ,							A_   ,							A_   ,							depth=A_				)				)






      def SCREAMING_SNAKE_CASE_						(		self						:						Tuple   ,							A_						:						Tensor   ,							A_						:						bool = False   ,							A_						:						bool = True				):






       '''simple docstring'''


       __lowercase						=						() if output_hidden_states else None

       for stage_module in self.stages:
        if output_hidden_states:
         __lowercase						=						hidden_states + (hidden_state,)

        __lowercase						=						stage_module(A_				)

       if output_hidden_states:
        __lowercase						=						hidden_states + (hidden_state,)

       if not return_dict:
        return tuple(v for v in [hidden_state, hidden_states] if v is not None				)

       return BaseModelOutputWithNoAttention(last_hidden_state=A_   ,							hidden_states=A_				)






class  lowerCamelCase__    (		_a     ):
      a			:  List[str]           =		RegNetConfig
      a			:  int           =		"""regnet"""
      a			:  Tuple           =		"""pixel_values"""
      a			:  Dict           =		True
      def SCREAMING_SNAKE_CASE_						(		self						:						int   ,							A_						:						List[Any]				):






       '''simple docstring'''


       if isinstance(A_   ,							nn.Convad				):
        nn.init.kaiming_normal_(module.weight   ,							mode="""fan_out"""   ,							nonlinearity="""relu"""				)
       elif isinstance(A_   ,							(nn.BatchNormad, nn.GroupNorm)				):
        nn.init.constant_(module.weight   ,							1				)
        nn.init.constant_(module.bias   ,							0				)






      def SCREAMING_SNAKE_CASE_						(		self						:						List[Any]   ,							A_						:						Dict   ,							A_						:						List[str]=False				):






       '''simple docstring'''


       if isinstance(A_   ,							A_				):
        __lowercase						=						value






UpperCAmelCase__					=R"\n    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it\n    as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and\n    behavior.\n\n    Parameters:\n        config ([`RegNetConfig`]): Model configuration class with all the parameters of the model.\n            Initializing with a config file does not load the weights associated with the model, only the\n            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.\n"

UpperCAmelCase__					=R"\n    Args:\n        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):\n            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See\n            [`ConvNextImageProcessor.__call__`] for details.\n\n        output_hidden_states (`bool`, *optional*):\n            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for\n            more detail.\n        return_dict (`bool`, *optional*):\n            Whether or not to return a [`~file_utils.ModelOutput`] instead of a plain tuple.\n"





@add_start_docstrings(
    """The bare RegNet model outputting raw features without any specific head on top."""      , _a      , )
# Copied from transformers.models.resnet.modeling_resnet.ResNetModel with RESNET->REGNET,ResNet->RegNet
class  lowerCamelCase__    (		_a     ):
      def __init__(		self						:						Any   ,							A_						:						Any				):






       '''simple docstring'''


       super().__init__(A_				)
       __lowercase						=						config
       __lowercase						=						RegNetEmbeddings(A_				)
       __lowercase						=						RegNetEncoder(A_				)
       __lowercase						=						nn.AdaptiveAvgPoolad((1, 1)				)
       # Initialize weights and apply final processing
       self.post_init()






      @add_start_docstrings_to_model_forward(A_				)
      @add_code_sample_docstrings(
          checkpoint=_CHECKPOINT_FOR_DOC   ,							output_type=A_   ,							config_class=_CONFIG_FOR_DOC   ,							modality="""vision"""   ,							expected_output=_EXPECTED_OUTPUT_SHAPE   ,							)
      def SCREAMING_SNAKE_CASE_						(		self						:						Dict   ,							A_						:						Tensor   ,							A_						:						Optional[bool] = None   ,							A_						:						Optional[bool] = None				):






       '''simple docstring'''


       __lowercase						=						(
           output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
       )
       __lowercase						=						return_dict if return_dict is not None else self.config.use_return_dict

       __lowercase						=						self.embedder(A_				)

       __lowercase						=						self.encoder(
           A_   ,							output_hidden_states=A_   ,							return_dict=A_				)

       __lowercase						=						encoder_outputs[0]

       __lowercase						=						self.pooler(A_				)

       if not return_dict:
        return (last_hidden_state, pooled_output) + encoder_outputs[1:]

       return BaseModelOutputWithPoolingAndNoAttention(
           last_hidden_state=A_   ,							pooler_output=A_   ,							hidden_states=encoder_outputs.hidden_states   ,							)






@add_start_docstrings(
    """
    RegNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    """      , _a      , )
# Copied from transformers.models.resnet.modeling_resnet.ResNetForImageClassification with RESNET->REGNET,ResNet->RegNet,resnet->regnet
class  lowerCamelCase__    (		_a     ):
      def __init__(		self						:						int   ,							A_						:						int				):






       '''simple docstring'''


       super().__init__(A_				)
       __lowercase						=						config.num_labels
       __lowercase						=						RegNetModel(A_				)
       # classification head
       __lowercase						=						nn.Sequential(
           nn.Flatten()   ,							nn.Linear(config.hidden_sizes[-1]   ,							config.num_labels				) if config.num_labels > 0 else nn.Identity()   ,							)
       # initialize weights and apply final processing
       self.post_init()






      @add_start_docstrings_to_model_forward(A_				)
      @add_code_sample_docstrings(
          checkpoint=_IMAGE_CLASS_CHECKPOINT   ,							output_type=A_   ,							config_class=_CONFIG_FOR_DOC   ,							expected_output=_IMAGE_CLASS_EXPECTED_OUTPUT   ,							)
      def SCREAMING_SNAKE_CASE_						(		self						:						Optional[int]   ,							A_						:						Optional[torch.FloatTensor] = None   ,							A_						:						Optional[torch.LongTensor] = None   ,							A_						:						Optional[bool] = None   ,							A_						:						Optional[bool] = None   ,							):






       '''simple docstring'''


       __lowercase						=						return_dict if return_dict is not None else self.config.use_return_dict

       __lowercase						=						self.regnet(A_   ,							output_hidden_states=A_   ,							return_dict=A_				)

       __lowercase						=						outputs.pooler_output if return_dict else outputs[1]

       __lowercase						=						self.classifier(A_				)

       __lowercase						=						None

       if labels is not None:
        if self.config.problem_type is None:
         if self.num_labels == 1:
          __lowercase						=						"""regression"""
         elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int):
          __lowercase						=						"""single_label_classification"""
         else:
          __lowercase						=						"""multi_label_classification"""
        if self.config.problem_type == "regression":
         __lowercase						=						MSELoss()
         if self.num_labels == 1:
          __lowercase						=						loss_fct(logits.squeeze()   ,							labels.squeeze()				)
         else:
          __lowercase						=						loss_fct(A_   ,							A_				)
        elif self.config.problem_type == "single_label_classification":
         __lowercase						=						CrossEntropyLoss()
         __lowercase						=						loss_fct(logits.view(-1   ,							self.num_labels				)   ,							labels.view(-1				)				)
        elif self.config.problem_type == "multi_label_classification":
         __lowercase						=						BCEWithLogitsLoss()
         __lowercase						=						loss_fct(A_   ,							A_				)

       if not return_dict:
        __lowercase						=						(logits,) + outputs[2:]
        return (loss,) + output if loss is not None else output

       return ImageClassifierOutputWithNoAttention(loss=A_   ,							logits=A_   ,							hidden_states=outputs.hidden_states				)
