'''simple docstring'''


import argparse
import hashlib
import os
import urllib
import warnings

import torch
from torch import nn
from tqdm import tqdm

from transformers import WhisperConfig, WhisperForConditionalGeneration


UpperCAmelCase_ 		=      {
    "tiny.en": "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt",
    "tiny": "https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt",
    "base.en": "https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt",
    "base": "https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt",
    "small.en": "https://openaipublic.azureedge.net/main/whisper/models/f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872/small.en.pt",
    "small": "https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt",
    "medium.en": "https://openaipublic.azureedge.net/main/whisper/models/d7440d1dc186f76616474e0ff0b3b6b879abc9d1a4926b7adfa41db2d497ab4f/medium.en.pt",
    "medium": "https://openaipublic.azureedge.net/main/whisper/models/345ae4da62f9b3d59415adc60127b97c714f32e89e936602e85993674d08dcb1/medium.pt",
    "large": "https://openaipublic.azureedge.net/main/whisper/models/e4b87e7e0bf463eb8e6956e646f1e277e901512310def2c24bf0e11bd3c28e9a/large.pt",
    "large-v2": "https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt",
}


def 						SCREAMING_SNAKE_CASE       (      a_	:							int			):
  __a			=					['layers', 'blocks']
  for k in ignore_keys:
    state_dict.pop(a_				,					a_			)


UpperCAmelCase_ 		=      {
    "blocks": "layers",
    "mlp.0": "fc1",
    "mlp.2": "fc2",
    "mlp_ln": "final_layer_norm",
    ".attn.query": ".self_attn.q_proj",
    ".attn.key": ".self_attn.k_proj",
    ".attn.value": ".self_attn.v_proj",
    ".attn_ln": ".self_attn_layer_norm",
    ".attn.out": ".self_attn.out_proj",
    ".cross_attn.query": ".encoder_attn.q_proj",
    ".cross_attn.key": ".encoder_attn.k_proj",
    ".cross_attn.value": ".encoder_attn.v_proj",
    ".cross_attn_ln": ".encoder_attn_layer_norm",
    ".cross_attn.out": ".encoder_attn.out_proj",
    "decoder.ln.": "decoder.layer_norm.",
    "encoder.ln.": "encoder.layer_norm.",
    "token_embedding": "embed_tokens",
    "encoder.positional_embedding": "encoder.embed_positions.weight",
    "decoder.positional_embedding": "decoder.embed_positions.weight",
    "ln_post": "layer_norm",
}


def 						SCREAMING_SNAKE_CASE       (      a_	:							int			):
  __a			=					list(s_dict.keys()			)
  for key in keys:
    __a			=					key
    for k, v in WHISPER_MAPPING.items():
      if k in key:
        __a			=					new_key.replace(a_				,					a_			)

    print(f"{key} -> {new_key}"			)

    __a			=					s_dict.pop(a_			)
  return s_dict


def 						SCREAMING_SNAKE_CASE       (      a_	:							Optional[int]			):
  __a	,       __a			=					emb.weight.shape
  __a			=					nn.Linear(a_				,					a_				,					bias=a_			)
  __a			=					emb.weight.data
  return lin_layer


def 						SCREAMING_SNAKE_CASE       (      a_	:							str				,					a_	:							str			):
  os.makedirs(a_				,					exist_ok=a_			)
  __a			=					os.path.basename(a_			)

  __a			=					url.split('/'			)[-2]
  __a			=					os.path.join(a_				,					a_			)

  if os.path.exists(a_			) and not os.path.isfile(a_			):
    raise RuntimeError(f"{download_target} exists and is not a regular file"			)

  if os.path.isfile(a_			):
    __a			=					open(a_				,					'rb'			).read()
    if hashlib.shaaaa(a_			).hexdigest() == expected_shaaaa:
      return model_bytes
    else:
      warnings.warn(f"{download_target} exists, but the SHA256 checksum does not match; re-downloading the file"			)

  with urllib.request.urlopen(a_			) as source, open(a_				,					'wb'			) as output:
    with tqdm(
        total=int(source.info().get('Content-Length'			)			)				,					ncols=80				,					unit='iB'				,					unit_scale=a_				,					unit_divisor=1024			) as loop:
      while True:
        __a			=					source.read(8192			)
        if not buffer:
          break

        output.write(a_			)
        loop.update(len(a_			)			)

  __a			=					open(a_				,					'rb'			).read()
  if hashlib.shaaaa(a_			).hexdigest() != expected_shaaaa:
    raise RuntimeError(
        'Model has been downloaded but the SHA256 checksum does not not match. Please retry loading the model.'			)

  return model_bytes


