



'''simple docstring'''


import collections.abc
from typing import Optional, Tuple, Union

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

from ...activations import ACTaFN
from ...modeling_outputs import BaseModelOutputWithNoAttention, ImageClassifierOutputWithNoAttention
from ...modeling_utils import PreTrainedModel
from ...utils import add_code_sample_docstrings, add_start_docstrings, add_start_docstrings_to_model_forward, logging
from .configuration_poolformer import PoolFormerConfig


lowercase_      :				List[str]   					=    logging.get_logger(__name__)

# General docstring
lowercase_      :				str   					=    '''PoolFormerConfig'''

# Base docstring
lowercase_      :				Optional[int]   					=    '''sail/poolformer_s12'''
lowercase_      :				str   					=    [1, 512, 7, 7]

# Image classification docstring
lowercase_      :				int   					=    '''sail/poolformer_s12'''
lowercase_      :				Dict   					=    '''tabby, tabby cat'''

lowercase_      :				int   					=    [
    '''sail/poolformer_s12''',
    # See all PoolFormer models at https://huggingface.co/models?filter=poolformer
]







def      SCREAMING_SNAKE_CASE				(				lowercase_    :      Union[str, Any] ,  lowercase_    :      float = 0.0 ,  lowercase_    :      bool = False						):
						if drop_prob == 0.0 or not training:
												return input
						lowercase        =							1 - drop_prob
						lowercase        =							(input.shape[0],) + (1,) * (input.ndim - 1)  # work with diff dim tensors, not just 2D ConvNets
						lowercase        =							keep_prob + torch.rand(lowercase_ ,  dtype=input.dtype ,  device=input.device						)
						random_tensor.floor_()  # binarize
						lowercase        =							input.div(lowercase_						) * random_tensor
						return output




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase = None						)    ->    None:
							'''simple docstring'''






							super().__init__()
							lowercase        =							drop_prob







	def   _a   (    self ,				_lowerCAmelCase						)    ->    torch.Tensor:
							'''simple docstring'''






							return drop_path(_lowerCAmelCase ,				self.drop_prob ,				self.training						)







	def   _a   (    self						)    ->    str:
							'''simple docstring'''






							return "p={}".format(self.drop_prob						)




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase=None						)    ->    List[str]:
							'''simple docstring'''






							super().__init__()
							lowercase        =							patch_size if isinstance(_lowerCAmelCase ,				collections.abc.Iterable						) else (patch_size, patch_size)
							lowercase        =							stride if isinstance(_lowerCAmelCase ,				collections.abc.Iterable						) else (stride, stride)
							lowercase        =							padding if isinstance(_lowerCAmelCase ,				collections.abc.Iterable						) else (padding, padding)

							lowercase        =							nn.Convad(_lowerCAmelCase ,				_lowerCAmelCase ,				kernel_size=_lowerCAmelCase ,				stride=_lowerCAmelCase ,				padding=_lowerCAmelCase						)
							lowercase        =							norm_layer(_lowerCAmelCase						) if norm_layer else nn.Identity()







	def   _a   (    self ,				_lowerCAmelCase						)    ->    int:
							'''simple docstring'''






							lowercase        =							self.projection(_lowerCAmelCase						)
							lowercase        =							self.norm(_lowerCAmelCase						)
							return embeddings




