






import gc
import random
import unittest

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

from diffusers import AutoencoderKL, DDIMScheduler, DDPMScheduler, StableDiffusionUpscalePipeline, UNetaDConditionModel
from diffusers.utils import floats_tensor, load_image, load_numpy, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu


enable_full_determinism()






class 			_UpperCamelCase(       unittest.TestCase		):

		def    __lowerCAmelCase  (					self		:    str    ):



					'''simple docstring'''



					super().tearDown()
					gc.collect()
					torch.cuda.empty_cache()

		@property
		def    __lowerCAmelCase  (					self		:    str    ):



					'''simple docstring'''



					__a						:  List[str]									=     1
					__a						:  List[Any]									=     3
					__a						:  str									=     (3_2, 3_2)

					__a						:  List[Any]									=     floats_tensor((batch_size, num_channels) + sizes    ,       rng=random.Random(0    )    ).to(SCREAMING_SNAKE_CASE__    )
					return image

		@property
		def    __lowerCAmelCase  (					self		:    Tuple    ):



					'''simple docstring'''



					torch.manual_seed(0    )
					__a						:  Optional[int]									=     UNetaDConditionModel(
					    block_out_channels=(3_2, 3_2, 6_4)    ,       layers_per_block=2    ,       sample_size=3_2    ,       in_channels=7    ,       out_channels=4    ,       down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D', 'CrossAttnDownBlock2D')    ,       up_block_types=('CrossAttnUpBlock2D', 'CrossAttnUpBlock2D', 'UpBlock2D')    ,       cross_attention_dim=3_2    ,       attention_head_dim=8    ,       use_linear_projection=SCREAMING_SNAKE_CASE__    ,       only_cross_attention=(True, True, False)    ,       num_class_embeds=1_0_0    ,       )
					return model

		@property
		def    __lowerCAmelCase  (					self		:    Optional[Any]    ):



					'''simple docstring'''



					torch.manual_seed(0    )
					__a						:  Optional[Any]									=     AutoencoderKL(
					    block_out_channels=[3_2, 3_2, 6_4]    ,       in_channels=3    ,       out_channels=3    ,       down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D', 'DownEncoderBlock2D']    ,       up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D', 'UpDecoderBlock2D']    ,       latent_channels=4    ,       )
					return model

		@property
		def    __lowerCAmelCase  (					self		:    Tuple    ):



					'''simple docstring'''



					torch.manual_seed(0    )
					__a						:  Dict									=     CLIPTextConfig(
					    bos_token_id=0    ,       eos_token_id=2    ,       hidden_size=3_2    ,       intermediate_size=3_7    ,       layer_norm_eps=1e-05    ,       num_attention_heads=4    ,       num_hidden_layers=5    ,       pad_token_id=1    ,       vocab_size=1_0_0_0    ,       hidden_act='gelu'    ,       projection_dim=5_1_2    ,       )
					return CLIPTextModel(SCREAMING_SNAKE_CASE__    )

		def    __lowerCAmelCase  (					self		:    int    ):



					'''simple docstring'''



					__a						:  Tuple									=     'cpu'  # ensure determinism for the device-dependent torch.Generator
					__a						:  int									=     self.dummy_cond_unet_upscale
					__a						:  Any									=     DDPMScheduler()
					__a						:  Any									=     DDIMScheduler(prediction_type='v_prediction'    )
					__a						:  Any									=     self.dummy_vae
					__a						:  List[str]									=     self.dummy_text_encoder
					__a						:  List[Any]									=     CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip'    )

					__a						:  Optional[int]									=     self.dummy_image.cpu().permute(0    ,       2    ,       3    ,       1    )[0]
					__a						:  Optional[Any]									=     Image.fromarray(np.uinta(SCREAMING_SNAKE_CASE__    )    ).convert('RGB'    ).resize((6_4, 6_4)    )

					# make sure here that pndm scheduler skips prk
					__a						:  str									=     StableDiffusionUpscalePipeline(
					    unet=SCREAMING_SNAKE_CASE__    ,       low_res_scheduler=SCREAMING_SNAKE_CASE__    ,       scheduler=SCREAMING_SNAKE_CASE__    ,       vae=SCREAMING_SNAKE_CASE__    ,       text_encoder=SCREAMING_SNAKE_CASE__    ,       tokenizer=SCREAMING_SNAKE_CASE__    ,       max_noise_level=3_5_0    ,       )
					__a						:  List[Any]									=     sd_pipe.to(SCREAMING_SNAKE_CASE__    )
					sd_pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE__    )

					__a						:  Union[str, Any]									=     'A painting of a squirrel eating a burger'
					__a						:  Any									=     torch.Generator(device=SCREAMING_SNAKE_CASE__    ).manual_seed(0    )
					__a						:  List[str]									=     sd_pipe(
					    [prompt]    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       guidance_scale=6.0    ,       noise_level=2_0    ,       num_inference_steps=2    ,       output_type='np'    ,       )

					__a						:  Tuple									=     output.images

					__a						:  Optional[Any]									=     torch.Generator(device=SCREAMING_SNAKE_CASE__    ).manual_seed(0    )
					__a						:  int									=     sd_pipe(
					    [prompt]    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       guidance_scale=6.0    ,       noise_level=2_0    ,       num_inference_steps=2    ,       output_type='np'    ,       return_dict=SCREAMING_SNAKE_CASE__    ,       )[0]

					__a						:  Dict									=     image[0, -3:, -3:, -1]
					__a						:  Union[str, Any]									=     image_from_tuple[0, -3:, -3:, -1]

					__a						:  Any									=     low_res_image.size[0] * 4
					assert image.shape == (1, expected_height_width, expected_height_width, 3)
					__a						:  Dict									=     np.array([0.3_113, 0.3_910, 0.4_272, 0.4_859, 0.5_061, 0.4_652, 0.5_362, 0.5_715, 0.5_661]    )

					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    __lowerCAmelCase  (					self		:    Union[str, Any]    ):



					'''simple docstring'''



					__a						:  List[str]									=     'cpu'  # ensure determinism for the device-dependent torch.Generator
					__a						:  List[str]									=     self.dummy_cond_unet_upscale
					__a						:  Dict									=     DDPMScheduler()
					__a						:  Dict									=     DDIMScheduler(prediction_type='v_prediction'    )
					__a						:  int									=     self.dummy_vae
					__a						:  Optional[int]									=     self.dummy_text_encoder
					__a						:  str									=     CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip'    )

					__a						:  Optional[Any]									=     self.dummy_image.cpu().permute(0    ,       2    ,       3    ,       1    )[0]
					__a						:  int									=     Image.fromarray(np.uinta(SCREAMING_SNAKE_CASE__    )    ).convert('RGB'    ).resize((6_4, 6_4)    )

					# make sure here that pndm scheduler skips prk
					__a						:  Dict									=     StableDiffusionUpscalePipeline(
					    unet=SCREAMING_SNAKE_CASE__    ,       low_res_scheduler=SCREAMING_SNAKE_CASE__    ,       scheduler=SCREAMING_SNAKE_CASE__    ,       vae=SCREAMING_SNAKE_CASE__    ,       text_encoder=SCREAMING_SNAKE_CASE__    ,       tokenizer=SCREAMING_SNAKE_CASE__    ,       max_noise_level=3_5_0    ,       )
					__a						:  int									=     sd_pipe.to(SCREAMING_SNAKE_CASE__    )
					sd_pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE__    )

					__a						:  List[str]									=     'A painting of a squirrel eating a burger'
					__a						:  str									=     sd_pipe(
					    2 * [prompt]    ,       image=2 * [low_res_image]    ,       guidance_scale=6.0    ,       noise_level=2_0    ,       num_inference_steps=2    ,       output_type='np'    ,       )
					__a						:  Any									=     output.images
					assert image.shape[0] == 2

					__a						:  List[Any]									=     torch.Generator(device=SCREAMING_SNAKE_CASE__    ).manual_seed(0    )
					__a						:  int									=     sd_pipe(
					    [prompt]    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       num_images_per_prompt=2    ,       guidance_scale=6.0    ,       noise_level=2_0    ,       num_inference_steps=2    ,       output_type='np'    ,       )
					__a						:  Optional[Any]									=     output.images
					assert image.shape[0] == 2



		@unittest.skipIf(torch_device != 'cuda'    ,       'This test requires a GPU'    )
		def    __lowerCAmelCase  (					self		:    Dict    ):



					'''simple docstring'''



					__a						:  Dict									=     self.dummy_cond_unet_upscale
					__a						:  Any									=     DDPMScheduler()
					__a						:  Tuple									=     DDIMScheduler(prediction_type='v_prediction'    )
					__a						:  Union[str, Any]									=     self.dummy_vae
					__a						:  Dict									=     self.dummy_text_encoder
					__a						:  List[Any]									=     CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip'    )

					__a						:  Optional[int]									=     self.dummy_image.cpu().permute(0    ,       2    ,       3    ,       1    )[0]
					__a						:  Dict									=     Image.fromarray(np.uinta(SCREAMING_SNAKE_CASE__    )    ).convert('RGB'    ).resize((6_4, 6_4)    )

					# put models in fp16, except vae as it overflows in fp16
					__a						:  str									=     unet.half()
					__a						:  Any									=     text_encoder.half()

					# make sure here that pndm scheduler skips prk
					__a						:  Optional[Any]									=     StableDiffusionUpscalePipeline(
					    unet=SCREAMING_SNAKE_CASE__    ,       low_res_scheduler=SCREAMING_SNAKE_CASE__    ,       scheduler=SCREAMING_SNAKE_CASE__    ,       vae=SCREAMING_SNAKE_CASE__    ,       text_encoder=SCREAMING_SNAKE_CASE__    ,       tokenizer=SCREAMING_SNAKE_CASE__    ,       max_noise_level=3_5_0    ,       )
					__a						:  int									=     sd_pipe.to(SCREAMING_SNAKE_CASE__    )
					sd_pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE__    )

					__a						:  str									=     'A painting of a squirrel eating a burger'
					__a						:  Tuple									=     torch.manual_seed(0    )
					__a						:  int									=     sd_pipe(
					    [prompt]    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       num_inference_steps=2    ,       output_type='np'    ,       ).images

					__a						:  List[str]									=     low_res_image.size[0] * 4
					assert image.shape == (1, expected_height_width, expected_height_width, 3)






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

		def    __lowerCAmelCase  (					self		:    Any    ):



					'''simple docstring'''



					super().tearDown()
					gc.collect()
					torch.cuda.empty_cache()

		def    __lowerCAmelCase  (					self		:    int    ):



					'''simple docstring'''



					__a						:  Optional[int]									=     load_image(
					    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
					    '/sd2-upscale/low_res_cat.png'    )
					__a						:  int									=     load_numpy(
					    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd2-upscale'
					    '/upsampled_cat.npy'    )

					__a						:  List[Any]									=     'stabilityai/stable-diffusion-x4-upscaler'
					__a						:  List[Any]									=     StableDiffusionUpscalePipeline.from_pretrained(SCREAMING_SNAKE_CASE__    )
					pipe.to(SCREAMING_SNAKE_CASE__    )
					pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE__    )
					pipe.enable_attention_slicing()

					__a						:  Any									=     'a cat sitting on a park bench'

					__a						:  List[str]									=     torch.manual_seed(0    )
					__a						:  List[Any]									=     pipe(
					    prompt=SCREAMING_SNAKE_CASE__    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       output_type='np'    ,       )
					__a						:  Union[str, Any]									=     output.images[0]

					assert image.shape == (5_1_2, 5_1_2, 3)
					assert np.abs(expected_image - image    ).max() < 1e-3

		def    __lowerCAmelCase  (					self		:    Tuple    ):



					'''simple docstring'''



					__a						:  List[Any]									=     load_image(
					    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
					    '/sd2-upscale/low_res_cat.png'    )
					__a						:  List[Any]									=     load_numpy(
					    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd2-upscale'
					    '/upsampled_cat_fp16.npy'    )

					__a						:  Dict									=     'stabilityai/stable-diffusion-x4-upscaler'
					__a						:  Any									=     StableDiffusionUpscalePipeline.from_pretrained(
					    SCREAMING_SNAKE_CASE__    ,       torch_dtype=torch.floataa    ,       )
					pipe.to(SCREAMING_SNAKE_CASE__    )
					pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE__    )
					pipe.enable_attention_slicing()

					__a						:  Optional[Any]									=     'a cat sitting on a park bench'

					__a						:  Any									=     torch.manual_seed(0    )
					__a						:  List[Any]									=     pipe(
					    prompt=SCREAMING_SNAKE_CASE__    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       output_type='np'    ,       )
					__a						:  Tuple									=     output.images[0]

					assert image.shape == (5_1_2, 5_1_2, 3)
					assert np.abs(expected_image - image    ).max() < 5e-1



		def    __lowerCAmelCase  (					self		:    Any    ):



					'''simple docstring'''



					torch.cuda.empty_cache()
					torch.cuda.reset_max_memory_allocated()
					torch.cuda.reset_peak_memory_stats()

					__a						:  int									=     load_image(
					    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
					    '/sd2-upscale/low_res_cat.png'    )

					__a						:  Dict									=     'stabilityai/stable-diffusion-x4-upscaler'
					__a						:  str									=     StableDiffusionUpscalePipeline.from_pretrained(
					    SCREAMING_SNAKE_CASE__    ,       torch_dtype=torch.floataa    ,       )
					pipe.to(SCREAMING_SNAKE_CASE__    )
					pipe.set_progress_bar_config(disable=SCREAMING_SNAKE_CASE__    )
					pipe.enable_attention_slicing(1    )
					pipe.enable_sequential_cpu_offload()

					__a						:  List[Any]									=     'a cat sitting on a park bench'

					__a						:  Union[str, Any]									=     torch.manual_seed(0    )
					__a						:  Dict									=     pipe(
					    prompt=SCREAMING_SNAKE_CASE__    ,       image=SCREAMING_SNAKE_CASE__    ,       generator=SCREAMING_SNAKE_CASE__    ,       num_inference_steps=5    ,       output_type='np'    ,       )

					__a						:  Optional[int]									=     torch.cuda.max_memory_allocated()
					# make sure that less than 2.9 GB is allocated
					assert mem_bytes < 2.9 * 1_0**9






'''simple docstring'''




def __lowerCAmelCase					(				UpperCamelCase__							)      ->       bool:
    if not isinstance(UpperCamelCase__							,    UpperCamelCase__							):
        raise ValueError('''Input series is not valid, valid series - [2, 4, 6]'''							)
    if len(UpperCamelCase__							) == 0:
        raise ValueError('''Input list must be a non empty list'''							)
    if len(UpperCamelCase__							) == 1:
        return True
    __lowerCamelCase            =    series[1] - series[0]
    for index in range(len(UpperCamelCase__							) - 1							):
        if series[index + 1] - series[index] != common_diff:
            return False
    return True






def __lowerCAmelCase					(				UpperCamelCase__							)      ->       float:
    if not isinstance(UpperCamelCase__							,    UpperCamelCase__							):
        raise ValueError('''Input series is not valid, valid series - [2, 4, 6]'''							)
    if len(UpperCamelCase__							) == 0:
        raise ValueError('''Input list must be a non empty list'''							)
    __lowerCamelCase            =    0
    for val in series:
        answer += val
    return answer / len(UpperCamelCase__							)


if __name__ == "__main__":
  import doctest

  doctest.testmod()
