





'''simple docstring'''

from typing import Callable, List, Optional, Union

import torch

from ...models import UNetaDModel
from ...schedulers import CMStochasticIterativeScheduler
from ...utils import (
    is_accelerate_available,
    is_accelerate_version,
    logging,
    randn_tensor,
    replace_example_docstring,
)
from ..pipeline_utils import DiffusionPipeline, ImagePipelineOutput


lowerCAmelCase__	:					Optional[Any]	     =       logging.get_logger(__name__)  # pylint: disable=invalid-name


lowerCAmelCase__	:					Tuple	     =       "\n    Examples:\n        ```py\n        >>> import torch\n\n        >>> from diffusers import ConsistencyModelPipeline\n\n        >>> device = \"cuda\"\n        >>> # Load the cd_imagenet64_l2 checkpoint.\n        >>> model_id_or_path = \"openai/diffusers-cd_imagenet64_l2\"\n        >>> pipe = ConsistencyModelPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)\n        >>> pipe.to(device)\n\n        >>> # Onestep Sampling\n        >>> image = pipe(num_inference_steps=1).images[0]\n        >>> image.save(\"cd_imagenet64_l2_onestep_sample.png\")\n\n        >>> # Onestep sampling, class-conditional image generation\n        >>> # ImageNet-64 class label 145 corresponds to king penguins\n        >>> image = pipe(num_inference_steps=1, class_labels=145).images[0]\n        >>> image.save(\"cd_imagenet64_l2_onestep_sample_penguin.png\")\n\n        >>> # Multistep sampling, class-conditional image generation\n        >>> # Timesteps can be explicitly specified; the particular timesteps below are from the original Github repo:\n        >>> # https://github.com/openai/consistency_models/blob/main/scripts/launch.sh#L77\n        >>> image = pipe(num_inference_steps=None, timesteps=[22, 0], class_labels=145).images[0]\n        >>> image.save(\"cd_imagenet64_l2_multistep_sample_penguin.png\")\n        ```\n"


