






import logging
import re

import pytorch_quantization
import pytorch_quantization.nn as quant_nn
import torch
from pytorch_quantization import calib
from pytorch_quantization.tensor_quant import QuantDescriptor


a_							=    logging.getLogger(__name__)

a_							=    50  # max width of layer names
a_							=    70  # max width of quantizer names


def        _a  (     UpperCamelCase_					:				str   ) ->   List[str]:
						"""simple docstring"""







						lowerCAmelCase__       =						parser.add_argument_group("quant_trainer arguments"   )
						group.add_argument("--wprec"    ,   type=UpperCamelCase_    ,   default=8    ,   help="weight precision"   )
						group.add_argument("--aprec"    ,   type=UpperCamelCase_    ,   default=8    ,   help="activation precision"   )
						group.add_argument("--quant-per-tensor"    ,   action="store_true"    ,   help="per tensor weight scaling"   )
						group.add_argument("--quant-disable"    ,   action="store_true"    ,   help="disable all quantizers"   )
						group.add_argument("--quant-disable-embeddings"    ,   action="store_true"    ,   help="disable all embeddings quantizers"   )
						group.add_argument("--quant-disable-keyword"    ,   type=UpperCamelCase_    ,   nargs="+"    ,   help="disable quantizers by keyword"   )
						group.add_argument("--quant-disable-layer-module"    ,   type=UpperCamelCase_    ,   help="disable quantizers by keyword under layer."   )
						group.add_argument("--quant-enable-layer-module"    ,   type=UpperCamelCase_    ,   help="enable quantizers by keyword under layer"   )
						group.add_argument("--calibrator"    ,   default="max"    ,   help="which quantization range calibrator to use"   )
						group.add_argument("--percentile"    ,   default=UpperCamelCase_    ,   type=UpperCamelCase_    ,   help="percentile for PercentileCalibrator"   )
						group.add_argument("--fuse-qkv"    ,   action="store_true"    ,   help="use the same scale factor for qkv"   )
						group.add_argument("--clip-gelu"    ,   metavar="N"    ,   type=UpperCamelCase_    ,   help="clip gelu output maximum value to N"   )
						group.add_argument(
						    "--recalibrate-weights"    ,   action="store_true"    ,   help=(
						        "recalibrate weight amaxes by taking the max of the weights."
						        " amaxes will be computed with the current quantization granularity (axis)."
						    )    ,   )


def        _a  (     UpperCamelCase_					:				int   ) ->   List[Any]:
						"""simple docstring"""







						if args.calibrator == "max":
												lowerCAmelCase__       =						"max"
						elif args.calibrator == "percentile":
												if args.percentile is None:
																		raise ValueError("Specify --percentile when using percentile calibrator"   )
												lowerCAmelCase__       =						"histogram"
						elif args.calibrator == "mse":
												lowerCAmelCase__       =						"histogram"
						else:
												raise ValueError(F"Invalid calibrator {args.calibrator}"   )

						lowerCAmelCase__       =						QuantDescriptor(num_bits=args.aprec    ,   calib_method=UpperCamelCase_   )
						lowerCAmelCase__       =						QuantDescriptor(num_bits=args.wprec    ,   axis=(None if args.quant_per_tensor else (0,))   )
						quant_nn.QuantLinear.set_default_quant_desc_input(UpperCamelCase_   )
						quant_nn.QuantLinear.set_default_quant_desc_weight(UpperCamelCase_   )


def        _a  (     UpperCamelCase_					:				Union[str, Any]    ,   UpperCamelCase_					:				List[Any]    ,   UpperCamelCase_					:				Any=False    ,   UpperCamelCase_					:				List[Any]=False   ) ->   Any:
						"""simple docstring"""







						logger.info("Configuring Model for Quantization"   )
						logger.info(F"using quantization package {pytorch_quantization.__file__}"   )

						if not calib:
												if args.quant_disable_embeddings:
																		set_quantizer_by_name(UpperCamelCase_    ,   ["embeddings"]    ,   which="weight"    ,   _disabled=UpperCamelCase_   )

												if args.quant_disable:
																		set_quantizer_by_name(UpperCamelCase_    ,   [""]    ,   _disabled=UpperCamelCase_   )

												if args.quant_disable_keyword:
																		set_quantizer_by_name(UpperCamelCase_    ,   args.quant_disable_keyword    ,   _disabled=UpperCamelCase_   )

												if args.quant_disable_layer_module:
																		set_quantizer_by_name(UpperCamelCase_    ,   [R"layer.\d+." + args.quant_disable_layer_module]    ,   _disabled=UpperCamelCase_   )

												if args.quant_enable_layer_module:
																		set_quantizer_by_name(UpperCamelCase_    ,   [R"layer.\d+." + args.quant_enable_layer_module]    ,   _disabled=UpperCamelCase_   )

												if args.recalibrate_weights:
																		recalibrate_weights(UpperCamelCase_   )

												if args.fuse_qkv:
																		fuse_qkv(UpperCamelCase_    ,   UpperCamelCase_   )

						if args.clip_gelu:
												clip_gelu(UpperCamelCase_    ,   args.clip_gelu   )

						# if args.local_rank in [-1, 0] and not calib:
						print_quant_summary(UpperCamelCase_   )