class      __UpperCamelCase       (nn.GroupNorm			):







	def __init__(    self ,				_lowerCAmelCase ,				**_lowerCAmelCase						)    ->    Tuple:
							'''simple docstring'''






							super().__init__(1 ,				_lowerCAmelCase ,				**_lowerCAmelCase						)




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase						)    ->    Optional[Any]:
							'''simple docstring'''






							super().__init__()
							lowercase        =							nn.AvgPoolad(_lowerCAmelCase ,				stride=1 ,				padding=pool_size // 2 ,				count_include_pad=_lowerCAmelCase						)







	def   _a   (    self ,				_lowerCAmelCase						)    ->    List[Any]:
							'''simple docstring'''






							return self.pool(_lowerCAmelCase						) - hidden_states




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase						)    ->    str:
							'''simple docstring'''






							super().__init__()
							lowercase        =							nn.Convad(_lowerCAmelCase ,				_lowerCAmelCase ,				1						)
							lowercase        =							nn.Convad(_lowerCAmelCase ,				_lowerCAmelCase ,				1						)
							lowercase        =							PoolFormerDropPath(_lowerCAmelCase						)
							if isinstance(config.hidden_act ,				_lowerCAmelCase						):
													lowercase        =							ACTaFN[config.hidden_act]
							else:
													lowercase        =							config.hidden_act







	def   _a   (    self ,				_lowerCAmelCase						)    ->    Union[str, Any]:
							'''simple docstring'''






							lowercase        =							self.conva(_lowerCAmelCase						)
							lowercase        =							self.act_fn(_lowerCAmelCase						)
							lowercase        =							self.drop(_lowerCAmelCase						)
							lowercase        =							self.conva(_lowerCAmelCase						)
							lowercase        =							self.drop(_lowerCAmelCase						)

							return hidden_states




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase						)    ->    Union[str, Any]:
							'''simple docstring'''






							super().__init__()
							lowercase        =							PoolFormerPooling(_lowerCAmelCase						)
							lowercase        =							PoolFormerOutput(_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase ,				_lowerCAmelCase						)
							lowercase        =							PoolFormerGroupNorm(_lowerCAmelCase						)
							lowercase        =							PoolFormerGroupNorm(_lowerCAmelCase						)

							# Useful for training neural nets
							lowercase        =							PoolFormerDropPath(_lowerCAmelCase						) if drop_path > 0.0 else nn.Identity()
							lowercase        =							config.use_layer_scale
							if config.use_layer_scale:
													lowercase        =							nn.Parameter(
													    config.layer_scale_init_value * torch.ones((_lowerCAmelCase)						) ,				requires_grad=_lowerCAmelCase						)
													lowercase        =							nn.Parameter(
													    config.layer_scale_init_value * torch.ones((_lowerCAmelCase)						) ,				requires_grad=_lowerCAmelCase						)







	def   _a   (    self ,				_lowerCAmelCase						)    ->    List[str]:
							'''simple docstring'''






							if self.use_layer_scale:
													lowercase        =							self.pooling(self.before_norm(_lowerCAmelCase						)						)
													lowercase        =							self.layer_scale_a.unsqueeze(-1						).unsqueeze(-1						) * pooling_output
													# First residual connection
													lowercase        =							hidden_states + self.drop_path(_lowerCAmelCase						)
													lowercase        =							()

													lowercase        =							self.output(self.after_norm(_lowerCAmelCase						)						)
													lowercase        =							self.layer_scale_a.unsqueeze(-1						).unsqueeze(-1						) * layer_output
													# Second residual connection
													lowercase        =							hidden_states + self.drop_path(_lowerCAmelCase						)

													lowercase        =							(output,) + outputs
													return outputs

							else:
													lowercase        =							self.drop_path(self.pooling(self.before_norm(_lowerCAmelCase						)						)						)
													# First residual connection
													lowercase        =							pooling_output + hidden_states
													lowercase        =							()

													# Second residual connection inside the PoolFormerOutput block
													lowercase        =							self.drop_path(self.output(self.after_norm(_lowerCAmelCase						)						)						)
													lowercase        =							hidden_states + layer_output

													lowercase        =							(output,) + outputs
													return outputs




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase						)    ->    Union[str, Any]:
							'''simple docstring'''






							super().__init__()
							lowercase        =							config
							# stochastic depth decay rule
							lowercase        =							[x.item() for x in torch.linspace(0 ,				config.drop_path_rate ,				sum(config.depths						)						)]

							# patch embeddings
							lowercase        =							[]
							for i in range(config.num_encoder_blocks						):
													embeddings.append(
													    PoolFormerEmbeddings(
													        patch_size=config.patch_sizes[i] ,				stride=config.strides[i] ,				padding=config.padding[i] ,				num_channels=config.num_channels if i == 0 else config.hidden_sizes[i - 1] ,				hidden_size=config.hidden_sizes[i] ,				)						)
							lowercase        =							nn.ModuleList(_lowerCAmelCase						)

							# Transformer blocks
							lowercase        =							[]
							lowercase        =							0
							for i in range(config.num_encoder_blocks						):
													# each block consists of layers
													lowercase        =							[]
													if i != 0:
																			cur += config.depths[i - 1]
													for j in range(config.depths[i]						):
																			layers.append(
																			    PoolFormerLayer(
																			        _lowerCAmelCase ,				num_channels=config.hidden_sizes[i] ,				pool_size=config.pool_size ,				hidden_size=config.hidden_sizes[i] ,				intermediate_size=int(config.hidden_sizes[i] * config.mlp_ratio						) ,				drop_path=dpr[cur + j] ,				)						)
													blocks.append(nn.ModuleList(_lowerCAmelCase						)						)

							lowercase        =							nn.ModuleList(_lowerCAmelCase						)







	def   _a   (    self ,				_lowerCAmelCase ,				_lowerCAmelCase=False ,				_lowerCAmelCase=True						)    ->    Tuple:
							'''simple docstring'''






							lowercase        =							() if output_hidden_states else None

							lowercase        =							pixel_values
							for idx, layers in enumerate(zip(self.patch_embeddings ,				self.block						)						):
													lowercase     ,   lowercase        =							layers
													# Get patch embeddings from hidden_states
													lowercase        =							embedding_layer(_lowerCAmelCase						)
													# Send the embeddings through the blocks
													for _, blk in enumerate(_lowerCAmelCase						):
																			lowercase        =							blk(_lowerCAmelCase						)
																			lowercase        =							layer_outputs[0]

													if output_hidden_states:
																			lowercase        =							all_hidden_states + (hidden_states,)

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

							return BaseModelOutputWithNoAttention(last_hidden_state=_lowerCAmelCase ,				hidden_states=_lowerCAmelCase						)




