



"""simple docstring"""







import gc
import random
import tempfile
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMInverseScheduler,
    DDIMScheduler,
    DPMSolverMultistepInverseScheduler,
    DPMSolverMultistepScheduler,
    StableDiffusionDiffEditPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import load_image, slow
from diffusers.utils.testing_utils import enable_full_determinism, floats_tensor, require_torch_gpu, torch_device

from ..pipeline_params import TEXT_GUIDED_IMAGE_INPAINTING_BATCH_PARAMS, TEXT_GUIDED_IMAGE_INPAINTING_PARAMS
from ..test_pipelines_common import PipelineLatentTesterMixin, PipelineTesterMixin


enable_full_determinism()

class       _a  ( SCREAMING_SNAKE_CASE__     ,	SCREAMING_SNAKE_CASE__     ,	unittest.TestCase):
			__magic_name__     					=     StableDiffusionDiffEditPipeline
			__magic_name__     					=     TEXT_GUIDED_IMAGE_INPAINTING_PARAMS - {"""height""", """width""", """image"""} | {"""image_latents"""}
			__magic_name__     					=     TEXT_GUIDED_IMAGE_INPAINTING_BATCH_PARAMS - {"""image"""} | {"""image_latents"""}
			__magic_name__     					=     frozenset(
			    [])  # TO-DO: update image_params once pipeline is refactored with VaeImageProcessor.preprocess
			__magic_name__     					=     frozenset([])



			def 				__lowercase					(			self							:				List[str]		)							->					Any:
									torch.manual_seed(0		)
									snake_case   :			Dict						    = UNetaDConditionModel(
									    block_out_channels=(32, 64)   ,	layers_per_block=2   ,	sample_size=32   ,	in_channels=4   ,	out_channels=4   ,	down_block_types=("DownBlock2D", "CrossAttnDownBlock2D")   ,	up_block_types=("CrossAttnUpBlock2D", "UpBlock2D")   ,	cross_attention_dim=32   ,	attention_head_dim=(2, 4)   ,	use_linear_projection=_lowercase   ,	)
									snake_case   :			Dict						    = DDIMScheduler(
									    beta_start=0.00085   ,	beta_end=0.012   ,	beta_schedule="scaled_linear"   ,	clip_sample=_lowercase   ,	set_alpha_to_one=_lowercase   ,	)
									snake_case   :			Any						    = DDIMInverseScheduler(
									    beta_start=0.00085   ,	beta_end=0.012   ,	beta_schedule="scaled_linear"   ,	clip_sample=_lowercase   ,	set_alpha_to_zero=_lowercase   ,	)
									torch.manual_seed(0		)
									snake_case   :			int						    = AutoencoderKL(
									    block_out_channels=[32, 64]   ,	in_channels=3   ,	out_channels=3   ,	down_block_types=["DownEncoderBlock2D", "DownEncoderBlock2D"]   ,	up_block_types=["UpDecoderBlock2D", "UpDecoderBlock2D"]   ,	latent_channels=4   ,	sample_size=128   ,	)
									torch.manual_seed(0		)
									snake_case   :			Optional[int]						    = CLIPTextConfig(
									    bos_token_id=0   ,	eos_token_id=2   ,	hidden_size=32   ,	intermediate_size=37   ,	layer_norm_eps=1E-05   ,	num_attention_heads=4   ,	num_hidden_layers=5   ,	pad_token_id=1   ,	vocab_size=1000   ,	hidden_act="gelu"   ,	projection_dim=512   ,	)
									snake_case   :			Union[str, Any]						    = CLIPTextModel(_lowercase		)
									snake_case   :			Tuple						    = CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"		)

									snake_case   :			Tuple						    = {
									    "unet": unet,
									    "scheduler": scheduler,
									    "inverse_scheduler": inverse_scheduler,
									    "vae": vae,
									    "text_encoder": text_encoder,
									    "tokenizer": tokenizer,
									    "safety_checker": None,
									    "feature_extractor": None,
									}

									return components



			def 				__lowercase					(			self							:				List[str]   ,	_lowercase							:				Union[str, Any]   ,	_lowercase							:				Optional[Any]=0		)							->					str:
									snake_case   :			List[Any]						    = floats_tensor((1, 16, 16)   ,	rng=random.Random(_lowercase		)		).to(_lowercase		)
									snake_case   :			Any						    = floats_tensor((1, 2, 4, 16, 16)   ,	rng=random.Random(_lowercase		)		).to(_lowercase		)
									if str(_lowercase		).startswith("mps"		):
															snake_case   :			int						    = torch.manual_seed(_lowercase		)
									else:
															snake_case   :			Optional[int]						    = torch.Generator(device=_lowercase		).manual_seed(_lowercase		)
									snake_case   :			Any						    = {
									    "prompt": "a dog and a newt",
									    "mask_image": mask,
									    "image_latents": latents,
									    "generator": generator,
									    "num_inference_steps": 2,
									    "inpaint_strength": 1.0,
									    "guidance_scale": 6.0,
									    "output_type": "numpy",
									}

									return inputs



			def 				__lowercase					(			self							:				Optional[int]   ,	_lowercase							:				List[str]   ,	_lowercase							:				str=0		)							->					Any:
									snake_case   :			Tuple						    = floats_tensor((1, 3, 32, 32)   ,	rng=random.Random(_lowercase		)		).to(_lowercase		)
									snake_case   :			str						    = image.cpu().permute(0   ,	2   ,	3   ,	1		)[0]
									snake_case   :			Union[str, Any]						    = Image.fromarray(np.uinta(_lowercase		)		).convert("RGB"		)
									if str(_lowercase		).startswith("mps"		):
															snake_case   :			Tuple						    = torch.manual_seed(_lowercase		)
									else:
															snake_case   :			List[Any]						    = torch.Generator(device=_lowercase		).manual_seed(_lowercase		)
									snake_case   :			Union[str, Any]						    = {
									    "image": image,
									    "source_prompt": "a cat and a frog",
									    "target_prompt": "a dog and a newt",
									    "generator": generator,
									    "num_inference_steps": 2,
									    "num_maps_per_mask": 2,
									    "mask_encode_strength": 1.0,
									    "guidance_scale": 6.0,
									    "output_type": "numpy",
									}

									return inputs



			def 				__lowercase					(			self							:				Any   ,	_lowercase							:				int   ,	_lowercase							:				Union[str, Any]=0		)							->					List[str]:
									snake_case   :			Dict						    = floats_tensor((1, 3, 32, 32)   ,	rng=random.Random(_lowercase		)		).to(_lowercase		)
									snake_case   :			Any						    = image.cpu().permute(0   ,	2   ,	3   ,	1		)[0]
									snake_case   :			Tuple						    = Image.fromarray(np.uinta(_lowercase		)		).convert("RGB"		)
									if str(_lowercase		).startswith("mps"		):
															snake_case   :			List[Any]						    = torch.manual_seed(_lowercase		)
									else:
															snake_case   :			List[Any]						    = torch.Generator(device=_lowercase		).manual_seed(_lowercase		)
									snake_case   :			str						    = {
									    "image": image,
									    "prompt": "a cat and a frog",
									    "generator": generator,
									    "num_inference_steps": 2,
									    "inpaint_strength": 1.0,
									    "guidance_scale": 6.0,
									    "decode_latents": True,
									    "output_type": "numpy",
									}
									return inputs



			def 				__lowercase					(			self							:				Optional[Any]		)							->					Tuple:
									if not hasattr(self.pipeline_class   ,	"_optional_components"		):
															return

									snake_case   :			Tuple						    = self.get_dummy_components()
									snake_case   :			str						    = self.pipeline_class(**_lowercase		)
									pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)

									# set all optional components to None and update pipeline config accordingly
									for optional_component in pipe._optional_components:
															setattr(_lowercase   ,	_lowercase   ,	_lowercase		)
									pipe.register_modules(**{optional_component: None for optional_component in pipe._optional_components}		)

									snake_case   :			Optional[Any]						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			Dict						    = pipe(**_lowercase		)[0]

									with tempfile.TemporaryDirectory() as tmpdir:
															pipe.save_pretrained(_lowercase		)
															snake_case   :			Tuple						    = self.pipeline_class.from_pretrained(_lowercase		)
															pipe_loaded.to(_lowercase		)
															pipe_loaded.set_progress_bar_config(disable=_lowercase		)

									for optional_component in pipe._optional_components:
															self.assertTrue(
															    getattr(_lowercase   ,	_lowercase		) is None   ,	F'''`{optional_component}` did not stay set to None after loading.'''   ,	)

									snake_case   :			Tuple						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			str						    = pipe_loaded(**_lowercase		)[0]

									snake_case   :			List[Any]						    = np.abs(output - output_loaded		).max()
									self.assertLess(_lowercase   ,	1E-4		)



			def 				__lowercase					(			self							:				Union[str, Any]		)							->					List[str]:
									snake_case   :			Tuple						    = "cpu"

									snake_case   :			Optional[int]						    = self.get_dummy_components()
									snake_case   :			List[str]						    = self.pipeline_class(**_lowercase		)
									pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			Tuple						    = self.get_dummy_mask_inputs(_lowercase		)
									snake_case   :			str						    = pipe.generate_mask(**_lowercase		)
									snake_case   :			Optional[Any]						    = mask[0, -3:, -3:]

									self.assertEqual(mask.shape   ,	(1, 16, 16)		)
									snake_case   :			str						    = np.array([0] * 9		)
									snake_case   :			Tuple						    = np.abs(mask_slice.flatten() - expected_slice		).max()
									self.assertLessEqual(_lowercase   ,	1E-3		)
									self.assertEqual(mask[0, -3, -4]   ,	0		)



			def 				__lowercase					(			self							:				str		)							->					int:
									snake_case   :			str						    = "cpu"

									snake_case   :			Optional[Any]						    = self.get_dummy_components()
									snake_case   :			Dict						    = self.pipeline_class(**_lowercase		)
									pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			int						    = self.get_dummy_inversion_inputs(_lowercase		)
									snake_case   :			Union[str, Any]						    = pipe.invert(**_lowercase		).images
									snake_case   :			Dict						    = image[0, -1, -3:, -3:]

									self.assertEqual(image.shape   ,	(2, 32, 32, 3)		)
									snake_case   :			Optional[int]						    = np.array(
									    [0.5150, 0.5134, 0.5043, 0.5376, 0.4694, 0.51050, 0.5015, 0.4407, 0.4799]   ,	)
									snake_case   :			List[Any]						    = np.abs(image_slice.flatten() - expected_slice		).max()
									self.assertLessEqual(_lowercase   ,	1E-3		)



			def 				__lowercase					(			self							:				Optional[Any]		)							->					Tuple:
									super().test_inference_batch_single_identical(expected_max_diff=5E-3		)



			def 				__lowercase					(			self							:				List[Any]		)							->					Optional[int]:
									snake_case   :			str						    = "cpu"

									snake_case   :			Optional[Any]						    = self.get_dummy_components()

									snake_case   :			Union[str, Any]						    = {"beta_start": 0.00085, "beta_end": 0.012, "beta_schedule": "scaled_linear"}
									snake_case   :			Tuple						    = DPMSolverMultistepScheduler(**_lowercase		)
									snake_case   :			int						    = DPMSolverMultistepInverseScheduler(**_lowercase		)

									snake_case   :			Union[str, Any]						    = self.pipeline_class(**_lowercase		)
									pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			str						    = self.get_dummy_inversion_inputs(_lowercase		)
									snake_case   :			Optional[Any]						    = pipe.invert(**_lowercase		).images
									snake_case   :			Optional[Any]						    = image[0, -1, -3:, -3:]

									self.assertEqual(image.shape   ,	(2, 32, 32, 3)		)
									snake_case   :			List[str]						    = np.array(
									    [0.5150, 0.5134, 0.5043, 0.5376, 0.4694, 0.51050, 0.5015, 0.4407, 0.4799]   ,	)
									snake_case   :			Optional[Any]						    = np.abs(image_slice.flatten() - expected_slice		).max()
									self.assertLessEqual(_lowercase   ,	1E-3		)



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



			def 				__lowercase					(			self							:				str		)							->					Optional[int]:
									super().tearDown()
									gc.collect()
									torch.cuda.empty_cache()



			@classmethod
			def 				__lowercase					(			cls							:				Optional[int]		)							->					Optional[Any]:
									snake_case   :			Any						    = load_image(
									    "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/diffedit/fruit.png"		)

									snake_case   :			str						    = raw_image.convert("RGB"		).resize((768, 768)		)

									snake_case   :			Tuple						    = raw_image



			def 				__lowercase					(			self							:				Tuple		)							->					int:
									snake_case   :			int						    = torch.manual_seed(0		)

									snake_case   :			List[Any]						    = StableDiffusionDiffEditPipeline.from_pretrained(
									    "stabilityai/stable-diffusion-2-1"   ,	safety_checker=_lowercase   ,	torch_dtype=torch.floataa		)
									snake_case   :			List[str]						    = DDIMScheduler.from_config(pipe.scheduler.config		)
									snake_case   :			int						    = DDIMInverseScheduler.from_config(pipe.scheduler.config		)
									pipe.enable_model_cpu_offload()
									pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			int						    = "a bowl of fruit"
									snake_case   :			Any						    = "a bowl of pears"

									snake_case   :			Tuple						    = pipe.generate_mask(
									    image=self.raw_image   ,	source_prompt=_lowercase   ,	target_prompt=_lowercase   ,	generator=_lowercase   ,	)

									snake_case   :			Any						    = pipe.invert(
									    prompt=_lowercase   ,	image=self.raw_image   ,	inpaint_strength=0.7   ,	generator=_lowercase		).latents

									snake_case   :			Any						    = pipe(
									    prompt=_lowercase   ,	mask_image=_lowercase   ,	image_latents=_lowercase   ,	generator=_lowercase   ,	negative_prompt=_lowercase   ,	inpaint_strength=0.7   ,	output_type="numpy"   ,	).images[0]

									snake_case   :			List[str]						    = (
									    np.array(
									        load_image(
									            "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
									            "/diffedit/pears.png"		).resize((768, 768)		)		)
									    / 255
									)
									assert np.abs((expected_image - image).max()		) < 5E-1



			def 				__lowercase					(			self							:				str		)							->					int:
									snake_case   :			Any						    = torch.manual_seed(0		)

									snake_case   :			List[str]						    = StableDiffusionDiffEditPipeline.from_pretrained(
									    "stabilityai/stable-diffusion-2-1"   ,	safety_checker=_lowercase   ,	torch_dtype=torch.floataa		)
									snake_case   :			Tuple						    = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config		)
									snake_case   :			str						    = DPMSolverMultistepInverseScheduler.from_config(pipe.scheduler.config		)
									pipe.enable_model_cpu_offload()
									pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			List[str]						    = "a bowl of fruit"
									snake_case   :			List[Any]						    = "a bowl of pears"

									snake_case   :			int						    = pipe.generate_mask(
									    image=self.raw_image   ,	source_prompt=_lowercase   ,	target_prompt=_lowercase   ,	generator=_lowercase   ,	)

									snake_case   :			List[str]						    = pipe.invert(
									    prompt=_lowercase   ,	image=self.raw_image   ,	inpaint_strength=0.7   ,	generator=_lowercase   ,	num_inference_steps=25   ,	).latents

									snake_case   :			str						    = pipe(
									    prompt=_lowercase   ,	mask_image=_lowercase   ,	image_latents=_lowercase   ,	generator=_lowercase   ,	negative_prompt=_lowercase   ,	inpaint_strength=0.7   ,	num_inference_steps=25   ,	output_type="numpy"   ,	).images[0]

									snake_case   :			Tuple						    = (
									    np.array(
									        load_image(
									            "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
									            "/diffedit/pears.png"		).resize((768, 768)		)		)
									    / 255
									)
									assert np.abs((expected_image - image).max()		) < 5E-1