class 			SCREAMING_SNAKE_CASE__	(					lowerCamelCase__						):







					"""simple docstring"""






					def __init__(					self    :	Tuple						,     UpperCAmelCase_    :	Union[str, Any]						,     UpperCAmelCase_    :	List[str]						):







							"""simple docstring"""
							super().__init__()

							self.register_modules(
							    unet=_UpperCAmelCase						,     scheduler=_UpperCAmelCase						,     )

							__UpperCAmelCase     :				Union[str, Any]					   =			None
					def 						lowerCamelCase_					(					self    :	Optional[int]						,     UpperCAmelCase_    :	Union[str, Any]=0						):







							"""simple docstring"""
							if is_accelerate_available() and is_accelerate_version(">="						,     "0.14.0"						):
									from accelerate import cpu_offload
							else:
									raise ImportError("`enable_sequential_cpu_offload` requires `accelerate v0.14.0` or higher"						)

							__UpperCAmelCase     :				List[Any]					   =			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)

							for cpu_offloaded_model in [self.unet]:
									cpu_offload(_UpperCAmelCase						,     _UpperCAmelCase						)

							if self.safety_checker is not None:
									cpu_offload(self.safety_checker						,     execution_device=_UpperCAmelCase						,     offload_buffers=_UpperCAmelCase						)
					def 						lowerCamelCase_					(					self    :	Union[str, Any]						,     UpperCAmelCase_    :	Tuple=0						):







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

							__UpperCAmelCase     :				Tuple					   =			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)

							__UpperCAmelCase     :				List[str]					   =			None
							for cpu_offloaded_model in [self.unet]:
									__UpperCAmelCase   ,       __UpperCAmelCase     :				Dict					   =			cpu_offload_with_hook(_UpperCAmelCase						,     _UpperCAmelCase						,     prev_module_hook=_UpperCAmelCase						)

							if self.safety_checker is not None:
									__UpperCAmelCase   ,       __UpperCAmelCase     :				List[str]					   =			cpu_offload_with_hook(self.safety_checker						,     _UpperCAmelCase						,     prev_module_hook=_UpperCAmelCase						)

							# We'll offload the last model manually.
							__UpperCAmelCase     :				int					   =			hook
					@property
					# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device
					def 						lowerCamelCase_					(					self    :	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
					def 						lowerCamelCase_					(					self    :	List[Any]						,     UpperCAmelCase_    :	Tuple						,     UpperCAmelCase_    :	Optional[Any]						,     UpperCAmelCase_    :	List[str]						,     UpperCAmelCase_    :	Optional[int]						,     UpperCAmelCase_    :	Dict						,     UpperCAmelCase_    :	Optional[int]						,     UpperCAmelCase_    :	Optional[Any]						,     UpperCAmelCase_    :	str=None						):







							"""simple docstring"""
							__UpperCAmelCase     :				Optional[Any]					   =			(batch_size, num_channels, height, width)
							if isinstance(_UpperCAmelCase						,     _UpperCAmelCase						) and len(_UpperCAmelCase						) != batch_size:
									raise ValueError(
									    f"You have passed a list of generators of length {len(_UpperCAmelCase						)}, but requested an effective batch"
									    f" size of {batch_size}. Make sure the batch size matches the length of the generators."						)

							if latents is None:
									__UpperCAmelCase     :				Optional[int]					   =			randn_tensor(_UpperCAmelCase						,     generator=_UpperCAmelCase						,     device=_UpperCAmelCase						,     dtype=_UpperCAmelCase						)
							else:
									__UpperCAmelCase     :				Dict					   =			latents.to(device=_UpperCAmelCase						,     dtype=_UpperCAmelCase						)

							# scale the initial noise by the standard deviation required by the scheduler
							__UpperCAmelCase     :				Optional[int]					   =			latents * self.scheduler.init_noise_sigma
							return latents
					def 						lowerCamelCase_					(					self    :	Union[str, Any]						,     UpperCAmelCase_    :	List[str]						,     UpperCAmelCase_    :	Optional[int] = "pil"						):







							"""simple docstring"""
							if output_type not in ["pt", "np", "pil"]:
									raise ValueError(
									    f"output_type={output_type} is not supported. Make sure to choose one of [\'pt\', \'np\', or \'pil\']"						)

							# Equivalent to diffusers.VaeImageProcessor.denormalize
							__UpperCAmelCase     :				Union[str, Any]					   =			(sample / 2 + 0.5).clamp(0						,     1						)
							if output_type == "pt":
									return sample

							# Equivalent to diffusers.VaeImageProcessor.pt_to_numpy
							__UpperCAmelCase     :				Optional[int]					   =			sample.cpu().permute(0						,     2						,     3						,     1						).numpy()
							if output_type == "np":
									return sample

							# Output_type must be 'pil'
							__UpperCAmelCase     :				List[str]					   =			self.numpy_to_pil(_UpperCAmelCase						)
							return sample
					def 						lowerCamelCase_					(					self    :	Dict						,     UpperCAmelCase_    :	Any						,     UpperCAmelCase_    :	int						,     UpperCAmelCase_    :	Dict=None						):







							"""simple docstring"""
							if self.unet.config.num_class_embeds is not None:
									if isinstance(_UpperCAmelCase						,     _UpperCAmelCase						):
											__UpperCAmelCase     :				Union[str, Any]					   =			torch.tensor(_UpperCAmelCase						,     dtype=torch.int						)
									elif isinstance(_UpperCAmelCase						,     _UpperCAmelCase						):
											assert batch_size == 1, "Batch size must be 1 if classes is an int"
											__UpperCAmelCase     :				List[str]					   =			torch.tensor([class_labels]						,     dtype=torch.int						)
									elif class_labels is None:
											# Randomly generate batch_size class labels
											# TODO: should use generator here? int analogue of randn_tensor is not exposed in ...utils
											__UpperCAmelCase     :				List[str]					   =			torch.randint(0						,     self.unet.config.num_class_embeds						,     size=(batch_size,)						)
									__UpperCAmelCase     :				Optional[int]					   =			class_labels.to(_UpperCAmelCase						)
							else:
									__UpperCAmelCase     :				Dict					   =			None
							return class_labels
					def 						lowerCamelCase_					(					self    :	Tuple						,     UpperCAmelCase_    :	Tuple						,     UpperCAmelCase_    :	Tuple						,     UpperCAmelCase_    :	Optional[Any]						,     UpperCAmelCase_    :	Dict						,     UpperCAmelCase_    :	Optional[Any]						,     UpperCAmelCase_    :	int						):







							"""simple docstring"""
							if num_inference_steps is None and timesteps is None:
									raise ValueError("Exactly one of `num_inference_steps` or `timesteps` must be supplied."						)

							if num_inference_steps is not None and timesteps is not None:
									logger.warning(
									    f"Both `num_inference_steps`: {num_inference_steps} and `timesteps`: {timesteps} are supplied;"
									    " `timesteps` will be used over `num_inference_steps`."						)

							if latents is not None:
									__UpperCAmelCase     :				List[Any]					   =			(batch_size, 3, img_size, img_size)
									if latents.shape != expected_shape:
											raise ValueError(f"The shape of latents is {latents.shape} but is expected to be {expected_shape}."						)

							if (callback_steps is None) or (
							    callback_steps is not None and (not isinstance(_UpperCAmelCase						,     _UpperCAmelCase						) or callback_steps <= 0)
							):
									raise ValueError(
									    f"`callback_steps` has to be a positive integer but is {callback_steps} of type"
									    f" {type(_UpperCAmelCase						)}."						)






					@torch.no_grad()
					@replace_example_docstring(_UpperCAmelCase						)
					def __call__(					self    :	str						,     UpperCAmelCase_    :	Union[str, Any] = 1						,     UpperCAmelCase_    :	Optional[Any] = None						,     UpperCAmelCase_    :	Tuple = 1						,     UpperCAmelCase_    :	Optional[int] = None						,     UpperCAmelCase_    :	str = None						,     UpperCAmelCase_    :	Optional[int] = None						,     UpperCAmelCase_    :	List[Any] = "pil"						,     UpperCAmelCase_    :	int = True						,     UpperCAmelCase_    :	Optional[Any] = None						,     UpperCAmelCase_    :	Union[str, Any] = 1						,     ):







							"""simple docstring"""
							__UpperCAmelCase     :				Union[str, Any]					   =			self.unet.config.sample_size
							__UpperCAmelCase     :				List[Any]					   =			self._execution_device

							# 1. Check inputs
							self.check_inputs(_UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						)

							# 2. Prepare image latents
							# Sample image latents x_0 ~ N(0, sigma_0^2 * I)
							__UpperCAmelCase     :				int					   =			self.prepare_latents(
							    batch_size=_UpperCAmelCase						,     num_channels=self.unet.config.in_channels						,     height=_UpperCAmelCase						,     width=_UpperCAmelCase						,     dtype=self.unet.dtype						,     device=_UpperCAmelCase						,     generator=_UpperCAmelCase						,     latents=_UpperCAmelCase						,     )

							# 3. Handle class_labels for class-conditional models
							__UpperCAmelCase     :				Dict					   =			self.prepare_class_labels(_UpperCAmelCase						,     _UpperCAmelCase						,     class_labels=_UpperCAmelCase						)

							# 4. Prepare timesteps
							if timesteps is not None:
									self.scheduler.set_timesteps(timesteps=_UpperCAmelCase						,     device=_UpperCAmelCase						)
									__UpperCAmelCase     :				Dict					   =			self.scheduler.timesteps
									__UpperCAmelCase     :				int					   =			len(_UpperCAmelCase						)
							else:
									self.scheduler.set_timesteps(_UpperCAmelCase						)
									__UpperCAmelCase     :				str					   =			self.scheduler.timesteps

							# 5. Denoising loop
							# Multistep sampling: implements Algorithm 1 in the paper
							with self.progress_bar(total=_UpperCAmelCase						) as progress_bar:
									for i, t in enumerate(_UpperCAmelCase						):
											__UpperCAmelCase     :				List[str]					   =			self.scheduler.scale_model_input(_UpperCAmelCase						,     _UpperCAmelCase						)
											__UpperCAmelCase     :				Any					   =			self.unet(_UpperCAmelCase						,     _UpperCAmelCase						,     class_labels=_UpperCAmelCase						,     return_dict=_UpperCAmelCase						)[0]

											__UpperCAmelCase     :				List[Any]					   =			self.scheduler.step(_UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						,     generator=_UpperCAmelCase						)[0]

											# call the callback, if provided
											progress_bar.update()
											if callback is not None and i % callback_steps == 0:
													callback(_UpperCAmelCase						,     _UpperCAmelCase						,     _UpperCAmelCase						)

        # 6. Post-process image sample
							__UpperCAmelCase     :				int					   =			self.postprocess_image(_UpperCAmelCase						,     output_type=_UpperCAmelCase						)

							# Offload last model to CPU
							if hasattr(self						,     "final_offload_hook"						) and self.final_offload_hook is not None:
									self.final_offload_hook.offload()

							if not return_dict:
									return (image,)

							return ImagePipelineOutput(images=_UpperCAmelCase						)








import os

from packaging import version

from .. import __version__
from .accelerate_utils import apply_forward_hook
from .constants import (
    CONFIG_NAME,
    DEPRECATED_REVISION_ARGS,
    DIFFUSERS_CACHE,
    DIFFUSERS_DYNAMIC_MODULE_NAME,
    FLAX_WEIGHTS_NAME,
    HF_MODULES_CACHE,
    HUGGINGFACE_CO_RESOLVE_ENDPOINT,
    ONNX_EXTERNAL_WEIGHTS_NAME,
    ONNX_WEIGHTS_NAME,
    SAFETENSORS_WEIGHTS_NAME,
    TEXT_ENCODER_ATTN_MODULE,
    WEIGHTS_NAME,
)
from .deprecation_utils import deprecate
from .doc_utils import replace_example_docstring
from .dynamic_modules_utils import get_class_from_dynamic_module
from .hub_utils import (
    HF_HUB_OFFLINE,
    _add_variant,
    _get_model_file,
    extract_commit_hash,
    http_user_agent,
)
from .import_utils import (
    BACKENDS_MAPPING,
    ENV_VARS_TRUE_AND_AUTO_VALUES,
    ENV_VARS_TRUE_VALUES,
    USE_JAX,
    USE_TF,
    USE_TORCH,
    DummyObject,
    OptionalDependencyNotAvailable,
    is_accelerate_available,
    is_accelerate_version,
    is_bsa_available,
    is_flax_available,
    is_ftfy_available,
    is_inflect_available,
    is_invisible_watermark_available,
    is_k_diffusion_available,
    is_k_diffusion_version,
    is_librosa_available,
    is_note_seq_available,
    is_omegaconf_available,
    is_onnx_available,
    is_safetensors_available,
    is_scipy_available,
    is_tensorboard_available,
    is_tf_available,
    is_torch_available,
    is_torch_version,
    is_torchsde_available,
    is_transformers_available,
    is_transformers_version,
    is_unidecode_available,
    is_wandb_available,
    is_xformers_available,
    requires_backends,
)
from .logging import get_logger
from .outputs import BaseOutput
from .pil_utils import PIL_INTERPOLATION, numpy_to_pil, pt_to_pil
from .torch_utils import is_compiled_module, randn_tensor


if is_torch_available():
   from .testing_utils import (
       floats_tensor,
       load_hf_numpy,
       load_image,
       load_numpy,
       load_pt,
       nightly,
       parse_flag_from_env,
       print_tensor_test,
       require_torch_a,
       require_torch_gpu,
       skip_mps,
       slow,
       torch_all_close,
       torch_device,
   )
   from .torch_utils import maybe_allow_in_graph

from .testing_utils import export_to_gif, export_to_video


UpperCAmelCase			=    get_logger(__name__)






def        __lowerCAmelCase    (SCREAMING_SNAKE_CASE					)->  Tuple:




      """simple docstring"""

      if version.parse(SCREAMING_SNAKE_CASE					) < version.parse(SCREAMING_SNAKE_CASE					):
            if "dev" in min_version:
                  snake_case_       =      (
                      '''This example requires a source install from HuggingFace diffusers (see '''
                      '''`https://huggingface.co/docs/diffusers/installation#install-from-source`),'''
                  )
            else:
                  snake_case_       =      f'''This example requires a minimum version of {min_version},'''
            error_message += f''' but the version found is {__version__}.\n'''
            raise ImportError(SCREAMING_SNAKE_CASE					)