


"""simple docstring"""




from typing import List, Optional, Tuple, Union

import torch
from torch import nn
from torch.nn import CrossEntropyLoss

from ... import AutoBackbone
from ...modeling_outputs import SemanticSegmenterOutput
from ...modeling_utils import PreTrainedModel
from ...utils import add_start_docstrings, add_start_docstrings_to_model_forward, replace_return_docstrings
from ...utils.backbone_utils import BackboneMixin
from .configuration_upernet import UperNetConfig


lowercase_			     =  [
    "openmmlab/upernet-convnext-tiny",
    # See all UperNet models at https://huggingface.co/models?filter=upernet
]

# General docstring
lowercase_			     =  "UperNetConfig"
class 					__lowerCAmelCase					(   nn.Module       ):


		'''simple docstring'''



		def __init__(  self							, _a							, _a							, _a							, _a = 0							, _a = False							, _a = 1							, ):
				super().__init__()
				__a           =			nn.Convad(
				    in_channels=_a							, out_channels=_a							, kernel_size=_a							, padding=_a							, bias=_a							, dilation=_a							, )
				__a           =			nn.BatchNormad(_a      )
				__a           =			nn.ReLU()





		def 			__UpperCAmelCase       (  self							, _a      ):
				__a           =			self.conv(_a      )
				__a           =			self.batch_norm(_a      )
				__a           =			self.activation(_a      )

				return output







class 					__lowerCAmelCase					(   nn.Module       ):


		'''simple docstring'''



		def __init__(  self							, _a							, _a							, _a      ):
				super().__init__()
				__a           =			[
				    nn.AdaptiveAvgPoolad(_a      ),
				    UperNetConvModule(_a							, _a							, kernel_size=1      ),
				]
				for i, layer in enumerate(self.layers      ):
						self.add_module(str(_a      )							, _a      )





		def 			__UpperCAmelCase       (  self							, _a      ):
				__a           =			input
				for layer in self.layers:
						__a           =			layer(_a      )
				return hidden_state







class 					__lowerCAmelCase					(   nn.Module       ):


		'''simple docstring'''



		def __init__(  self							, _a							, _a							, _a							, _a      ):
				super().__init__()
				__a           =			pool_scales
				__a           =			align_corners
				__a           =			in_channels
				__a           =			channels
				__a           =			[]
				for i, pool_scale in enumerate(_a      ):
						__a           =			UperNetPyramidPoolingBlock(pool_scale=_a							, in_channels=_a							, channels=_a      )
						self.blocks.append(_a      )
						self.add_module(str(_a      )							, _a      )





		def 			__UpperCAmelCase       (  self							, _a      ):
				__a           =			[]
				for ppm in self.blocks:
						__a           =			ppm(_a      )
						__a           =			nn.functional.interpolate(
						    _a							, size=x.size()[2:]							, mode='''bilinear'''							, align_corners=self.align_corners      )
						ppm_outs.append(_a      )
				return ppm_outs







