




'''simple docstring'''



import warnings
from functools import wraps
from typing import Callable




def   lowercase__(			__UpperCamelCase:					Callable    ):

      """simple docstring"""






      @wraps(__UpperCamelCase    )
      def _inner_fn(*__UpperCamelCase:					List[Any]      ,**__UpperCamelCase:					Any    ):
            warnings.warn(
                (f"'{fn.__name__}' is experimental and might be subject to breaking changes in the future.")      ,__UpperCamelCase      ,)
            return fn(*__UpperCamelCase      ,**__UpperCamelCase    )

      return _inner_fn







'''simple docstring'''






import gc
import random
import unittest

import torch

from diffusers import (
    IFImgaImgPipeline,
    IFImgaImgSuperResolutionPipeline,
    IFInpaintingPipeline,
    IFInpaintingSuperResolutionPipeline,
    IFPipeline,
    IFSuperResolutionPipeline,
)
from diffusers.models.attention_processor import AttnAddedKVProcessor
from diffusers.utils.import_utils import is_xformers_available
from diffusers.utils.testing_utils import floats_tensor, load_numpy, require_torch_gpu, skip_mps, slow, torch_device

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference
from . import IFPipelineTesterMixin

@skip_mps
class 				a__(   lowerCamelCase__						,					lowerCamelCase__						,					unittest.TestCase      ):
    lowercase__					=       IFPipeline
    lowercase__					=       TEXT_TO_IMAGE_PARAMS - {"""width""", """height""", """latents"""}
    lowercase__					=       TEXT_TO_IMAGE_BATCH_PARAMS
    lowercase__					=       PipelineTesterMixin.required_optional_params - {"""latents"""}







    def      lowercase_			( self					:    List[Any]      ):
      return self._get_dummy_components()







    def      lowercase_			( self					:    int		,     __snake_case					:    List[str]		,     __snake_case					:    List[Any]=0      ):
      if str(__snake_case      ).startswith('mps'      ):
        a		:   List[Any]	  =	torch.manual_seed(__snake_case      )
      else:
        a		:   str	  =	torch.Generator(device=__snake_case      ).manual_seed(__snake_case      )

      a		:   Dict	  =	{
          'prompt': 'A painting of a squirrel eating a burger',
          'generator': generator,
          'num_inference_steps': 2,
          'output_type': 'numpy',
      }

      return inputs







    def      lowercase_			( self					:    Optional[Any]      ):
      self._test_save_load_optional_components()







    @unittest.skipIf(torch_device != 'cuda'		,     reason='float16 requires CUDA'      )
    def      lowercase_			( self					:    Union[str, Any]      ):
      # Due to non-determinism in save load of the hf-internal-testing/tiny-random-t5 text encoder
      super().test_save_load_floataa(expected_max_diff=1e-1      )







    def      lowercase_			( self					:    Tuple      ):
      self._test_attention_slicing_forward_pass(expected_max_diff=1e-2      )







    def      lowercase_			( self					:    str      ):
      self._test_save_load_local()







    def      lowercase_			( self					:    Any      ):
      self._test_inference_batch_single_identical(
          expected_max_diff=1e-2		,     )







    @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[str]      ):
      self._test_xformers_attention_forwardGenerator_pass(expected_max_diff=1e-3      )

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







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







    def      lowercase_			( self					:    Tuple      ):
      # if

      a		:   List[Any]	  =	IFPipeline.from_pretrained('DeepFloyd/IF-I-XL-v1.0'		,     variant='fp16'		,     torch_dtype=torch.floataa      )

      a		:   Optional[int]	  =	IFSuperResolutionPipeline.from_pretrained(
          'DeepFloyd/IF-II-L-v1.0'		,     variant='fp16'		,     torch_dtype=torch.floataa		,     text_encoder=__snake_case		,     tokenizer=__snake_case      )

      # pre compute text embeddings and remove T5 to save memory

      pipe_a.text_encoder.to('cuda'      )

      a  ,      a		:   Optional[Any]	  =	pipe_a.encode_prompt('anime turtle'		,     device='cuda'      )

      del pipe_a.tokenizer
      del pipe_a.text_encoder
      gc.collect()

      a		:   List[Any]	  =	None
      a		:   Dict	  =	None

      pipe_a.enable_model_cpu_offload()
      pipe_a.enable_model_cpu_offload()

      pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()      )
      pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()      )

      self._test_if(__snake_case		,     __snake_case		,     __snake_case		,     __snake_case      )

      pipe_a.remove_all_hooks()
      pipe_a.remove_all_hooks()

      # img2img

      a		:   List[str]	  =	IFImgaImgPipeline(**pipe_a.components      )
      a		:   int	  =	IFImgaImgSuperResolutionPipeline(**pipe_a.components      )

      pipe_a.enable_model_cpu_offload()
      pipe_a.enable_model_cpu_offload()

      pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()      )
      pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()      )

      self._test_if_imgaimg(__snake_case		,     __snake_case		,     __snake_case		,     __snake_case      )

      pipe_a.remove_all_hooks()
      pipe_a.remove_all_hooks()

      # inpainting

      a		:   Tuple	  =	IFInpaintingPipeline(**pipe_a.components      )
      a		:   int	  =	IFInpaintingSuperResolutionPipeline(**pipe_a.components      )

      pipe_a.enable_model_cpu_offload()
      pipe_a.enable_model_cpu_offload()

      pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()      )
      pipe_a.unet.set_attn_processor(AttnAddedKVProcessor()      )

      self._test_if_inpainting(__snake_case		,     __snake_case		,     __snake_case		,     __snake_case      )







    def      lowercase_			( self					:    Optional[Any]		,     __snake_case					:    Optional[int]		,     __snake_case					:    Union[str, Any]		,     __snake_case					:    Tuple		,     __snake_case					:    List[str]      ):
      # pipeline 1

      _start_torch_memory_measurement()

      a		:   int	  =	torch.Generator(device='cpu'      ).manual_seed(0      )
      a		:   int	  =	pipe_a(
          prompt_embeds=__snake_case		,     negative_prompt_embeds=__snake_case		,     num_inference_steps=2		,     generator=__snake_case		,     output_type='np'		,     )

      a		:   Dict	  =	output.images[0]

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

      a		:   Any	  =	torch.cuda.max_memory_allocated()
      assert mem_bytes < 13 * 10**9

      a		:   Optional[int]	  =	load_numpy(
          'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if.npy'      )
      assert_mean_pixel_difference(__snake_case		,     __snake_case      )

      # pipeline 2

      _start_torch_memory_measurement()

      a		:   List[str]	  =	torch.Generator(device='cpu'      ).manual_seed(0      )

      a		:   List[Any]	  =	floats_tensor((1, 3, 64, 64)		,     rng=random.Random(0      )      ).to(__snake_case      )

      a		:   Any	  =	pipe_a(
          prompt_embeds=__snake_case		,     negative_prompt_embeds=__snake_case		,     image=__snake_case		,     generator=__snake_case		,     num_inference_steps=2		,     output_type='np'		,     )

      a		:   Tuple	  =	output.images[0]

      assert image.shape == (2_56, 2_56, 3)

      a		:   Optional[Any]	  =	torch.cuda.max_memory_allocated()
      assert mem_bytes < 4 * 10**9

      a		:   Tuple	  =	load_numpy(
          'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_superresolution_stage_II.npy'      )
      assert_mean_pixel_difference(__snake_case		,     __snake_case      )







    def      lowercase_			( self					:    List[str]		,     __snake_case					:    str		,     __snake_case					:    int		,     __snake_case					:    Any		,     __snake_case					:    Any      ):
      # pipeline 1

      _start_torch_memory_measurement()

      a		:   Optional[Any]	  =	floats_tensor((1, 3, 64, 64)		,     rng=random.Random(0      )      ).to(__snake_case      )

      a		:   Optional[int]	  =	torch.Generator(device='cpu'      ).manual_seed(0      )

      a		:   Any	  =	pipe_a(
          prompt_embeds=__snake_case		,     negative_prompt_embeds=__snake_case		,     image=__snake_case		,     num_inference_steps=2		,     generator=__snake_case		,     output_type='np'		,     )

      a		:   List[Any]	  =	output.images[0]

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

      a		:   Optional[Any]	  =	torch.cuda.max_memory_allocated()
      assert mem_bytes < 10 * 10**9

      a		:   Tuple	  =	load_numpy(
          'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_img2img.npy'      )
      assert_mean_pixel_difference(__snake_case		,     __snake_case      )

      # pipeline 2

      _start_torch_memory_measurement()

      a		:   Optional[int]	  =	torch.Generator(device='cpu'      ).manual_seed(0      )

      a		:   str	  =	floats_tensor((1, 3, 2_56, 2_56)		,     rng=random.Random(0      )      ).to(__snake_case      )
      a		:   Any	  =	floats_tensor((1, 3, 64, 64)		,     rng=random.Random(0      )      ).to(__snake_case      )

      a		:   Dict	  =	pipe_a(
          prompt_embeds=__snake_case		,     negative_prompt_embeds=__snake_case		,     image=__snake_case		,     original_image=__snake_case		,     generator=__snake_case		,     num_inference_steps=2		,     output_type='np'		,     )

      a		:   Optional[Any]	  =	output.images[0]

      assert image.shape == (2_56, 2_56, 3)

      a		:   Any	  =	torch.cuda.max_memory_allocated()
      assert mem_bytes < 4 * 10**9

      a		:   Dict	  =	load_numpy(
          'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_img2img_superresolution_stage_II.npy'      )
      assert_mean_pixel_difference(__snake_case		,     __snake_case      )







    def      lowercase_			( self					:    List[Any]		,     __snake_case					:    Tuple		,     __snake_case					:    Any		,     __snake_case					:    str		,     __snake_case					:    int      ):
      # pipeline 1

      _start_torch_memory_measurement()

      a		:   Tuple	  =	floats_tensor((1, 3, 64, 64)		,     rng=random.Random(0      )      ).to(__snake_case      )
      a		:   Union[str, Any]	  =	floats_tensor((1, 3, 64, 64)		,     rng=random.Random(1      )      ).to(__snake_case      )

      a		:   Union[str, Any]	  =	torch.Generator(device='cpu'      ).manual_seed(0      )
      a		:   str	  =	pipe_a(
          prompt_embeds=__snake_case		,     negative_prompt_embeds=__snake_case		,     image=__snake_case		,     mask_image=__snake_case		,     num_inference_steps=2		,     generator=__snake_case		,     output_type='np'		,     )

      a		:   List[Any]	  =	output.images[0]

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

      a		:   List[str]	  =	torch.cuda.max_memory_allocated()
      assert mem_bytes < 10 * 10**9

      a		:   Optional[int]	  =	load_numpy(
          'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_inpainting.npy'      )
      assert_mean_pixel_difference(__snake_case		,     __snake_case      )

      # pipeline 2

      _start_torch_memory_measurement()

      a		:   Union[str, Any]	  =	torch.Generator(device='cpu'      ).manual_seed(0      )

      a		:   Optional[int]	  =	floats_tensor((1, 3, 64, 64)		,     rng=random.Random(0      )      ).to(__snake_case      )
      a		:   Tuple	  =	floats_tensor((1, 3, 2_56, 2_56)		,     rng=random.Random(0      )      ).to(__snake_case      )
      a		:   Optional[int]	  =	floats_tensor((1, 3, 2_56, 2_56)		,     rng=random.Random(1      )      ).to(__snake_case      )

      a		:   int	  =	pipe_a(
          prompt_embeds=__snake_case		,     negative_prompt_embeds=__snake_case		,     image=__snake_case		,     mask_image=__snake_case		,     original_image=__snake_case		,     generator=__snake_case		,     num_inference_steps=2		,     output_type='np'		,     )

      a		:   List[str]	  =	output.images[0]

      assert image.shape == (2_56, 2_56, 3)

      a		:   Union[str, Any]	  =	torch.cuda.max_memory_allocated()
      assert mem_bytes < 4 * 10**9

      a		:   Any	  =	load_numpy(
          'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/if/test_if_inpainting_superresolution_stage_II.npy'      )
      assert_mean_pixel_difference(__snake_case		,     __snake_case      )
def  lowerCamelCase__			(		):
  torch.cuda.empty_cache()
  torch.cuda.reset_max_memory_allocated()
  torch.cuda.reset_peak_memory_stats()