




import warnings

from ...processing_utils import ProcessorMixin
from ...tokenization_utils_base import BatchEncoding




class 		UpperCamelCase__	(lowerCAmelCase__     ):

    '''simple docstring'''



    lowerCamelCase_      :	Optional[int]	     =      ["""image_processor""", """tokenizer"""]
    lowerCamelCase_      :	Tuple	     =      """ViTImageProcessor"""
    lowerCamelCase_      :	str	     =      ("""CLIPTokenizer""", """CLIPTokenizerFast""")







    def __init__(    self     ,  UpperCamelCase__=None     ,  UpperCamelCase__=None     ,  **UpperCamelCase__     )     ->      int:
           lowerCamelCase   :      List[Any]			 =					None
           if "feature_extractor" in kwargs:
                  warnings.warn(
                      "The `feature_extractor` argument is deprecated and will be removed in v5, use `image_processor`"
                      " instead."     ,  UpperCamelCase__     ,  )
                  lowerCamelCase   :      Any			 =					kwargs.pop("feature_extractor"     )

           lowerCamelCase   :      Dict			 =					image_processor if image_processor is not None else feature_extractor
           if image_processor is None:
                  raise ValueError("You need to specify an `image_processor`."     )
           if tokenizer is None:
                  raise ValueError("You need to specify a `tokenizer`."     )

           super().__init__(UpperCamelCase__     ,  UpperCamelCase__     )







    def __call__(    self     ,  UpperCamelCase__=None     ,  UpperCamelCase__=None     ,  UpperCamelCase__=None     ,  UpperCamelCase__=None     ,  **UpperCamelCase__     )     ->      Union[str, Any]:
           if text is None and visual_prompt is None and images is None:
                  raise ValueError("You have to specify either text, visual prompt or images."     )

           if text is not None and visual_prompt is not None:
                  raise ValueError("You have to specify exactly one type of prompt. Either text or visual prompt."     )

           if text is not None:
                  lowerCamelCase   :      Any			 =					self.tokenizer(UpperCamelCase__     ,  return_tensors=UpperCamelCase__     ,  **UpperCamelCase__     )

           if visual_prompt is not None:
                  lowerCamelCase   :      List[Any]			 =					self.image_processor(UpperCamelCase__     ,  return_tensors=UpperCamelCase__     ,  **UpperCamelCase__     )

           if images is not None:
                  lowerCamelCase   :      Tuple			 =					self.image_processor(UpperCamelCase__     ,  return_tensors=UpperCamelCase__     ,  **UpperCamelCase__     )

           if visual_prompt is not None and images is not None:
                  lowerCamelCase   :      Optional[Any]			 =					{
                      "pixel_values": image_features.pixel_values,
                      "conditional_pixel_values": prompt_features.pixel_values,
                  }
                  return encoding
           elif text is not None and images is not None:
                  lowerCamelCase   :      int			 =					image_features.pixel_values
                  return encoding
           elif text is not None:
                  return encoding
           elif visual_prompt is not None:
                  lowerCamelCase   :      Tuple			 =					{
                      "conditional_pixel_values": prompt_features.pixel_values,
                  }
                  return encoding
           else:
                  return BatchEncoding(data=dict(**UpperCamelCase__     )     ,  tensor_type=UpperCamelCase__     )







    def     _lowercase     (    self     ,  *UpperCamelCase__     ,  **UpperCamelCase__     )     ->      List[Any]:
           return self.tokenizer.batch_decode(*UpperCamelCase__     ,  **UpperCamelCase__     )







    def     _lowercase     (    self     ,  *UpperCamelCase__     ,  **UpperCamelCase__     )     ->      int:
           return self.tokenizer.decode(*UpperCamelCase__     ,  **UpperCamelCase__     )







    @property
    def     _lowercase     (    self     )     ->      Dict:
           warnings.warn(
               "`feature_extractor_class` is deprecated and will be removed in v5. Use `image_processor_class` instead."     ,  UpperCamelCase__     ,  )
           return self.image_processor_class







    @property
    def     _lowercase     (    self     )     ->      str:
           warnings.warn(
               "`feature_extractor` is deprecated and will be removed in v5. Use `image_processor` instead."     ,  UpperCamelCase__     ,  )
           return self.image_processor












import copy
import os
from typing import Union

from ...configuration_utils import PretrainedConfig
from ...models.auto.modeling_auto import MODEL_FOR_CAUSAL_LM_MAPPING_NAMES
from ...utils import logging
from ..auto import CONFIG_MAPPING


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

