



"""simple docstring"""





import gc
import random
import unittest

import numpy as np
import torch
from transformers import (
    CLIPImageProcessor,
    CLIPTextConfig,
    CLIPTextModel,
    CLIPTokenizer,
    CLIPVisionConfig,
    CLIPVisionModelWithProjection,
)

from diffusers import AutoencoderKL, DDIMScheduler, DDPMScheduler, StableUnCLIPImgaImgPipeline, UNetaDConditionModel
from diffusers.pipelines.pipeline_utils import DiffusionPipeline
from diffusers.pipelines.stable_diffusion.stable_unclip_image_normalizer import StableUnCLIPImageNormalizer
from diffusers.utils.import_utils import is_xformers_available
from diffusers.utils.testing_utils import (
    enable_full_determinism,
    floats_tensor,
    load_image,
    load_numpy,
    require_torch_gpu,
    skip_mps,
    slow,
    torch_device,
)

from ..pipeline_params import TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS, TEXT_GUIDED_IMAGE_VARIATION_PARAMS
from ..test_pipelines_common import (
    PipelineKarrasSchedulerTesterMixin,
    PipelineLatentTesterMixin,
    PipelineTesterMixin,
    assert_mean_pixel_difference,
)


enable_full_determinism()
class 				lowercase__       (   _a    , _a    , _a    , unittest.TestCase				):







       '''simple docstring'''


       UpperCamelCase						=					StableUnCLIPImgaImgPipeline
       UpperCamelCase						=					TEXT_GUIDED_IMAGE_VARIATION_PARAMS
       UpperCamelCase						=					TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
       UpperCamelCase						=					frozenset(
           []				)  # TO-DO: update image_params once pipeline is refactored with VaeImageProcessor.preprocess
       UpperCamelCase						=					frozenset([]				)



       def 					lowercase__    (							self      :  Union[str, Any]   )			->						Tuple:


             '''simple docstring'''




             UpperCAmelCase_      			=							32
             UpperCAmelCase_      			=							embedder_hidden_size

             # image encoding components

             UpperCAmelCase_      			=							CLIPImageProcessor(crop_size=32		,    size=32   )

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							CLIPVisionModelWithProjection(
                 CLIPVisionConfig(
                     hidden_size=snake_case_		,    projection_dim=snake_case_		,    num_hidden_layers=5		,    num_attention_heads=4		,    image_size=32		,    intermediate_size=37		,    patch_size=1		,    )   )

             # regular denoising components

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							StableUnCLIPImageNormalizer(embedding_dim=snake_case_   )
             UpperCAmelCase_      			=							DDPMScheduler(beta_schedule="squaredcos_cap_v2"   )

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"   )

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							CLIPTextModel(
                 CLIPTextConfig(
                     bos_token_id=0		,    eos_token_id=2		,    hidden_size=snake_case_		,    projection_dim=32		,    intermediate_size=37		,    layer_norm_eps=1e-05		,    num_attention_heads=4		,    num_hidden_layers=5		,    pad_token_id=1		,    vocab_size=1000		,    )   )

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							UNetaDConditionModel(
                 sample_size=32		,    in_channels=4		,    out_channels=4		,    down_block_types=("CrossAttnDownBlock2D", "DownBlock2D")		,    up_block_types=("UpBlock2D", "CrossAttnUpBlock2D")		,    block_out_channels=(32, 64)		,    attention_head_dim=(2, 4)		,    class_embed_type="projection"		,    projection_class_embeddings_input_dim=embedder_projection_dim * 2		,    cross_attention_dim=snake_case_		,    layers_per_block=1		,    upcast_attention=snake_case_		,    use_linear_projection=snake_case_		,    )

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							DDIMScheduler(
                 beta_schedule="scaled_linear"		,    beta_start=0.0_0085		,    beta_end=0.012		,    prediction_type="v_prediction"		,    set_alpha_to_one=snake_case_		,    steps_offset=1		,    )

             torch.manual_seed(0   )
             UpperCAmelCase_      			=							AutoencoderKL()

             UpperCAmelCase_      			=							{
                 # image encoding components
                 """feature_extractor""": feature_extractor,
                 """image_encoder""": image_encoder.eval(),
                 # image noising components
                 """image_normalizer""": image_normalizer.eval(),
                 """image_noising_scheduler""": image_noising_scheduler,
                 # regular denoising components
                 """tokenizer""": tokenizer,
                 """text_encoder""": text_encoder.eval(),
                 """unet""": unet.eval(),
                 """scheduler""": scheduler,
                 """vae""": vae.eval(),
             }

             return components



       def 					lowercase__    (							self      :  str		,    _UpperCAmelCase      :  List[Any]		,    _UpperCAmelCase      :  Optional[Any]=0		,    _UpperCAmelCase      :  str=True   )			->						Optional[int]:


             '''simple docstring'''




             if str(snake_case_   ).startswith("mps"   ):
                   UpperCAmelCase_      			=							torch.manual_seed(snake_case_   )
             else:
                   UpperCAmelCase_      			=							torch.Generator(device=snake_case_   ).manual_seed(snake_case_   )

             UpperCAmelCase_      			=							floats_tensor((1, 3, 32, 32)		,    rng=random.Random(snake_case_   )   ).to(snake_case_   )

             if pil_image:
                   UpperCAmelCase_      			=							input_image * 0.5 + 0.5
                   UpperCAmelCase_      			=							input_image.clamp(0		,    1   )
                   UpperCAmelCase_      			=							input_image.cpu().permute(0		,    2		,    3		,    1   ).float().numpy()
                   UpperCAmelCase_      			=							DiffusionPipeline.numpy_to_pil(snake_case_   )[0]

             return {
                 "prompt": "An anime racoon running a marathon",
                 "image": input_image,
                 "generator": generator,
                 "num_inference_steps": 2,
                 "output_type": "np",
             }



       @skip_mps
       def 					lowercase__    (							self      :  Tuple   )			->						Optional[Any]:


             '''simple docstring'''




             UpperCAmelCase_      			=							"""cpu"""  # ensure determinism for the device-dependent torch.Generator
             UpperCAmelCase_      			=							self.get_dummy_components()
             UpperCAmelCase_      			=							StableUnCLIPImgaImgPipeline(**snake_case_   )
             UpperCAmelCase_      			=							sd_pipe.to(snake_case_   )
             sd_pipe.set_progress_bar_config(disable=snake_case_   )

             UpperCAmelCase_      			=							self.get_dummy_inputs(snake_case_   )
             inputs.update({"image_embeds": None}   )
             UpperCAmelCase_      			=							sd_pipe(**snake_case_   ).images
             UpperCAmelCase_      			=							image[0, -3:, -3:, -1]

             assert image.shape == (1, 32, 32, 3)
             UpperCAmelCase_      			=							np.array([0.3872, 0.7224, 0.5601, 0.4741, 0.6872, 0.5814, 0.4636, 0.3867, 0.5078]   )

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



       def 					lowercase__    (							self      :  Tuple   )			->						Union[str, Any]:


             '''simple docstring'''




             UpperCAmelCase_      			=							torch_device in ["""cpu""", """mps"""]

             self._test_attention_slicing_forward_pass(test_max_difference=snake_case_   )



       def 					lowercase__    (							self      :  Dict   )			->						str:


             '''simple docstring'''




             UpperCAmelCase_      			=							torch_device in ["""cpu""", """mps"""]

             self._test_inference_batch_single_identical(test_max_difference=snake_case_   )







       @unittest.skipIf(
           torch_device != "cuda" or not is_xformers_available()		,    reason="XFormers attention is only available with CUDA and `xformers` installed"		,    )
       def 					lowercase__    (							self      :  List[Any]   )			->						Tuple:


             '''simple docstring'''




             self._test_xformers_attention_forwardGenerator_pass(test_max_difference=snake_case_   )



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







       '''simple docstring'''


       def 					lowercase__    (							self      :  List[Any]   )			->						Tuple:


             '''simple docstring'''




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



       def 					lowercase__    (							self      :  int   )			->						Tuple:


             '''simple docstring'''




             UpperCAmelCase_      			=							load_image(
                 "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/turtle.png"   )

             UpperCAmelCase_      			=							load_numpy(
                 "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/stable_unclip_2_1_l_img2img_anime_turtle_fp16.npy"   )

             UpperCAmelCase_      			=							StableUnCLIPImgaImgPipeline.from_pretrained(
                 "fusing/stable-unclip-2-1-l-img2img"		,    torch_dtype=torch.floataa   )
             pipe.to(snake_case_   )
             pipe.set_progress_bar_config(disable=snake_case_   )
             # stable unclip will oom when integration tests are run on a V100,
             # so turn on memory savings
             pipe.enable_attention_slicing()
             pipe.enable_sequential_cpu_offload()

             UpperCAmelCase_      			=							torch.Generator(device="cpu"   ).manual_seed(0   )
             UpperCAmelCase_      			=							pipe(snake_case_		,    "anime turle"		,    generator=snake_case_		,    output_type="np"   )

             UpperCAmelCase_      			=							output.images[0]

             assert image.shape == (768, 768, 3)

             assert_mean_pixel_difference(snake_case_		,    snake_case_   )



       def 					lowercase__    (							self      :  Union[str, Any]   )			->						Optional[Any]:


             '''simple docstring'''




             UpperCAmelCase_      			=							load_image(
                 "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/turtle.png"   )

             UpperCAmelCase_      			=							load_numpy(
                 "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/stable_unclip_2_1_h_img2img_anime_turtle_fp16.npy"   )

             UpperCAmelCase_      			=							StableUnCLIPImgaImgPipeline.from_pretrained(
                 "fusing/stable-unclip-2-1-h-img2img"		,    torch_dtype=torch.floataa   )
             pipe.to(snake_case_   )
             pipe.set_progress_bar_config(disable=snake_case_   )
             # stable unclip will oom when integration tests are run on a V100,
             # so turn on memory savings
             pipe.enable_attention_slicing()
             pipe.enable_sequential_cpu_offload()

             UpperCAmelCase_      			=							torch.Generator(device="cpu"   ).manual_seed(0   )
             UpperCAmelCase_      			=							pipe(snake_case_		,    "anime turle"		,    generator=snake_case_		,    output_type="np"   )

             UpperCAmelCase_      			=							output.images[0]

             assert image.shape == (768, 768, 3)

             assert_mean_pixel_difference(snake_case_		,    snake_case_   )







       def 					lowercase__    (							self      :  List[str]   )			->						Union[str, Any]:


             '''simple docstring'''




             UpperCAmelCase_      			=							load_image(
                 "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/turtle.png"   )

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

             UpperCAmelCase_      			=							StableUnCLIPImgaImgPipeline.from_pretrained(
                 "fusing/stable-unclip-2-1-h-img2img"		,    torch_dtype=torch.floataa   )
             UpperCAmelCase_      			=							pipe.to(snake_case_   )
             pipe.set_progress_bar_config(disable=snake_case_   )
             pipe.enable_attention_slicing()
             pipe.enable_sequential_cpu_offload()

             UpperCAmelCase_      			=							pipe(
                 snake_case_		,    "anime turtle"		,    num_inference_steps=2		,    output_type="np"		,    )

             UpperCAmelCase_      			=							torch.cuda.max_memory_allocated()
             # make sure that less than 7 GB is allocated
             assert mem_bytes < 7 * 10**9