def        _a  (     UpperCamelCase_					:				Union[str, Any]   ) ->   Tuple:
						"""simple docstring"""







						logger.info("Enabling Calibration"   )
						for name, module in model.named_modules():
												if name.endswith("_quantizer"   ):
																		if module._calibrator is not None:
																								module.disable_quant()
																								module.enable_calib()
																		else:
																								module.disable()
																		logger.info(F"{name:80}: {module}"   )


def        _a  (     UpperCamelCase_					:				Dict    ,   UpperCamelCase_					:				Tuple   ) ->   str:
						"""simple docstring"""







						logger.info("Loading calibrated amax"   )
						for name, module in model.named_modules():
												if name.endswith("_quantizer"   ):
																		if module._calibrator is not None:
																								if isinstance(module._calibrator    ,   calib.MaxCalibrator   ):
																														module.load_calib_amax()
																								else:
																														module.load_calib_amax("percentile"    ,   percentile=args.percentile   )
																								module.enable_quant()
																								module.disable_calib()
																		else:
																								module.enable()
						model.cuda()
						print_quant_summary(UpperCamelCase_   )


def        _a  (     UpperCamelCase_					:				Optional[Any]    ,   UpperCamelCase_					:				int   ) ->   int:
						"""simple docstring"""







						def fusea(UpperCamelCase_					:				List[Any]    ,   UpperCamelCase_					:				Tuple    ,   UpperCamelCase_					:				Optional[int]   ):
												for mod in [qq, qk, qv]:
																		if not hasattr(UpperCamelCase_    ,   "_amax"   ):
																								print("          WARNING: NO AMAX BUFFER"   )
																								return
												lowerCAmelCase__       =						qq._amax.detach().item()
												lowerCAmelCase__       =						qk._amax.detach().item()
												lowerCAmelCase__       =						qv._amax.detach().item()

												lowerCAmelCase__       =						max(UpperCamelCase_    ,   UpperCamelCase_    ,   UpperCamelCase_   )
												qq._amax.fill_(UpperCamelCase_   )
												qk._amax.fill_(UpperCamelCase_   )
												qv._amax.fill_(UpperCamelCase_   )
												logger.info(F"          q={q:5.2f} k={k:5.2f} v={v:5.2f} -> {amax:5.2f}"   )

						for name, mod in model.named_modules():
												if name.endswith(".attention.self"   ):
																		logger.info(F"FUSE_QKV: {name:{name_width}}"   )
																		fusea(mod.matmul_q_input_quantizer    ,   mod.matmul_k_input_quantizer    ,   mod.matmul_v_input_quantizer   )
																		if args.quant_per_tensor:
																								fusea(mod.query._weight_quantizer    ,   mod.key._weight_quantizer    ,   mod.value._weight_quantizer   )


def        _a  (     UpperCamelCase_					:				Any    ,   UpperCamelCase_					:				List[Any]   ) ->   Optional[int]:
						"""simple docstring"""







						for name, mod in model.named_modules():
												if name.endswith(".output.dense"   ) and not name.endswith("attention.output.dense"   ):
																		lowerCAmelCase__       =						mod._input_quantizer._amax.data.detach().item()
																		mod._input_quantizer._amax.data.detach().clamp_(max=UpperCamelCase_   )
																		lowerCAmelCase__       =						mod._input_quantizer._amax.data.detach().item()
																		logger.info(F"CLIP_GELU: {name:{name_width}} amax: {amax_init:5.2f} -> {amax:5.2f}"   )


