


'''simple docstring'''






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






       def __init__(      self  ,							snake_case  ,							snake_case=None  ,							snake_case=None  ,							snake_case=None  ,							snake_case="resnet50"  ,							snake_case=3  ,							snake_case=3_2  ,							snake_case=3  ,							snake_case=True  ,							snake_case=True  ,							)						->  str:




          '''simple docstring'''
          _UpperCAmelCase       :       Union[str, Any]							   =parent
          _UpperCAmelCase       :       List[str]							   =out_indices if out_indices is not None else [4]
          _UpperCAmelCase       :       Tuple							   =stage_names
          _UpperCAmelCase       :       Any							   =out_features
          _UpperCAmelCase       :       List[Any]							   =backbone
          _UpperCAmelCase       :       Any							   =batch_size
          _UpperCAmelCase       :       Optional[Any]							   =image_size
          _UpperCAmelCase       :       Optional[int]							   =num_channels
          _UpperCAmelCase       :       Tuple							   =use_pretrained_backbone
          _UpperCAmelCase       :       Optional[Any]							   =is_training






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




          '''simple docstring'''
          _UpperCAmelCase       :       List[Any]							   =floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size])
          _UpperCAmelCase       :       Optional[Any]							   =self.get_config()

          return config, pixel_values






       def       lowerCAmelCase		(      self)						->  Union[str, Any]:




          '''simple docstring'''
          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       lowerCAmelCase		(      self  ,							snake_case  ,							snake_case)						->  Union[str, Any]:




          '''simple docstring'''
          _UpperCAmelCase       :       str							   =TimmBackbone(config=snake_case)
          model.to(snake_case)
          model.eval()
          with torch.no_grad():
             _UpperCAmelCase       :       Any							   =model(snake_case)
          self.parent.assertEqual(
              result.feature_map[-1].shape  ,							(self.batch_size, model.channels[-1], 1_4, 1_4)  ,							)






       def       lowerCAmelCase		(      self)						->  int:




          '''simple docstring'''
          _UpperCAmelCase       :       Optional[int]							   =self.prepare_config_and_inputs()
          _UpperCAmelCase       :       List[Any]							   =config_and_inputs
          _UpperCAmelCase       :       str							   ={'pixel_values': pixel_values}
          return config, inputs_dict






