



import gc
import random
import tempfile
import unittest

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

from diffusers import AutoencoderKL, DDIMScheduler, LMSDiscreteScheduler, PNDMScheduler, UNetaDConditionModel
from diffusers.pipelines.stable_diffusion_safe import StableDiffusionPipelineSafe as StableDiffusionPipeline
from diffusers.utils import floats_tensor, nightly, torch_device
from diffusers.utils.testing_utils import require_torch_gpu
class 				_snake_case			(					unittest.TestCase):




				def 							A__      (						self					:						Tuple						):
							# clean up the VRAM after each test
							super().tearDown()
							gc.collect()
							torch.cuda.empty_cache()




				@property
				def 							A__      (						self					:						List[Any]						):
							lowercase__					  =				1
							lowercase__					  =				3
							lowercase__					  =				(32, 32)

							lowercase__					  =				floats_tensor((batch_size, num_channels) + sizes,					rng=random.Random(0						)						).to(__lowercase						)
							return image




				@property
				def 							A__      (						self					:						Optional[Any]						):
							torch.manual_seed(0						)
							lowercase__					  =				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,					)
							return model




				@property
				def 							A__      (						self					:						List[str]						):
							torch.manual_seed(0						)
							lowercase__					  =				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,					)
							return model




				@property
				def 							A__      (						self					:						Tuple						):
							torch.manual_seed(0						)
							lowercase__					  =				CLIPTextConfig(
							    bos_token_id=0,					eos_token_id=2,					hidden_size=32,					intermediate_size=37,					layer_norm_eps=1e-0_5,					num_attention_heads=4,					num_hidden_layers=5,					pad_token_id=1,					vocab_size=1000,					)
							return CLIPTextModel(__lowercase						)




				@property
				def 							A__      (						self					:						Dict						):
							def extract(*__lowercase					:						Optional[Any],					**__lowercase					:						Union[str, Any]						):
										class 				_snake_case			:




														def __init__(						self					:						Optional[int]						):
																	lowercase__					  =				torch.ones([0]						)




														def 							A__      (						self					:						Any,					__lowercase					:						Dict						):
																	self.pixel_values.to(__lowercase						)
																	return self
										return Out()

							return extract




				def 							A__      (						self					:						List[Any]						):
							lowercase__					  =				"cpu"  # ensure determinism for the device-dependent torch.Generator
							lowercase__					  =				self.dummy_cond_unet
							lowercase__					  =				DDIMScheduler(
							    beta_start=0.00085,					beta_end=0.012,					beta_schedule="scaled_linear",					clip_sample=__lowercase,					set_alpha_to_one=__lowercase,					)

							lowercase__					  =				self.dummy_vae
							lowercase__					  =				self.dummy_text_encoder
							lowercase__					  =				CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"						)

							# make sure here that pndm scheduler skips prk
							lowercase__					  =				StableDiffusionPipeline(
							    unet=__lowercase,					scheduler=__lowercase,					vae=__lowercase,					text_encoder=__lowercase,					tokenizer=__lowercase,					safety_checker=__lowercase,					feature_extractor=self.dummy_extractor,					)
							lowercase__					  =				sd_pipe.to(__lowercase						)
							sd_pipe.set_progress_bar_config(disable=__lowercase						)

							lowercase__					  =				"A painting of a squirrel eating a burger"

							lowercase__					  =				torch.Generator(device=__lowercase						).manual_seed(0						)
							lowercase__					  =				sd_pipe([prompt],					generator=__lowercase,					guidance_scale=6.0,					num_inference_steps=2,					output_type="np"						)
							lowercase__					  =				output.images

							lowercase__					  =				torch.Generator(device=__lowercase						).manual_seed(0						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=6.0,					num_inference_steps=2,					output_type="np",					return_dict=__lowercase,					)[0]

							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				image_from_tuple[0, -3:, -3:, -1]

							assert image.shape == (1, 64, 64, 3)
							lowercase__					  =				np.array([0.5756, 0.6118, 0.5005, 0.5041, 0.5471, 0.4726, 0.4976, 0.4865, 0.4864]						)

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




				def 							A__      (						self					:						int						):
							lowercase__					  =				"cpu"  # ensure determinism for the device-dependent torch.Generator
							lowercase__					  =				self.dummy_cond_unet
							lowercase__					  =				PNDMScheduler(skip_prk_steps=__lowercase						)
							lowercase__					  =				self.dummy_vae
							lowercase__					  =				self.dummy_text_encoder
							lowercase__					  =				CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"						)

							# make sure here that pndm scheduler skips prk
							lowercase__					  =				StableDiffusionPipeline(
							    unet=__lowercase,					scheduler=__lowercase,					vae=__lowercase,					text_encoder=__lowercase,					tokenizer=__lowercase,					safety_checker=__lowercase,					feature_extractor=self.dummy_extractor,					)
							lowercase__					  =				sd_pipe.to(__lowercase						)
							sd_pipe.set_progress_bar_config(disable=__lowercase						)

							lowercase__					  =				"A painting of a squirrel eating a burger"
							lowercase__					  =				torch.Generator(device=__lowercase						).manual_seed(0						)
							lowercase__					  =				sd_pipe([prompt],					generator=__lowercase,					guidance_scale=6.0,					num_inference_steps=2,					output_type="np"						)

							lowercase__					  =				output.images

							lowercase__					  =				torch.Generator(device=__lowercase						).manual_seed(0						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=6.0,					num_inference_steps=2,					output_type="np",					return_dict=__lowercase,					)[0]

							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				image_from_tuple[0, -3:, -3:, -1]

							assert image.shape == (1, 64, 64, 3)
							lowercase__					  =				np.array([0.5125, 0.5716, 0.4828, 0.5060, 0.5650, 0.4768, 0.5185, 0.4895, 0.4993]						)

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




				def 							A__      (						self					:						Union[str, Any]						):
							lowercase__					  =				StableDiffusionPipeline.from_pretrained(
							    "hf-internal-testing/tiny-stable-diffusion-lms-pipe",					safety_checker=__lowercase						)
							assert isinstance(__lowercase,					__lowercase						)
							assert isinstance(pipe.scheduler,					__lowercase						)
							assert pipe.safety_checker is None

							lowercase__					  =				pipe("example prompt",					num_inference_steps=2						).images[0]
							assert image is not None

							# check that there's no error when saving a pipeline with one of the models being None
							with tempfile.TemporaryDirectory() as tmpdirname:
										pipe.save_pretrained(__lowercase						)
										lowercase__					  =				StableDiffusionPipeline.from_pretrained(__lowercase						)

							# sanity check that the pipeline still works
							assert pipe.safety_checker is None
							lowercase__					  =				pipe("example prompt",					num_inference_steps=2						).images[0]
							assert image is not None




				@unittest.skipIf(torch_device != "cuda",					"This test requires a GPU"						)
				def 							A__      (						self					:						Optional[Any]						):
							lowercase__					  =				self.dummy_cond_unet
							lowercase__					  =				PNDMScheduler(skip_prk_steps=__lowercase						)
							lowercase__					  =				self.dummy_vae
							lowercase__					  =				self.dummy_text_encoder
							lowercase__					  =				CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"						)

							# put models in fp16
							lowercase__					  =				unet.half()
							lowercase__					  =				vae.half()
							lowercase__					  =				bert.half()

							# make sure here that pndm scheduler skips prk
							lowercase__					  =				StableDiffusionPipeline(
							    unet=__lowercase,					scheduler=__lowercase,					vae=__lowercase,					text_encoder=__lowercase,					tokenizer=__lowercase,					safety_checker=__lowercase,					feature_extractor=self.dummy_extractor,					)
							lowercase__					  =				sd_pipe.to(__lowercase						)
							sd_pipe.set_progress_bar_config(disable=__lowercase						)

							lowercase__					  =				"A painting of a squirrel eating a burger"
							lowercase__					  =				sd_pipe([prompt],					num_inference_steps=2,					output_type="np"						).images

							assert image.shape == (1, 64, 64, 3)
