



'''simple docstring'''



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        UpperCAmelCase (    ):
							SCREAMING_SNAKE_CASE       :   Optional[Any]         =      '''https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png'''
							SCREAMING_SNAKE_CASE       :   str         =      Image.open(requests.get(A       ,		stream=A					).raw					).convert('''RGB'''					)

							return image
def        UpperCAmelCase (    A	:					List[str]					):
							SCREAMING_SNAKE_CASE       :   Tuple         =      []
							# 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        UpperCAmelCase (    A	:					Dict       ,		A	:					Tuple       ,		A	:					Tuple					):
							SCREAMING_SNAKE_CASE       :   Dict         =      dct.pop(A					)
							SCREAMING_SNAKE_CASE       :   Any         =      val
def        UpperCAmelCase (    A	:					Any       ,		A	:					Dict					):
							for i in range(config.vision_config.num_hidden_layers					):
														# read in original q and v biases
														SCREAMING_SNAKE_CASE       :   List[str]         =      state_dict.pop(F"""visual_encoder.blocks.{i}.attn.q_bias"""					)
														SCREAMING_SNAKE_CASE       :   Any         =      state_dict.pop(F"""visual_encoder.blocks.{i}.attn.v_bias"""					)

														# next, set bias in the state dict
														SCREAMING_SNAKE_CASE       :   Any         =      torch.cat((q_bias, torch.zeros_like(A       ,		requires_grad=A					), v_bias)					)
														SCREAMING_SNAKE_CASE       :   List[Any]         =      qkv_bias
def        UpperCAmelCase (    A	:					Optional[int]       ,		A	:					Any					):
							SCREAMING_SNAKE_CASE       :   str         =      364 if '''coco''' in model_name else 224
							SCREAMING_SNAKE_CASE       :   Any         =      BlipaVisionConfig(image_size=A					).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:
														SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      OPTConfig.from_pretrained('''facebook/opt-2.7b'''       ,		eos_token_id=A					).to_dict()
							elif "opt-6.7b" in model_name:
														SCREAMING_SNAKE_CASE       :   List[str]         =      OPTConfig.from_pretrained('''facebook/opt-6.7b'''       ,		eos_token_id=A					).to_dict()
							elif "t5-xl" in model_name:
														SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      TaConfig.from_pretrained('''google/flan-t5-xl'''       ,		dense_act_fn='''gelu'''       ,		bos_token_id=1					).to_dict()
							elif "t5-xxl" in model_name:
														SCREAMING_SNAKE_CASE       :   Optional[Any]         =      TaConfig.from_pretrained('''google/flan-t5-xxl'''       ,		dense_act_fn='''gelu'''       ,		bos_token_id=1					).to_dict()

							SCREAMING_SNAKE_CASE       :   List[Any]         =      BlipaConfig(vision_config=A       ,		text_config=A					)

							return config, image_size
