


from typing import List, Optional, Union

import torch
from transformers import (
    XLMRobertaTokenizer,
)

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


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

lowerCAmelCase       =							'''
    Examples:
        ```py
        >>> from diffusers import KandinskyPipeline, KandinskyPriorPipeline
        >>> import torch

        >>> pipe_prior = KandinskyPriorPipeline.from_pretrained("kandinsky-community/Kandinsky-2-1-prior")
        >>> pipe_prior.to("cuda")

        >>> prompt = "red cat, 4k photo"
        >>> out = pipe_prior(prompt)
        >>> image_emb = out.image_embeds
        >>> negative_image_emb = out.negative_image_embeds

        >>> pipe = KandinskyPipeline.from_pretrained("kandinsky-community/kandinsky-2-1")
        >>> pipe.to("cuda")

        >>> image = pipe(
        ...     prompt,
        ...     image_embeds=image_emb,
        ...     negative_image_embeds=negative_image_emb,
        ...     height=768,
        ...     width=768,
        ...     num_inference_steps=100,
        ... ).images

        >>> image[0].save("cat.png")
        ```
'''
def 			_a (      SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE=8     ):


		"""simple docstring"""




		lowercase__            =      h // scale_factor**2
		if h % scale_factor**2 != 0:
				new_h += 1
		lowercase__            =      w // scale_factor**2
		if w % scale_factor**2 != 0:
				new_w += 1
		return new_h * scale_factor, new_w * scale_factor


