

from __future__ import annotations


def        __lowercase    (  UpperCAmelCase__		,					UpperCAmelCase__		,					UpperCAmelCase__      ):

					"""simple docstring"""






					if len(UpperCAmelCase__      ) == 0:
										raise ValueError('find_max() arg is an empty sequence'      )
					if (
					    left >= len(UpperCAmelCase__      )
					    or left < -len(UpperCAmelCase__      )
					    or right >= len(UpperCAmelCase__      )
					    or right < -len(UpperCAmelCase__      )
					):
										raise IndexError('list index out of range'      )
					if left == right:
										return nums[left]
					__lowerCAmelCase					=							(left + right) >> 1  # the middle
					__lowerCAmelCase					=							find_max(UpperCAmelCase__		,					UpperCAmelCase__		,					UpperCAmelCase__      )  # find max in range[left, mid]
					__lowerCAmelCase					=							find_max(UpperCAmelCase__		,					mid + 1		,					UpperCAmelCase__      )  # find max in range[mid + 1, right]

					return left_max if left_max >= right_max else right_max


if __name__ == "__main__":
		import doctest

		doctest.testmod(verbose=True)









import copy
import inspect
import unittest

from transformers import AutoBackbone
from transformers.configuration_utils import PretrainedConfig
from transformers.testing_utils import require_timm, require_torch, torch_device
from transformers.utils.import_utils import is_torch_available

from ...test_backbone_common import BackboneTesterMixin
from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor


if is_torch_available():
		import torch

		from transformers import TimmBackbone, TimmBackboneConfig

from ...test_pipeline_mixin import PipelineTesterMixin





class     snake_case_			:


							"""simple docstring"""





							def __init__( self					,						_A					,						_A=None					,						_A=None					,						_A=None					,						_A="resnet50"					,						_A=3					,						_A=3_2					,						_A=3					,						_A=True					,						_A=True					,						):
												__lowerCAmelCase					=							parent
												__lowerCAmelCase					=							out_indices if out_indices is not None else [4]
												__lowerCAmelCase					=							stage_names
												__lowerCAmelCase					=							out_features
												__lowerCAmelCase					=							backbone
												__lowerCAmelCase					=							batch_size
												__lowerCAmelCase					=							image_size
												__lowerCAmelCase					=							num_channels
												__lowerCAmelCase					=							use_pretrained_backbone
												__lowerCAmelCase					=							is_training




							def        A__  ( self							):
												__lowerCAmelCase					=							floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]							)
												__lowerCAmelCase					=							self.get_config()

												return config, pixel_values




							def        A__  ( self							):
												return TimmBackboneConfig(
												    image_size=self.image_size					,						num_channels=self.num_channels					,						out_features=self.out_features					,						out_indices=self.out_indices					,						stage_names=self.stage_names					,						use_pretrained_backbone=self.use_pretrained_backbone					,						backbone=self.backbone					,						)




							def        A__  ( self					,						_A					,						_A							):
												__lowerCAmelCase					=							TimmBackbone(config=_A							)
												model.to(_A							)
												model.eval()
												with torch.no_grad():
																	__lowerCAmelCase					=							model(_A							)
												self.parent.assertEqual(
												    result.feature_map[-1].shape					,						(self.batch_size, model.channels[-1], 1_4, 1_4)					,						)




							def        A__  ( self							):
												__lowerCAmelCase					=							self.prepare_config_and_inputs()
												__lowerCAmelCase,	__lowerCAmelCase					=							config_and_inputs
												__lowerCAmelCase					=							{'pixel_values': pixel_values}
												return config, inputs_dict