def 						SCREAMING_SNAKE_CASE       (      a_	:							Optional[Any]				,					a_	:							Union[str, Any]			):
  if ".pt" not in checkpoint_path:
    __a			=					_download(_MODELS[checkpoint_path]			)
  else:
    __a			=					torch.load(a_				,					map_location='cpu'			)
  __a			=					original_checkpoint['dims']
  __a			=					original_checkpoint['model_state_dict']
  __a			=					state_dict['decoder.token_embedding.weight']
  remove_ignore_keys_(a_			)
  rename_keys(a_			)
  __a			=					True
  __a			=					state_dict['decoder.layers.0.fc1.weight'].shape[0]

  __a			=					WhisperConfig(
      vocab_size=dimensions['n_vocab']				,					encoder_ffn_dim=a_				,					decoder_ffn_dim=a_				,					num_mel_bins=dimensions['n_mels']				,					d_model=dimensions['n_audio_state']				,					max_target_positions=dimensions['n_text_ctx']				,					encoder_layers=dimensions['n_audio_layer']				,					encoder_attention_heads=dimensions['n_audio_head']				,					decoder_layers=dimensions['n_text_layer']				,					decoder_attention_heads=dimensions['n_text_state']				,					max_source_positions=dimensions['n_audio_ctx']				,					)

  __a			=					WhisperForConditionalGeneration(a_			)
  __a	,       __a			=					model.model.load_state_dict(a_				,					strict=a_			)
  if len(a_			) > 0 and not set(a_			) <= {
      "encoder.embed_positions.weights",
      "decoder.embed_positions.weights",
  }:
    raise ValueError(
        'Only `encoder.embed_positions.weights` and `decoder.embed_positions.weights`  are allowed to be missing,'
        f" but all the following weights are missing {missing}"			)

  if tie_embeds:
    __a			=					make_linear_from_emb(model.model.decoder.embed_tokens			)
  else:
    __a			=					proj_out_weights

  model.save_pretrained(a_			)


if __name__ == "__main__":
  UpperCAmelCase_ 		=      argparse.ArgumentParser()
  # # Required parameters
  parser.add_argument("--checkpoint_path", type=str, help="Patht to the downloaded checkpoints")
  parser.add_argument("--pytorch_dump_folder_path", default=None, type=str, help="Path to the output PyTorch model.")
  UpperCAmelCase_ 		=      parser.parse_args()

  convert_openai_whisper_to_tfms(args.checkpoint_path, args.pytorch_dump_folder_path)









'''simple docstring'''


import gc
import unittest

import numpy as np
import torch
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTokenizer

from diffusers import TransformeraDModel, VQDiffusionPipeline, VQDiffusionScheduler, VQModel
from diffusers.pipelines.vq_diffusion.pipeline_vq_diffusion import LearnedClassifierFreeSamplingEmbeddings
from diffusers.utils import load_numpy, slow, torch_device
from diffusers.utils.testing_utils import require_torch_gpu


UpperCAmelCase_ 		=      False