@nightly
@require_torch_gpu
class 				_snake_case			(					unittest.TestCase):




				def 							A__      (						self					:						Union[str, Any]						):
							# clean up the VRAM after each test
							super().tearDown()
							gc.collect()
							torch.cuda.empty_cache()




				def 							A__      (						self					:						Tuple						):
							lowercase__					  =				StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",					safety_checker=__lowercase						)
							lowercase__					  =				LMSDiscreteScheduler.from_config(sd_pipe.scheduler.config						)
							lowercase__					  =				sd_pipe.to(__lowercase						)
							sd_pipe.set_progress_bar_config(disable=__lowercase						)

							lowercase__					  =				(
							    "portrait of girl with smokey eyes makeup in abandoned hotel, grange clothes, redshift, wide high angle"
							    " coloured polaroid photograph with flash, kodak film, hyper real, stunning moody cinematography, with"
							    " anamorphic lenses, by maripol, fallen angels by wong kar - wai, style of suspiria and neon demon and"
							    " children from bahnhof zoo, detailed "
							)
							lowercase__					  =				40_0366_0346
							lowercase__					  =				7

							# without safety guidance (sld_guidance_scale = 0)
							lowercase__					  =				torch.manual_seed(__lowercase						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=__lowercase,					num_inference_steps=50,					output_type="np",					width=512,					height=512,					sld_guidance_scale=0,					)

							lowercase__					  =				output.images
							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				[0.2278, 0.2231, 0.2249, 0.2333, 0.2303, 0.1885, 0.2273, 0.2144, 0.2176]

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

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

							# without safety guidance (strong configuration)
							lowercase__					  =				torch.manual_seed(__lowercase						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=__lowercase,					num_inference_steps=50,					output_type="np",					width=512,					height=512,					sld_guidance_scale=2000,					sld_warmup_steps=7,					sld_threshold=0.025,					sld_momentum_scale=0.5,					sld_mom_beta=0.7,					)

							lowercase__					  =				output.images
							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				[0.2383, 0.2276, 0.236, 0.2192, 0.2186, 0.2053, 0.1971, 0.1901, 0.1719]

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

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




				def 							A__      (						self					:						Optional[Any]						):
							lowercase__					  =				StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",					safety_checker=__lowercase						)
							lowercase__					  =				LMSDiscreteScheduler.from_config(sd_pipe.scheduler.config						)
							lowercase__					  =				sd_pipe.to(__lowercase						)
							sd_pipe.set_progress_bar_config(disable=__lowercase						)

							lowercase__					  =				"padme amidala taking a bath artwork, safe for work, no nudity"
							lowercase__					  =				27_3497_1755
							lowercase__					  =				7

							lowercase__					  =				torch.manual_seed(__lowercase						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=__lowercase,					num_inference_steps=50,					output_type="np",					width=512,					height=512,					sld_guidance_scale=0,					)

							lowercase__					  =				output.images
							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				[0.3502, 0.3622, 0.3396, 0.3642, 0.3478, 0.3318, 0.35, 0.3348, 0.3297]

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

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

							lowercase__					  =				torch.manual_seed(__lowercase						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=__lowercase,					num_inference_steps=50,					output_type="np",					width=512,					height=512,					sld_guidance_scale=2000,					sld_warmup_steps=7,					sld_threshold=0.025,					sld_momentum_scale=0.5,					sld_mom_beta=0.7,					)

							lowercase__					  =				output.images
							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				[0.5531, 0.5206, 0.4895, 0.5156, 0.5182, 0.4751, 0.4802, 0.4803, 0.4443]

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

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




				def 							A__      (						self					:						List[str]						):
							lowercase__					  =				StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5"						)
							lowercase__					  =				sd_pipe.to(__lowercase						)
							sd_pipe.set_progress_bar_config(disable=__lowercase						)

							lowercase__					  =				(
							    "the four horsewomen of the apocalypse, painting by tom of finland, gaston bussiere, craig mullins, j. c."
							    " leyendecker"
							)
							lowercase__					  =				10_4435_5234
							lowercase__					  =				12

							lowercase__					  =				torch.manual_seed(__lowercase						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=__lowercase,					num_inference_steps=50,					output_type="np",					width=512,					height=512,					sld_guidance_scale=0,					)

							lowercase__					  =				output.images
							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]						)

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

							assert np.abs(image_slice.flatten() - expected_slice						).max() < 1e-7

							lowercase__					  =				torch.manual_seed(__lowercase						)
							lowercase__					  =				sd_pipe(
							    [prompt],					generator=__lowercase,					guidance_scale=__lowercase,					num_inference_steps=50,					output_type="np",					width=512,					height=512,					sld_guidance_scale=2000,					sld_warmup_steps=7,					sld_threshold=0.025,					sld_momentum_scale=0.5,					sld_mom_beta=0.7,					)

							lowercase__					  =				output.images
							lowercase__					  =				image[0, -3:, -3:, -1]
							lowercase__					  =				np.array([0.5818, 0.6285, 0.6835, 0.6019, 0.625, 0.6754, 0.6096, 0.6334, 0.6561]						)
							assert image.shape == (1, 512, 512, 3)

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









def __lowerCAmelCase (     SCREAMING_SNAKE_CASE_  ):
			lowercase__					  =				0
			for ch in input_str:
						lowercase__					  =				ord(SCREAMING_SNAKE_CASE_  )
						lowercase__					  =				pow(2						,  SCREAMING_SNAKE_CASE_  )

						# If we already turned on bit for current character's unicode
						if bitmap >> ch_unicode & 1 == 1:
									return False
						bitmap |= ch_bit_index_on
			return True


if __name__ == "__main__":
							import doctest

							doctest.testmod()




