




from typing import List, Optional, Union

import numpy as np
import PIL
import torch
from PIL import Image

from ...models import UNetaDConditionModel, VQModel
from ...pipelines import DiffusionPipeline
from ...pipelines.pipeline_utils import ImagePipelineOutput
from ...schedulers import DDPMScheduler
from ...utils import (
    is_accelerate_available,
    is_accelerate_version,
    logging,
    randn_tensor,
    replace_example_docstring,
)


a_   		=     logging.get_logger(__name__)  # pylint: disable=invalid-name

a_   		=     "\n    Examples:\n        ```py\n        >>> from diffusers import KandinskyV22Img2ImgPipeline, KandinskyV22PriorPipeline\n        >>> from diffusers.utils import load_image\n        >>> import torch\n\n        >>> pipe_prior = KandinskyV22PriorPipeline.from_pretrained(\n        ...     \"kandinsky-community/kandinsky-2-2-prior\", torch_dtype=torch.float16\n        ... )\n        >>> pipe_prior.to(\"cuda\")\n\n        >>> prompt = \"A red cartoon frog, 4k\"\n        >>> image_emb, zero_image_emb = pipe_prior(prompt, return_dict=False)\n\n        >>> pipe = KandinskyV22Img2ImgPipeline.from_pretrained(\n        ...     \"kandinsky-community/kandinsky-2-2-decoder\", torch_dtype=torch.float16\n        ... )\n        >>> pipe.to(\"cuda\")\n\n        >>> init_image = load_image(\n        ...     \"https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main\"\n        ...     \"/kandinsky/frog.png\"\n        ... )\n\n        >>> image = pipe(\n        ...     image=init_image,\n        ...     image_embeds=image_emb,\n        ...     negative_image_embeds=zero_image_emb,\n        ...     height=768,\n        ...     width=768,\n        ...     num_inference_steps=100,\n        ...     strength=0.2,\n        ... ).images\n\n        >>> image[0].save(\"red_frog.png\")\n        ```\n"




def 					__SCREAMING_SNAKE_CASE   (  lowercase_					,     lowercase_					,     lowercase_=8      )       ->	Tuple:

    """simple docstring"""


    __UpperCamelCase  		=						height // scale_factor**2
    if height % scale_factor**2 != 0:
        new_height += 1
    __UpperCamelCase  		=						width // scale_factor**2
    if width % scale_factor**2 != 0:
        new_width += 1
    return new_height * scale_factor, new_width * scale_factor




def 					__SCREAMING_SNAKE_CASE   (  lowercase_					,     lowercase_=5_12					,     lowercase_=5_12      )       ->	Optional[int]:

    """simple docstring"""


    __UpperCamelCase  		=						pil_image.resize((w, h)					,     resample=Image.BICUBIC					,     reducing_gap=1      )
    __UpperCamelCase  		=						np.array(pil_image.convert('''RGB'''      )      )
    __UpperCamelCase  		=						arr.astype(np.floataa      ) / 127.5 - 1
    __UpperCamelCase  		=						np.transpose(lowercase_					,     [2, 0, 1]      )
    __UpperCamelCase  		=						torch.from_numpy(lowercase_      ).unsqueeze(0      )
    return image