def        _a  (     UpperCamelCase_					:				str   ) ->   int:
						"""simple docstring"""







						for name, mod in model.named_modules():
												if hasattr(UpperCamelCase_    ,   "_weight_quantizer"   ) and mod._weight_quantizer.axis is not None:
																		lowerCAmelCase__       =						mod.weight.shape[0]
																		lowerCAmelCase__       =						mod._weight_quantizer._amax.detach()
																		lowerCAmelCase__       =						torch.ones(UpperCamelCase_    ,   dtype=amax.dtype    ,   device=amax.device   ) * amax
																		print(F"expanding {name} {amax} -> {mod._weight_quantizer._amax}"   )


def        _a  (     UpperCamelCase_					:				Any   ) ->   Optional[int]:
						"""simple docstring"""







						for name, mod in model.named_modules():
												if hasattr(UpperCamelCase_    ,   "_weight_quantizer"   ):
																		if not hasattr(mod.weight_quantizer    ,   "_amax"   ):
																								print("RECALIB: {name:{name_width}} WARNING: NO AMAX BUFFER"   )
																								continue

																		# determine which axes to reduce across
																		# e.g. a 4D tensor quantized per axis 0 should reduce over (1,2,3)
																		lowerCAmelCase__       =						set() if mod._weight_quantizer.axis is None else set(mod._weight_quantizer.axis   )
																		lowerCAmelCase__       =						set(range(len(mod.weight.size()   )   )   ) - axis_set
																		lowerCAmelCase__       =						pytorch_quantization.utils.reduce_amax(mod.weight    ,   axis=UpperCamelCase_    ,   keepdims=UpperCamelCase_   ).detach()
																		logger.info(F"RECALIB: {name:{name_width}} {mod._weight_quantizer._amax.flatten()} -> {amax.flatten()}"   )
																		lowerCAmelCase__       =						amax


def        _a  (     UpperCamelCase_					:				str    ,   UpperCamelCase_					:				Optional[Any]=25    ,   UpperCamelCase_					:				str=180    ,   UpperCamelCase_					:				Optional[int]=None   ) ->   Tuple:
						"""simple docstring"""







						if ignore is None:
												lowerCAmelCase__       =						[]
						elif not isinstance(UpperCamelCase_    ,   UpperCamelCase_   ):
												lowerCAmelCase__       =						[ignore]

						lowerCAmelCase__       =						0
						for name, mod in model.named_modules():
												if not hasattr(UpperCamelCase_    ,   "weight"   ):
																		continue
												lowerCAmelCase__       =						max(UpperCamelCase_    ,   len(UpperCamelCase_   )   )

						for name, mod in model.named_modules():
												lowerCAmelCase__       =						getattr(UpperCamelCase_    ,   "_input_quantizer"    ,   UpperCamelCase_   )
												lowerCAmelCase__       =						getattr(UpperCamelCase_    ,   "_weight_quantizer"    ,   UpperCamelCase_   )
												if not hasattr(UpperCamelCase_    ,   "weight"   ):
																		continue
												if type(UpperCamelCase_   ) in ignore:
																		continue
												if [True for s in ignore if type(UpperCamelCase_   ) is str and s in name]:
																		continue
												lowerCAmelCase__       =						F"Act:{input_q.extra_repr()}"
												lowerCAmelCase__       =						F"Wgt:{weight_q.extra_repr()}"
												lowerCAmelCase__       =						F"{name:{name_width}} {act_str} {wgt_str}"
												if len(UpperCamelCase_   ) <= line_width:
																		logger.info(UpperCamelCase_   )
												else:
																		logger.info(F"{name:{name_width}} {act_str}"   )
																		logger.info(F"{'  ':{name_width}} {wgt_str}"   )


def        _a  (     UpperCamelCase_					:				str   ) ->   Dict:
						"""simple docstring"""







						lowerCAmelCase__       =						0
						for name, mod in model.named_modules():
												if isinstance(UpperCamelCase_    ,   pytorch_quantization.nn.TensorQuantizer   ):
																		print(F"{name:80} {mod}"   )
																		count += 1
						print(F"{count} TensorQuantizers found in model"   )