class 					__lowerCAmelCase					(   nn.Module       ):


		'''simple docstring'''



		def __init__(  self							, _a							, _a      ):
				super().__init__()

				__a           =			config
				__a           =			config.pool_scales  # e.g. (1, 2, 3, 6)
				__a           =			in_channels
				__a           =			config.hidden_size
				__a           =			False
				__a           =			nn.Convad(self.channels							, config.num_labels							, kernel_size=1      )

				# PSP Module
				__a           =			UperNetPyramidPoolingModule(
				    self.pool_scales							, self.in_channels[-1]							, self.channels							, align_corners=self.align_corners							, )
				__a           =			UperNetConvModule(
				    self.in_channels[-1] + len(self.pool_scales      ) * self.channels							, self.channels							, kernel_size=3							, padding=1							, )
				# FPN Module
				__a           =			nn.ModuleList()
				__a           =			nn.ModuleList()
				for in_channels in self.in_channels[:-1]:  # skip the top layer
						__a           =			UperNetConvModule(_a							, self.channels							, kernel_size=1      )
						__a           =			UperNetConvModule(self.channels							, self.channels							, kernel_size=3							, padding=1      )
						self.lateral_convs.append(_a      )
						self.fpn_convs.append(_a      )

				__a           =			UperNetConvModule(
				    len(self.in_channels      ) * self.channels							, self.channels							, kernel_size=3							, padding=1							, )

		def 			__UpperCAmelCase       (  self      ):
				self.apply(self._init_weights      )

		def 			__UpperCAmelCase       (  self							, _a      ):
				if isinstance(_a							, nn.Convad      ):
						module.weight.data.normal_(mean=0.0							, std=self.config.initializer_range      )
						if module.bias is not None:
								module.bias.data.zero_()

		def 			__UpperCAmelCase       (  self							, _a      ):
				__a           =			inputs[-1]
				__a           =			[x]
				psp_outs.extend(self.psp_modules(_a      )      )
				__a           =			torch.cat(_a							, dim=1      )
				__a           =			self.bottleneck(_a      )

				return output





		def 			__UpperCAmelCase       (  self							, _a      ):
				# build laterals
				__a           =			[lateral_conv(encoder_hidden_states[i]      ) for i, lateral_conv in enumerate(self.lateral_convs      )]

				laterals.append(self.psp_forward(_a      )      )

				# build top-down path
				__a           =			len(_a      )
				for i in range(used_backbone_levels - 1							, 0							, -1      ):
						__a           =			laterals[i - 1].shape[2:]
						__a           =			laterals[i - 1] + nn.functional.interpolate(
						    laterals[i]							, size=_a							, mode='''bilinear'''							, align_corners=self.align_corners      )

				# build outputs
				__a           =			[self.fpn_convs[i](laterals[i]      ) for i in range(used_backbone_levels - 1      )]
				# append psp feature
				fpn_outs.append(laterals[-1]      )

				for i in range(used_backbone_levels - 1							, 0							, -1      ):
						__a           =			nn.functional.interpolate(
						    fpn_outs[i]							, size=fpn_outs[0].shape[2:]							, mode='''bilinear'''							, align_corners=self.align_corners      )
				__a           =			torch.cat(_a							, dim=1      )
				__a           =			self.fpn_bottleneck(_a      )
				__a           =			self.classifier(_a      )

				return output







