


from collections import OrderedDict
from typing import Any, Mapping, Optional

from ... import PreTrainedTokenizer
from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig, OnnxConfigWithPast, OnnxSeqaSeqConfigWithPast
from ...onnx.utils import compute_effective_axis_dimension
from ...utils import TensorType, is_torch_available, logging


a_ :Optional[int]  							=			logging.get_logger(__name__)

a_ :Union[str, Any]  							=			{
    'Helsinki-NLP/opus-mt-en-de': 'https://huggingface.co/Helsinki-NLP/opus-mt-en-de/resolve/main/config.json',
    # See all Marian models at https://huggingface.co/models?filter=marian
}

class 							lowercase  (						_UpperCAmelCase			):
     lowerCamelCase			:			Union[str, Any]      = '''marian'''
     lowerCamelCase			:			Tuple      = ['''past_key_values''']
     lowerCamelCase			:			Optional[Any]      = {'''num_attention_heads''': '''encoder_attention_heads''', '''hidden_size''': '''d_model'''}







     def __init__(						self :						Optional[Any]   ,   _lowercase :						str=5_81_01   ,   _lowercase :						Union[str, Any]=None   ,   _lowercase :						Tuple=10_24   ,   _lowercase :						List[Any]=12   ,   _lowercase :						int=40_96   ,   _lowercase :						int=16   ,   _lowercase :						str=12   ,   _lowercase :						List[str]=40_96   ,   _lowercase :						Tuple=16   ,   _lowercase :						List[Any]=0.0   ,   _lowercase :						Any=0.0   ,   _lowercase :						List[Any]=True   ,   _lowercase :						Dict=True   ,   _lowercase :						Union[str, Any]="gelu"   ,   _lowercase :						int=10_24   ,   _lowercase :						Optional[Any]=0.1   ,   _lowercase :						List[Any]=0.0   ,   _lowercase :						Optional[int]=0.0   ,   _lowercase :						str=0.02   ,   _lowercase :						Tuple=5_81_00   ,   _lowercase :						int=False   ,   _lowercase :						Any=5_81_00   ,   _lowercase :						Tuple=0   ,   _lowercase :						Tuple=0   ,   _lowercase :						List[Any]=True   ,   **_lowercase :						int   ,   ):
           SCREAMING_SNAKE_CASE__       :  List[str]						     =		vocab_size
           SCREAMING_SNAKE_CASE__       :  Dict						     =		decoder_vocab_size or vocab_size
           SCREAMING_SNAKE_CASE__       :  List[Any]						     =		max_position_embeddings
           SCREAMING_SNAKE_CASE__       :  int						     =		d_model
           SCREAMING_SNAKE_CASE__       :  Tuple						     =		encoder_ffn_dim
           SCREAMING_SNAKE_CASE__       :  int						     =		encoder_layers
           SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		encoder_attention_heads
           SCREAMING_SNAKE_CASE__       :  Dict						     =		decoder_ffn_dim
           SCREAMING_SNAKE_CASE__       :  Tuple						     =		decoder_layers
           SCREAMING_SNAKE_CASE__       :  Optional[int]						     =		decoder_attention_heads
           SCREAMING_SNAKE_CASE__       :  int						     =		dropout
           SCREAMING_SNAKE_CASE__       :  Optional[int]						     =		attention_dropout
           SCREAMING_SNAKE_CASE__       :  List[str]						     =		activation_dropout
           SCREAMING_SNAKE_CASE__       :  Union[str, Any]						     =		activation_function
           SCREAMING_SNAKE_CASE__       :  Tuple						     =		init_std
           SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		encoder_layerdrop
           SCREAMING_SNAKE_CASE__       :  List[str]						     =		decoder_layerdrop
           SCREAMING_SNAKE_CASE__       :  Tuple						     =		use_cache
           SCREAMING_SNAKE_CASE__       :  str						     =		encoder_layers
           SCREAMING_SNAKE_CASE__       :  Any						     =		scale_embedding  # scale factor will be sqrt(d_model) if True
           SCREAMING_SNAKE_CASE__       :  str						     =		share_encoder_decoder_embeddings
           super().__init__(
               pad_token_id=_lowercase   ,   eos_token_id=_lowercase   ,   is_encoder_decoder=_lowercase   ,   decoder_start_token_id=_lowercase   ,   forced_eos_token_id=_lowercase   ,   **_lowercase   ,   )