SCREAMING_SNAKE_CASE__       :      Dict  =   {
    'salesforce/blip2-opt-2.7b': 'https://huggingface.co/salesforce/blip2-opt-2.7b/resolve/main/config.json',
}




class 		UpperCamelCase__	(lowerCAmelCase__     ):

    '''simple docstring'''



    lowerCamelCase_      :	Union[str, Any]	     =      """blip_2_vision_model"""







    def __init__(    self     ,  UpperCamelCase__=1408     ,  UpperCamelCase__=6144     ,  UpperCamelCase__=39     ,  UpperCamelCase__=16     ,  UpperCamelCase__=224     ,  UpperCamelCase__=14     ,  UpperCamelCase__="gelu"     ,  UpperCamelCase__=0.00001     ,  UpperCamelCase__=0.0     ,  UpperCamelCase__=1e-10     ,  UpperCamelCase__=True     ,  **UpperCamelCase__     ,  )     ->      Optional[Any]:
           super().__init__(**UpperCamelCase__     )

           lowerCamelCase   :      Dict			 =					hidden_size
           lowerCamelCase   :      Union[str, Any]			 =					intermediate_size
           lowerCamelCase   :      List[str]			 =					num_hidden_layers
           lowerCamelCase   :      List[str]			 =					num_attention_heads
           lowerCamelCase   :      Dict			 =					patch_size
           lowerCamelCase   :      Tuple			 =					image_size
           lowerCamelCase   :      Dict			 =					initializer_range
           lowerCamelCase   :      Union[str, Any]			 =					attention_dropout
           lowerCamelCase   :      Dict			 =					layer_norm_eps
           lowerCamelCase   :      Optional[Any]			 =					hidden_act
           lowerCamelCase   :      str			 =					qkv_bias







    @classmethod
    def     _lowercase     (    cls     ,  UpperCamelCase__     ,  **UpperCamelCase__     )     ->      "PretrainedConfig":
           cls._set_token_in_kwargs(UpperCamelCase__     )

           lowerCamelCase ,      lowerCamelCase   :      List[str]			 =					cls.get_config_dict(UpperCamelCase__     ,  **UpperCamelCase__     )

           # get the vision config dict if we are loading from Blip2Config
           if config_dict.get("model_type"     ) == "blip-2":
                  lowerCamelCase   :      Optional[int]			 =					config_dict["vision_config"]

           if "model_type" in config_dict and hasattr(cls     ,  "model_type"     ) and config_dict["model_type"] != cls.model_type:
                  logger.warning(
                      F'''You are using a model of type {config_dict["model_type"]} to instantiate a model of type '''
                      F'''{cls.model_type}. This is not supported for all configurations of models and can yield errors.'''     )

           return cls.from_dict(UpperCamelCase__     ,  **UpperCamelCase__     )




class 		UpperCamelCase__	(lowerCAmelCase__     ):

    '''simple docstring'''



    lowerCamelCase_      :	Dict	     =      """blip_2_qformer"""







    def __init__(    self     ,  UpperCamelCase__=3_0522     ,  UpperCamelCase__=768     ,  UpperCamelCase__=12     ,  UpperCamelCase__=12     ,  UpperCamelCase__=3072     ,  UpperCamelCase__="gelu"     ,  UpperCamelCase__=0.1     ,  UpperCamelCase__=0.1     ,  UpperCamelCase__=512     ,  UpperCamelCase__=0.02     ,  UpperCamelCase__=1e-12     ,  UpperCamelCase__=0     ,  UpperCamelCase__="absolute"     ,  UpperCamelCase__=2     ,  UpperCamelCase__=1408     ,  **UpperCamelCase__     ,  )     ->      int:
           super().__init__(pad_token_id=UpperCamelCase__     ,  **UpperCamelCase__     )

           lowerCamelCase   :      Optional[int]			 =					vocab_size
           lowerCamelCase   :      int			 =					hidden_size
           lowerCamelCase   :      Dict			 =					num_hidden_layers
           lowerCamelCase   :      Union[str, Any]			 =					num_attention_heads
           lowerCamelCase   :      int			 =					hidden_act
           lowerCamelCase   :      Optional[Any]			 =					intermediate_size
           lowerCamelCase   :      Dict			 =					hidden_dropout_prob
           lowerCamelCase   :      Dict			 =					attention_probs_dropout_prob
           lowerCamelCase   :      Dict			 =					max_position_embeddings
           lowerCamelCase   :      List[str]			 =					initializer_range
           lowerCamelCase   :      List[str]			 =					layer_norm_eps
           lowerCamelCase   :      int			 =					position_embedding_type
           lowerCamelCase   :      Tuple			 =					cross_attention_frequency
           lowerCamelCase   :      Optional[int]			 =					encoder_hidden_size







    @classmethod
    def     _lowercase     (    cls     ,  UpperCamelCase__     ,  **UpperCamelCase__     )     ->      "PretrainedConfig":
           cls._set_token_in_kwargs(UpperCamelCase__     )

           lowerCamelCase ,      lowerCamelCase   :      str			 =					cls.get_config_dict(UpperCamelCase__     ,  **UpperCamelCase__     )

           # get the qformer config dict if we are loading from Blip2Config
           if config_dict.get("model_type"     ) == "blip-2":
                  lowerCamelCase   :      int			 =					config_dict["qformer_config"]

           if "model_type" in config_dict and hasattr(cls     ,  "model_type"     ) and config_dict["model_type"] != cls.model_type:
                  logger.warning(
                      F'''You are using a model of type {config_dict["model_type"]} to instantiate a model of type '''
                      F'''{cls.model_type}. This is not supported for all configurations of models and can yield errors.'''     )

           return cls.from_dict(UpperCamelCase__     ,  **UpperCamelCase__     )