class        _a							(			A__			):

							def __init__(							self:	Tuple    ,						UpperCamelCase_:	MultilingualCLIP    ,						UpperCamelCase_:	XLMRobertaTokenizer    ,						UpperCamelCase_:	UNetaDConditionModel    ,						UpperCamelCase_:	Union[DDIMScheduler, DDPMScheduler]    ,						UpperCamelCase_:	VQModel    ,						)			->   List[str]:





									"""simple docstring"""







									super().__init__()

									self.register_modules(
									    text_encoder=UpperCamelCase_    ,						tokenizer=UpperCamelCase_    ,						unet=UpperCamelCase_    ,						scheduler=UpperCamelCase_    ,						movq=UpperCamelCase_    ,						)
									lowercase__            =      2 ** (len(self.movq.config.block_out_channels							) - 1)

							def       lowerCamelCase_ (							self:	int    ,						UpperCamelCase_:	Optional[Any]    ,						UpperCamelCase_:	int    ,						UpperCamelCase_:	Any    ,						UpperCamelCase_:	Dict    ,						UpperCamelCase_:	str    ,						UpperCamelCase_:	str							)			->   Tuple:





									"""simple docstring"""







									if latents is None:
											lowercase__            =      randn_tensor(UpperCamelCase_    ,						generator=UpperCamelCase_    ,						device=UpperCamelCase_    ,						dtype=UpperCamelCase_							)
									else:
											if latents.shape != shape:
													raise ValueError(f'Unexpected latents shape, got {latents.shape}, expected {shape}'							)
											lowercase__            =      latents.to(UpperCamelCase_							)

									lowercase__            =      latents * scheduler.init_noise_sigma
									return latents

							def       lowerCamelCase_ (							self:	Dict    ,						UpperCamelCase_:	Optional[int]    ,						UpperCamelCase_:	Dict    ,						UpperCamelCase_:	List[Any]    ,						UpperCamelCase_:	str    ,						UpperCamelCase_:	Union[str, Any]=None    ,						)			->   List[str]:





									"""simple docstring"""







									lowercase__            =      len(UpperCamelCase_							) if isinstance(UpperCamelCase_    ,						UpperCamelCase_							) else 1
									# get prompt text embeddings
									lowercase__            =      self.tokenizer(
									    UpperCamelCase_    ,						padding='''max_length'''    ,						truncation=UpperCamelCase_    ,						max_length=77    ,						return_attention_mask=UpperCamelCase_    ,						add_special_tokens=UpperCamelCase_    ,						return_tensors='''pt'''    ,						)

									lowercase__            =      text_inputs.input_ids
									lowercase__            =      self.tokenizer(UpperCamelCase_    ,						padding='''longest'''    ,						return_tensors='''pt'''							).input_ids

									if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal(UpperCamelCase_    ,						UpperCamelCase_							):
											lowercase__            =      self.tokenizer.batch_decode(untruncated_ids[:, self.tokenizer.model_max_length - 1 : -1]							)
											logger.warning(
											    '''The following part of your input was truncated because CLIP can only handle sequences up to'''
											    f' {self.tokenizer.model_max_length} tokens: {removed_text}'							)

									lowercase__            =      text_input_ids.to(UpperCamelCase_							)
									lowercase__            =      text_inputs.attention_mask.to(UpperCamelCase_							)

									lowercase__            =      self.text_encoder(
									    input_ids=UpperCamelCase_    ,						attention_mask=UpperCamelCase_							)

									lowercase__            =      prompt_embeds.repeat_interleave(UpperCamelCase_    ,						dim=0							)
									lowercase__            =      text_encoder_hidden_states.repeat_interleave(UpperCamelCase_    ,						dim=0							)
									lowercase__            =      text_mask.repeat_interleave(UpperCamelCase_    ,						dim=0							)

									if do_classifier_free_guidance:
											lowercase__            =      42
											if negative_prompt is None:
													lowercase__            =      [""] * batch_size
											elif type(UpperCamelCase_							) is not type(UpperCamelCase_							):
													raise TypeError(
													    f'`negative_prompt` should be the same type to `prompt`, but got {type(UpperCamelCase_							)} !='
													    f' {type(UpperCamelCase_							)}.'							)
											elif isinstance(UpperCamelCase_    ,						UpperCamelCase_							):
													lowercase__            =      [negative_prompt]
											elif batch_size != len(UpperCamelCase_							):
													raise ValueError(
													    f'`negative_prompt`: {negative_prompt} has batch size {len(UpperCamelCase_							)}, but `prompt`:'
													    f' {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches'
													    ''' the batch size of `prompt`.'''							)
											else:
													lowercase__            =      negative_prompt

											lowercase__            =      self.tokenizer(
											    UpperCamelCase_    ,						padding='''max_length'''    ,						max_length=77    ,						truncation=UpperCamelCase_    ,						return_attention_mask=UpperCamelCase_    ,						add_special_tokens=UpperCamelCase_    ,						return_tensors='''pt'''    ,						)
											lowercase__            =      uncond_input.input_ids.to(UpperCamelCase_							)
											lowercase__            =      uncond_input.attention_mask.to(UpperCamelCase_							)

											lowercase__            =      self.text_encoder(
											    input_ids=UpperCamelCase_    ,						attention_mask=UpperCamelCase_							)

											# duplicate unconditional embeddings for each generation per prompt, using mps friendly method

											lowercase__            =      negative_prompt_embeds.shape[1]
											lowercase__            =      negative_prompt_embeds.repeat(1    ,						UpperCamelCase_							)
											lowercase__            =      negative_prompt_embeds.view(batch_size * num_images_per_prompt    ,						UpperCamelCase_							)

											lowercase__            =      uncond_text_encoder_hidden_states.shape[1]
											lowercase__            =      uncond_text_encoder_hidden_states.repeat(1    ,						UpperCamelCase_    ,						1							)
											lowercase__            =      uncond_text_encoder_hidden_states.view(
											    batch_size * num_images_per_prompt    ,						UpperCamelCase_    ,						-1							)
											lowercase__            =      uncond_text_mask.repeat_interleave(UpperCamelCase_    ,						dim=0							)

											# done duplicates

											# For classifier free guidance, we need to do two forward passes.
											# Here we concatenate the unconditional and text embeddings into a single batch
											# to avoid doing two forward passes
											lowercase__            =      torch.cat([negative_prompt_embeds, prompt_embeds]							)
											lowercase__            =      torch.cat([uncond_text_encoder_hidden_states, text_encoder_hidden_states]							)

											lowercase__            =      torch.cat([uncond_text_mask, text_mask]							)

									return prompt_embeds, text_encoder_hidden_states, text_mask

							def       lowerCamelCase_ (							self:	Any    ,						UpperCamelCase_:	List[str]=0							)			->   Dict:





									"""simple docstring"""







									if is_accelerate_available():
											from accelerate import cpu_offload
									else:
											raise ImportError('''Please install accelerate via `pip install accelerate`'''							)

									lowercase__            =      torch.device(f'cuda:{gpu_id}'							)

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

							def       lowerCamelCase_ (							self:	Tuple    ,						UpperCamelCase_:	Tuple=0							)			->   Tuple:





									"""simple docstring"""







									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.'''							)

									lowercase__            =      torch.device(f'cuda:{gpu_id}'							)

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

									lowercase__            =      None
									for cpu_offloaded_model in [self.text_encoder, self.unet, self.movq]:
											lowercase__            =      cpu_offload_with_hook(UpperCamelCase_    ,						UpperCamelCase_    ,						prev_module_hook=UpperCamelCase_							)

									if self.safety_checker is not None:
											lowercase__            =      cpu_offload_with_hook(self.safety_checker    ,						UpperCamelCase_    ,						prev_module_hook=UpperCamelCase_							)

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

							@property
							# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device
							def       lowerCamelCase_ (							self:	List[Any]							)			->   List[str]:





									"""simple docstring"""







									if not hasattr(self.unet    ,						'''_hf_hook'''							):
											return self.device
									for module in self.unet.modules():
											if (
											    hasattr(UpperCamelCase_    ,						'''_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(UpperCamelCase_							)
							def __call__(							self:	str    ,						UpperCamelCase_:	Union[str, List[str]]    ,						UpperCamelCase_:	Union[torch.FloatTensor, List[torch.FloatTensor]]    ,						UpperCamelCase_:	Union[torch.FloatTensor, List[torch.FloatTensor]]    ,						UpperCamelCase_:	Optional[Union[str, List[str]]] = None    ,						UpperCamelCase_:	int = 512    ,						UpperCamelCase_:	int = 512    ,						UpperCamelCase_:	int = 100    ,						UpperCamelCase_:	float = 4.0    ,						UpperCamelCase_:	int = 1    ,						UpperCamelCase_:	Optional[Union[torch.Generator, List[torch.Generator]]] = None    ,						UpperCamelCase_:	Optional[torch.FloatTensor] = None    ,						UpperCamelCase_:	Optional[str] = "pil"    ,						UpperCamelCase_:	bool = True    ,						)			->   Tuple:





									"""simple docstring"""







									if isinstance(UpperCamelCase_    ,						UpperCamelCase_							):
											lowercase__            =      1
									elif isinstance(UpperCamelCase_    ,						UpperCamelCase_							):
											lowercase__            =      len(UpperCamelCase_							)
									else:
											raise ValueError(f'`prompt` has to be of type `str` or `list` but is {type(UpperCamelCase_							)}'							)

									lowercase__            =      self._execution_device

									lowercase__            =      batch_size * num_images_per_prompt
									lowercase__            =      guidance_scale > 1.0

									lowercase__            =      self._encode_prompt(
									    UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_							)

									if isinstance(UpperCamelCase_    ,						UpperCamelCase_							):
											lowercase__            =      torch.cat(UpperCamelCase_    ,						dim=0							)
									if isinstance(UpperCamelCase_    ,						UpperCamelCase_							):
											lowercase__            =      torch.cat(UpperCamelCase_    ,						dim=0							)

									if do_classifier_free_guidance:
											lowercase__            =      image_embeds.repeat_interleave(UpperCamelCase_    ,						dim=0							)
											lowercase__            =      negative_image_embeds.repeat_interleave(UpperCamelCase_    ,						dim=0							)

									lowercase__            =      torch.cat([negative_image_embeds, image_embeds]    ,						dim=0							).to(
									    dtype=prompt_embeds.dtype    ,						device=UpperCamelCase_							)

									self.scheduler.set_timesteps(UpperCamelCase_    ,						device=UpperCamelCase_							)
									lowercase__            =      self.scheduler.timesteps

									lowercase__            =      self.unet.config.in_channels

									lowercase__            =      get_new_h_w(UpperCamelCase_    ,						UpperCamelCase_    ,						self.movq_scale_factor							)

									# create initial latent
									lowercase__            =      self.prepare_latents(
									    (batch_size, num_channels_latents, height, width)    ,						text_encoder_hidden_states.dtype    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						self.scheduler    ,						)

									for i, t in enumerate(self.progress_bar(UpperCamelCase_							)							):
											# expand the latents if we are doing classifier free guidance
											lowercase__            =      torch.cat([latents] * 2							) if do_classifier_free_guidance else latents

											lowercase__            =      {"text_embeds": prompt_embeds, "image_embeds": image_embeds}
											lowercase__            =      self.unet(
											    sample=UpperCamelCase_    ,						timestep=UpperCamelCase_    ,						encoder_hidden_states=UpperCamelCase_    ,						added_cond_kwargs=UpperCamelCase_    ,						return_dict=UpperCamelCase_    ,						)[0]

											if do_classifier_free_guidance:
													lowercase__            =      noise_pred.split(latents.shape[1]    ,						dim=1							)
													lowercase__            =      noise_pred.chunk(2							)
													lowercase__            =      variance_pred.chunk(2							)
													lowercase__            =      noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)
													lowercase__            =      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"]
											):
													lowercase__            =      noise_pred.split(latents.shape[1]    ,						dim=1							)

											# compute the previous noisy sample x_t -> x_t-1
											lowercase__            =      self.scheduler.step(
											    UpperCamelCase_    ,						UpperCamelCase_    ,						UpperCamelCase_    ,						generator=UpperCamelCase_    ,						).prev_sample
									# post-processing
									lowercase__            =      self.movq.decode(UpperCamelCase_    ,						force_not_quantize=UpperCamelCase_							)["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"]:
											lowercase__            =      image * 0.5 + 0.5
											lowercase__            =      image.clamp(0    ,						1							)
											lowercase__            =      image.cpu().permute(0    ,						2    ,						3    ,						1							).float().numpy()

									if output_type == "pil":
											lowercase__            =      self.numpy_to_pil(UpperCamelCase_							)

									if not return_dict:
											return (image,)

									return ImagePipelineOutput(images=UpperCamelCase_							)










from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_speech_available, is_torch_available


lowerCamelCase	:							int				={
    '''configuration_audio_spectrogram_transformer''': [
        '''AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP''',
        '''ASTConfig''',
    ]
}

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase	:							Union[str, Any]				=[
     '''AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST''',
     '''ASTForAudioClassification''',
     '''ASTModel''',
     '''ASTPreTrainedModel''',
 ]

try:
 if not is_speech_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase	:							Optional[int]				=['''ASTFeatureExtractor''']

if TYPE_CHECKING:
 from .configuration_audio_spectrogram_transformer import (
     AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP,
     ASTConfig,
 )

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_audio_spectrogram_transformer import (
      AUDIO_SPECTROGRAM_TRANSFORMER_PRETRAINED_MODEL_ARCHIVE_LIST,
      ASTForAudioClassification,
      ASTModel,
      ASTPreTrainedModel,
  )

 try:
  if not is_speech_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .feature_extraction_audio_spectrogram_transformer import ASTFeatureExtractor


else:
 import sys

 lowerCamelCase	:							Optional[int]				=_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)