class      __UpperCamelCase       (_UpperCAmelCase			):
	__A			  =					PoolFormerConfig
	__A			  =					'''poolformer'''
	__A			  =					'''pixel_values'''
	__A			  =					True







	def   _a   (    self ,				_lowerCAmelCase						)    ->    List[str]:
							'''simple docstring'''






							if isinstance(_lowerCAmelCase ,				(nn.Linear, nn.Convad)						):
													module.weight.data.normal_(mean=0.0 ,				std=self.config.initializer_range						)
													if module.bias is not None:
																			module.bias.data.zero_()
							elif isinstance(_lowerCAmelCase ,				nn.LayerNorm						):
													module.bias.data.zero_()
													module.weight.data.fill_(1.0						)







	def   _a   (    self ,				_lowerCAmelCase ,				_lowerCAmelCase=False						)    ->    int:
							'''simple docstring'''






							if isinstance(_lowerCAmelCase ,				_lowerCAmelCase						):
													lowercase        =							value




lowercase_      :				Any   					=    r'''
    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) sub-class. Use
    it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and
    behavior.

    Parameters:
        config ([`PoolFormerConfig`]): Model configuration class with all the parameters of the model.
            Initializing with a config file does not load the weights associated with the model, only the
            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
'''

lowercase_      :				List[str]   					=    r'''
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`PoolFormerImageProcessor.__call__`] for details.
'''




@add_start_docstrings(
    '''The bare PoolFormer Model transformer outputting raw hidden-states without any specific head on top.'''			,   _UpperCAmelCase			,   )
