






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





import importlib.metadata
import operator
import re
import sys
from typing import Optional

from packaging import version


__A											=						{
    """<""": operator.lt,
    """<=""": operator.le,
    """==""": operator.eq,
    """!=""": operator.ne,
    """>=""": operator.ge,
    """>""": operator.gt,
}
def 					__A  (_SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE     )   ->Union[str, Any]:





  """simple docstring"""


  if got_ver is None or want_ver is None:
    raise ValueError(
        F"Unable to compare versions for {requirement}: need={want_ver} found={got_ver}. This is unusual. Consider"
        F" reinstalling {pkg}."     )
  if not ops[op](version.parse(_SCREAMING_SNAKE_CASE     )	,  version.parse(_SCREAMING_SNAKE_CASE     )     ):
    raise ImportError(
        F"{requirement} is required for a normal functioning of this module, but found {pkg}=={got_ver}.{hint}"     )
def 					__A  (_SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE = None     )   ->None:





  """simple docstring"""


  lowerCAmelCase__     :List[str]											=				F"\n{hint}" if hint is not None else ''

  # non-versioned check
  if re.match(r'^[\w_\-\d]+$'	,  _SCREAMING_SNAKE_CASE     ):
    lowerCAmelCase__				,							lowerCAmelCase__				,							lowerCAmelCase__     :Any											=				requirement, None, None
  else:
    lowerCAmelCase__     :List[str]											=				re.findall(r'^([^!=<>\s]+)([\s!=<>]{1,2}.+)'	,  _SCREAMING_SNAKE_CASE     )
    if not match:
      raise ValueError(
          'requirement needs to be in the pip package format, .e.g., package_a==1.23, or package_b>=1.23, but'
          F" got {requirement}"     )
    lowerCAmelCase__				,							lowerCAmelCase__     :Union[str, Any]											=				match[0]
    lowerCAmelCase__     :List[Any]											=				want_full.split(','     )  # there could be multiple requirements
    lowerCAmelCase__     :Any											=				{}
    for w in want_range:
      lowerCAmelCase__     :Tuple											=				re.findall(r'^([\s!=<>]{1,2})(.+)'	,  _SCREAMING_SNAKE_CASE     )
      if not match:
        raise ValueError(
            'requirement needs to be in the pip package format, .e.g., package_a==1.23, or package_b>=1.23,'
            F" but got {requirement}"     )
      lowerCAmelCase__				,							lowerCAmelCase__     :int											=				match[0]
      lowerCAmelCase__     :str											=				want_ver
      if op not in ops:
        raise ValueError(F"{requirement}: need one of {list(ops.keys()     )}, but got {op}"     )

    # special case
  if pkg == "python":
    lowerCAmelCase__     :Any											=				'.'.join([str(_SCREAMING_SNAKE_CASE     ) for x in sys.version_info[:3]]     )
    for op, want_ver in wanted.items():
      _compare_versions(_SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE     )
    return

  # check if any version is installed
  try:
    lowerCAmelCase__     :List[Any]											=				importlib.metadata.version(_SCREAMING_SNAKE_CASE     )
  except importlib.metadata.PackageNotFoundError:
    raise importlib.metadata.PackageNotFoundError(
        F"The '{requirement}' distribution was not found and is required by this application. {hint}"     )

  # check that the right version is installed if version number or a range was provided
  if want_ver is not None:
    for op, want_ver in wanted.items():
      _compare_versions(_SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE     )




def 					__A  (_SCREAMING_SNAKE_CASE     )   ->List[Any]:





  """simple docstring"""


  lowerCAmelCase__     :Optional[Any]											=				'Try: pip install transformers -U or pip install -e \'.[dev]\' if you\'re working with git main'
  return require_version(_SCREAMING_SNAKE_CASE	,  _SCREAMING_SNAKE_CASE     )