@require_torch
@require_timm
class  __magic_name__							(		lowerCAmelCase ,lowerCAmelCase ,lowerCAmelCase ,unittest.TestCase    ):
       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       lowerCAmelCase		(      self)						->  Union[str, Any]:




          '''simple docstring'''
          _UpperCAmelCase       :       List[str]							   =TimmBackboneModelTester(self)
          _UpperCAmelCase       :       Dict							   =ConfigTester(self  ,							config_class=snake_case  ,							has_text_modality=snake_case)






       def       lowerCAmelCase		(      self)						->  str:




          '''simple docstring'''
          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       lowerCAmelCase		(      self)						->  Union[str, Any]:




          '''simple docstring'''
          _UpperCAmelCase       :       int							   ='resnet18'
          _UpperCAmelCase       :       Optional[Any]							   ='microsoft/resnet-18'

          _UpperCAmelCase       :       List[str]							   =AutoBackbone.from_pretrained(snake_case  ,							use_timm_backbone=snake_case)
          _UpperCAmelCase       :       str							   =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])

          _UpperCAmelCase       :       str							   =AutoBackbone.from_pretrained(snake_case  ,							use_timm_backbone=snake_case  ,							out_indices=[1, 2, 3])
          _UpperCAmelCase       :       int							   =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       lowerCAmelCase		(      self)						->  Dict:




          '''simple docstring'''
          pass






       @unittest.skip('TimmBackbone doesn\'t have num_hidden_layers attribute')
       def       lowerCAmelCase		(      self)						->  Optional[Any]:




          '''simple docstring'''
          pass






       @unittest.skip('TimmBackbone initialization is managed on the timm side')
       def       lowerCAmelCase		(      self)						->  str:




          '''simple docstring'''
          pass






       @unittest.skip('TimmBackbone models doesn\'t have inputs_embeds')
       def       lowerCAmelCase		(      self)						->  str:




          '''simple docstring'''
          pass






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




          '''simple docstring'''
          pass






       @unittest.skip('TimmBackbone model cannot be created without specifying a backbone checkpoint')
       def       lowerCAmelCase		(      self)						->  Tuple:




          '''simple docstring'''
          pass






       @unittest.skip('Only checkpoints on timm can be loaded into TimmBackbone')
       def       lowerCAmelCase		(      self)						->  str:




          '''simple docstring'''
          pass






       @unittest.skip('model weights aren\'t tied in TimmBackbone.')
       def       lowerCAmelCase		(      self)						->  Optional[Any]:




          '''simple docstring'''
          pass






       @unittest.skip('model weights aren\'t tied in TimmBackbone.')
       def       lowerCAmelCase		(      self)						->  int:




          '''simple docstring'''
          pass






       @unittest.skip('Only checkpoints on timm can be loaded into TimmBackbone')
       def       lowerCAmelCase		(      self)						->  int:




          '''simple docstring'''
          pass






       @unittest.skip('Only checkpoints on timm can be loaded into TimmBackbone')
       def       lowerCAmelCase		(      self)						->  str:




          '''simple docstring'''
          pass






       @unittest.skip('TimmBackbone doesn\'t have hidden size info in its configuration.')
       def       lowerCAmelCase		(      self)						->  Dict:




          '''simple docstring'''
          pass






       @unittest.skip('TimmBackbone doesn\'t support output_attentions.')
       def       lowerCAmelCase		(      self)						->  Optional[int]:




          '''simple docstring'''
          pass






       @unittest.skip('Safetensors is not supported by timm.')
       def       lowerCAmelCase		(      self)						->  Optional[int]:




          '''simple docstring'''
          pass






       @unittest.skip('Will be fixed soon by reducing the size of the model used for common tests.')
       def       lowerCAmelCase		(      self)						->  Optional[Any]:




          '''simple docstring'''
          pass






       def       lowerCAmelCase		(      self)						->  Any:




          '''simple docstring'''
          _UpperCAmelCase       :       Union[str, Any]							   =self.model_tester.prepare_config_and_inputs_for_common()

          for model_class in self.all_model_classes:
             _UpperCAmelCase       :       Optional[int]							   =model_class(snake_case)
             _UpperCAmelCase       :       Dict							   =inspect.signature(model.forward)
             # signature.parameters is an OrderedDict => so arg_names order is deterministic
             _UpperCAmelCase       :       Any							   =[*signature.parameters.keys()]

             _UpperCAmelCase       :       int							   =['pixel_values']
             self.assertListEqual(arg_names[:1]  ,							snake_case)






       def       lowerCAmelCase		(      self)						->  int:




          '''simple docstring'''
          _UpperCAmelCase       :       Tuple							   =self.model_tester.prepare_config_and_inputs_for_common()
          _UpperCAmelCase       :       List[Any]							   =True
          _UpperCAmelCase       :       Union[str, Any]							   =self.has_attentions

          # no need to test all models as different heads yield the same functionality
          _UpperCAmelCase       :       Union[str, Any]							   =self.all_model_classes[0]
          _UpperCAmelCase       :       int							   =model_class(snake_case)
          model.to(snake_case)

          _UpperCAmelCase       :       List[str]							   =self._prepare_for_class(snake_case  ,							snake_case)
          _UpperCAmelCase       :       Optional[Any]							   =model(**snake_case)
          _UpperCAmelCase       :       Optional[int]							   =outputs[0][-1]

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

          if self.has_attentions:
             _UpperCAmelCase       :       Dict							   =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       lowerCAmelCase		(      self)						->  Optional[Any]:




          '''simple docstring'''
          _UpperCAmelCase       :       Union[str, Any]							   =self.model_tester.prepare_config_and_inputs_for_common()

          for model_class in self.all_model_classes:
             _UpperCAmelCase       :       Dict							   =model_class(snake_case)
             model.to(snake_case)
             model.eval()
             _UpperCAmelCase       :       Optional[Any]							   =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
             _UpperCAmelCase       :       str							   =copy.deepcopy(snake_case)
             _UpperCAmelCase       :       List[Any]							   =None
             _UpperCAmelCase       :       Any							   =model_class(snake_case)
             model.to(snake_case)
             model.eval()
             _UpperCAmelCase       :       int							   =model(**snake_case)

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

             # Check backbone can be initialized with fresh weights
             _UpperCAmelCase       :       str							   =copy.deepcopy(snake_case)
             _UpperCAmelCase       :       Any							   =False
             _UpperCAmelCase       :       Tuple							   =model_class(snake_case)
             model.to(snake_case)
             model.eval()
             _UpperCAmelCase       :       Optional[Any]							   =model(**snake_case)





'''simple docstring'''






from typing import Any