@torch.no_grad()
def        UpperCAmelCase (    A	:					Optional[Any]       ,		A	:					Union[str, Any]=None       ,		A	:					Any=False					):
							SCREAMING_SNAKE_CASE       :   Optional[Any]         =      (
							    AutoTokenizer.from_pretrained('''facebook/opt-2.7b'''					)
							    if '''opt''' in model_name
							    else AutoTokenizer.from_pretrained('''google/flan-t5-xl'''					)
							)
							SCREAMING_SNAKE_CASE       :   Any         =      tokenizer('''\n'''       ,		add_special_tokens=A					).input_ids[0]
							SCREAMING_SNAKE_CASE       ,SCREAMING_SNAKE_CASE       :   Dict         =      get_blipa_config(A       ,		eos_token_id=A					)

							SCREAMING_SNAKE_CASE       :   Any         =      BlipaForConditionalGeneration(A					).eval()

							SCREAMING_SNAKE_CASE       :   Optional[int]         =      {
							    '''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'''),
							}

							SCREAMING_SNAKE_CASE       ,SCREAMING_SNAKE_CASE       :   List[str]         =      model_name_to_original[model_name]

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

							# update state dict keys
							SCREAMING_SNAKE_CASE       :   Any         =      original_model.state_dict()
							SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      create_rename_keys(A					)
							for src, dest in rename_keys:
														rename_key(A       ,		A       ,		A					)

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

							# read in qv biases
							read_in_q_v_bias(A       ,		A					)

							SCREAMING_SNAKE_CASE       ,SCREAMING_SNAKE_CASE       :   Tuple         =      hf_model.load_state_dict(A       ,		strict=A					)
							assert len(A					) == 0
							assert unexpected_keys == ["qformer.embeddings.position_ids"]

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

							# create processor
							SCREAMING_SNAKE_CASE       :   Tuple         =      BlipImageProcessor(
							    size={'''height''': image_size, '''width''': image_size}       ,		image_mean=A       ,		image_std=A					)
							SCREAMING_SNAKE_CASE       :   Optional[Any]         =      BlipaProcessor(image_processor=A       ,		tokenizer=A					)
							SCREAMING_SNAKE_CASE       :   Optional[Any]         =      processor(images=A       ,		return_tensors='''pt'''					).pixel_values.to(A					)

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

							original_model.to(A					)
							hf_model.to(A					)
							with torch.no_grad():
														if "opt" in model_name:
																					SCREAMING_SNAKE_CASE       :   Dict         =      original_model({'''image''': original_pixel_values, '''text_input''': ['''''']}					).logits
																					SCREAMING_SNAKE_CASE       :   Optional[int]         =      hf_model(A       ,		A					).logits
														else:
																					SCREAMING_SNAKE_CASE       :   Optional[Any]         =      original_model(
																					    {'''image''': original_pixel_values, '''text_input''': ['''\n'''], '''text_output''': ['''\n''']}					).logits
																					SCREAMING_SNAKE_CASE       :   str         =      input_ids.masked_fill(input_ids == tokenizer.pad_token_id       ,		-100					)
																					SCREAMING_SNAKE_CASE       :   Any         =      hf_model(A       ,		A       ,		labels=A					).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":
														SCREAMING_SNAKE_CASE       :   str         =      torch.tensor(
														    [[-41.5850, -4.4440, -8.9922], [-47.4322, -5.9143, -1.7340]]       ,		device=A					)
														assert torch.allclose(logits[0, :3, :3]       ,		A       ,		atol=1e-4					)
							elif model_name == "blip2-flan-t5-xl-coco":
														SCREAMING_SNAKE_CASE       :   Dict         =      torch.tensor(
														    [[-57.0109, -9.8967, -12.6280], [-68.6578, -12.7191, -10.5065]]       ,		device=A					)
							else:
														# cast to same type
														SCREAMING_SNAKE_CASE       :   str         =      logits.dtype
														assert torch.allclose(original_logits.to(A					)       ,		A       ,		atol=1e-2					)
							print('''Looks ok!'''					)

							print('''Generating a caption...'''					)
							SCREAMING_SNAKE_CASE       :   int         =      ''''''
							SCREAMING_SNAKE_CASE       :   List[Any]         =      tokenizer(A       ,		return_tensors='''pt'''					).input_ids.to(A					)

							SCREAMING_SNAKE_CASE       :   Tuple         =      original_model.generate({'''image''': original_pixel_values}					)
							SCREAMING_SNAKE_CASE       :   List[str]         =      hf_model.generate(
							    A       ,		A       ,		do_sample=A       ,		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:'''       ,		A					)
							SCREAMING_SNAKE_CASE       :   List[str]         =      input_ids.shape[1]
							SCREAMING_SNAKE_CASE       :   Dict         =      processor.batch_decode(outputs[:, prompt_length:]       ,		skip_special_tokens=A					)
							SCREAMING_SNAKE_CASE       :   Optional[Any]         =      [text.strip() for text in output_text]
							print('''HF generation:'''       ,		A					)

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

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


if __name__ == "__main__":
							lowerCAmelCase_  :							List[str]             =    argparse.ArgumentParser()
							lowerCAmelCase_  :							List[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',
							)

							lowerCAmelCase_  :							Union[str, Any]             =    parser.parse_args()

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









'''simple docstring'''



from queue import PriorityQueue
from typing import Any

import numpy as np
def        UpperCAmelCase (    A	:					dict       ,		A	:					str       ,		A	:					set       ,		A	:					set       ,		A	:					dict       ,		A	:					dict       ,		A	:					PriorityQueue       ,		A	:					dict       ,		A	:					float | int       ,		):
							for nxt, d in graph[v]:
														if nxt in visited_forward:
																					continue
														SCREAMING_SNAKE_CASE       :   str         =      cst_fwd.get(A       ,		np.inf					)
														SCREAMING_SNAKE_CASE       :   Optional[int]         =      cst_fwd[v] + d
														if new_cost_f < old_cost_f:
																					queue.put((new_cost_f, nxt)					)
																					SCREAMING_SNAKE_CASE       :   Tuple         =      new_cost_f
																					SCREAMING_SNAKE_CASE       :   List[str]         =      v
														if nxt in visited_backward:
																					if cst_fwd[v] + d + cst_bwd[nxt] < shortest_distance:
																												SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      cst_fwd[v] + d + cst_bwd[nxt]
							return shortest_distance
def        UpperCAmelCase (    A	:					str       ,		A	:					str       ,		A	:					dict       ,		A	:					dict					):
							SCREAMING_SNAKE_CASE       :   Dict         =      -1

							SCREAMING_SNAKE_CASE       :   Optional[int]         =      set()
							SCREAMING_SNAKE_CASE       :   Optional[Any]         =      set()
							SCREAMING_SNAKE_CASE       :   Any         =      {source: 0}
							SCREAMING_SNAKE_CASE       :   Tuple         =      {destination: 0}
							SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      {source: None}
							SCREAMING_SNAKE_CASE       :   Optional[int]         =      {destination: None}
							SCREAMING_SNAKE_CASE       :   PriorityQueue[Any]         =      PriorityQueue()
							SCREAMING_SNAKE_CASE       :   PriorityQueue[Any]         =      PriorityQueue()

							SCREAMING_SNAKE_CASE       :   List[str]         =      np.inf

							queue_forward.put((0, source)					)
							queue_backward.put((0, destination)					)

							if source == destination:
														return 0

							while not queue_forward.empty() and not queue_backward.empty():
														SCREAMING_SNAKE_CASE       ,SCREAMING_SNAKE_CASE       :   str         =      queue_forward.get()
														visited_forward.add(A					)

														SCREAMING_SNAKE_CASE       ,SCREAMING_SNAKE_CASE       :   int         =      queue_backward.get()
														visited_backward.add(A					)

														SCREAMING_SNAKE_CASE       :   Tuple         =      pass_and_relaxation(
														    A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		)

														SCREAMING_SNAKE_CASE       :   Optional[int]         =      pass_and_relaxation(
														    A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		A       ,		)

														if cst_fwd[v_fwd] + cst_bwd[v_bwd] >= shortest_distance:
																					break

							if shortest_distance != np.inf:
														SCREAMING_SNAKE_CASE       :   int         =      shortest_distance
							return shortest_path_distance


lowerCAmelCase_  :							int             =    {
    'B': [['C', 1]],
    'C': [['D', 1]],
    'D': [['F', 1]],
    'E': [['B', 1], ['G', 2]],
    'F': [],
    'G': [['F', 1]],
}
lowerCAmelCase_  :							str             =    {
    'B': [['E', 1]],
    'C': [['B', 1]],
    'D': [['C', 1]],
    'F': [['D', 1], ['G', 1]],
    'E': [[None, np.inf]],
    'G': [['E', 2]],
}

if __name__ == "__main__":
							import doctest

							doctest.testmod()