class  _lowerCamelCase						(			_SCREAMING_SNAKE_CASE   ):

      """simple docstring"""

      def __init__(     self					: Optional[int] ,       snake_case					: UNetaDConditionModel ,       snake_case					: DDPMScheduler ,       snake_case					: VQModel ,       ):
          super().__init__()

          self.register_modules(
              unet=snake_case ,       scheduler=snake_case ,       movq=snake_case ,       )
          __UpperCamelCase  		=						2 ** (len(self.movq.config.block_out_channels				) - 1)







      def       snake_case	(     self					: int ,       snake_case					: Optional[Any] ,       snake_case					: str ,       snake_case					: Tuple				):
          # get the original timestep using init_timestep
          __UpperCamelCase  		=						min(int(num_inference_steps * strength				) ,       snake_case				)

          __UpperCamelCase  		=						max(num_inference_steps - init_timestep ,       0				)
          __UpperCamelCase  		=						self.scheduler.timesteps[t_start:]

          return timesteps, num_inference_steps - t_start







      def       snake_case	(     self					: str ,       snake_case					: Dict ,       snake_case					: List[str] ,       snake_case					: Any ,       snake_case					: str ,       snake_case					: Dict ,       snake_case					: Optional[Any] ,       snake_case					: int=None				):
          if not isinstance(snake_case ,       (torch.Tensor, PIL.Image.Image, list)				):
              raise ValueError(
                  F"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(snake_case				)}"				)

          __UpperCamelCase  		=						image.to(device=snake_case ,       dtype=snake_case				)

          __UpperCamelCase  		=						batch_size * num_images_per_prompt

          if image.shape[1] == 4:
              __UpperCamelCase  		=						image

          else:
              if isinstance(snake_case ,       snake_case				) and len(snake_case				) != batch_size:
                  raise ValueError(
                      F"You have passed a list of generators of length {len(snake_case				)}, but requested an effective batch"
                      F" size of {batch_size}. Make sure the batch size matches the length of the generators."				)

              elif isinstance(snake_case ,       snake_case				):
                  __UpperCamelCase  		=						[
                      self.movq.encode(image[i : i + 1]				).latent_dist.sample(generator[i]				) for i in range(snake_case				)
                  ]
                  __UpperCamelCase  		=						torch.cat(snake_case ,       dim=0				)
              else:
                  __UpperCamelCase  		=						self.movq.encode(snake_case				).latent_dist.sample(snake_case				)

              __UpperCamelCase  		=						self.movq.config.scaling_factor * init_latents

          __UpperCamelCase  		=						torch.cat([init_latents] ,       dim=0				)

          __UpperCamelCase  		=						init_latents.shape
          __UpperCamelCase  		=						randn_tensor(snake_case ,       generator=snake_case ,       device=snake_case ,       dtype=snake_case				)

          # get latents
          __UpperCamelCase  		=						self.scheduler.add_noise(snake_case ,       snake_case ,       snake_case				)

          __UpperCamelCase  		=						init_latents

          return latents







      def       snake_case	(     self					: Optional[int] ,       snake_case					: List[str]=0				):
          if is_accelerate_available():
              from accelerate import cpu_offload
          else:
              raise ImportError('''Please install accelerate via `pip install accelerate`'''				)

          __UpperCamelCase  		=						torch.device(F"cuda:{gpu_id}"				)

          __UpperCamelCase  		=						[
              self.unet,
              self.movq,
          ]
          for cpu_offloaded_model in models:
              if cpu_offloaded_model is not None:
                  cpu_offload(snake_case ,       snake_case				)







      def       snake_case	(     self					: Dict ,       snake_case					: Dict=0				):
          if is_accelerate_available() and is_accelerate_version('''>=''' ,       '''0.17.0.dev0'''				):
              from accelerate import cpu_offload_with_hook
          else:
              raise ImportError('''`enable_model_cpu_offload` requires `accelerate v0.17.0` or higher.'''				)

          __UpperCamelCase  		=						torch.device(F"cuda:{gpu_id}"				)

          if self.device.type != "cpu":
              self.to('''cpu''' ,       silence_dtype_warnings=snake_case				)
              torch.cuda.empty_cache()  # otherwise we don't see the memory savings (but they probably exist)

          __UpperCamelCase  		=						None
          for cpu_offloaded_model in [self.unet, self.movq]:
              __UpperCamelCase		,      __UpperCamelCase  		=						cpu_offload_with_hook(snake_case ,       snake_case ,       prev_module_hook=snake_case				)

          # We'll offload the last model manually.
          __UpperCamelCase  		=						hook







      @property
      # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device
      def       snake_case	(     self					: Dict				):
          if not hasattr(self.unet ,       '''_hf_hook'''				):
              return self.device
          for module in self.unet.modules():
              if (
                  hasattr(snake_case ,       '''_hf_hook'''				)
                  and hasattr(module._hf_hook ,       '''execution_device'''				)
                  and module._hf_hook.execution_device is not None
              ):
                  return torch.device(module._hf_hook.execution_device				)
          return self.device







      @torch.no_grad()
      @replace_example_docstring(snake_case				)
      def __call__(     self					: Union[str, Any] ,       snake_case					: Union[torch.FloatTensor, List[torch.FloatTensor]] ,       snake_case					: Union[torch.FloatTensor, PIL.Image.Image, List[torch.FloatTensor], List[PIL.Image.Image]] ,       snake_case					: Union[torch.FloatTensor, List[torch.FloatTensor]] ,       snake_case					: int = 512 ,       snake_case					: int = 512 ,       snake_case					: int = 100 ,       snake_case					: float = 4.0 ,       snake_case					: float = 0.3 ,       snake_case					: int = 1 ,       snake_case					: Optional[Union[torch.Generator, List[torch.Generator]]] = None ,       snake_case					: Optional[str] = "pil" ,       snake_case					: bool = True ,       ):
          __UpperCamelCase  		=						self._execution_device

          __UpperCamelCase  		=						guidance_scale > 1.0

          if isinstance(snake_case ,       snake_case				):
              __UpperCamelCase  		=						torch.cat(snake_case ,       dim=0				)
          __UpperCamelCase  		=						image_embeds.shape[0]
          if isinstance(snake_case ,       snake_case				):
              __UpperCamelCase  		=						torch.cat(snake_case ,       dim=0				)

          if do_classifier_free_guidance:
              __UpperCamelCase  		=						image_embeds.repeat_interleave(snake_case ,       dim=0				)
              __UpperCamelCase  		=						negative_image_embeds.repeat_interleave(snake_case ,       dim=0				)

          __UpperCamelCase  		=						torch.cat([negative_image_embeds, image_embeds] ,       dim=0				).to(dtype=self.unet.dtype ,       device=snake_case				)

          if not isinstance(snake_case ,       snake_case				):
              __UpperCamelCase  		=						[image]
          if not all(isinstance(snake_case ,       (PIL.Image.Image, torch.Tensor)				) for i in image				):
              raise ValueError(
                  F"Input is in incorrect format: {[type(snake_case				) for i in image]}. Currently, we only support  PIL image and pytorch tensor"				)

          __UpperCamelCase  		=						torch.cat([prepare_image(snake_case ,       snake_case ,       snake_case				) for i in image] ,       dim=0				)
          __UpperCamelCase  		=						image.to(dtype=image_embeds.dtype ,       device=snake_case				)

          __UpperCamelCase  		=						self.movq.encode(snake_case				)['''latents''']
          __UpperCamelCase  		=						latents.repeat_interleave(snake_case ,       dim=0				)
          self.scheduler.set_timesteps(snake_case ,       device=snake_case				)
          __UpperCamelCase		,      __UpperCamelCase  		=						self.get_timesteps(snake_case ,       snake_case ,       snake_case				)
          __UpperCamelCase  		=						timesteps[:1].repeat(batch_size * num_images_per_prompt				)
          __UpperCamelCase		,      __UpperCamelCase  		=						downscale_height_and_width(snake_case ,       snake_case ,       self.movq_scale_factor				)
          __UpperCamelCase  		=						self.prepare_latents(
              snake_case ,       snake_case ,       snake_case ,       snake_case ,       image_embeds.dtype ,       snake_case ,       snake_case				)
          for i, t in enumerate(self.progress_bar(snake_case				)				):
              # expand the latents if we are doing classifier free guidance
              __UpperCamelCase  		=						torch.cat([latents] * 2				) if do_classifier_free_guidance else latents

              __UpperCamelCase  		=						{'''image_embeds''': image_embeds}
              __UpperCamelCase  		=						self.unet(
                  sample=snake_case ,       timestep=snake_case ,       encoder_hidden_states=snake_case ,       added_cond_kwargs=snake_case ,       return_dict=snake_case ,       )[0]

              if do_classifier_free_guidance:
                  __UpperCamelCase		,      __UpperCamelCase  		=						noise_pred.split(latents.shape[1] ,       dim=1				)
                  __UpperCamelCase		,      __UpperCamelCase  		=						noise_pred.chunk(2				)
                  __UpperCamelCase		,      __UpperCamelCase  		=						variance_pred.chunk(2				)
                  __UpperCamelCase  		=						noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
                  __UpperCamelCase  		=						torch.cat([noise_pred, variance_pred_text] ,       dim=1				)

              if not (
                  hasattr(self.scheduler.config ,       '''variance_type'''				)
                  and self.scheduler.config.variance_type in ["learned", "learned_range"]
              ):
                  __UpperCamelCase		,      __UpperCamelCase  		=						noise_pred.split(latents.shape[1] ,       dim=1				)

              # compute the previous noisy sample x_t -> x_t-1
              __UpperCamelCase  		=						self.scheduler.step(
                  snake_case ,       snake_case ,       snake_case ,       generator=snake_case ,       )[0]

          # post-processing
          __UpperCamelCase  		=						self.movq.decode(snake_case ,       force_not_quantize=snake_case				)['''sample''']

          if output_type not in ["pt", "np", "pil"]:
              raise ValueError(F"Only the output types `pt`, `pil` and `np` are supported not output_type={output_type}"				)

          if output_type in ["np", "pil"]:
              __UpperCamelCase  		=						image * 0.5 + 0.5
              __UpperCamelCase  		=						image.clamp(0 ,       1				)
              __UpperCamelCase  		=						image.cpu().permute(0 ,       2 ,       3 ,       1				).float().numpy()

          if output_type == "pil":
              __UpperCamelCase  		=						self.numpy_to_pil(snake_case				)

          if not return_dict:
              return (image,)

          return ImagePipelineOutput(images=snake_case				)