def lowerCamelCase__      (						__lowerCamelCase	:							list	,   __lowerCamelCase	:							list	,   __lowerCamelCase	:							dict	,   __lowerCamelCase	:							dict	,   __lowerCamelCase	:							dict	,   ):







   '''simple docstring'''




   _validation(
       __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   )
   # Creates data structures and fill initial step
   _UpperCAmelCase       :       dict							   ={}
   _UpperCAmelCase       :       dict							   ={}
   for state in states_space:
      _UpperCAmelCase       :       int							   =observations_space[0]
      _UpperCAmelCase       :       int							   =(
          initial_probabilities[state] * emission_probabilities[state][observation]
      )
      _UpperCAmelCase       :       int							   =None

   # Fills the data structure with the probabilities of
   # different transitions and pointers to previous states
   for o in range(1	,   len(__lowerCamelCase							)							):
      _UpperCAmelCase       :       List[Any]							   =observations_space[o]
      _UpperCAmelCase       :       Optional[int]							   =observations_space[o - 1]
      for state in states_space:
         # Calculates the argmax for probability function
         _UpperCAmelCase       :       List[str]							   =''
         _UpperCAmelCase       :       Dict							   =-1
         for k_state in states_space:
            _UpperCAmelCase       :       List[str]							   =(
                probabilities[(k_state, prior_observation)]
                * transition_probabilities[k_state][state]
                * emission_probabilities[state][observation]
            )
            if probability > max_probability:
               _UpperCAmelCase       :       int							   =probability
               _UpperCAmelCase       :       List[Any]							   =k_state

            # Update probabilities and pointers dicts
         _UpperCAmelCase       :       str							   =(
             probabilities[(arg_max, prior_observation)]
             * transition_probabilities[arg_max][state]
             * emission_probabilities[state][observation]
         )

         _UpperCAmelCase       :       List[Any]							   =arg_max

    # The final observation
   _UpperCAmelCase       :       int							   =observations_space[len(__lowerCamelCase							) - 1]

   # argmax for given final observation
   _UpperCAmelCase       :       Any							   =''
   _UpperCAmelCase       :       Union[str, Any]							   =-1
   for k_state in states_space:
      _UpperCAmelCase       :       Optional[int]							   =probabilities[(k_state, final_observation)]
      if probability > max_probability:
         _UpperCAmelCase       :       Union[str, Any]							   =probability
         _UpperCAmelCase       :       int							   =k_state
   _UpperCAmelCase       :       int							   =arg_max

   # Process pointers backwards
   _UpperCAmelCase       :       List[str]							   =last_state
   _UpperCAmelCase       :       Optional[int]							   =[]
   for o in range(len(__lowerCamelCase							) - 1	,   -1	,   -1							):
      result.append(__lowerCamelCase							)
      _UpperCAmelCase       :       Optional[Any]							   =pointers[previous, observations_space[o]]
   result.reverse()

   return result





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   ):







   '''simple docstring'''




   _validate_not_empty(
       __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   )
   _validate_lists(__lowerCamelCase	,   __lowerCamelCase							)
   _validate_dicts(
       __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   ):







   '''simple docstring'''




   if not all(
       [
           observations_space,
           states_space,
           initial_probabilities,
           transition_probabilities,
           emission_probabilities,
       ]							):
      raise ValueError('There\'s an empty parameter'							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any							):







   '''simple docstring'''




   _validate_list(__lowerCamelCase	,   'observations_space'							)
   _validate_list(__lowerCamelCase	,   'states_space'							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							str							):







   '''simple docstring'''




   if not isinstance(_object	,   __lowerCamelCase							):
      _UpperCAmelCase       :       Any							   =f"{var_name} must be a list"
      raise ValueError(__lowerCamelCase							)
   else:
      for x in _object:
         if not isinstance(__lowerCamelCase	,   __lowerCamelCase							):
            _UpperCAmelCase       :       Optional[int]							   =f"{var_name} must be a list of strings"
            raise ValueError(__lowerCamelCase							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   __lowerCamelCase	:							Any	,   ):







   '''simple docstring'''




   _validate_dict(__lowerCamelCase	,   'initial_probabilities'	,   __lowerCamelCase							)
   _validate_nested_dict(__lowerCamelCase	,   'transition_probabilities'							)
   _validate_nested_dict(__lowerCamelCase	,   'emission_probabilities'							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							str							):







   '''simple docstring'''




   _validate_dict(_object	,   __lowerCamelCase	,   __lowerCamelCase							)
   for x in _object.values():
      _validate_dict(__lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase	,   __lowerCamelCase							)





def lowerCamelCase__      (						__lowerCamelCase	:							Any	,   __lowerCamelCase	:							str	,   __lowerCamelCase	:							type	,   __lowerCamelCase	:							bool = False							):







   '''simple docstring'''




   if not isinstance(_object	,   __lowerCamelCase							):
      _UpperCAmelCase       :       List[str]							   =f"{var_name} must be a dict"
      raise ValueError(__lowerCamelCase							)
   if not all(isinstance(__lowerCamelCase	,   __lowerCamelCase							) for x in _object							):
      _UpperCAmelCase       :       str							   =f"{var_name} all keys must be strings"
      raise ValueError(__lowerCamelCase							)
   if not all(isinstance(__lowerCamelCase	,   __lowerCamelCase							) for x in _object.values()							):
      _UpperCAmelCase       :       int							   ='nested dictionary ' if nested else ''
      _UpperCAmelCase       :       Optional[int]							   =f"{var_name} {nested_text}all values must be {value_type.__name__}"
      raise ValueError(__lowerCamelCase							)


if __name__ == "__main__":
 from doctest import testmod

 testmod()

