





import argparse

import requests
import torch

# pip3 install salesforce-lavis
# I'm actually installing a slightly modified version: pip3 install git+https://github.com/nielsrogge/LAVIS.git@fix_lavis
from lavis.models import load_model_and_preprocess
from PIL import Image

from transformers import (
    AutoTokenizer,
    BlipaConfig,
    BlipaForConditionalGeneration,
    BlipaProcessor,
    BlipaVisionConfig,
    BlipImageProcessor,
    OPTConfig,
    TaConfig,
)
from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_CLIP_STD



def 	_a						(   )    ->    List[str]:







   """simple docstring"""
   lowerCamelCase__       :						Optional[int]        =							'''https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png'''
   lowerCamelCase__       :						Tuple        =							Image.open(requests.get(UpperCAmelCase      ,  stream=UpperCAmelCase					).raw					).convert('''RGB'''					)

   return image



def 	_a						(   UpperCAmelCase					)    ->    str:







   """simple docstring"""
   lowerCamelCase__       :						Dict        =							[]
   # fmt: off

   # vision encoder
   rename_keys.append(('''visual_encoder.cls_token''', '''vision_model.embeddings.class_embedding''')					)
   rename_keys.append(('''visual_encoder.pos_embed''', '''vision_model.embeddings.position_embedding''')					)
   rename_keys.append(('''visual_encoder.patch_embed.proj.weight''', '''vision_model.embeddings.patch_embedding.weight''')					)
   rename_keys.append(('''visual_encoder.patch_embed.proj.bias''', '''vision_model.embeddings.patch_embedding.bias''')					)
   rename_keys.append(('''ln_vision.weight''', '''vision_model.post_layernorm.weight''')					)
   rename_keys.append(('''ln_vision.bias''', '''vision_model.post_layernorm.bias''')					)

   for i in range(config.vision_config.num_hidden_layers					):
      rename_keys.append((f"visual_encoder.blocks.{i}.norm1.weight", f"vision_model.encoder.layers.{i}.layer_norm1.weight")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.norm1.bias", f"vision_model.encoder.layers.{i}.layer_norm1.bias")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.norm2.weight", f"vision_model.encoder.layers.{i}.layer_norm2.weight")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.norm2.bias", f"vision_model.encoder.layers.{i}.layer_norm2.bias")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.attn.qkv.weight", f"vision_model.encoder.layers.{i}.self_attn.qkv.weight")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.attn.proj.weight", f"vision_model.encoder.layers.{i}.self_attn.projection.weight",)					)
      rename_keys.append((f"visual_encoder.blocks.{i}.attn.proj.bias", f"vision_model.encoder.layers.{i}.self_attn.projection.bias")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc1.weight", f"vision_model.encoder.layers.{i}.mlp.fc1.weight")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc1.bias", f"vision_model.encoder.layers.{i}.mlp.fc1.bias")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc2.weight", f"vision_model.encoder.layers.{i}.mlp.fc2.weight")					)
      rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc2.bias", f"vision_model.encoder.layers.{i}.mlp.fc2.bias")					)

   # QFormer
   rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.weight''', '''qformer.layernorm.weight''')					)
   rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.bias''', '''qformer.layernorm.bias''')					)

   # fmt: on
   return rename_keys



def 	_a						(   UpperCAmelCase      ,  UpperCAmelCase      ,  UpperCAmelCase					)    ->    Union[str, Any]:







   """simple docstring"""
   lowerCamelCase__       :						List[Any]        =							dct.pop(UpperCAmelCase					)
   lowerCamelCase__       :						Dict        =							val