class 							lowercase  (						_UpperCAmelCase			):







     @property
     # Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.inputs
     def 							lowercase__       (						self :						Tuple      ):
           if self.task in ["default", "seq2seq-lm"]:
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		OrderedDict(
                     [
                         ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
                         ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
                     ]      )

                 if self.use_past:
                       SCREAMING_SNAKE_CASE__       :  Any						     =		{0: '''batch'''}
                       SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		{0: '''batch''', 1: '''past_decoder_sequence + sequence'''}
                 else:
                       SCREAMING_SNAKE_CASE__       :  Optional[int]						     =		{0: '''batch''', 1: '''decoder_sequence'''}
                       SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		{0: '''batch''', 1: '''decoder_sequence'''}

                 if self.use_past:
                       self.fill_with_past_key_values_(_lowercase   ,   direction='''inputs'''      )
           elif self.task == "causal-lm":
                 # TODO: figure this case out.
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		OrderedDict(
                     [
                         ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
                         ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
                     ]      )
                 if self.use_past:
                       SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  int						     =		self.num_layers
                       for i in range(_lowercase      ):
                             SCREAMING_SNAKE_CASE__       :  int						     =		{0: '''batch''', 2: '''past_sequence + sequence'''}
                             SCREAMING_SNAKE_CASE__       :  Any						     =		{0: '''batch''', 2: '''past_sequence + sequence'''}
           else:
                 SCREAMING_SNAKE_CASE__       :  int						     =		OrderedDict(
                     [
                         ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
                         ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
                         ('''decoder_input_ids''', {0: '''batch''', 1: '''decoder_sequence'''}),
                         ('''decoder_attention_mask''', {0: '''batch''', 1: '''decoder_sequence'''}),
                     ]      )

           return common_inputs







     @property
     # Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.outputs
     def 							lowercase__       (						self :						Tuple      ):
           if self.task in ["default", "seq2seq-lm"]:
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		super().outputs
           else:
                 SCREAMING_SNAKE_CASE__       :  Union[str, Any]						     =		super(_lowercase   ,   self      ).outputs
                 if self.use_past:
                       SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  Optional[int]						     =		self.num_layers
                       for i in range(_lowercase      ):
                             SCREAMING_SNAKE_CASE__       :  List[Any]						     =		{0: '''batch''', 2: '''past_sequence + sequence'''}
                             SCREAMING_SNAKE_CASE__       :  Any						     =		{0: '''batch''', 2: '''past_sequence + sequence'''}
           return common_outputs







     def 							lowercase__       (						self :						Optional[Any]   ,   _lowercase :						PreTrainedTokenizer   ,   _lowercase :						int = -1   ,   _lowercase :						int = -1   ,   _lowercase :						bool = False   ,   _lowercase :						Optional[TensorType] = None   ,   ):
           SCREAMING_SNAKE_CASE__       :  str						     =		self._generate_dummy_inputs_for_encoder_and_decoder(
               _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase      )

           # Generate decoder inputs
           SCREAMING_SNAKE_CASE__       :  str						     =		seq_length if not self.use_past else 1
           SCREAMING_SNAKE_CASE__       :  List[str]						     =		self._generate_dummy_inputs_for_encoder_and_decoder(
               _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase      )
           SCREAMING_SNAKE_CASE__       :  Dict						     =		{f"""decoder_{name}""": tensor for name, tensor in decoder_inputs.items()}
           SCREAMING_SNAKE_CASE__       :  Optional[int]						     =		dict(**_lowercase   ,   **_lowercase      )

           if self.use_past:
                 if not is_torch_available():
                       raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''      )
                 else:
                       import torch
                 SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  str						     =		common_inputs['''input_ids'''].shape
                 SCREAMING_SNAKE_CASE__       :  str						     =		common_inputs['''decoder_input_ids'''].shape[1]
                 SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  Dict						     =		self.num_attention_heads
                 SCREAMING_SNAKE_CASE__       :  Union[str, Any]						     =		(
                     batch,
                     num_encoder_attention_heads,
                     encoder_seq_length,
                     self._config.hidden_size // num_encoder_attention_heads,
                 )
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		decoder_seq_length + 3
                 SCREAMING_SNAKE_CASE__       :  Union[str, Any]						     =		(
                     batch,
                     num_decoder_attention_heads,
                     decoder_past_length,
                     self._config.hidden_size // num_decoder_attention_heads,
                 )

                 SCREAMING_SNAKE_CASE__       :  str						     =		torch.cat(
                     [common_inputs['''decoder_attention_mask'''], torch.ones(_lowercase   ,   _lowercase      )]   ,   dim=1      )

                 SCREAMING_SNAKE_CASE__       :  Union[str, Any]						     =		[]
                 # If the number of encoder and decoder layers are present in the model configuration, both are considered
                 SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  List[str]						     =		self.num_layers
                 SCREAMING_SNAKE_CASE__       :  str						     =		min(_lowercase   ,   _lowercase      )
                 SCREAMING_SNAKE_CASE__       :  List[Any]						     =		max(_lowercase   ,   _lowercase      ) - min_num_layers
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		'''encoder''' if num_encoder_layers > num_decoder_layers else '''decoder'''

                 for _ in range(_lowercase      ):
                       common_inputs["past_key_values"].append(
                           (
                               torch.zeros(_lowercase      ),
                               torch.zeros(_lowercase      ),
                               torch.zeros(_lowercase      ),
                               torch.zeros(_lowercase      ),
                           )      )
                 # TODO: test this.
                 SCREAMING_SNAKE_CASE__       :  List[Any]						     =		encoder_shape if remaining_side_name == '''encoder''' else decoder_shape
                 for _ in range(_lowercase   ,   _lowercase      ):
                       common_inputs["past_key_values"].append((torch.zeros(_lowercase      ), torch.zeros(_lowercase      ))      )
           return common_inputs







     def 							lowercase__       (						self :						int   ,   _lowercase :						PreTrainedTokenizer   ,   _lowercase :						int = -1   ,   _lowercase :						int = -1   ,   _lowercase :						bool = False   ,   _lowercase :						Optional[TensorType] = None   ,   ):
           SCREAMING_SNAKE_CASE__       :  List[str]						     =		self._generate_dummy_inputs_for_encoder_and_decoder(
               _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase      )

           if self.use_past:
                 if not is_torch_available():
                       raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''      )
                 else:
                       import torch
                 SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  List[str]						     =		common_inputs['''input_ids'''].shape
                 # Not using the same length for past_key_values
                 SCREAMING_SNAKE_CASE__       :  Any						     =		seqlen + 2
                 SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  Optional[int]						     =		self.num_layers
                 SCREAMING_SNAKE_CASE__     ,       SCREAMING_SNAKE_CASE__       :  List[Any]						     =		self.num_attention_heads
                 SCREAMING_SNAKE_CASE__       :  str						     =		(
                     batch,
                     num_encoder_attention_heads,
                     past_key_values_length,
                     self._config.hidden_size // num_encoder_attention_heads,
                 )

                 SCREAMING_SNAKE_CASE__       :  Any						     =		common_inputs['''attention_mask'''].dtype
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		torch.cat(
                     [common_inputs['''attention_mask'''], torch.ones(_lowercase   ,   _lowercase   ,   dtype=_lowercase      )]   ,   dim=1      )
                 SCREAMING_SNAKE_CASE__       :  List[str]						     =		[
                     (torch.zeros(_lowercase      ), torch.zeros(_lowercase      )) for _ in range(_lowercase      )
                 ]
           return common_inputs







     def 							lowercase__       (						self :						Optional[Any]   ,   _lowercase :						PreTrainedTokenizer   ,   _lowercase :						int = -1   ,   _lowercase :						int = -1   ,   _lowercase :						bool = False   ,   _lowercase :						Optional[TensorType] = None   ,   ):
           # Copied from OnnxConfig.generate_dummy_inputs
           # Did not use super(OnnxConfigWithPast, self).generate_dummy_inputs for code clarity.
           # If dynamic axis (-1) we forward with a fixed dimension of 2 samples to avoid optimizations made by ONNX
           SCREAMING_SNAKE_CASE__       :  str						     =		compute_effective_axis_dimension(
               _lowercase   ,   fixed_dimension=OnnxConfig.default_fixed_batch   ,   num_token_to_add=0      )

           # If dynamic axis (-1) we forward with a fixed dimension of 8 tokens to avoid optimizations made by ONNX
           SCREAMING_SNAKE_CASE__       :  str						     =		tokenizer.num_special_tokens_to_add(_lowercase      )
           SCREAMING_SNAKE_CASE__       :  List[str]						     =		compute_effective_axis_dimension(
               _lowercase   ,   fixed_dimension=OnnxConfig.default_fixed_sequence   ,   num_token_to_add=_lowercase      )

           # Generate dummy inputs according to compute batch and sequence
           SCREAMING_SNAKE_CASE__       :  List[Any]						     =		[''' '''.join([tokenizer.unk_token]      ) * seq_length] * batch_size
           SCREAMING_SNAKE_CASE__       :  Union[str, Any]						     =		dict(tokenizer(_lowercase   ,   return_tensors=_lowercase      )      )
           return common_inputs







     def 							lowercase__       (						self :						List[str]   ,   _lowercase :						PreTrainedTokenizer   ,   _lowercase :						int = -1   ,   _lowercase :						int = -1   ,   _lowercase :						bool = False   ,   _lowercase :						Optional[TensorType] = None   ,   ):
           if self.task in ["default", "seq2seq-lm"]:
                 SCREAMING_SNAKE_CASE__       :  Dict						     =		self._generate_dummy_inputs_for_default_and_seqaseq_lm(
                     _lowercase   ,   batch_size=_lowercase   ,   seq_length=_lowercase   ,   is_pair=_lowercase   ,   framework=_lowercase      )

           else:
                 SCREAMING_SNAKE_CASE__       :  List[Any]						     =		self._generate_dummy_inputs_for_causal_lm(
                     _lowercase   ,   batch_size=_lowercase   ,   seq_length=_lowercase   ,   is_pair=_lowercase   ,   framework=_lowercase      )

           return common_inputs







     def 							lowercase__       (						self :						str   ,   _lowercase :						Union[str, Any]   ,   _lowercase :						Any   ,   _lowercase :						Optional[int]   ,   _lowercase :						Union[str, Any]      ):
           if self.task in ["default", "seq2seq-lm"]:
                 SCREAMING_SNAKE_CASE__       :  Optional[Any]						     =		super()._flatten_past_key_values_(_lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase      )
           else:
                 SCREAMING_SNAKE_CASE__       :  List[Any]						     =		super(_lowercase   ,   self      )._flatten_past_key_values_(
                     _lowercase   ,   _lowercase   ,   _lowercase   ,   _lowercase      )







     @property
     def 							lowercase__       (						self :						Dict      ):
           return 1E-4











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     __a			:



	def __init__(    self				:     Union[str, Any]					,						snake_case_				:     Dict					,						snake_case_				:     Tuple=None					,						snake_case_				:     List[str]=None					,						snake_case_				:     Union[str, Any]=None					,						snake_case_				:     str="resnet50"					,						snake_case_				:     List[Any]=3					,						snake_case_				:     Optional[int]=32					,						snake_case_				:     Union[str, Any]=3					,						snake_case_				:     Tuple=True					,						snake_case_				:     List[str]=True					,						)->				Optional[Any]:
						__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 		UpperCamelCase				(    self				:     int)->				Dict:
						__lowerCAmelCase						 =floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size])
						__lowerCAmelCase						 =self.get_config()

						return config, pixel_values



	def 		UpperCamelCase				(    self				:     Optional[int])->				Optional[int]:
						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 		UpperCamelCase				(    self				:     str					,						snake_case_				:     int					,						snake_case_				:     Union[str, Any])->				str:
						__lowerCAmelCase						 =TimmBackbone(config=snake_case_)
						model.to(snake_case_)
						model.eval()
						with torch.no_grad():
											__lowerCAmelCase						 =model(snake_case_)
						self.parent.assertEqual(
						    result.feature_map[-1].shape					,						(self.batch_size, model.channels[-1], 14, 14)					,						)



	def 		UpperCamelCase				(    self				:     List[str])->				Union[str, Any]:
						__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     __a			(  SCREAMING_SNAKE_CASE						,     SCREAMING_SNAKE_CASE						,     SCREAMING_SNAKE_CASE						,     unittest.TestCase					):
	SCREAMING_SNAKE_CASE  	=							(TimmBackbone,) if is_torch_available() else ()
	SCREAMING_SNAKE_CASE  	=							{"feature-extraction": TimmBackbone} if is_torch_available() else {}
	SCREAMING_SNAKE_CASE  	=							False
	SCREAMING_SNAKE_CASE  	=							False
	SCREAMING_SNAKE_CASE  	=							False
	SCREAMING_SNAKE_CASE  	=							False



	def 		UpperCamelCase				(    self				:     Union[str, Any])->				str:
						__lowerCAmelCase						 =TimmBackboneModelTester(self)
						__lowerCAmelCase						 =ConfigTester(self					,						config_class=snake_case_					,						has_text_modality=snake_case_)



	def 		UpperCamelCase				(    self				:     Tuple)->				Optional[Any]:
						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 		UpperCamelCase				(    self				:     Any)->				Dict:
						__lowerCAmelCase						 ="""resnet18"""
						__lowerCAmelCase						 ="""microsoft/resnet-18"""

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

						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(snake_case_					,						use_timm_backbone=snake_case_					,						out_indices=[1, 2, 3])
						__lowerCAmelCase						 =AutoBackbone.from_pretrained(snake_case_					,						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 		UpperCamelCase				(    self				:     Dict)->				Any:
						pass



	@unittest.skip("""TimmBackbone doesn't have num_hidden_layers attribute""")
	def 		UpperCamelCase				(    self				:     Tuple)->				Dict:
						pass



	@unittest.skip("""TimmBackbone initialization is managed on the timm side""")
	def 		UpperCamelCase				(    self				:     Union[str, Any])->				List[str]:
						pass



	@unittest.skip("""TimmBackbone models doesn't have inputs_embeds""")
	def 		UpperCamelCase				(    self				:     List[str])->				List[str]:
						pass



	@unittest.skip("""TimmBackbone models doesn't have inputs_embeds""")
	def 		UpperCamelCase				(    self				:     int)->				int:
						pass



	@unittest.skip("""TimmBackbone model cannot be created without specifying a backbone checkpoint""")
	def 		UpperCamelCase				(    self				:     Dict)->				int:
						pass



	@unittest.skip("""Only checkpoints on timm can be loaded into TimmBackbone""")
	def 		UpperCamelCase				(    self				:     Any)->				Dict:
						pass



	@unittest.skip("""model weights aren't tied in TimmBackbone.""")
	def 		UpperCamelCase				(    self				:     int)->				Tuple:
						pass



	@unittest.skip("""model weights aren't tied in TimmBackbone.""")
	def 		UpperCamelCase				(    self				:     Optional[int])->				Union[str, Any]:
						pass



	@unittest.skip("""Only checkpoints on timm can be loaded into TimmBackbone""")
	def 		UpperCamelCase				(    self				:     Optional[Any])->				Optional[Any]:
						pass



	@unittest.skip("""Only checkpoints on timm can be loaded into TimmBackbone""")
	def 		UpperCamelCase				(    self				:     Any)->				List[Any]:
						pass



	@unittest.skip("""TimmBackbone doesn't have hidden size info in its configuration.""")
	def 		UpperCamelCase				(    self				:     Any)->				Tuple:
						pass



	@unittest.skip("""TimmBackbone doesn't support output_attentions.""")
	def 		UpperCamelCase				(    self				:     List[Any])->				str:
						pass



	@unittest.skip("""Safetensors is not supported by timm.""")
	def 		UpperCamelCase				(    self				:     Dict)->				Optional[int]:
						pass



	@unittest.skip("""Will be fixed soon by reducing the size of the model used for common tests.""")
	def 		UpperCamelCase				(    self				:     Optional[int])->				Tuple:
						pass



	def 		UpperCamelCase				(    self				:     int)->				Union[str, Any]:
						__lowerCAmelCase ,						__lowerCAmelCase						 =self.model_tester.prepare_config_and_inputs_for_common()

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



	def 		UpperCamelCase				(    self				:     Dict)->				Optional[Any]:
						__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(snake_case_)
						model.to(snake_case_)

						__lowerCAmelCase						 =self._prepare_for_class(snake_case_					,						snake_case_)
						__lowerCAmelCase						 =model(**snake_case_)
						__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=snake_case_)

						self.assertIsNotNone(hidden_states.grad)

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



	def 		UpperCamelCase				(    self				:     Tuple)->				List[Any]:
						__lowerCAmelCase ,						__lowerCAmelCase						 =self.model_tester.prepare_config_and_inputs_for_common()

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

											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(snake_case_)
											__lowerCAmelCase						 =None
											__lowerCAmelCase						 =model_class(snake_case_)
											model.to(snake_case_)
											model.eval()
											__lowerCAmelCase						 =model(**snake_case_)

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

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