import argparse
from pathlib import Path
from typing import Dict, OrderedDict, Tuple

import torch
from audiocraft.models import MusicGen

from transformers import (
    AutoFeatureExtractor,
    AutoTokenizer,
    EncodecModel,
    MusicgenDecoderConfig,
    MusicgenForConditionalGeneration,
    MusicgenProcessor,
    TaEncoderModel,
)
from transformers.models.musicgen.modeling_musicgen import MusicgenForCausalLM
from transformers.utils import logging


logging.set_verbosity_info()
a_   		=     logging.get_logger(__name__)


a_   		=     ["model.decoder.embed_positions.weights"]




def 					__SCREAMING_SNAKE_CASE   (  lowercase_      )       ->	Optional[Any]:

    """simple docstring"""


    if "emb" in name:
        __UpperCamelCase  		=						name.replace('''emb'''					,     '''model.decoder.embed_tokens'''      )
    if "transformer" in name:
        __UpperCamelCase  		=						name.replace('''transformer'''					,     '''model.decoder'''      )
    if "cross_attention" in name:
        __UpperCamelCase  		=						name.replace('''cross_attention'''					,     '''encoder_attn'''      )
    if "linear1" in name:
        __UpperCamelCase  		=						name.replace('''linear1'''					,     '''fc1'''      )
    if "linear2" in name:
        __UpperCamelCase  		=						name.replace('''linear2'''					,     '''fc2'''      )
    if "norm1" in name:
        __UpperCamelCase  		=						name.replace('''norm1'''					,     '''self_attn_layer_norm'''      )
    if "norm_cross" in name:
        __UpperCamelCase  		=						name.replace('''norm_cross'''					,     '''encoder_attn_layer_norm'''      )
    if "norm2" in name:
        __UpperCamelCase  		=						name.replace('''norm2'''					,     '''final_layer_norm'''      )
    if "out_norm" in name:
        __UpperCamelCase  		=						name.replace('''out_norm'''					,     '''model.decoder.layer_norm'''      )
    if "linears" in name:
        __UpperCamelCase  		=						name.replace('''linears'''					,     '''lm_heads'''      )
    if "condition_provider.conditioners.description.output_proj" in name:
        __UpperCamelCase  		=						name.replace('''condition_provider.conditioners.description.output_proj'''					,     '''enc_to_dec_proj'''      )
    return name