def 	_a						(   UpperCAmelCase      ,  UpperCAmelCase					)    ->    List[Any]:







   """simple docstring"""
   for i in range(config.vision_config.num_hidden_layers					):
      # read in original q and v biases
      lowerCamelCase__       :						Optional[int]        =							state_dict.pop(f"visual_encoder.blocks.{i}.attn.q_bias"					)
      lowerCamelCase__       :						Dict        =							state_dict.pop(f"visual_encoder.blocks.{i}.attn.v_bias"					)

      # next, set bias in the state dict
      lowerCamelCase__       :						List[Any]        =							torch.cat((q_bias, torch.zeros_like(UpperCAmelCase      ,  requires_grad=UpperCAmelCase					), v_bias)					)
      lowerCamelCase__       :						int        =							qkv_bias



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







   """simple docstring"""
   lowerCamelCase__       :						Optional[int]        =							364 if '''coco''' in model_name else 224
   lowerCamelCase__       :						Optional[int]        =							BlipaVisionConfig(image_size=UpperCAmelCase					).to_dict()

   # make sure the models have proper bos_token_id and eos_token_id set (important for generation)
   # seems like flan-T5 models don't have bos_token_id properly set?
   if "opt-2.7b" in model_name:
      lowerCamelCase__       :						Union[str, Any]        =							OPTConfig.from_pretrained('''facebook/opt-2.7b'''      ,  eos_token_id=UpperCAmelCase					).to_dict()
   elif "opt-6.7b" in model_name:
      lowerCamelCase__       :						Any        =							OPTConfig.from_pretrained('''facebook/opt-6.7b'''      ,  eos_token_id=UpperCAmelCase					).to_dict()
   elif "t5-xl" in model_name:
      lowerCamelCase__       :						List[str]        =							TaConfig.from_pretrained('''google/flan-t5-xl'''      ,  dense_act_fn='''gelu'''      ,  bos_token_id=1					).to_dict()
   elif "t5-xxl" in model_name:
      lowerCamelCase__       :						Union[str, Any]        =							TaConfig.from_pretrained('''google/flan-t5-xxl'''      ,  dense_act_fn='''gelu'''      ,  bos_token_id=1					).to_dict()

   lowerCamelCase__       :						str        =							BlipaConfig(vision_config=UpperCAmelCase      ,  text_config=UpperCAmelCase					)

   return config, image_size