class      __UpperCamelCase       (_UpperCAmelCase			):







	def __init__(    self ,				_lowerCAmelCase						)    ->    str:
							'''simple docstring'''






							super().__init__(_lowerCAmelCase						)
							lowercase        =							config

							lowercase        =							PoolFormerEncoder(_lowerCAmelCase						)

							# Initialize weights and apply final processing
							self.post_init()







	def   _a   (    self						)    ->    Tuple:
							'''simple docstring'''






							return self.embeddings.patch_embeddings







	@add_start_docstrings_to_model_forward(_lowerCAmelCase						)
	@add_code_sample_docstrings(
	    checkpoint=_CHECKPOINT_FOR_DOC ,				output_type=_lowerCAmelCase ,				config_class=_CONFIG_FOR_DOC ,				modality="""vision""" ,				expected_output=_EXPECTED_OUTPUT_SHAPE ,				)
	def   _a   (    self ,				_lowerCAmelCase = None ,				_lowerCAmelCase = None ,				_lowerCAmelCase = None ,				)    ->    Union[Tuple, BaseModelOutputWithNoAttention]:
							'''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

							if pixel_values is None:
													raise ValueError("""You have to specify pixel_values"""						)

							lowercase        =							self.encoder(
							    _lowerCAmelCase ,				output_hidden_states=_lowerCAmelCase ,				return_dict=_lowerCAmelCase ,				)
							lowercase        =							encoder_outputs[0]

							if not return_dict:
													return (sequence_output, None) + encoder_outputs[1:]

							return BaseModelOutputWithNoAttention(
							    last_hidden_state=_lowerCAmelCase ,				hidden_states=encoder_outputs.hidden_states ,				)




class      __UpperCamelCase       (nn.Module			):







	def __init__(    self ,				_lowerCAmelCase						)    ->    Optional[Any]:
							'''simple docstring'''






							super().__init__()
							lowercase        =							nn.Linear(config.hidden_size ,				config.hidden_size						)







	def   _a   (    self ,				_lowerCAmelCase						)    ->    int:
							'''simple docstring'''






							lowercase        =							self.dense(_lowerCAmelCase						)
							return output




@add_start_docstrings(
    '''
    PoolFormer Model transformer with an image classification head on top
    '''			,   _UpperCAmelCase			,   )
class      __UpperCamelCase       (_UpperCAmelCase			):







	def __init__(    self ,				_lowerCAmelCase						)    ->    str:
							'''simple docstring'''






							super().__init__(_lowerCAmelCase						)
							lowercase        =							config.num_labels
							lowercase        =							PoolFormerModel(_lowerCAmelCase						)

							# Final norm
							lowercase        =							PoolFormerGroupNorm(config.hidden_sizes[-1]						)
							# Classifier head
							lowercase        =							(
							    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(_lowerCAmelCase						)
	@add_code_sample_docstrings(
	    checkpoint=_IMAGE_CLASS_CHECKPOINT ,				output_type=_lowerCAmelCase ,				config_class=_CONFIG_FOR_DOC ,				expected_output=_IMAGE_CLASS_EXPECTED_OUTPUT ,				)
	def   _a   (    self ,				_lowerCAmelCase = None ,				_lowerCAmelCase = None ,				_lowerCAmelCase = None ,				_lowerCAmelCase = None ,				)    ->    Union[Tuple, ImageClassifierOutputWithNoAttention]:
							'''simple docstring'''






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

							lowercase        =							self.poolformer(
							    _lowerCAmelCase ,				output_hidden_states=_lowerCAmelCase ,				return_dict=_lowerCAmelCase ,				)

							lowercase        =							outputs[0]

							lowercase        =							self.classifier(self.norm(_lowerCAmelCase						).mean([-2, -1]						)						)

							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(_lowerCAmelCase ,				_lowerCAmelCase						)
													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(_lowerCAmelCase ,				_lowerCAmelCase						)

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

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







'''simple docstring'''


from transformers import HfArgumentParser, TensorFlowBenchmark, TensorFlowBenchmarkArguments







def      SCREAMING_SNAKE_CASE				(				):
						lowercase        =							HfArgumentParser(lowercase_						)
						lowercase        =							parser.parse_args_into_dataclasses()[0]
						lowercase        =							TensorFlowBenchmark(args=lowercase_						)
						try:
												lowercase        =							parser.parse_args_into_dataclasses()[0]
						except ValueError as e:
												lowercase        =							"""Arg --no_{0} is no longer used, please use --no-{0} instead."""
												lowercase        =							""" """.join(str(lowercase_						).split(""" """						)[:-1]						)
												lowercase        =							""""""
												lowercase        =							eval(str(lowercase_						).split(""" """						)[-1]						)
												lowercase        =							[]
												for arg in depreciated_args:
																		# arg[2:] removes '--'
																		if arg[2:] in TensorFlowBenchmark.deprecated_args:
																								# arg[5:] removes '--no_'
																								full_error_msg += arg_error_msg.format(arg[5:]						)
																		else:
																								wrong_args.append(lowercase_						)
												if len(lowercase_						) > 0:
																		lowercase        =							full_error_msg + begin_error_msg + str(lowercase_						)
												raise ValueError(lowercase_						)
						benchmark.run()


if __name__ == "__main__":
						main()