class 					__lowerCAmelCase					(   nn.Module       ):


		'''simple docstring'''



		def __init__(  self							, _a							, _a = 2							, _a = 3							, _a = 1      ):
				super().__init__()

				__a           =			config
				__a           =			config.auxiliary_in_channels
				__a           =			config.auxiliary_channels
				__a           =			config.auxiliary_num_convs
				__a           =			config.auxiliary_concat_input
				__a           =			in_index

				__a           =			(kernel_size // 2) * dilation
				__a           =			[]
				convs.append(
				    UperNetConvModule(
				        self.in_channels							, self.channels							, kernel_size=_a							, padding=_a							, dilation=_a      )      )
				for i in range(self.num_convs - 1      ):
						convs.append(
						    UperNetConvModule(
						        self.channels							, self.channels							, kernel_size=_a							, padding=_a							, dilation=_a      )      )
				if self.num_convs == 0:
						__a           =			nn.Identity()
				else:
						__a           =			nn.Sequential(*_a      )
				if self.concat_input:
						__a           =			UperNetConvModule(
						    self.in_channels + self.channels							, self.channels							, kernel_size=_a							, padding=kernel_size // 2      )

				__a           =			nn.Convad(self.channels							, config.num_labels							, kernel_size=1      )

		def 			__UpperCAmelCase       (  self      ):
				self.apply(self._init_weights      )

		def 			__UpperCAmelCase       (  self							, _a      ):
				if isinstance(_a							, nn.Convad      ):
						module.weight.data.normal_(mean=0.0							, std=self.config.initializer_range      )
						if module.bias is not None:
								module.bias.data.zero_()





		def 			__UpperCAmelCase       (  self							, _a      ):
				# just take the relevant feature maps
				__a           =			encoder_hidden_states[self.in_index]
				__a           =			self.convs(_a      )
				if self.concat_input:
						__a           =			self.conv_cat(torch.cat([hidden_states, output]							, dim=1      )      )
				__a           =			self.classifier(_a      )
				return output







class 					__lowerCAmelCase					(   __SCREAMING_SNAKE_CASE       ):


		'''simple docstring'''



		__UpperCAmelCase		:			int										=				UperNetConfig
		__UpperCAmelCase		:			Union[str, Any]										=				'pixel_values'
		__UpperCAmelCase		:			Dict										=				True

		def 			__UpperCAmelCase       (  self							, _a      ):
				if isinstance(_a							, _a      ):
						module.backbone.init_weights()
						module.decode_head.init_weights()
						module.auxiliary_head.init_weights()

		def 			__UpperCAmelCase       (  self      ):
				self.backbone.init_weights()
				self.decode_head.init_weights()
				self.auxiliary_head.init_weights()





		def 			__UpperCAmelCase       (  self							, _a							, _a=False      ):
				if isinstance(_a							, _a      ):
						__a           =			value







lowercase_			     =  r"\n    Parameters:\n    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) sub-class. Use\n    it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and\n    behavior.\n        config ([`UperNetConfig`]): 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"

lowercase_			     =  r"\n    Args:\n        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):\n            Pixel values. Padding will be ignored by default should you provide it. Pixel values can be obtained using\n            [`AutoImageProcessor`]. See [`SegformerImageProcessor.__call__`] for details.\n        output_attentions (`bool`, *optional*):\n            Whether or not to return the attentions tensors of all attention layers in case the backbone has them. See\n            `attentions` under returned tensors for more detail.\n        output_hidden_states (`bool`, *optional*):\n            Whether or not to return the hidden states of all layers of the backbone. See `hidden_states` under\n            returned tensors for more detail.\n        return_dict (`bool`, *optional*):\n            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.\n"
@add_start_docstrings(
    'UperNet framework leveraging any vision backbone e.g. for ADE20k, CityScapes.'     ,			__SCREAMING_SNAKE_CASE     ,			)
class 					__lowerCAmelCase					(   __SCREAMING_SNAKE_CASE       ):


		'''simple docstring'''



		def __init__(  self							, _a      ):
				super().__init__(_a      )

				__a           =			AutoBackbone.from_config(config.backbone_config      )

				# Semantic segmentation head(s)
				__a           =			UperNetHead(_a							, in_channels=self.backbone.channels      )
				__a           =			UperNetFCNHead(_a      ) if config.use_auxiliary_head else None

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





		@add_start_docstrings_to_model_forward(UPERNET_INPUTS_DOCSTRING.format('''batch_size, sequence_length'''      )      )
		@replace_return_docstrings(output_type=_a							, config_class=_CONFIG_FOR_DOC      )
		def 			__UpperCAmelCase       (  self							, _a = None							, _a = None							, _a = None							, _a = None							, _a = None							, ):
				__a           =			return_dict if return_dict is not None else self.config.use_return_dict
				__a           =			(
				    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
				)
				__a           =			output_attentions if output_attentions is not None else self.config.output_attentions

				__a           =			self.backbone.forward_with_filtered_kwargs(
				    _a							, output_hidden_states=_a							, output_attentions=_a      )
				__a           =			outputs.feature_maps

				__a           =			self.decode_head(_a      )
				__a           =			nn.functional.interpolate(_a							, size=pixel_values.shape[2:]							, mode='''bilinear'''							, align_corners=_a      )

				__a           =			None
				if self.auxiliary_head is not None:
						__a           =			self.auxiliary_head(_a      )
						__a           =			nn.functional.interpolate(
						    _a							, size=pixel_values.shape[2:]							, mode='''bilinear'''							, align_corners=_a      )

				__a           =			None
				if labels is not None:
						if self.config.num_labels == 1:
								raise ValueError('''The number of labels should be greater than one'''      )
						else:
								# compute weighted loss
								__a           =			CrossEntropyLoss(ignore_index=self.config.loss_ignore_index      )
								__a           =			loss_fct(_a							, _a      )
								__a           =			loss_fct(_a							, _a      )
								__a           =			main_loss + self.config.auxiliary_loss_weight * auxiliary_loss

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

				return SemanticSegmenterOutput(
				    loss=_a							, logits=_a							, hidden_states=outputs.hidden_states							, attentions=outputs.attentions							, )












def 						lowerCamelCase__    (		):







	'''simple docstring'''





	snake_case_		    =     []
	snake_case_		    =     1

	while len(_A							) < 1E6:
		constant.append(str(_A							)							)
		i += 1

	snake_case_		    =     "".join(_A							)

	return (
	    int(constant[0]							)
	    * int(constant[9]							)
	    * int(constant[99]							)
	    * int(constant[999]							)
	    * int(constant[9999]							)
	    * int(constant[99999]							)
	    * int(constant[999999]							)
	)


if __name__ == "__main__":
		print(solution())