class    __lowercase						(  unittest.TestCase ):







   def 		UpperCamelCase__			(	self      )				->    int:
     # clean up the VRAM after each test
     super().tearDown()
     gc.collect()
     torch.cuda.empty_cache()







   @property
   def 		UpperCamelCase__			(	self      )				->    Tuple:
     return 12







   @property
   def 		UpperCamelCase__			(	self      )				->    Optional[int]:
     return 12







   @property
   def 		UpperCamelCase__			(	self      )				->    List[str]:
     return 32







   @property
   def 		UpperCamelCase__			(	self      )				->    Optional[int]:
     torch.manual_seed(0      )
     __a			=					VQModel(
         block_out_channels=[32, 64]      ,							in_channels=3      ,							out_channels=3      ,							down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D']      ,							up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D']      ,							latent_channels=3      ,							num_vq_embeddings=self.num_embed      ,							vq_embed_dim=3      ,							)
     return model







   @property
   def 		UpperCamelCase__			(	self      )				->    Optional[int]:
     __a			=					CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip'      )
     return tokenizer







   @property
   def 		UpperCamelCase__			(	self      )				->    Tuple:
     torch.manual_seed(0      )
     __a			=					CLIPTextConfig(
         bos_token_id=0      ,							eos_token_id=2      ,							hidden_size=self.text_embedder_hidden_size      ,							intermediate_size=37      ,							layer_norm_eps=1e-05      ,							num_attention_heads=4      ,							num_hidden_layers=5      ,							pad_token_id=1      ,							vocab_size=1000      ,							)
     return CLIPTextModel(UpperCamelCase      )







   @property
   def 		UpperCamelCase__			(	self      )				->    Tuple:
     torch.manual_seed(0      )

     __a			=					12
     __a			=					12

     __a			=					{
         'attention_bias': True,
         'cross_attention_dim': 32,
         'attention_head_dim': height * width,
         'num_attention_heads': 1,
         'num_vector_embeds': self.num_embed,
         'num_embeds_ada_norm': self.num_embeds_ada_norm,
         'norm_num_groups': 32,
         'sample_size': width,
         'activation_fn': 'geglu-approximate',
     }

     __a			=					TransformeraDModel(**UpperCamelCase      )
     return model







   def 		UpperCamelCase__			(	self      )				->    Optional[Any]:
     __a			=					'cpu'

     __a			=					self.dummy_vqvae
     __a			=					self.dummy_text_encoder
     __a			=					self.dummy_tokenizer
     __a			=					self.dummy_transformer
     __a			=					VQDiffusionScheduler(self.num_embed      )
     __a			=					LearnedClassifierFreeSamplingEmbeddings(learnable=UpperCamelCase      )

     __a			=					VQDiffusionPipeline(
         vqvae=UpperCamelCase      ,							text_encoder=UpperCamelCase      ,							tokenizer=UpperCamelCase      ,							transformer=UpperCamelCase      ,							scheduler=UpperCamelCase      ,							learned_classifier_free_sampling_embeddings=UpperCamelCase      ,							)
     __a			=					pipe.to(UpperCamelCase      )
     pipe.set_progress_bar_config(disable=UpperCamelCase      )

     __a			=					'teddy bear playing in the pool'

     __a			=					torch.Generator(device=UpperCamelCase      ).manual_seed(0      )
     __a			=					pipe([prompt]      ,							generator=UpperCamelCase      ,							num_inference_steps=2      ,							output_type='np'      )
     __a			=					output.images

     __a			=					torch.Generator(device=UpperCamelCase      ).manual_seed(0      )
     __a			=					pipe(
         [prompt]      ,							generator=UpperCamelCase      ,							output_type='np'      ,							return_dict=UpperCamelCase      ,							num_inference_steps=2      )[0]

     __a			=					image[0, -3:, -3:, -1]
     __a			=					image_from_tuple[0, -3:, -3:, -1]

     assert image.shape == (1, 24, 24, 3)

     __a			=					np.array([0.6_551, 0.6_168, 0.5_008, 0.5_676, 0.5_659, 0.4_295, 0.6_073, 0.5_599, 0.4_992]      )

     assert np.abs(image_slice.flatten() - expected_slice      ).max() < 1e-2
     assert np.abs(image_from_tuple_slice.flatten() - expected_slice      ).max() < 1e-2







   def 		UpperCamelCase__			(	self      )				->    int:
     __a			=					'cpu'

     __a			=					self.dummy_vqvae
     __a			=					self.dummy_text_encoder
     __a			=					self.dummy_tokenizer
     __a			=					self.dummy_transformer
     __a			=					VQDiffusionScheduler(self.num_embed      )
     __a			=					LearnedClassifierFreeSamplingEmbeddings(
         learnable=UpperCamelCase      ,							hidden_size=self.text_embedder_hidden_size      ,							length=tokenizer.model_max_length      )

     __a			=					VQDiffusionPipeline(
         vqvae=UpperCamelCase      ,							text_encoder=UpperCamelCase      ,							tokenizer=UpperCamelCase      ,							transformer=UpperCamelCase      ,							scheduler=UpperCamelCase      ,							learned_classifier_free_sampling_embeddings=UpperCamelCase      ,							)
     __a			=					pipe.to(UpperCamelCase      )
     pipe.set_progress_bar_config(disable=UpperCamelCase      )

     __a			=					'teddy bear playing in the pool'

     __a			=					torch.Generator(device=UpperCamelCase      ).manual_seed(0      )
     __a			=					pipe([prompt]      ,							generator=UpperCamelCase      ,							num_inference_steps=2      ,							output_type='np'      )
     __a			=					output.images

     __a			=					torch.Generator(device=UpperCamelCase      ).manual_seed(0      )
     __a			=					pipe(
         [prompt]      ,							generator=UpperCamelCase      ,							output_type='np'      ,							return_dict=UpperCamelCase      ,							num_inference_steps=2      )[0]

     __a			=					image[0, -3:, -3:, -1]
     __a			=					image_from_tuple[0, -3:, -3:, -1]

     assert image.shape == (1, 24, 24, 3)

     __a			=					np.array([0.6_693, 0.6_075, 0.4_959, 0.5_701, 0.5_583, 0.4_333, 0.6_171, 0.5_684, 0.4_988]      )

     assert np.abs(image_slice.flatten() - expected_slice      ).max() < 2.0
     assert np.abs(image_from_tuple_slice.flatten() - expected_slice      ).max() < 1e-2





@slow
@require_torch_gpu
class    __lowercase						(  unittest.TestCase ):







   def 		UpperCamelCase__			(	self      )				->    Any:
     # clean up the VRAM after each test
     super().tearDown()
     gc.collect()
     torch.cuda.empty_cache()







   def 		UpperCamelCase__			(	self      )				->    Union[str, Any]:
     __a			=					load_numpy(
         'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
         '/vq_diffusion/teddy_bear_pool_classifier_free_sampling.npy'      )

     __a			=					VQDiffusionPipeline.from_pretrained('microsoft/vq-diffusion-ithq'      )
     __a			=					pipeline.to(UpperCamelCase      )
     pipeline.set_progress_bar_config(disable=UpperCamelCase      )

     # requires GPU generator for gumbel softmax
     # don't use GPU generator in tests though
     __a			=					torch.Generator(device=UpperCamelCase      ).manual_seed(0      )
     __a			=					pipeline(
         'teddy bear playing in the pool'      ,							num_images_per_prompt=1      ,							generator=UpperCamelCase      ,							output_type='np'      ,							)

     __a			=					output.images[0]

     assert image.shape == (256, 256, 3)
     assert np.abs(expected_image - image      ).max() < 2.0