"""simple docstring"""







import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    EulerAncestralDiscreteScheduler,
    LMSDiscreteScheduler,
    PNDMScheduler,
    StableDiffusionPanoramaPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu, skip_mps

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineLatentTesterMixin, PipelineTesterMixin


enable_full_determinism()

@skip_mps
class       _a  ( SCREAMING_SNAKE_CASE__     ,	SCREAMING_SNAKE_CASE__     ,	unittest.TestCase):
			__magic_name__     					=     StableDiffusionPanoramaPipeline
			__magic_name__     					=     TEXT_TO_IMAGE_PARAMS
			__magic_name__     					=     TEXT_TO_IMAGE_BATCH_PARAMS
			__magic_name__     					=     TEXT_TO_IMAGE_IMAGE_PARAMS
			__magic_name__     					=     TEXT_TO_IMAGE_IMAGE_PARAMS



			def 				__lowercase					(			self							:				Optional[int]		)							->					int:
									torch.manual_seed(0		)
									snake_case   :			Optional[Any]						    = UNetaDConditionModel(
									    block_out_channels=(32, 64)   ,	layers_per_block=1   ,	sample_size=32   ,	in_channels=4   ,	out_channels=4   ,	down_block_types=("DownBlock2D", "CrossAttnDownBlock2D")   ,	up_block_types=("CrossAttnUpBlock2D", "UpBlock2D")   ,	cross_attention_dim=32   ,	)
									snake_case   :			Tuple						    = DDIMScheduler()
									torch.manual_seed(0		)
									snake_case   :			List[Any]						    = AutoencoderKL(
									    block_out_channels=[32, 64]   ,	in_channels=3   ,	out_channels=3   ,	down_block_types=["DownEncoderBlock2D", "DownEncoderBlock2D"]   ,	up_block_types=["UpDecoderBlock2D", "UpDecoderBlock2D"]   ,	latent_channels=4   ,	)
									torch.manual_seed(0		)
									snake_case   :			str						    = CLIPTextConfig(
									    bos_token_id=0   ,	eos_token_id=2   ,	hidden_size=32   ,	intermediate_size=37   ,	layer_norm_eps=1E-05   ,	num_attention_heads=4   ,	num_hidden_layers=5   ,	pad_token_id=1   ,	vocab_size=1000   ,	)
									snake_case   :			int						    = CLIPTextModel(_lowercase		)
									snake_case   :			Union[str, Any]						    = CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"		)

									snake_case   :			Any						    = {
									    "unet": unet,
									    "scheduler": scheduler,
									    "vae": vae,
									    "text_encoder": text_encoder,
									    "tokenizer": tokenizer,
									    "safety_checker": None,
									    "feature_extractor": None,
									}
									return components



			def 				__lowercase					(			self							:				List[str]   ,	_lowercase							:				int   ,	_lowercase							:				Dict=0		)							->					Optional[int]:
									snake_case   :			Union[str, Any]						    = torch.manual_seed(_lowercase		)
									snake_case   :			str						    = {
									    "prompt": "a photo of the dolomites",
									    "generator": generator,
									    # Setting height and width to None to prevent OOMs on CPU.
									    "height": None,
									    "width": None,
									    "num_inference_steps": 1,
									    "guidance_scale": 6.0,
									    "output_type": "numpy",
									}
									return inputs



			def 				__lowercase					(			self							:				str		)							->					List[str]:
									snake_case   :			Any						    = "cpu"  # ensure determinism for the device-dependent torch.Generator
									snake_case   :			Dict						    = self.get_dummy_components()
									snake_case   :			Any						    = StableDiffusionPanoramaPipeline(**_lowercase		)
									snake_case   :			List[Any]						    = sd_pipe.to(_lowercase		)
									sd_pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			Optional[Any]						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			Union[str, Any]						    = sd_pipe(**_lowercase		).images
									snake_case   :			List[Any]						    = image[0, -3:, -3:, -1]
									assert image.shape == (1, 64, 64, 3)

									snake_case   :			List[Any]						    = np.array([0.6186, 0.5374, 0.4915, 0.4135, 0.4114, 0.4563, 0.5128, 0.4977, 0.4757]		)

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



			def 				__lowercase					(			self							:				int		)							->					Union[str, Any]:
									super().test_inference_batch_consistent(batch_sizes=[1, 2]		)



			def 				__lowercase					(			self							:				Tuple		)							->					Tuple:
									super().test_inference_batch_single_identical(batch_size=2   ,	expected_max_diff=3.25E-3		)



			def 				__lowercase					(			self							:				Any		)							->					List[Any]:
									snake_case   :			Any						    = "cpu"  # ensure determinism for the device-dependent torch.Generator
									snake_case   :			Union[str, Any]						    = self.get_dummy_components()
									snake_case   :			Tuple						    = StableDiffusionPanoramaPipeline(**_lowercase		)
									snake_case   :			Tuple						    = sd_pipe.to(_lowercase		)
									sd_pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			List[str]						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			int						    = "french fries"
									snake_case   :			Union[str, Any]						    = sd_pipe(**_lowercase   ,	negative_prompt=_lowercase		)
									snake_case   :			str						    = output.images
									snake_case   :			Optional[Any]						    = image[0, -3:, -3:, -1]

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

									snake_case   :			Union[str, Any]						    = np.array([0.6187, 0.5375, 0.4915, 0.4136, 0.4114, 0.4563, 0.5128, 0.4976, 0.4757]		)

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



			def 				__lowercase					(			self							:				str		)							->					Any:
									snake_case   :			Optional[Any]						    = "cpu"  # ensure determinism for the device-dependent torch.Generator
									snake_case   :			List[Any]						    = self.get_dummy_components()
									snake_case   :			List[Any]						    = StableDiffusionPanoramaPipeline(**_lowercase		)
									snake_case   :			int						    = sd_pipe.to(_lowercase		)
									sd_pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			Tuple						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			str						    = sd_pipe(**_lowercase   ,	view_batch_size=2		)
									snake_case   :			Optional[Any]						    = output.images
									snake_case   :			int						    = image[0, -3:, -3:, -1]

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

									snake_case   :			str						    = np.array([0.6187, 0.5375, 0.4915, 0.4136, 0.4114, 0.4563, 0.5128, 0.4976, 0.4757]		)

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



			def 				__lowercase					(			self							:				int		)							->					Optional[Any]:
									snake_case   :			Dict						    = "cpu"  # ensure determinism for the device-dependent torch.Generator
									snake_case   :			List[str]						    = self.get_dummy_components()
									snake_case   :			Any						    = EulerAncestralDiscreteScheduler(
									    beta_start=0.00085   ,	beta_end=0.012   ,	beta_schedule="scaled_linear"		)
									snake_case   :			List[str]						    = StableDiffusionPanoramaPipeline(**_lowercase		)
									snake_case   :			List[str]						    = sd_pipe.to(_lowercase		)
									sd_pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			List[Any]						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			Optional[Any]						    = sd_pipe(**_lowercase		).images
									snake_case   :			int						    = image[0, -3:, -3:, -1]

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

									snake_case   :			Tuple						    = np.array([0.4024, 0.6510, 0.4901, 0.5378, 0.5813, 0.5622, 0.4795, 0.4467, 0.4952]		)

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



			def 				__lowercase					(			self							:				Tuple		)							->					Union[str, Any]:
									snake_case   :			str						    = "cpu"  # ensure determinism for the device-dependent torch.Generator
									snake_case   :			str						    = self.get_dummy_components()
									snake_case   :			Optional[int]						    = PNDMScheduler(
									    beta_start=0.00085   ,	beta_end=0.012   ,	beta_schedule="scaled_linear"   ,	skip_prk_steps=_lowercase		)
									snake_case   :			Dict						    = StableDiffusionPanoramaPipeline(**_lowercase		)
									snake_case   :			Dict						    = sd_pipe.to(_lowercase		)
									sd_pipe.set_progress_bar_config(disable=_lowercase		)

									snake_case   :			Dict						    = self.get_dummy_inputs(_lowercase		)
									snake_case   :			Optional[int]						    = sd_pipe(**_lowercase		).images
									snake_case   :			str						    = image[0, -3:, -3:, -1]

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

									snake_case   :			Optional[int]						    = np.array([0.6391, 0.6291, 0.4861, 0.5134, 0.5552, 0.4578, 0.5032, 0.5023, 0.4539]		)

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



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



			def 				__lowercase					(			self							:				Union[str, Any]		)							->					str:
									super().tearDown()
									gc.collect()
									torch.cuda.empty_cache()



			def 				__lowercase					(			self							:				Dict   ,	_lowercase							:				Any=0		)							->					Optional[Any]:
									snake_case   :			Any						    = torch.manual_seed(_lowercase		)
									snake_case   :			Any						    = {
									    "prompt": "a photo of the dolomites",
									    "generator": generator,
									    "num_inference_steps": 3,
									    "guidance_scale": 7.5,
									    "output_type": "numpy",
									}
									return inputs



			def 				__lowercase					(			self							:				Optional[Any]		)							->					Union[str, Any]:
									snake_case   :			List[Any]						    = "stabilityai/stable-diffusion-2-base"
									snake_case   :			Dict						    = DDIMScheduler.from_pretrained(_lowercase   ,	subfolder="scheduler"		)
									snake_case   :			Any						    = StableDiffusionPanoramaPipeline.from_pretrained(_lowercase   ,	scheduler=_lowercase   ,	safety_checker=_lowercase		)
									pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)
									pipe.enable_attention_slicing()

									snake_case   :			str						    = self.get_inputs()
									snake_case   :			List[Any]						    = pipe(**_lowercase		).images
									snake_case   :			Optional[int]						    = image[0, -3:, -3:, -1].flatten()

									assert image.shape == (1, 512, 2048, 3)

									snake_case   :			List[str]						    = np.array(
									    [
									        0.36968392,
									        0.27025372,
									        0.32446766,
									        0.28379387,
									        0.36363274,
									        0.30733347,
									        0.27100027,
									        0.27054125,
									        0.25536096,
									    ]		)

									assert np.abs(expected_slice - image_slice		).max() < 1E-2



			def 				__lowercase					(			self							:				Tuple		)							->					List[str]:
									snake_case   :			List[str]						    = StableDiffusionPanoramaPipeline.from_pretrained(
									    "stabilityai/stable-diffusion-2-base"   ,	safety_checker=_lowercase		)
									snake_case   :			int						    = LMSDiscreteScheduler.from_config(pipe.scheduler.config		)
									pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)
									pipe.enable_attention_slicing()

									snake_case   :			Dict						    = self.get_inputs()
									snake_case   :			int						    = pipe(**_lowercase		).images
									snake_case   :			Optional[Any]						    = image[0, -3:, -3:, -1].flatten()

									assert image.shape == (1, 512, 2048, 3)

									snake_case   :			List[str]						    = np.array(
									    [
									        [
									            0.0,
									            0.0,
									            0.0,
									            0.0,
									            0.0,
									            0.0,
									            0.0,
									            0.0,
									            0.0,
									        ]
									    ]		)

									assert np.abs(expected_slice - image_slice		).max() < 1E-3



			def 				__lowercase					(			self							:				str		)							->					Any:
									snake_case   :			Any						    = 0

									def callback_fn(_lowercase							:				int   ,	_lowercase							:				int   ,	_lowercase							:				torch.FloatTensor		) -> None:
															snake_case   :			List[Any]						    = True
															nonlocal number_of_steps
															number_of_steps += 1
															if step == 1:
																					snake_case   :			List[Any]						    = latents.detach().cpu().numpy()
																					assert latents.shape == (1, 4, 64, 256)
																					snake_case   :			int						    = latents[0, -3:, -3:, -1]

																					snake_case   :			Tuple						    = np.array(
																					    [
																					        0.18681869,
																					        0.33907816,
																					        0.5361276,
																					        0.14432865,
																					        -0.02856611,
																					        -0.73941123,
																					        0.23397987,
																					        0.47322682,
																					        -0.37823164,
																					    ]		)
																					assert np.abs(latents_slice.flatten() - expected_slice		).max() < 5E-2
															elif step == 2:
																					snake_case   :			Union[str, Any]						    = latents.detach().cpu().numpy()
																					assert latents.shape == (1, 4, 64, 256)
																					snake_case   :			Tuple						    = latents[0, -3:, -3:, -1]

																					snake_case   :			Tuple						    = np.array(
																					    [
																					        0.18539645,
																					        0.33987248,
																					        0.5378559,
																					        0.14437142,
																					        -0.02455261,
																					        -0.7338317,
																					        0.23990755,
																					        0.47356272,
																					        -0.3786505,
																					    ]		)

																					assert np.abs(latents_slice.flatten() - expected_slice		).max() < 5E-2

									snake_case   :			Dict						    = False

									snake_case   :			List[Any]						    = "stabilityai/stable-diffusion-2-base"
									snake_case   :			List[str]						    = DDIMScheduler.from_pretrained(_lowercase   ,	subfolder="scheduler"		)
									snake_case   :			Optional[Any]						    = StableDiffusionPanoramaPipeline.from_pretrained(_lowercase   ,	scheduler=_lowercase   ,	safety_checker=_lowercase		)
									snake_case   :			Any						    = pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)
									pipe.enable_attention_slicing()

									snake_case   :			Tuple						    = self.get_inputs()
									pipe(**_lowercase   ,	callback=_lowercase   ,	callback_steps=1		)
									assert callback_fn.has_been_called
									assert number_of_steps == 3



			def 				__lowercase					(			self							:				Any		)							->					Tuple:
									torch.cuda.empty_cache()
									torch.cuda.reset_max_memory_allocated()
									torch.cuda.reset_peak_memory_stats()

									snake_case   :			Optional[int]						    = "stabilityai/stable-diffusion-2-base"
									snake_case   :			Tuple						    = DDIMScheduler.from_pretrained(_lowercase   ,	subfolder="scheduler"		)
									snake_case   :			Any						    = StableDiffusionPanoramaPipeline.from_pretrained(_lowercase   ,	scheduler=_lowercase   ,	safety_checker=_lowercase		)
									snake_case   :			Tuple						    = pipe.to(_lowercase		)
									pipe.set_progress_bar_config(disable=_lowercase		)
									pipe.enable_attention_slicing(1		)
									pipe.enable_sequential_cpu_offload()

									snake_case   :			Any						    = self.get_inputs()
									snake_case   :			Optional[int]						    = pipe(**_lowercase		)

									snake_case   :			int						    = torch.cuda.max_memory_allocated()
									# make sure that less than 5.2 GB is allocated
									assert mem_bytes < 5.5 * 10**9