@require_torch
@require_timm
class     snake_case_			(				_a			, _a			, _a			, unittest.TestCase							):


							"""simple docstring"""





							__UpperCAmelCase       =(TimmBackbone,) if is_torch_available() else ()
							__UpperCAmelCase       ={"""feature-extraction""": TimmBackbone} if is_torch_available() else {}
							__UpperCAmelCase       =False
							__UpperCAmelCase       =False
							__UpperCAmelCase       =False
							__UpperCAmelCase       =False




							def        A__  ( self							):
												__lowerCAmelCase					=							TimmBackboneModelTester(self							)
												__lowerCAmelCase					=							ConfigTester(self					,						config_class=_A					,						has_text_modality=_A							)




							def        A__  ( self							):
												self.config_tester.create_and_test_config_to_json_string()
												self.config_tester.create_and_test_config_to_json_file()
												self.config_tester.create_and_test_config_from_and_save_pretrained()
												self.config_tester.create_and_test_config_with_num_labels()
												self.config_tester.check_config_can_be_init_without_params()
												self.config_tester.check_config_arguments_init()




							def        A__  ( self							):
												__lowerCAmelCase					=							'resnet18'
												__lowerCAmelCase					=							'microsoft/resnet-18'

												__lowerCAmelCase					=							AutoBackbone.from_pretrained(_A					,						use_timm_backbone=_A							)
												__lowerCAmelCase					=							AutoBackbone.from_pretrained(_A							)

												self.assertEqual(len(timm_model.out_features							)					,						len(transformers_model.out_features							)							)
												self.assertEqual(len(timm_model.stage_names							)					,						len(transformers_model.stage_names							)							)
												self.assertEqual(timm_model.channels					,						transformers_model.channels							)
												# Out indices are set to the last layer by default. For timm models, we don't know
												# the number of layers in advance, so we set it to (-1,), whereas for transformers
												# models, we set it to [len(stage_names) - 1] (kept for backward compatibility).
												self.assertEqual(timm_model.out_indices					,						(-1,)							)
												self.assertEqual(transformers_model.out_indices					,						[len(timm_model.stage_names							) - 1]							)

												__lowerCAmelCase					=							AutoBackbone.from_pretrained(_A					,						use_timm_backbone=_A					,						out_indices=[1, 2, 3]							)
												__lowerCAmelCase					=							AutoBackbone.from_pretrained(_A					,						out_indices=[1, 2, 3]							)

												self.assertEqual(timm_model.out_indices					,						transformers_model.out_indices							)
												self.assertEqual(len(timm_model.out_features							)					,						len(transformers_model.out_features							)							)
												self.assertEqual(timm_model.channels					,						transformers_model.channels							)




							@unittest.skip('TimmBackbone doesn\'t support feed forward chunking'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone doesn\'t have num_hidden_layers attribute'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone initialization is managed on the timm side'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone models doesn\'t have inputs_embeds'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone models doesn\'t have inputs_embeds'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone model cannot be created without specifying a backbone checkpoint'							)
							def        A__  ( self							):
												pass




							@unittest.skip('Only checkpoints on timm can be loaded into TimmBackbone'							)
							def        A__  ( self							):
												pass




							@unittest.skip('model weights aren\'t tied in TimmBackbone.'							)
							def        A__  ( self							):
												pass




							@unittest.skip('model weights aren\'t tied in TimmBackbone.'							)
							def        A__  ( self							):
												pass




							@unittest.skip('Only checkpoints on timm can be loaded into TimmBackbone'							)
							def        A__  ( self							):
												pass




							@unittest.skip('Only checkpoints on timm can be loaded into TimmBackbone'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone doesn\'t have hidden size info in its configuration.'							)
							def        A__  ( self							):
												pass




							@unittest.skip('TimmBackbone doesn\'t support output_attentions.'							)
							def        A__  ( self							):
												pass




							@unittest.skip('Safetensors is not supported by timm.'							)
							def        A__  ( self							):
												pass




							@unittest.skip('Will be fixed soon by reducing the size of the model used for common tests.'							)
							def        A__  ( self							):
												pass




							def        A__  ( self							):
												__lowerCAmelCase,	__lowerCAmelCase					=							self.model_tester.prepare_config_and_inputs_for_common()

												for model_class in self.all_model_classes:
																	__lowerCAmelCase					=							model_class(_A							)
																	__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]					,						_A							)




							def        A__  ( self							):
												__lowerCAmelCase,	__lowerCAmelCase					=							self.model_tester.prepare_config_and_inputs_for_common()
												__lowerCAmelCase					=							True
												__lowerCAmelCase					=							self.has_attentions

												# no need to test all models as different heads yield the same functionality
												__lowerCAmelCase					=							self.all_model_classes[0]
												__lowerCAmelCase					=							model_class(_A							)
												model.to(_A							)

												__lowerCAmelCase					=							self._prepare_for_class(_A					,						_A							)
												__lowerCAmelCase					=							model(**_A							)
												__lowerCAmelCase					=							outputs[0][-1]

												# Encoder-/Decoder-only models
												__lowerCAmelCase					=							outputs.hidden_states[0]
												hidden_states.retain_grad()

												if self.has_attentions:
																	__lowerCAmelCase					=							outputs.attentions[0]
																	attentions.retain_grad()

												output.flatten()[0].backward(retain_graph=_A							)

												self.assertIsNotNone(hidden_states.grad							)

												if self.has_attentions:
																	self.assertIsNotNone(attentions.grad							)




							def        A__  ( self							):
												__lowerCAmelCase,	__lowerCAmelCase					=							self.model_tester.prepare_config_and_inputs_for_common()

												for model_class in self.all_model_classes:
																	__lowerCAmelCase					=							model_class(_A							)
																	model.to(_A							)
																	model.eval()
																	__lowerCAmelCase					=							model(**_A							)

																	self.assertEqual(len(result.feature_maps							)					,						len(config.out_indices							)							)
																	self.assertEqual(len(model.channels							)					,						len(config.out_indices							)							)

																	# Check output of last stage is taken if out_features=None, out_indices=None
																	__lowerCAmelCase					=							copy.deepcopy(_A							)
																	__lowerCAmelCase					=							None
																	__lowerCAmelCase					=							model_class(_A							)
																	model.to(_A							)
																	model.eval()
																	__lowerCAmelCase					=							model(**_A							)

																	self.assertEqual(len(result.feature_maps							)					,						1							)
																	self.assertEqual(len(model.channels							)					,						1							)

																	# Check backbone can be initialized with fresh weights
																	__lowerCAmelCase					=							copy.deepcopy(_A							)
																	__lowerCAmelCase					=							False
																	__lowerCAmelCase					=							model_class(_A							)
																	model.to(_A							)
																	model.eval()
																	__lowerCAmelCase					=							model(**_A							)