def 					__SCREAMING_SNAKE_CASE   (  lowercase_					,     lowercase_      )       ->	Tuple[Dict, Dict]:

    """simple docstring"""


    __UpperCamelCase  		=						list(state_dict.keys()      )
    __UpperCamelCase  		=						{}
    for key in keys:
        __UpperCamelCase  		=						state_dict.pop(lowercase_      )
        __UpperCamelCase  		=						rename_keys(lowercase_      )
        if "in_proj_weight" in key:
            # split fused qkv proj
            __UpperCamelCase  		=						val[:hidden_size, :]
            __UpperCamelCase  		=						val[hidden_size : 2 * hidden_size, :]
            __UpperCamelCase  		=						val[-hidden_size:, :]
        elif "enc_to_dec_proj" in key:
            __UpperCamelCase  		=						val
        else:
            __UpperCamelCase  		=						val
    return state_dict, enc_dec_proj_state_dict




def 					__SCREAMING_SNAKE_CASE   (  lowercase_      )       ->	MusicgenDecoderConfig:

    """simple docstring"""


    if checkpoint == "small":
        # default config values
        __UpperCamelCase  		=						10_24
        __UpperCamelCase  		=						24
        __UpperCamelCase  		=						16
    elif checkpoint == "medium":
        __UpperCamelCase  		=						15_36
        __UpperCamelCase  		=						48
        __UpperCamelCase  		=						24
    elif checkpoint == "large":
        __UpperCamelCase  		=						20_48
        __UpperCamelCase  		=						48
        __UpperCamelCase  		=						32
    else:
        raise ValueError(F"Checkpoint should be one of `['small', 'medium', 'large']`, got {checkpoint}."      )
    __UpperCamelCase  		=						MusicgenDecoderConfig(
        hidden_size=lowercase_					,     ffn_dim=hidden_size * 4					,     num_hidden_layers=lowercase_					,     num_attention_heads=lowercase_					,     )
    return config




