



'''simple docstring'''





import copy

from ...configuration_utils import PretrainedConfig
from ...utils import logging


UpperCamelCase__    :     int			  =   logging.get_logger(__name__)

UpperCamelCase__    :     int			  =   {
    'facebook/sam-vit-huge': 'https://huggingface.co/facebook/sam-vit-huge/resolve/main/config.json',
    'facebook/sam-vit-large': 'https://huggingface.co/facebook/sam-vit-large/resolve/main/config.json',
    'facebook/sam-vit-base': 'https://huggingface.co/facebook/sam-vit-base/resolve/main/config.json',
}


class 							_lowerCAmelCase	(  __A							):


 """simple docstring"""

 def __init__(      self					,    _lowerCamelCase=256					,    _lowerCamelCase=1024					,    _lowerCamelCase=16					,    _lowerCamelCase=16					,    _lowerCamelCase=4					,    _lowerCamelCase="gelu"					,    _lowerCamelCase=1e-6					,    **_lowerCamelCase					,    )    ->    Tuple:
    super().__init__(**_lowerCamelCase  )
    A_  :		Union[str, Any]						=					hidden_size
    A_  :		Optional[Any]						=					image_size
    A_  :		List[Any]						=					patch_size
    A_  :		int						=					image_size // patch_size
    A_  :		str						=					mask_input_channels
    A_  :		int						=					num_point_embeddings
    A_  :		Union[str, Any]						=					hidden_act
    A_  :		List[str]						=					layer_norm_eps


class 							_lowerCAmelCase	(  __A							):


 """simple docstring"""

 def __init__(      self					,    _lowerCamelCase=256					,    _lowerCamelCase="relu"					,    _lowerCamelCase=2048					,    _lowerCamelCase=2					,    _lowerCamelCase=8					,    _lowerCamelCase=2					,    _lowerCamelCase=3					,    _lowerCamelCase=3					,    _lowerCamelCase=256					,    _lowerCamelCase=1e-6					,    **_lowerCamelCase					,    )    ->    List[str]:
    super().__init__(**_lowerCamelCase  )
    A_  :		Any						=					hidden_size
    A_  :		Any						=					hidden_act
    A_  :		List[str]						=					mlp_dim
    A_  :		List[Any]						=					num_hidden_layers
    A_  :		int						=					num_attention_heads
    A_  :		Tuple						=					attention_downsample_rate
    A_  :		Union[str, Any]						=					num_multimask_outputs
    A_  :		Optional[int]						=					iou_head_depth
    A_  :		Any						=					iou_head_hidden_dim
    A_  :		int						=					layer_norm_eps


class 							_lowerCAmelCase	(  __A							):


 """simple docstring"""

 def __init__(      self					,    _lowerCamelCase=768					,    _lowerCamelCase=256					,    _lowerCamelCase=12					,    _lowerCamelCase=12					,    _lowerCamelCase=3					,    _lowerCamelCase=1024					,    _lowerCamelCase=16					,    _lowerCamelCase="gelu"					,    _lowerCamelCase=1e-06					,    _lowerCamelCase=0.0					,    _lowerCamelCase=1e-10					,    _lowerCamelCase=True					,    _lowerCamelCase=4.0					,    _lowerCamelCase=True					,    _lowerCamelCase=True					,    _lowerCamelCase=14					,    _lowerCamelCase=[2, 5, 8, 11]					,    _lowerCamelCase=128					,    _lowerCamelCase=None					,    **_lowerCamelCase					,    )    ->    Tuple:
    super().__init__(**_lowerCamelCase  )

    A_  :		Any						=					hidden_size
    A_  :		Optional[Any]						=					output_channels
    A_  :		Optional[int]						=					num_hidden_layers
    A_  :		Any						=					num_attention_heads
    A_  :		Optional[Any]						=					num_channels
    A_  :		Tuple						=					image_size
    A_  :		int						=					patch_size
    A_  :		Any						=					hidden_act
    A_  :		List[Any]						=					layer_norm_eps
    A_  :		Optional[int]						=					attention_dropout
    A_  :		Tuple						=					initializer_range
    A_  :		int						=					qkv_bias
    A_  :		Optional[Any]						=					mlp_ratio
    A_  :		str						=					use_abs_pos
    A_  :		Optional[int]						=					use_rel_pos
    A_  :		List[str]						=					window_size
    A_  :		str						=					global_attn_indexes
    A_  :		int						=					num_pos_feats
    A_  :		int						=					int(hidden_size * mlp_ratio  ) if mlp_dim is None else mlp_dim