"""simple docstring"""





from collections.abc import Iterable
from typing import Generic, TypeVar

lowerCamelCase       	=						TypeVar("""_T""")
class 				lowercase__       (   Generic[_T]				):







       '''simple docstring'''


       def __init__(							self      :  int		,    _UpperCAmelCase      :  Iterable[_T] | None = None   )			->						None:


             '''simple docstring'''




             UpperCAmelCase_      			=							list(iterable or []   )
             UpperCAmelCase_      			=							[]



       def __len__(							self      :  Optional[int]   )			->						int:


             '''simple docstring'''




             return len(self._stacka   ) + len(self._stacka   )



       def __repr__(							self      :  Optional[Any]   )			->						str:


             '''simple docstring'''




             return F"""Queue({tuple(self._stacka[::-1] + self._stacka   )})"""



       def 					lowercase__    (							self      :  Optional[Any]		,    _UpperCAmelCase      :  _T   )			->						None:


             '''simple docstring'''




             self._stacka.append(_UpperCAmelCase   )







       def 					lowercase__    (							self      :  Dict   )			->						_T:


             '''simple docstring'''




             UpperCAmelCase_      			=							self._stacka.pop
             UpperCAmelCase_      			=							self._stacka.append

             if not self._stacka:
                   while self._stacka:
                         stacka_append(stacka_pop()   )

             if not self._stacka:
                   raise IndexError("Queue is empty"   )
             return self._stacka.pop()


if __name__ == "__main__":
  from doctest import testmod

  testmod()