def        _a  (     UpperCamelCase_					:				List[str]    ,   UpperCamelCase_					:				Union[str, Any]    ,   UpperCamelCase_					:				Union[str, Any]    ,   UpperCamelCase_					:				Optional[Any]    ,   UpperCamelCase_					:				int   ) ->   Tuple:
						"""simple docstring"""







						lowerCAmelCase__       =						getattr(UpperCamelCase_    ,   UpperCamelCase_    ,   UpperCamelCase_   )
						if quantizer_mod is not None:
												assert hasattr(UpperCamelCase_    ,   UpperCamelCase_   )
												setattr(UpperCamelCase_    ,   UpperCamelCase_    ,   UpperCamelCase_   )
						else:
												logger.warning(F"{name} has no {quantizer}"   )


def        _a  (     UpperCamelCase_					:				List[Any]    ,   UpperCamelCase_					:				int    ,   UpperCamelCase_					:				Union[str, Any]="both"    ,   **UpperCamelCase_					:				Dict   ) ->   Optional[int]:
						"""simple docstring"""







						lowerCAmelCase__       =						F"Warning: changing {which} quantizers of {name:{qname_width}}"
						for k, v in kwargs.items():
												s += F" {k}={v}"
												if which in ["input", "both"]:
																		set_quantizer(UpperCamelCase_    ,   UpperCamelCase_    ,   "_input_quantizer"    ,   UpperCamelCase_    ,   UpperCamelCase_   )
												if which in ["weight", "both"]:
																		set_quantizer(UpperCamelCase_    ,   UpperCamelCase_    ,   "_weight_quantizer"    ,   UpperCamelCase_    ,   UpperCamelCase_   )
						logger.info(UpperCamelCase_   )





def        _a  (     UpperCamelCase_					:				str    ,   UpperCamelCase_					:				List[Any]    ,   **UpperCamelCase_					:				Any   ) ->   Any:
						"""simple docstring"""







						for name, mod in model.named_modules():
												if hasattr(UpperCamelCase_    ,   "_input_quantizer"   ) or hasattr(UpperCamelCase_    ,   "_weight_quantizer"   ):
																		for n in names:
																								if re.search(UpperCamelCase_    ,   UpperCamelCase_   ):
																														set_quantizers(UpperCamelCase_    ,   UpperCamelCase_    ,   **UpperCamelCase_   )
												elif name.endswith("_quantizer"   ):
																		for n in names:
																								if re.search(UpperCamelCase_    ,   UpperCamelCase_   ):
																														lowerCAmelCase__       =						F"Warning: changing {name:{name_width}}"
																														for k, v in kwargs.items():
																																				s += F" {k}={v}"
																																				setattr(UpperCamelCase_    ,   UpperCamelCase_    ,   UpperCamelCase_   )
																														logger.info(UpperCamelCase_   )












import inspect
import unittest

from transformers import SegformerConfig, is_torch_available, is_vision_available
from transformers.models.auto import get_values
from transformers.testing_utils import require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
	import torch

	from transformers import (
	    MODEL_MAPPING,
	    SegformerForImageClassification,
	    SegformerForSemanticSegmentation,
	    SegformerModel,
	)
	from transformers.models.segformer.modeling_segformer import SEGFORMER_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
	from PIL import Image

	from transformers import SegformerImageProcessor


class      lowercase__     (			_UpperCAmelCase	):

	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						self.config_class(**self.inputs_dict       )
							self.parent.assertTrue(hasattr(__UpperCAmelCase		,    "hidden_sizes"       )       )
							self.parent.assertTrue(hasattr(__UpperCAmelCase		,    "num_attention_heads"       )       )
							self.parent.assertTrue(hasattr(__UpperCAmelCase		,    "num_encoder_blocks"       )       )