@torch.no_grad()
def 	_a						(   UpperCAmelCase      ,  UpperCAmelCase=None      ,  UpperCAmelCase=False					)    ->    Dict:







   """simple docstring"""
   lowerCamelCase__       :						List[str]        =							(
       AutoTokenizer.from_pretrained('''facebook/opt-2.7b'''					)
       if '''opt''' in model_name
       else AutoTokenizer.from_pretrained('''google/flan-t5-xl'''					)
   )
   lowerCamelCase__       :						Union[str, Any]        =							tokenizer('''\n'''      ,  add_special_tokens=UpperCAmelCase					).input_ids[0]
   lowerCamelCase__       ,							lowerCamelCase__       :						int        =							get_blipa_config(UpperCAmelCase      ,  eos_token_id=UpperCAmelCase					)

   lowerCamelCase__       :						Tuple        =							BlipaForConditionalGeneration(UpperCAmelCase					).eval()

   lowerCamelCase__       :						Tuple        =							{
       '''blip2-opt-2.7b''': ('''blip2_opt''', '''pretrain_opt2.7b'''),
       '''blip2-opt-6.7b''': ('''blip2_opt''', '''pretrain_opt6.7b'''),
       '''blip2-opt-2.7b-coco''': ('''blip2_opt''', '''caption_coco_opt2.7b'''),
       '''blip2-opt-6.7b-coco''': ('''blip2_opt''', '''caption_coco_opt6.7b'''),
       '''blip2-flan-t5-xl''': ('''blip2_t5''', '''pretrain_flant5xl'''),
       '''blip2-flan-t5-xl-coco''': ('''blip2_t5''', '''caption_coco_flant5xl'''),
       '''blip2-flan-t5-xxl''': ('''blip2_t5''', '''pretrain_flant5xxl'''),
   }

   lowerCamelCase__       ,							lowerCamelCase__       :						List[Any]        =							model_name_to_original[model_name]

   # load original model
   print('''Loading original model...'''					)
   lowerCamelCase__       :						Optional[int]        =							'''cuda''' if torch.cuda.is_available() else '''cpu'''
   lowerCamelCase__       ,							lowerCamelCase__       ,							lowerCamelCase__       :						Dict        =							load_model_and_preprocess(
       name=UpperCAmelCase      ,  model_type=UpperCAmelCase      ,  is_eval=UpperCAmelCase      ,  device=UpperCAmelCase					)
   original_model.eval()
   print('''Done!'''					)

   # update state dict keys
   lowerCamelCase__       :						List[str]        =							original_model.state_dict()
   lowerCamelCase__       :						Optional[int]        =							create_rename_keys(UpperCAmelCase					)
   for src, dest in rename_keys:
      rename_key(UpperCAmelCase      ,  UpperCAmelCase      ,  UpperCAmelCase					)

   # some keys can be renamed efficiently
   for key, val in state_dict.copy().items():
      lowerCamelCase__       :						Dict        =							state_dict.pop(UpperCAmelCase					)
      if key.startswith('''Qformer.bert'''					):
         lowerCamelCase__       :						Dict        =							key.replace('''Qformer.bert'''      ,  '''qformer'''					)
      if "attention.self" in key:
         lowerCamelCase__       :						List[str]        =							key.replace('''self'''      ,  '''attention'''					)
      if "opt_proj" in key:
         lowerCamelCase__       :						Union[str, Any]        =							key.replace('''opt_proj'''      ,  '''language_projection'''					)
      if "t5_proj" in key:
         lowerCamelCase__       :						int        =							key.replace('''t5_proj'''      ,  '''language_projection'''					)
      if key.startswith('''opt'''					):
         lowerCamelCase__       :						Optional[int]        =							key.replace('''opt'''      ,  '''language'''					)
      if key.startswith('''t5'''					):
         lowerCamelCase__       :						Tuple        =							key.replace('''t5'''      ,  '''language'''					)
      lowerCamelCase__       :						Optional[int]        =							val

   # read in qv biases
   read_in_q_v_bias(UpperCAmelCase      ,  UpperCAmelCase					)

   lowerCamelCase__       ,							lowerCamelCase__       :						Dict        =							hf_model.load_state_dict(UpperCAmelCase      ,  strict=UpperCAmelCase					)
   assert len(UpperCAmelCase					) == 0
   assert unexpected_keys == ["qformer.embeddings.position_ids"]

   lowerCamelCase__       :						Optional[int]        =							load_demo_image()
   lowerCamelCase__       :						Optional[int]        =							vis_processors['''eval'''](UpperCAmelCase					).unsqueeze(0					).to(UpperCAmelCase					)
   lowerCamelCase__       :						Union[str, Any]        =							tokenizer(['''\n''']      ,  return_tensors='''pt'''					).input_ids.to(UpperCAmelCase					)

   # create processor
   lowerCamelCase__       :						Any        =							BlipImageProcessor(
       size={'''height''': image_size, '''width''': image_size}      ,  image_mean=UpperCAmelCase      ,  image_std=UpperCAmelCase					)
   lowerCamelCase__       :						str        =							BlipaProcessor(image_processor=UpperCAmelCase      ,  tokenizer=UpperCAmelCase					)
   lowerCamelCase__       :						List[str]        =							processor(images=UpperCAmelCase      ,  return_tensors='''pt'''					).pixel_values.to(UpperCAmelCase					)

   # make sure processor creates exact same pixel values
   assert torch.allclose(UpperCAmelCase      ,  UpperCAmelCase					)

   original_model.to(UpperCAmelCase					)
   hf_model.to(UpperCAmelCase					)
   with torch.no_grad():
      if "opt" in model_name:
         lowerCamelCase__       :						str        =							original_model({'''image''': original_pixel_values, '''text_input''': ['''''']}					).logits
         lowerCamelCase__       :						Optional[Any]        =							hf_model(UpperCAmelCase      ,  UpperCAmelCase					).logits
      else:
         lowerCamelCase__       :						Union[str, Any]        =							original_model(
             {'''image''': original_pixel_values, '''text_input''': ['''\n'''], '''text_output''': ['''\n''']}					).logits
         lowerCamelCase__       :						int        =							input_ids.masked_fill(input_ids == tokenizer.pad_token_id      ,  -100					)
         lowerCamelCase__       :						Optional[Any]        =							hf_model(UpperCAmelCase      ,  UpperCAmelCase      ,  labels=UpperCAmelCase					).logits

   assert original_logits.shape == logits.shape
   print('''First values of original logits:'''      ,  original_logits[0, :3, :3]					)
   print('''First values of HF logits:'''      ,  logits[0, :3, :3]					)

   # assert values
   if model_name == "blip2-flan-t5-xl":
      lowerCamelCase__       :						Optional[int]        =							torch.tensor(
          [[-41.58_50, -4.44_40, -8.99_22], [-47.43_22, -5.91_43, -1.73_40]]      ,  device=UpperCAmelCase					)
      assert torch.allclose(logits[0, :3, :3]      ,  UpperCAmelCase      ,  atol=1E-4					)
   elif model_name == "blip2-flan-t5-xl-coco":
      lowerCamelCase__       :						Union[str, Any]        =							torch.tensor(
          [[-57.01_09, -9.89_67, -12.62_80], [-68.65_78, -12.71_91, -10.50_65]]      ,  device=UpperCAmelCase					)
   else:
      # cast to same type
      lowerCamelCase__       :						List[Any]        =							logits.dtype
      assert torch.allclose(original_logits.to(UpperCAmelCase					)      ,  UpperCAmelCase      ,  atol=1E-2					)
   print('''Looks ok!'''					)

   print('''Generating a caption...'''					)
   lowerCamelCase__       :						Optional[int]        =							''''''
   lowerCamelCase__       :						int        =							tokenizer(UpperCAmelCase      ,  return_tensors='''pt'''					).input_ids.to(UpperCAmelCase					)

   lowerCamelCase__       :						str        =							original_model.generate({'''image''': original_pixel_values}					)
   lowerCamelCase__       :						Optional[Any]        =							hf_model.generate(
       UpperCAmelCase      ,  UpperCAmelCase      ,  do_sample=UpperCAmelCase      ,  num_beams=5      ,  max_length=30      ,  min_length=1      ,  top_p=0.9      ,  repetition_penalty=1.0      ,  length_penalty=1.0      ,  temperature=1      ,  )
   print('''Original generation:'''      ,  UpperCAmelCase					)
   lowerCamelCase__       :						Optional[Any]        =							input_ids.shape[1]
   lowerCamelCase__       :						Optional[Any]        =							processor.batch_decode(outputs[:, prompt_length:]      ,  skip_special_tokens=UpperCAmelCase					)
   lowerCamelCase__       :						str        =							[text.strip() for text in output_text]
   print('''HF generation:'''      ,  UpperCAmelCase					)

   if pytorch_dump_folder_path is not None:
      processor.save_pretrained(UpperCAmelCase					)
      hf_model.save_pretrained(UpperCAmelCase					)

   if push_to_hub:
      processor.push_to_hub(f"nielsr/{model_name}"					)
      hf_model.push_to_hub(f"nielsr/{model_name}"					)


