


import argparse

import torch
from clip import load

from transformers import CLIPConfig, CLIPModel

def  lowerCAmelCase__				(    a__:	Optional[int]    ,						a__:	Dict )						->	str:


							'''simple docstring'''





							_UpperCAmelCase	, _UpperCAmelCase	, _UpperCAmelCase					=    pt_attn_layer.in_proj_weight.chunk(3    ,						dim=0 )
							_UpperCAmelCase	, _UpperCAmelCase	, _UpperCAmelCase					=    pt_attn_layer.in_proj_bias.chunk(3    ,						dim=0 )

							_UpperCAmelCase					=    pt_attn_layer.out_proj.weight
							_UpperCAmelCase					=    pt_attn_layer.out_proj.bias

							_UpperCAmelCase					=    q_proj
							_UpperCAmelCase					=    q_proj_bias

							_UpperCAmelCase					=    k_proj
							_UpperCAmelCase					=    k_proj_bias

							_UpperCAmelCase					=    v_proj
							_UpperCAmelCase					=    v_proj_bias

							_UpperCAmelCase					=    out_proj_weights
							_UpperCAmelCase					=    out_proj_bias

def  lowerCAmelCase__				(    a__:	Any    ,						a__:	Any )						->	Optional[int]:


							'''simple docstring'''





							copy_linear(hf_mlp.fca    ,						pt_mlp.c_fc )
							copy_linear(hf_mlp.fca    ,						pt_mlp.c_proj )

def  lowerCAmelCase__				(    a__:	int    ,						a__:	Optional[int] )						->	int:


							'''simple docstring'''





							_UpperCAmelCase					=    pt_linear.weight
							_UpperCAmelCase					=    pt_linear.bias

def  lowerCAmelCase__				(    a__:	Dict    ,						a__:	Dict )						->	str:


							'''simple docstring'''





							copy_linear(hf_layer.layer_norma    ,						pt_layer.ln_a )
							copy_linear(hf_layer.layer_norma    ,						pt_layer.ln_a )

							# copy MLP
							copy_mlp(hf_layer.mlp    ,						pt_layer.mlp )

							# copy attn
							copy_attn_layer(hf_layer.self_attn    ,						pt_layer.attn )

def  lowerCAmelCase__				(    a__:	str    ,						a__:	Dict )						->	List[str]:


							'''simple docstring'''





							for hf_layer, pt_layer in zip(a__    ,						a__ ):
														copy_layer(a__    ,						a__ )

def  lowerCAmelCase__				(    a__:	str    ,						a__:	Tuple )						->	int:


							'''simple docstring'''





							_UpperCAmelCase					=    pt_model.token_embedding.weight
							_UpperCAmelCase					=    pt_model.positional_embedding

							# copy layer norm
							copy_linear(hf_encoder.final_layer_norm    ,						pt_model.ln_final )

							# copy hidden layers
							copy_layers(hf_encoder.encoder.layers    ,						pt_model.transformer.resblocks )

def  lowerCAmelCase__				(    a__:	Tuple    ,						a__:	str )						->	Union[str, Any]:


							'''simple docstring'''





							_UpperCAmelCase					=    pt_model.text_projection.data.T

							# copy text encoder
							copy_encoder(hf_model.text_model    ,						a__ )

def  lowerCAmelCase__				(    a__:	Union[str, Any]    ,						a__:	int )						->	List[str]:


							'''simple docstring'''





							_UpperCAmelCase					=    pt_model.visual.proj.data.T

							# copy layer norms
							copy_linear(hf_model.vision_model.pre_layrnorm    ,						pt_model.visual.ln_pre )
							copy_linear(hf_model.vision_model.post_layernorm    ,						pt_model.visual.ln_post )

							# copy embeds
							_UpperCAmelCase					=    pt_model.visual.conva.weight.data
							_UpperCAmelCase					=    pt_model.visual.class_embedding
							_UpperCAmelCase					=    pt_model.visual.positional_embedding.data

							# copy encoder
							copy_layers(hf_model.vision_model.encoder.layers    ,						pt_model.visual.transformer.resblocks )

@torch.no_grad()
def  lowerCAmelCase__				(    a__:	Union[str, Any]    ,						a__:	str    ,						a__:	List[str]=None )						->	Union[str, Any]:


							'''simple docstring'''





							if config_path is not None:
														_UpperCAmelCase					=    CLIPConfig.from_pretrained(a__ )
							else:
														_UpperCAmelCase					=    CLIPConfig(projection_dim=5_1_2    ,						text_config={}    ,						vision_config={} )

							_UpperCAmelCase					=    CLIPModel(a__ ).eval()

							_UpperCAmelCase	, _UpperCAmelCase					=    load(a__    ,						device='cpu'    ,						jit=a__ )
							_UpperCAmelCase					=    pt_model.eval()

							copy_text_model_and_projection(a__    ,						a__ )
							copy_vison_model_and_projection(a__    ,						a__ )
							_UpperCAmelCase					=    pt_model.logit_scale

							_UpperCAmelCase					=    torch.arange(0    ,						7_7 ).unsqueeze(0 )
							_UpperCAmelCase					=    torch.randn(1    ,						3    ,						2_2_4    ,						2_2_4 )

							_UpperCAmelCase					=    hf_model(input_ids=a__    ,						pixel_values=a__    ,						return_dict=a__ )
							_UpperCAmelCase					=    hf_outputs.logits_per_image
							_UpperCAmelCase					=    hf_outputs.logits_per_text
							_UpperCAmelCase	, _UpperCAmelCase					=    pt_model(a__    ,						a__ )

							assert torch.allclose(a__    ,						a__    ,						atol=1e-3 )
							assert torch.allclose(a__    ,						a__    ,						atol=1e-3 )

							hf_model.save_pretrained(a__ )


if __name__ == "__main__":
		lowerCAmelCase__						:List[Any]         =							argparse.ArgumentParser()
		parser.add_argument('''--pytorch_dump_folder_path''', default=None, type=str, help='''Path to the output PyTorch model.''')
		parser.add_argument('''--checkpoint_path''', default=None, type=str, help='''Path to fairseq checkpoint''')
		parser.add_argument('''--config_path''', default=None, type=str, help='''Path to hf config.json of model to convert''')
		lowerCAmelCase__						:List[Any]         =							parser.parse_args()

		convert_clip_checkpoint(args.checkpoint_path, args.pytorch_dump_folder_path, args.config_path)




from __future__ import annotations

def  lowerCAmelCase__				(    a__:	list[int]    ,						a__:	int )						->	list[int]:


							'''simple docstring'''





							_UpperCAmelCase					=    {}
							for index, val in enumerate(a__ ):
														_UpperCAmelCase					=    target - val
														if compl in chk_map:
																					return [chk_map[compl], index]
														_UpperCAmelCase					=    index
							return []


if __name__ == "__main__":
		import doctest

		doctest.testmod()
		print(f'''{two_sum([2, 7, 1_1, 1_5], 9) = }''')