class      lowercase__     :

	def __init__(							self		,    __UpperCAmelCase		,    __UpperCAmelCase=13		,    __UpperCAmelCase=64		,    __UpperCAmelCase=3		,    __UpperCAmelCase=4		,    __UpperCAmelCase=[2, 2, 2, 2]		,    __UpperCAmelCase=[8, 4, 2, 1]		,    __UpperCAmelCase=[16, 32, 64, 128]		,    __UpperCAmelCase=[1, 4, 8, 16]		,    __UpperCAmelCase=[1, 2, 4, 8]		,    __UpperCAmelCase=True		,    __UpperCAmelCase=True		,    __UpperCAmelCase="gelu"		,    __UpperCAmelCase=0.1		,    __UpperCAmelCase=0.1		,    __UpperCAmelCase=0.02		,    __UpperCAmelCase=3		,    __UpperCAmelCase=None		,    )->					str:







							'''simple docstring'''





							lowerCAmelCase__       =						parent
							lowerCAmelCase__       =						batch_size
							lowerCAmelCase__       =						image_size
							lowerCAmelCase__       =						num_channels
							lowerCAmelCase__       =						num_encoder_blocks
							lowerCAmelCase__       =						sr_ratios
							lowerCAmelCase__       =						depths
							lowerCAmelCase__       =						hidden_sizes
							lowerCAmelCase__       =						downsampling_rates
							lowerCAmelCase__       =						num_attention_heads
							lowerCAmelCase__       =						is_training
							lowerCAmelCase__       =						use_labels
							lowerCAmelCase__       =						hidden_act
							lowerCAmelCase__       =						hidden_dropout_prob
							lowerCAmelCase__       =						attention_probs_dropout_prob
							lowerCAmelCase__       =						initializer_range
							lowerCAmelCase__       =						num_labels
							lowerCAmelCase__       =						scope

	def 		UpperCAmelCase  (							self       )->					Dict:







							'''simple docstring'''





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

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

							lowerCAmelCase__       =						self.get_config()
							return config, pixel_values, labels

	def 		UpperCAmelCase  (							self       )->					Optional[int]:







							'''simple docstring'''





							return SegformerConfig(
							    image_size=self.image_size		,    num_channels=self.num_channels		,    num_encoder_blocks=self.num_encoder_blocks		,    depths=self.depths		,    hidden_sizes=self.hidden_sizes		,    num_attention_heads=self.num_attention_heads		,    hidden_act=self.hidden_act		,    hidden_dropout_prob=self.hidden_dropout_prob		,    attention_probs_dropout_prob=self.attention_probs_dropout_prob		,    initializer_range=self.initializer_range		,    )

	def 		UpperCAmelCase  (							self		,    __UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       )->					Optional[int]:







							'''simple docstring'''





							lowerCAmelCase__       =						SegformerModel(config=__UpperCAmelCase       )
							model.to(__UpperCAmelCase       )
							model.eval()
							lowerCAmelCase__       =						model(__UpperCAmelCase       )
							lowerCAmelCase__       =						lowerCAmelCase__       =						self.image_size // (self.downsampling_rates[-1] * 2)
							self.parent.assertEqual(
							    result.last_hidden_state.shape		,    (self.batch_size, self.hidden_sizes[-1], expected_height, expected_width)       )

	def 		UpperCAmelCase  (							self		,    __UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       )->					str:







							'''simple docstring'''





							lowerCAmelCase__       =						self.num_labels
							lowerCAmelCase__       =						SegformerForSemanticSegmentation(__UpperCAmelCase       )
							model.to(__UpperCAmelCase       )
							model.eval()
							lowerCAmelCase__       =						model(__UpperCAmelCase       )
							self.parent.assertEqual(
							    result.logits.shape		,    (self.batch_size, self.num_labels, self.image_size // 4, self.image_size // 4)       )
							lowerCAmelCase__       =						model(__UpperCAmelCase		,    labels=__UpperCAmelCase       )
							self.parent.assertEqual(
							    result.logits.shape		,    (self.batch_size, self.num_labels, self.image_size // 4, self.image_size // 4)       )
							self.parent.assertGreater(result.loss		,    0.0       )

	def 		UpperCAmelCase  (							self		,    __UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       )->					List[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						1
							lowerCAmelCase__       =						SegformerForSemanticSegmentation(config=__UpperCAmelCase       )
							model.to(__UpperCAmelCase       )
							model.eval()
							lowerCAmelCase__       =						torch.randint(0		,    1		,    (self.batch_size, self.image_size, self.image_size)       ).to(__UpperCAmelCase       )
							lowerCAmelCase__       =						model(__UpperCAmelCase		,    labels=__UpperCAmelCase       )
							self.parent.assertGreater(result.loss		,    0.0       )


	def 		UpperCAmelCase  (							self       )->					Optional[int]:







							'''simple docstring'''





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





@require_torch
class      lowercase__     (			_UpperCAmelCase,					_UpperCAmelCase,					unittest.TestCase	):
	a_         =(
	    (
	        SegformerModel,
	        SegformerForSemanticSegmentation,
	        SegformerForImageClassification,
	    )
	    if is_torch_available()
	    else ()
	)
	a_         =(
	    {
	        """feature-extraction""": SegformerModel,
	        """image-classification""": SegformerForImageClassification,
	        """image-segmentation""": SegformerForSemanticSegmentation,
	    }
	    if is_torch_available()
	    else {}
	)

	a_         =True
	a_         =False
	a_         =False
	a_         =False

	def 		UpperCAmelCase  (							self       )->					Any:







							'''simple docstring'''





							lowerCAmelCase__       =						SegformerModelTester(self       )
							lowerCAmelCase__       =						SegformerConfigTester(self		,    config_class=__UpperCAmelCase       )

	def 		UpperCAmelCase  (							self       )->					Tuple:







							'''simple docstring'''





							self.config_tester.run_common_tests()

	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs()
							self.model_tester.create_and_check_model(*__UpperCAmelCase       )

	def 		UpperCAmelCase  (							self       )->					Any:







							'''simple docstring'''





							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs()
							self.model_tester.create_and_check_for_binary_image_segmentation(*__UpperCAmelCase       )

	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs()
							self.model_tester.create_and_check_for_image_segmentation(*__UpperCAmelCase       )

	@unittest.skip("SegFormer does not use inputs_embeds"       )
	def 		UpperCAmelCase  (							self       )->					Dict:







							'''simple docstring'''





							pass

	@unittest.skip("SegFormer does not have get_input_embeddings method and get_output_embeddings methods"       )
	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





							pass

	def 		UpperCAmelCase  (							self       )->					int:







							'''simple docstring'''





							lowerCAmelCase__      ,							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs_for_common()

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

													lowerCAmelCase__       =						["pixel_values"]
													self.assertListEqual(arg_names[:1]		,    __UpperCAmelCase       )

	def 		UpperCAmelCase  (							self       )->					str:







							'''simple docstring'''





							lowerCAmelCase__      ,							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs_for_common()
							lowerCAmelCase__       =						True

							for model_class in self.all_model_classes:
													lowerCAmelCase__       =						True
													lowerCAmelCase__       =						False
													lowerCAmelCase__       =						True
													lowerCAmelCase__       =						model_class(__UpperCAmelCase       )
													model.to(__UpperCAmelCase       )
													model.eval()
													with torch.no_grad():
																			lowerCAmelCase__       =						model(**self._prepare_for_class(__UpperCAmelCase		,    __UpperCAmelCase       )       )
													lowerCAmelCase__       =						outputs.attentions

													lowerCAmelCase__       =						sum(self.model_tester.depths       )
													self.assertEqual(len(__UpperCAmelCase       )		,    __UpperCAmelCase       )

													# check that output_attentions also work using config
													del inputs_dict["output_attentions"]
													lowerCAmelCase__       =						True
													lowerCAmelCase__       =						model_class(__UpperCAmelCase       )
													model.to(__UpperCAmelCase       )
													model.eval()
													with torch.no_grad():
																			lowerCAmelCase__       =						model(**self._prepare_for_class(__UpperCAmelCase		,    __UpperCAmelCase       )       )
													lowerCAmelCase__       =						outputs.attentions

													self.assertEqual(len(__UpperCAmelCase       )		,    __UpperCAmelCase       )

													# verify the first attentions (first block, first layer)
													lowerCAmelCase__       =						(self.model_tester.image_size // 4) ** 2
													lowerCAmelCase__       =						(self.model_tester.image_size // (4 * self.model_tester.sr_ratios[0])) ** 2
													self.assertListEqual(
													    list(attentions[0].shape[-3:]       )		,    [self.model_tester.num_attention_heads[0], expected_seq_len, expected_reduced_seq_len]		,    )

													# verify the last attentions (last block, last layer)
													lowerCAmelCase__       =						(self.model_tester.image_size // 32) ** 2
													lowerCAmelCase__       =						(self.model_tester.image_size // (32 * self.model_tester.sr_ratios[-1])) ** 2
													self.assertListEqual(
													    list(attentions[-1].shape[-3:]       )		,    [self.model_tester.num_attention_heads[-1], expected_seq_len, expected_reduced_seq_len]		,    )
													lowerCAmelCase__       =						len(__UpperCAmelCase       )

													# Check attention is always last and order is fine
													lowerCAmelCase__       =						True
													lowerCAmelCase__       =						True
													lowerCAmelCase__       =						model_class(__UpperCAmelCase       )
													model.to(__UpperCAmelCase       )
													model.eval()
													with torch.no_grad():
																			lowerCAmelCase__       =						model(**self._prepare_for_class(__UpperCAmelCase		,    __UpperCAmelCase       )       )

													self.assertEqual(out_len + 1		,    len(__UpperCAmelCase       )       )

													lowerCAmelCase__       =						outputs.attentions

													self.assertEqual(len(__UpperCAmelCase       )		,    __UpperCAmelCase       )
													# verify the first attentions (first block, first layer)
													lowerCAmelCase__       =						(self.model_tester.image_size // 4) ** 2
													lowerCAmelCase__       =						(self.model_tester.image_size // (4 * self.model_tester.sr_ratios[0])) ** 2
													self.assertListEqual(
													    list(self_attentions[0].shape[-3:]       )		,    [self.model_tester.num_attention_heads[0], expected_seq_len, expected_reduced_seq_len]		,    )

	def 		UpperCAmelCase  (							self       )->					Tuple:







							'''simple docstring'''





							def check_hidden_states_output(__UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       ):
													lowerCAmelCase__       =						model_class(__UpperCAmelCase       )
													model.to(__UpperCAmelCase       )
													model.eval()

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

													lowerCAmelCase__       =						outputs.hidden_states

													lowerCAmelCase__       =						self.model_tester.num_encoder_blocks
													self.assertEqual(len(__UpperCAmelCase       )		,    __UpperCAmelCase       )

													# verify the first hidden states (first block)
													self.assertListEqual(
													    list(hidden_states[0].shape[-3:]       )		,    [
													        self.model_tester.hidden_sizes[0],
													        self.model_tester.image_size // 4,
													        self.model_tester.image_size // 4,
													    ]		,    )

							lowerCAmelCase__      ,							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs_for_common()

							for model_class in self.all_model_classes:
													lowerCAmelCase__       =						True
													check_hidden_states_output(__UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       )

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

													check_hidden_states_output(__UpperCAmelCase		,    __UpperCAmelCase		,    __UpperCAmelCase       )

	def 		UpperCAmelCase  (							self       )->					Optional[Any]:







							'''simple docstring'''





							if not self.model_tester.is_training:
													return

							lowerCAmelCase__      ,							lowerCAmelCase__       =						self.model_tester.prepare_config_and_inputs_for_common()
							lowerCAmelCase__       =						True

							for model_class in self.all_model_classes:
													if model_class in get_values(__UpperCAmelCase       ):
																			continue

													lowerCAmelCase__       =						model_class(__UpperCAmelCase       )
													model.to(__UpperCAmelCase       )
													model.train()
													lowerCAmelCase__       =						self._prepare_for_class(__UpperCAmelCase		,    __UpperCAmelCase		,    return_labels=__UpperCAmelCase       )
													lowerCAmelCase__       =						model(**__UpperCAmelCase       ).loss
													loss.backward()

	@unittest.skip("Will be fixed soon by reducing the size of the model used for common tests."       )
	def 		UpperCAmelCase  (							self       )->					Any:







							'''simple docstring'''





							pass


	@slow
	def 		UpperCAmelCase  (							self       )->					Union[str, Any]:







							'''simple docstring'''





							for model_name in SEGFORMER_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
													lowerCAmelCase__       =						SegformerModel.from_pretrained(__UpperCAmelCase       )
													self.assertIsNotNone(__UpperCAmelCase       )





def        _a  (     ) ->   Any:
						"""simple docstring"""







						lowerCAmelCase__       =						Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png"   )
						return image





@require_torch
class      lowercase__     (			unittest.TestCase	):

	@slow
	def 		UpperCAmelCase  (							self       )->					Dict:







							'''simple docstring'''





							lowerCAmelCase__       =						SegformerImageProcessor(
							    image_scale=(512, 512)		,    keep_ratio=__UpperCAmelCase		,    align=__UpperCAmelCase		,    do_random_crop=__UpperCAmelCase       )
							lowerCAmelCase__       =						SegformerForSemanticSegmentation.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512"       ).to(
							    __UpperCAmelCase       )

							lowerCAmelCase__       =						prepare_img()
							lowerCAmelCase__       =						image_processor(images=__UpperCAmelCase		,    return_tensors="pt"       )
							lowerCAmelCase__       =						encoded_inputs.pixel_values.to(__UpperCAmelCase       )

							with torch.no_grad():
													lowerCAmelCase__       =						model(__UpperCAmelCase       )

							lowerCAmelCase__       =						torch.Size((1, model.config.num_labels, 128, 128)       )
							self.assertEqual(outputs.logits.shape		,    __UpperCAmelCase       )

							lowerCAmelCase__       =						torch.tensor(
							    [
							        [[-4.6_310, -5.5_232, -6.2_356], [-5.1_921, -6.1_444, -6.5_996], [-5.4_424, -6.2_790, -6.7_574]],
							        [[-12.1_391, -13.3_122, -13.9_554], [-12.8_732, -13.9_352, -14.3_563], [-12.9_438, -13.8_226, -14.2_513]],
							        [[-12.5_134, -13.4_686, -14.4_915], [-12.8_669, -14.4_343, -14.7_758], [-13.2_523, -14.5_819, -15.0_694]],
							    ]       ).to(__UpperCAmelCase       )
							self.assertTrue(torch.allclose(outputs.logits[0, :3, :3, :3]		,    __UpperCAmelCase		,    atol=1E-4       )       )

	@slow
	def 		UpperCAmelCase  (							self       )->					int:







							'''simple docstring'''





							lowerCAmelCase__       =						SegformerImageProcessor(
							    image_scale=(512, 512)		,    keep_ratio=__UpperCAmelCase		,    align=__UpperCAmelCase		,    do_random_crop=__UpperCAmelCase       )
							lowerCAmelCase__       =						SegformerForSemanticSegmentation.from_pretrained(
							    "nvidia/segformer-b1-finetuned-cityscapes-1024-1024"       ).to(__UpperCAmelCase       )

							lowerCAmelCase__       =						prepare_img()
							lowerCAmelCase__       =						image_processor(images=__UpperCAmelCase		,    return_tensors="pt"       )
							lowerCAmelCase__       =						encoded_inputs.pixel_values.to(__UpperCAmelCase       )

							with torch.no_grad():
													lowerCAmelCase__       =						model(__UpperCAmelCase       )

							lowerCAmelCase__       =						torch.Size((1, model.config.num_labels, 128, 128)       )
							self.assertEqual(outputs.logits.shape		,    __UpperCAmelCase       )

							lowerCAmelCase__       =						torch.tensor(
							    [
							        [[-13.5_748, -13.9_111, -12.6_500], [-14.3_500, -15.3_683, -14.2_328], [-14.7_532, -16.0_424, -15.6_087]],
							        [[-17.1_651, -15.8_725, -12.9_653], [-17.2_580, -17.3_718, -14.8_223], [-16.6_058, -16.8_783, -16.7_452]],
							        [[-3.6_456, -3.0_209, -1.4_203], [-3.0_797, -3.1_959, -2.0_000], [-1.8_757, -1.9_217, -1.6_997]],
							    ]       ).to(__UpperCAmelCase       )
							self.assertTrue(torch.allclose(outputs.logits[0, :3, :3, :3]		,    __UpperCAmelCase		,    atol=1E-1       )       )


	@slow
	def 		UpperCAmelCase  (							self       )->					List[Any]:







							'''simple docstring'''





							lowerCAmelCase__       =						SegformerImageProcessor(
							    image_scale=(512, 512)		,    keep_ratio=__UpperCAmelCase		,    align=__UpperCAmelCase		,    do_random_crop=__UpperCAmelCase       )
							lowerCAmelCase__       =						SegformerForSemanticSegmentation.from_pretrained("nvidia/segformer-b0-finetuned-ade-512-512"       ).to(
							    __UpperCAmelCase       )

							lowerCAmelCase__       =						prepare_img()
							lowerCAmelCase__       =						image_processor(images=__UpperCAmelCase		,    return_tensors="pt"       )
							lowerCAmelCase__       =						encoded_inputs.pixel_values.to(__UpperCAmelCase       )

							with torch.no_grad():
													lowerCAmelCase__       =						model(__UpperCAmelCase       )

							lowerCAmelCase__       =						outputs.logits.detach().cpu()

							lowerCAmelCase__       =						image_processor.post_process_semantic_segmentation(outputs=__UpperCAmelCase		,    target_sizes=[(500, 300)]       )
							lowerCAmelCase__       =						torch.Size((500, 300)       )
							self.assertEqual(segmentation[0].shape		,    __UpperCAmelCase       )

							lowerCAmelCase__       =						image_processor.post_process_semantic_segmentation(outputs=__UpperCAmelCase       )
							lowerCAmelCase__       =						torch.Size((128, 128)       )
							self.assertEqual(segmentation[0].shape		,    __UpperCAmelCase       )