if __name__ == "__main__":
       _A :   Tuple  			=  argparse.ArgumentParser()
       _A :   Any  			=  [
           'blip2-opt-2.7b',
           'blip2-opt-6.7b',
           'blip2-opt-2.7b-coco',
           'blip2-opt-6.7b-coco',
           'blip2-flan-t5-xl',
           'blip2-flan-t5-xl-coco',
           'blip2-flan-t5-xxl',
       ]
       parser.add_argument(
           '--model_name',
           default='blip2-opt-2.7b',
           choices=choices,
           type=str,
           help='Path to hf config.json of model to convert',
       )
       parser.add_argument('--pytorch_dump_folder_path', default=None, type=str, help='Path to the output PyTorch model.')
       parser.add_argument(
           '--push_to_hub',
           action='store_true',
           help='Whether to push the model and processor to the hub after converting',
       )

       _A :   str  			=  parser.parse_args()

       convert_blipa_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)










import math
import random



def 	_a						(   UpperCAmelCase      ,  UpperCAmelCase = False					)    ->    float:







   """simple docstring"""
   if deriv:
      return value * (1 - value)
   return 1 / (1 + math.exp(-value					))


# Initial Value
_A :   Tuple  			=  0.02



def 	_a						(   UpperCAmelCase      ,  UpperCAmelCase					)    ->    float:







   """simple docstring"""
   lowerCamelCase__       :						List[Any]        =							float(2 * (random.randint(1      ,  100					)) - 1					)

   for _ in range(UpperCAmelCase					):
      # Forward propagation
      lowerCamelCase__       :						Optional[int]        =							sigmoid_function(INITIAL_VALUE * weight					)
      # How much did we miss?
      lowerCamelCase__       :						int        =							(expected / 100) - layer_a
      # Error delta
      lowerCamelCase__       :						Union[str, Any]        =							layer_1_error * sigmoid_function(UpperCAmelCase      ,  UpperCAmelCase					)
      # Update weight
      weight += INITIAL_VALUE * layer_1_delta

   return layer_a * 100


if __name__ == "__main__":
       import doctest

       doctest.testmod()

       _A :   Union[str, Any]  			=  int(input('Expected value: '))
       _A :   int  			=  int(input('Number of propagations: '))
       print(forward_propagation(expected, number_propagations))



