





'''simple docstring'''



import gc
import random
import unittest

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

from diffusers import (
    AutoencoderKL,
    DiffusionPipeline,
    EulerDiscreteScheduler,
    StableDiffusionXLImgaImgPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import floats_tensor, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

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


enable_full_determinism()






class 							__lowercase    ( lowerCAmelCase__	, lowerCAmelCase__	, unittest.TestCase  ):







	'''simple docstring'''

	a      :			Dict     =    StableDiffusionXLImgaImgPipeline
	a      :			List[str]     =    TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {"height", "width"}
	a      :			Optional[Any]     =    PipelineTesterMixin.required_optional_params - {"latents"}
	a      :			Union[str, Any]     =    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
	a      :			Union[str, Any]     =    IMAGE_TO_IMAGE_IMAGE_PARAMS
	a      :			str     =    IMAGE_TO_IMAGE_IMAGE_PARAMS


	def   _UpperCAmelCase       (self	)							->							str:







				'''simple docstring'''





				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''')       ,attention_head_dim=(2, 4)       ,use_linear_projection=_lowerCamelCase       ,addition_embed_type='''text_time'''       ,addition_time_embed_dim=8       ,transformer_layers_per_block=(1, 2)       ,projection_class_embeddings_input_dim=80       ,cross_attention_dim=64       ,)
				__lowercase			  =							EulerDiscreteScheduler(
				    beta_start=0.0_0_0_8_5       ,beta_end=0.0_1_2       ,steps_offset=1       ,beta_schedule='''scaled_linear'''       ,timestep_spacing='''leading'''       ,)
				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       ,sample_size=128       ,)
				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       ,hidden_act='''gelu'''       ,projection_dim=32       ,)
				__lowercase			  =							CLIPTextModel(_lowerCamelCase	)
				__lowercase			  =							CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''       ,local_files_only=_lowerCamelCase	)

				__lowercase			  =							CLIPTextModelWithProjection(_lowerCamelCase	)
				__lowercase			  =							CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''       ,local_files_only=_lowerCamelCase	)

				__lowercase			  =							{
				    '''unet''': unet,
				    '''scheduler''': scheduler,
				    '''vae''': vae,
				    '''text_encoder''': text_encoder,
				    '''tokenizer''': tokenizer,
				    '''text_encoder_2''': text_encoder_a,
				    '''tokenizer_2''': tokenizer_a,
				    # "safety_checker": None,
				    # "feature_extractor": None,
				}
				return components


	def   _UpperCAmelCase       (self       ,_lowerCamelCase       ,_lowerCamelCase=0	)							->							Tuple:







				'''simple docstring'''





				__lowercase			  =							floats_tensor((1, 3, 32, 32)       ,rng=random.Random(_lowerCamelCase	)	).to(_lowerCamelCase	)
				__lowercase			  =							image / 2 + 0.5
				if str(_lowerCamelCase	).startswith('''mps'''	):
							__lowercase			  =							torch.manual_seed(_lowerCamelCase	)
				else:
							__lowercase			  =							torch.Generator(device=_lowerCamelCase	).manual_seed(_lowerCamelCase	)
				__lowercase			  =							{
				    '''prompt''': '''A painting of a squirrel eating a burger''',
				    '''image''': image,
				    '''generator''': generator,
				    '''num_inference_steps''': 2,
				    '''guidance_scale''': 5.0,
				    '''output_type''': '''numpy''',
				    '''strength''': 0.7_5,
				}
				return inputs


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







				'''simple docstring'''





				__lowercase			  =							'''cpu'''  # ensure determinism for the device-dependent torch.Generator
				__lowercase			  =							self.get_dummy_components()
				__lowercase			  =							StableDiffusionXLImgaImgPipeline(**_lowerCamelCase	)
				__lowercase			  =							sd_pipe.to(_lowerCamelCase	)
				sd_pipe.set_progress_bar_config(disable=_lowerCamelCase	)

				__lowercase			  =							self.get_dummy_inputs(_lowerCamelCase	)
				__lowercase			  =							sd_pipe(**_lowerCamelCase	).images
				__lowercase			  =							image[0, -3:, -3:, -1]

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

				__lowercase			  =							np.array([0.4_6_5_6, 0.4_8_4_0, 0.4_4_3_9, 0.6_6_9_8, 0.5_5_7_4, 0.4_5_2_4, 0.5_7_9_9, 0.5_9_4_3, 0.5_1_6_5]	)

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


	def   _UpperCAmelCase       (self	)							->							str:







				'''simple docstring'''





				super().test_attention_slicing_forward_pass(expected_max_diff=3E-3	)


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







				'''simple docstring'''





				super().test_inference_batch_single_identical(expected_max_diff=3E-3	)


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







				'''simple docstring'''





				pass


	def   _UpperCAmelCase       (self	)							->							List[str]:







				'''simple docstring'''





				__lowercase			  =							self.get_dummy_components()
				__lowercase			  =							StableDiffusionXLImgaImgPipeline(**_lowerCamelCase	)
				__lowercase			  =							sd_pipe.to(_lowerCamelCase	)
				__lowercase			  =							sd_pipe.to(_lowerCamelCase	)
				sd_pipe.set_progress_bar_config(disable=_lowerCamelCase	)

				# forward without prompt embeds
				__lowercase			  =							self.get_dummy_inputs(_lowerCamelCase	)
				__lowercase			  =							3 * ['''this is a negative prompt''']
				__lowercase			  =							negative_prompt
				__lowercase			  =							3 * [inputs['''prompt''']]

				__lowercase			  =							sd_pipe(**_lowerCamelCase	)
				__lowercase			  =							output.images[0, -3:, -3:, -1]

				# forward with prompt embeds
				__lowercase			  =							self.get_dummy_inputs(_lowerCamelCase	)
				__lowercase			  =							3 * ['''this is a negative prompt''']
				__lowercase			  =							3 * [inputs.pop('''prompt'''	)]

				(
				    (
				    __lowercase
				)  ,						(
				    __lowercase
				)  ,						(
				    __lowercase
				)  ,						(
				    __lowercase
				)  ,						
				)			  =							sd_pipe.encode_prompt(_lowerCamelCase       ,negative_prompt=_lowerCamelCase	)

				__lowercase			  =							sd_pipe(
				    **_lowerCamelCase       ,prompt_embeds=_lowerCamelCase       ,negative_prompt_embeds=_lowerCamelCase       ,pooled_prompt_embeds=_lowerCamelCase       ,negative_pooled_prompt_embeds=_lowerCamelCase       ,)
				__lowercase			  =							output.images[0, -3:, -3:, -1]

				# make sure that it's equal
				assert np.abs(image_slice_a.flatten() - image_slice_a.flatten()	).max() < 1E-4






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







	'''simple docstring'''

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







				'''simple docstring'''





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


	def   _UpperCAmelCase       (self       ,_lowerCamelCase       ,_lowerCamelCase="cpu"       ,_lowerCamelCase=torch.floataa       ,_lowerCamelCase=0	)							->							int:







				'''simple docstring'''





				__lowercase			  =							torch.Generator(device=_lowerCamelCase	).manual_seed(_lowerCamelCase	)
				__lowercase			  =							np.random.RandomState(_lowerCamelCase	).standard_normal((1, 4, 64, 64)	)
				__lowercase			  =							torch.from_numpy(_lowerCamelCase	).to(device=_lowerCamelCase       ,dtype=_lowerCamelCase	)
				__lowercase			  =							{
				    '''prompt''': '''a photograph of an astronaut riding a horse''',
				    '''latents''': latents,
				    '''generator''': generator,
				    '''num_inference_steps''': 3,
				    '''guidance_scale''': 7.5,
				    '''output_type''': '''numpy''',
				}
				return inputs


	def   _UpperCAmelCase       (self	)							->							int:







				'''simple docstring'''





				__lowercase			  =							DiffusionPipeline.from_pretrained('''stabilityai/stable-diffusion-2-base'''	)
				pipe.to(_lowerCamelCase	)
				pipe.set_progress_bar_config(disable=_lowerCamelCase	)

				__lowercase			  =							self.get_inputs(_lowerCamelCase	)
				__lowercase			  =							pipe(**_lowerCamelCase	).images
				__lowercase			  =							image[0, -3:, -3:, -1].flatten()

				assert image.shape == (1, 512, 512, 3)
				__lowercase			  =							np.array([0.4_9_4_9_3, 0.4_7_8_9_6, 0.4_0_7_9_8, 0.5_4_2_1_4, 0.5_3_2_1_2, 0.4_8_2_0_2, 0.4_7_6_5_6, 0.4_6_3_2_9, 0.4_8_5_0_6]	)
				assert np.abs(image_slice - expected_slice	).max() < 7E-3












'''simple docstring'''



# NOTE: This file is deprecated and will be removed in a future version.
# It only exists so that temporarely `from diffusers.pipelines import DiffusionPipeline` works

from ...utils import deprecate
from ..controlnet.pipeline_flax_controlnet import FlaxStableDiffusionControlNetPipeline  # noqa: F401


deprecate(
    '''stable diffusion controlnet''',
    '''0.22.0''',
    '''Importing `FlaxStableDiffusionControlNetPipeline` from diffusers.pipelines.stable_diffusion.flax_pipeline_stable_diffusion_controlnet is deprecated. Please import `from diffusers import FlaxStableDiffusionControlNetPipeline` instead.''',
    standard_warn=False,
    stacklevel=3,
)