class 		UpperCamelCase__	(lowerCAmelCase__     ):

    '''simple docstring'''



    lowerCamelCase_      :	List[str]	     =      """blip-2"""
    lowerCamelCase_      :	int	     =      True







    def __init__(    self     ,  UpperCamelCase__=None     ,  UpperCamelCase__=None     ,  UpperCamelCase__=None     ,  UpperCamelCase__=32     ,  **UpperCamelCase__     )     ->      str:
           super().__init__(**UpperCamelCase__     )

           if vision_config is None:
                  lowerCamelCase   :      List[Any]			 =					{}
                  logger.info("vision_config is None. initializing the Blip2VisionConfig with default values."     )

           if qformer_config is None:
                  lowerCamelCase   :      List[Any]			 =					{}
                  logger.info("qformer_config is None. Initializing the Blip2QFormerConfig with default values."     )

           if text_config is None:
                  lowerCamelCase   :      Any			 =					{}
                  logger.info("text_config is None. Initializing the text config with default values (`OPTConfig`)."     )

           lowerCamelCase   :      Optional[int]			 =					BlipaVisionConfig(**UpperCamelCase__     )
           lowerCamelCase   :      str			 =					BlipaQFormerConfig(**UpperCamelCase__     )
           lowerCamelCase   :      List[str]			 =					text_config["model_type"] if "model_type" in text_config else "opt"
           lowerCamelCase   :      str			 =					CONFIG_MAPPING[text_model_type](**UpperCamelCase__     )

           lowerCamelCase   :      Optional[Any]			 =					self.text_config.tie_word_embeddings
           lowerCamelCase   :      int			 =					self.text_config.is_encoder_decoder

           lowerCamelCase   :      Optional[Any]			 =					num_query_tokens
           lowerCamelCase   :      int			 =					self.vision_config.hidden_size
           lowerCamelCase   :      Tuple			 =					self.text_config.model_type in MODEL_FOR_CAUSAL_LM_MAPPING_NAMES
           lowerCamelCase   :      Dict			 =					1.0
           lowerCamelCase   :      List[Any]			 =					0.02







    @classmethod
    def     _lowercase     (    cls     ,  UpperCamelCase__     ,  UpperCamelCase__     ,  UpperCamelCase__     ,  **UpperCamelCase__     ,  )     ->      str:
           return cls(
               vision_config=vision_config.to_dict()     ,  qformer_config=qformer_config.to_dict()     ,  text_config=text_config.to_dict()     ,  **UpperCamelCase__     ,  )







    def     _lowercase     (    self     )     ->      Optional[Any]:
           lowerCamelCase   :      Tuple			 =					copy.deepcopy(self.__dict__     )
           lowerCamelCase   :      Tuple			 =					self.vision_config.to_dict()
           lowerCamelCase   :      int			 =					self.qformer_config.to_dict()
           lowerCamelCase   :      Optional[Any]			 =					self.text_config.to_dict()
           lowerCamelCase   :      int			 =					self.__class__.model_type
           return output