class 							_lowerCAmelCase	(  __A							):


 """simple docstring"""

 lowerCamelCase									=     '''sam'''
 lowerCamelCase									=     True







 def __init__(      self					,    _lowerCamelCase=None					,    _lowerCamelCase=None					,    _lowerCamelCase=None					,    _lowerCamelCase=0.02					,    **_lowerCamelCase					,    )    ->    str:
    super().__init__(**_lowerCamelCase  )
    A_  :		Union[str, Any]						=					vision_config if vision_config is not None else {}
    A_  :		Any						=					prompt_encoder_config if prompt_encoder_config is not None else {}
    A_  :		List[Any]						=					mask_decoder_config if mask_decoder_config is not None else {}

    if isinstance(_lowerCamelCase					,    _lowerCamelCase  ):
       A_  :		str						=					vision_config.to_dict()
    if isinstance(_lowerCamelCase					,    _lowerCamelCase  ):
       A_  :		int						=					prompt_encoder_config.to_dict()
    if isinstance(_lowerCamelCase					,    _lowerCamelCase  ):
       A_  :		Optional[int]						=					mask_decoder_config.to_dict()

    A_  :		List[Any]						=					SamVisionConfig(**_lowerCamelCase  )
    A_  :		Optional[Any]						=					SamPromptEncoderConfig(**_lowerCamelCase  )
    A_  :		List[Any]						=					SamMaskDecoderConfig(**_lowerCamelCase  )
    A_  :		Tuple						=					initializer_range







 def       UpperCAmelCase_       (      self  )    ->    str:
    A_  :		List[Any]						=					copy.deepcopy(self.__dict__  )
    A_  :		Optional[Any]						=					self.vision_config.to_dict()
    A_  :		List[str]						=					self.prompt_encoder_config.to_dict()
    A_  :		Any						=					self.mask_decoder_config.to_dict()
    A_  :		List[str]						=					self.__class__.model_type
    return output





'''simple docstring'''





import enum
import inspect
from typing import Iterable, List, Optional, Tuple, Union


class 							_lowerCAmelCase	(  enum.Enum							):


 """simple docstring"""

 lowerCamelCase									=     '''timm'''
 lowerCamelCase									=     '''transformers'''



def     UpperCAmelCase     (    a_      ,		a_      ,		a_		)   ->       Optional[Any]:



   """simple docstring"""






   if stage_names is None:
      raise ValueError("""Stage_names must be set for transformers backbones"""		)

   if out_features is not None:
      if not isinstance(a_      ,		(list,)		):
         raise ValueError(F"out_features must be a list {type(a_		)}"		)
      if any(feat not in stage_names for feat in out_features		):
         raise ValueError(F"out_features must be a subset of stage_names: {stage_names} got {out_features}"		)

   if out_indices is not None:
      if not isinstance(a_      ,		(list, tuple)		):
         raise ValueError(F"out_indices must be a list or tuple, got {type(a_		)}"		)
      if any(idx >= len(a_		) for idx in out_indices		):
         raise ValueError("""out_indices must be valid indices for stage_names {stage_names}, got {out_indices}"""		)

   if out_features is not None and out_indices is not None:
      if len(a_		) != len(a_		):
         raise ValueError("""out_features and out_indices should have the same length if both are set"""		)
      if out_features != [stage_names[idx] for idx in out_indices]:
         raise ValueError("""out_features and out_indices should correspond to the same stages if both are set"""		)



def     UpperCAmelCase     (    a_      ,		a_      ,		a_      ,		)   ->       Dict:



   """simple docstring"""






   if out_indices is None and out_features is None:
      A_  :		Optional[Any]						=					[len(a_		) - 1]
      A_  :		Optional[int]						=					[stage_names[-1]]
   elif out_indices is None and out_features is not None:
      A_  :		Optional[Any]						=					[stage_names.index(a_		) for layer in out_features]
   elif out_features is None and out_indices is not None:
      A_  :		int						=					[stage_names[idx] for idx in out_indices]
   return out_features, out_indices



def     UpperCAmelCase     (    a_      ,		a_      ,		a_      ,		)   ->       Tuple[List[str], List[int]]:



   """simple docstring"""






   verify_out_features_out_indices(out_features=a_      ,		out_indices=a_      ,		stage_names=a_		)
   A_						,  A_  :		List[Any]						=					_align_output_features_output_indices(
       out_features=a_      ,		out_indices=a_      ,		stage_names=a_		)
   # Verify that the aligned out_features and out_indices are valid
   verify_out_features_out_indices(out_features=a_      ,		out_indices=a_      ,		stage_names=a_		)
   return output_features, output_indices