@torch.no_grad()
def 					__SCREAMING_SNAKE_CASE   (  lowercase_					,     lowercase_=None					,     lowercase_=None					,     lowercase_="cpu"      )       ->	List[Any]:

    """simple docstring"""


    __UpperCamelCase  		=						MusicGen.get_pretrained(lowercase_					,     device=lowercase_      )
    __UpperCamelCase  		=						decoder_config_from_checkpoint(lowercase_      )

    __UpperCamelCase  		=						fairseq_model.lm.state_dict()
    __UpperCamelCase		,      __UpperCamelCase  		=						rename_state_dict(
        lowercase_					,     hidden_size=decoder_config.hidden_size      )

    __UpperCamelCase  		=						TaEncoderModel.from_pretrained('''t5-base'''      )
    __UpperCamelCase  		=						EncodecModel.from_pretrained('''facebook/encodec_32khz'''      )
    __UpperCamelCase  		=						MusicgenForCausalLM(lowercase_      ).eval()

    # load all decoder weights - expect that we'll be missing embeddings and enc-dec projection
    __UpperCamelCase		,      __UpperCamelCase  		=						decoder.load_state_dict(lowercase_					,     strict=lowercase_      )

    for key in missing_keys.copy():
        if key.startswith(('''text_encoder''', '''audio_encoder''')      ) or key in EXPECTED_MISSING_KEYS:
            missing_keys.remove(lowercase_      )

    if len(lowercase_      ) > 0:
        raise ValueError(F"Missing key(s) in state_dict: {missing_keys}"      )

    if len(lowercase_      ) > 0:
        raise ValueError(F"Unexpected key(s) in state_dict: {unexpected_keys}"      )

    # init the composite model
    __UpperCamelCase  		=						MusicgenForConditionalGeneration(text_encoder=lowercase_					,     audio_encoder=lowercase_					,     decoder=lowercase_      )

    # load the pre-trained enc-dec projection (from the decoder state dict)
    model.enc_to_dec_proj.load_state_dict(lowercase_      )

    # check we can do a forward pass
    __UpperCamelCase  		=						torch.arange(0					,     8					,     dtype=torch.long      ).reshape(2					,     -1      )
    __UpperCamelCase  		=						input_ids.reshape(2 * 4					,     -1      )

    with torch.no_grad():
        __UpperCamelCase  		=						model(input_ids=lowercase_					,     decoder_input_ids=lowercase_      ).logits

    if logits.shape != (8, 1, 20_48):
        raise ValueError('''Incorrect shape for logits'''      )

    # now construct the processor
    __UpperCamelCase  		=						AutoTokenizer.from_pretrained('''t5-base'''      )
    __UpperCamelCase  		=						AutoFeatureExtractor.from_pretrained('''facebook/encodec_32khz'''					,     padding_side='''left'''      )

    __UpperCamelCase  		=						MusicgenProcessor(feature_extractor=lowercase_					,     tokenizer=lowercase_      )

    # set the appropriate bos/pad token ids
    __UpperCamelCase  		=						20_48
    __UpperCamelCase  		=						20_48

    # set other default generation config params
    __UpperCamelCase  		=						int(30 * audio_encoder.config.frame_rate      )
    __UpperCamelCase  		=						True
    __UpperCamelCase  		=						3.0

    if pytorch_dump_folder is not None:
        Path(lowercase_      ).mkdir(exist_ok=lowercase_      )
        logger.info(F"Saving model {checkpoint} to {pytorch_dump_folder}"      )
        model.save_pretrained(lowercase_      )
        processor.save_pretrained(lowercase_      )

    if repo_id:
        logger.info(F"Pushing model {checkpoint} to {repo_id}"      )
        model.push_to_hub(lowercase_      )
        processor.push_to_hub(lowercase_      )


if __name__ == "__main__":
 a_   		=     argparse.ArgumentParser()
 # Required parameters
 parser.add_argument(
     "--checkpoint",
     default="small",
     type=str,
     help="Checkpoint size of the MusicGen model you'd like to convert. Can be one of: `['small', 'medium', 'large']`.",
 )
 parser.add_argument(
     "--pytorch_dump_folder",
     required=True,
     default=None,
     type=str,
     help="Path to the output PyTorch model directory.",
 )
 parser.add_argument(
     "--push_to_hub", default=None, type=str, help="Where to upload the converted model on the 🤗 hub."
 )
 parser.add_argument(
     "--device", default="cpu", type=str, help="Torch device to run the conversion, either cpu or cuda."
 )

 a_   		=     parser.parse_args()
 convert_musicgen_checkpoint(args.checkpoint, args.pytorch_dump_folder, args.push_to_hub)






