





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


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

UpperCamelCase_												=	'\n    Examples:\n        ```py\n        >>> from diffusers import KandinskyPipeline, KandinskyPriorPipeline\n        >>> import torch\n\n        >>> pipe_prior = KandinskyPriorPipeline.from_pretrained("kandinsky-community/Kandinsky-2-1-prior")\n        >>> pipe_prior.to("cuda")\n\n        >>> prompt = "red cat, 4k photo"\n        >>> out = pipe_prior(prompt)\n        >>> image_emb = out.image_embeds\n        >>> negative_image_emb = out.negative_image_embeds\n\n        >>> pipe = KandinskyPipeline.from_pretrained("kandinsky-community/kandinsky-2-1")\n        >>> pipe.to("cuda")\n\n        >>> image = pipe(\n        ...     prompt,\n        ...     image_embeds=image_emb,\n        ...     negative_image_embeds=negative_image_emb,\n        ...     height=768,\n        ...     width=768,\n        ...     num_inference_steps=100,\n        ... ).images\n\n        >>> image[0].save("cat.png")\n        ```\n'






def 				_UpperCAmelCase			(    A				,							A				,							A=8     ):




   '''simple docstring'''

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




class     snake_case_		(   a_							):






 '''simple docstring'''





 def __init__(  self,		A_,		A_,		A_,		A_,		A_,		)	->       str:
    super().__init__()

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

 def  __UpperCAmelCase						(  self,		A_,		A_,		A_,		A_,		A_,		A_		)	->       int:
    if latents is None:
       UpperCAmelCase__						=randn_tensor(lowerCAmelCase_,		generator=lowerCAmelCase_,		device=lowerCAmelCase_,		dtype=lowerCAmelCase_		)
    else:
       if latents.shape != shape:
          raise ValueError(f"""Unexpected latents shape, got {latents.shape}, expected {shape}"""		)
       UpperCAmelCase__						=latents.to(lowerCAmelCase_		)

    UpperCAmelCase__						=latents * scheduler.init_noise_sigma
    return latents

 def  __UpperCAmelCase						(  self,		A_,		A_,		A_,		A_,		A_=None,		)	->       Union[str, Any]:
    UpperCAmelCase__						=len(lowerCAmelCase_		) if isinstance(lowerCAmelCase_,		lowerCAmelCase_		) else 1
    # get prompt text embeddings
    UpperCAmelCase__						=self.tokenizer(
        lowerCAmelCase_,		padding="max_length",		truncation=lowerCAmelCase_,		max_length=77,		return_attention_mask=lowerCAmelCase_,		add_special_tokens=lowerCAmelCase_,		return_tensors="pt",		)

    UpperCAmelCase__						=text_inputs.input_ids
    UpperCAmelCase__						=self.tokenizer(lowerCAmelCase_,		padding="longest",		return_tensors="pt"		).input_ids

    if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal(lowerCAmelCase_,		lowerCAmelCase_		):
       UpperCAmelCase__						=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}"""		)

    UpperCAmelCase__						=text_input_ids.to(lowerCAmelCase_		)
    UpperCAmelCase__						=text_inputs.attention_mask.to(lowerCAmelCase_		)

    UpperCAmelCase__			,							UpperCAmelCase__						=self.text_encoder(
        input_ids=lowerCAmelCase_,		attention_mask=lowerCAmelCase_		)

    UpperCAmelCase__						=prompt_embeds.repeat_interleave(lowerCAmelCase_,		dim=0		)
    UpperCAmelCase__						=text_encoder_hidden_states.repeat_interleave(lowerCAmelCase_,		dim=0		)
    UpperCAmelCase__						=text_mask.repeat_interleave(lowerCAmelCase_,		dim=0		)

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

       UpperCAmelCase__						=self.tokenizer(
           lowerCAmelCase_,		padding="max_length",		max_length=77,		truncation=lowerCAmelCase_,		return_attention_mask=lowerCAmelCase_,		add_special_tokens=lowerCAmelCase_,		return_tensors="pt",		)
       UpperCAmelCase__						=uncond_input.input_ids.to(lowerCAmelCase_		)
       UpperCAmelCase__						=uncond_input.attention_mask.to(lowerCAmelCase_		)

       UpperCAmelCase__			,							UpperCAmelCase__						=self.text_encoder(
           input_ids=lowerCAmelCase_,		attention_mask=lowerCAmelCase_		)

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

       UpperCAmelCase__						=negative_prompt_embeds.shape[1]
       UpperCAmelCase__						=negative_prompt_embeds.repeat(1,		lowerCAmelCase_		)
       UpperCAmelCase__						=negative_prompt_embeds.view(batch_size * num_images_per_prompt,		lowerCAmelCase_		)

       UpperCAmelCase__						=uncond_text_encoder_hidden_states.shape[1]
       UpperCAmelCase__						=uncond_text_encoder_hidden_states.repeat(1,		lowerCAmelCase_,		1		)
       UpperCAmelCase__						=uncond_text_encoder_hidden_states.view(
           batch_size * num_images_per_prompt,		lowerCAmelCase_,		-1		)
       UpperCAmelCase__						=uncond_text_mask.repeat_interleave(lowerCAmelCase_,		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
       UpperCAmelCase__						=torch.cat([negative_prompt_embeds, prompt_embeds]		)
       UpperCAmelCase__						=torch.cat([uncond_text_encoder_hidden_states, text_encoder_hidden_states]		)

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

    return prompt_embeds, text_encoder_hidden_states, text_mask

 def  __UpperCAmelCase						(  self,		A_=0		)	->       int:
    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.text_encoder,
        self.movq,
    ]
    for cpu_offloaded_model in models:
       if cpu_offloaded_model is not None:
          cpu_offload(lowerCAmelCase_,		lowerCAmelCase_		)

 def  __UpperCAmelCase						(  self,		A_=0		)	->       str:
    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=lowerCAmelCase_		)
       torch.cuda.empty_cache()  # otherwise we don't see the memory savings (but they probably exist)

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

    if self.safety_checker is not None:
       UpperCAmelCase__			,							UpperCAmelCase__						=cpu_offload_with_hook(self.safety_checker,		lowerCAmelCase_,		prev_module_hook=lowerCAmelCase_		)

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

 @property
 # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device
 def  __UpperCAmelCase						(  self		)	->       Optional[Any]:
    if not hasattr(self.unet,		"_hf_hook"		):
       return self.device
    for module in self.unet.modules():
       if (
           hasattr(lowerCAmelCase_,		"_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(lowerCAmelCase_		)
 def __call__(  self,		A_,		A_,		A_,		A_ = None,		A_ = 512,		A_ = 512,		A_ = 100,		A_ = 4.0,		A_ = 1,		A_ = None,		A_ = None,		A_ = "pil",		A_ = True,		)	->       Optional[Any]:

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

    UpperCAmelCase__						=self._execution_device

    UpperCAmelCase__						=batch_size * num_images_per_prompt
    UpperCAmelCase__						=guidance_scale > 1.0

    UpperCAmelCase__			,							UpperCAmelCase__			,							UpperCAmelCase__						=self._encode_prompt(
        lowerCAmelCase_,		lowerCAmelCase_,		lowerCAmelCase_,		lowerCAmelCase_,		lowerCAmelCase_		)

    if isinstance(lowerCAmelCase_,		lowerCAmelCase_		):
       UpperCAmelCase__						=torch.cat(lowerCAmelCase_,		dim=0		)
    if isinstance(lowerCAmelCase_,		lowerCAmelCase_		):
       UpperCAmelCase__						=torch.cat(lowerCAmelCase_,		dim=0		)

    if do_classifier_free_guidance:
       UpperCAmelCase__						=image_embeds.repeat_interleave(lowerCAmelCase_,		dim=0		)
       UpperCAmelCase__						=negative_image_embeds.repeat_interleave(lowerCAmelCase_,		dim=0		)

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

    self.scheduler.set_timesteps(lowerCAmelCase_,		device=lowerCAmelCase_		)
    UpperCAmelCase__						=self.scheduler.timesteps

    UpperCAmelCase__						=self.unet.config.in_channels

    UpperCAmelCase__			,							UpperCAmelCase__						=get_new_h_w(lowerCAmelCase_,		lowerCAmelCase_,		self.movq_scale_factor		)

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

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

       UpperCAmelCase__						={"text_embeds": prompt_embeds, "image_embeds": image_embeds}
       UpperCAmelCase__						=self.unet(
           sample=lowerCAmelCase_,		timestep=lowerCAmelCase_,		encoder_hidden_states=lowerCAmelCase_,		added_cond_kwargs=lowerCAmelCase_,		return_dict=lowerCAmelCase_,		)[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(
           lowerCAmelCase_,		lowerCAmelCase_,		lowerCAmelCase_,		generator=lowerCAmelCase_,		).prev_sample
    # post-processing
    UpperCAmelCase__						=self.movq.decode(lowerCAmelCase_,		force_not_quantize=lowerCAmelCase_		)["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(lowerCAmelCase_		)

    if not return_dict:
       return (image,)

    return ImagePipelineOutput(images=lowerCAmelCase_		)







'''simple docstring'''





import re

from filelock import FileLock


try:
					import nltk

					UpperCAmelCase__  			=				True
except (ImportError, ModuleNotFoundError):
					UpperCAmelCase__  			=				False

if NLTK_AVAILABLE:
					with FileLock('''.lock''') as lock:
										nltk.download('''punkt''', quiet=True)






def 						UpperCAmelCase__(				_SCREAMING_SNAKE_CASE					: str ):






			"""simple docstring"""




			re.sub('<n>','',_SCREAMING_SNAKE_CASE )  # remove pegasus newline char
			assert NLTK_AVAILABLE, "nltk must be installed to separate newlines between sentences. (pip install nltk)"
			return "\n".join(nltk.sent_tokenize(_SCREAMING_SNAKE_CASE ) )