class 							_lowerCAmelCase	:


 """simple docstring"""

 lowerCamelCase									=     None







 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    None:
    if getattr(self					,    """_backbone"""					,    _lowerCamelCase  ) is None:
       raise ValueError("""self._backbone must be set before calling _init_timm_backbone"""  )

    # These will diagree with the defaults for the transformers models e.g. for resnet50
    # the transformer model has out_features = ['stem', 'stage1', 'stage2', 'stage3', 'stage4']
    # the timm model has out_features = ['act', 'layer1', 'layer2', 'layer3', 'layer4']
    A_  :		str						=					[stage["""module"""] for stage in self._backbone.feature_info.info]
    A_  :		Any						=					[stage["""num_chs"""] for stage in self._backbone.feature_info.info]
    A_  :		Tuple						=					self._backbone.feature_info.out_indices
    A_  :		str						=					self._backbone.feature_info.module_name()

    # We verify the out indices and out features are valid
    verify_out_features_out_indices(
        out_features=_lowerCamelCase					,    out_indices=_lowerCamelCase					,    stage_names=self.stage_names  )
    A_						,  A_  :		List[Any]						=					out_features, out_indices







 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    None:
    A_  :		List[Any]						=					getattr(_lowerCamelCase					,    """stage_names"""  )
    A_  :		int						=					getattr(_lowerCamelCase					,    """out_features"""					,    _lowerCamelCase  )
    A_  :		Optional[int]						=					getattr(_lowerCamelCase					,    """out_indices"""					,    _lowerCamelCase  )

    A_  :		Union[str, Any]						=					stage_names
    A_						,  A_  :		List[str]						=					get_aligned_output_features_output_indices(
        out_features=_lowerCamelCase					,    out_indices=_lowerCamelCase					,    stage_names=_lowerCamelCase  )
    # Number of channels for each stage. This is set in the transformer backbone model init
    A_  :		int						=					None







 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    None:
    A_  :		Optional[Any]						=					config

    A_  :		Optional[Any]						=					getattr(_lowerCamelCase					,    """use_timm_backbone"""					,    _lowerCamelCase  )
    A_  :		Optional[int]						=					BackboneType.TIMM if self.use_timm_backbone else BackboneType.TRANSFORMERS

    if self.backbone_type == BackboneType.TIMM:
       self._init_timm_backbone(_lowerCamelCase  )
    elif self.backbone_type == BackboneType.TRANSFORMERS:
       self._init_transformers_backbone(_lowerCamelCase  )
    else:
       raise ValueError(F"backbone_type {self.backbone_type} not supported."  )







 @property
 def       UpperCAmelCase_       (      self  )    ->    List[str]:
    return self._out_features







 @out_features.setter
 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    Any:
    A_						,  A_  :		Union[str, Any]						=					get_aligned_output_features_output_indices(
        out_features=_lowerCamelCase					,    out_indices=_lowerCamelCase					,    stage_names=self.stage_names  )







 @property
 def       UpperCAmelCase_       (      self  )    ->    Any:
    return self._out_indices







 @out_indices.setter
 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    Union[str, Any]:
    A_						,  A_  :		List[str]						=					get_aligned_output_features_output_indices(
        out_features=_lowerCamelCase					,    out_indices=_lowerCamelCase					,    stage_names=self.stage_names  )







 @property
 def       UpperCAmelCase_       (      self  )    ->    Dict:
    # the current backbones will output the number of channels for each stage
    # even if that stage is not in the out_features list.
    return {stage: self.num_features[i] for i, stage in enumerate(self.stage_names  )}







 @property
 def       UpperCAmelCase_       (      self  )    ->    Any:
    return [self.out_feature_channels[name] for name in self.out_features]







 def       UpperCAmelCase_       (      self					,    *_lowerCamelCase					,    **_lowerCamelCase  )    ->    List[Any]:
    A_  :		Optional[int]						=					dict(inspect.signature(self.forward  ).parameters  )
    A_  :		str						=					{k: v for k, v in kwargs.items() if k in signature}
    return self(*_lowerCamelCase					,    **_lowerCamelCase  )







 def       UpperCAmelCase_       (      self					,    _lowerCamelCase					,    _lowerCamelCase = None					,    _lowerCamelCase = None					,    _lowerCamelCase = None					,    )    ->    List[Any]:
    raise NotImplementedError("""This method should be implemented by the derived class."""  )







 def       UpperCAmelCase_       (      self  )    ->    List[str]:
    A_  :		Optional[int]						=					super().to_dict()
    A_  :		Union[str, Any]						=					output.pop("""_out_features"""  )
    A_  :		int						=					output.pop("""_out_indices"""  )
    return output


class 							_lowerCAmelCase	:


 """simple docstring"""

 @property
 def       UpperCAmelCase_       (      self  )    ->    Union[str, Any]:
    return self._out_features







 @out_features.setter
 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    List[str]:
    A_						,  A_  :		List[str]						=					get_aligned_output_features_output_indices(
        out_features=_lowerCamelCase					,    out_indices=_lowerCamelCase					,    stage_names=self.stage_names  )







 @property
 def       UpperCAmelCase_       (      self  )    ->    List[Any]:
    return self._out_indices







 @out_indices.setter
 def       UpperCAmelCase_       (      self					,    _lowerCamelCase  )    ->    str:
    A_						,  A_  :		Union[str, Any]						=					get_aligned_output_features_output_indices(
        out_features=_lowerCamelCase					,    out_indices=_lowerCamelCase					,    stage_names=self.stage_names  )







 def       UpperCAmelCase_       (      self  )    ->    List[str]:
    A_  :		Optional[int]						=					super().to_dict()
    A_  :		Tuple						=					output.pop("""_out_features"""  )
    A_  :		Optional[Any]						=					output.pop("""_out_indices"""  )
    return output
