


from typing import Dict, List, Optional, Union

import numpy as np

from ...image_processing_utils import BaseImageProcessor, BatchFeature, get_size_dict
from ...image_transforms import center_crop, normalize, rescale, resize, to_channel_dimension_format
from ...image_utils import (
    IMAGENET_STANDARD_MEAN,
    IMAGENET_STANDARD_STD,
    ChannelDimension,
    ImageInput,
    PILImageResampling,
    make_list_of_images,
    to_numpy_array,
    valid_images,
)
from ...utils import TensorType, is_vision_available, logging


if is_vision_available():
				import PIL


lowerCAmelCase__       :	Tuple     				=logging.get_logger(__name__)







class      __lowercase  (__SCREAMING_SNAKE_CASE   ):





							"""simple docstring"""







							_UpperCAmelCase     =		["""pixel_values"""]






							def __init__(	self       ,		lowerCAmelCase__ = True       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = PIL.Image.NEAREST       ,		lowerCAmelCase__ = False       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = 1 / 2_5_5       ,		lowerCAmelCase__ = False       ,		lowerCAmelCase__ = True       ,		lowerCAmelCase__ = True       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = True       ,		**lowerCAmelCase__       ,		):





										"""simple docstring"""




										super().__init__(**lowerCAmelCase__    )
										SCREAMING_SNAKE_CASE_						:			int       						= size if size is not None else {'height': 3_4_6, 'width': 3_4_6}
										SCREAMING_SNAKE_CASE_						:			List[str]       						= get_size_dict(lowerCAmelCase__    )
										SCREAMING_SNAKE_CASE_						:			int       						= crop_size if crop_size is not None else {'height': 2_8_9, 'width': 2_8_9}
										SCREAMING_SNAKE_CASE_						:			Union[str, Any]       						= get_size_dict(lowerCAmelCase__       ,		param_name='crop_size'    )

										SCREAMING_SNAKE_CASE_						:			Tuple       						= do_resize
										SCREAMING_SNAKE_CASE_						:			List[Any]       						= size
										SCREAMING_SNAKE_CASE_						:			int       						= resample
										SCREAMING_SNAKE_CASE_						:			List[Any]       						= do_center_crop
										SCREAMING_SNAKE_CASE_						:			Optional[Any]       						= crop_size
										SCREAMING_SNAKE_CASE_						:			Any       						= do_rescale
										SCREAMING_SNAKE_CASE_						:			Tuple       						= rescale_factor
										SCREAMING_SNAKE_CASE_						:			str       						= rescale_offset
										SCREAMING_SNAKE_CASE_						:			List[Any]       						= do_normalize
										SCREAMING_SNAKE_CASE_						:			List[Any]       						= image_mean if image_mean is not None else IMAGENET_STANDARD_MEAN
										SCREAMING_SNAKE_CASE_						:			Tuple       						= image_std if image_std is not None else IMAGENET_STANDARD_STD
										SCREAMING_SNAKE_CASE_						:			Optional[Any]       						= include_top






							def  UpperCamelCase__			(	self       ,		lowerCAmelCase__       ,		lowerCAmelCase__       ,		lowerCAmelCase__ = PIL.Image.NEAREST       ,		lowerCAmelCase__ = None       ,		**lowerCAmelCase__       ,		):





										"""simple docstring"""




										SCREAMING_SNAKE_CASE_						:			List[str]       						= get_size_dict(lowerCAmelCase__    )
										if "height" not in size or "width" not in size:
													raise ValueError(F'''The size dictionary must have keys \'height\' and \'width\'. Got {size.keys()}'''    )
										return resize(
										    lowerCAmelCase__       ,		size=(size['height'], size['width'])       ,		resample=lowerCAmelCase__       ,		data_format=lowerCAmelCase__       ,		**lowerCAmelCase__    )






							def  UpperCamelCase__			(	self       ,		lowerCAmelCase__       ,		lowerCAmelCase__       ,		lowerCAmelCase__ = None       ,		**lowerCAmelCase__       ,		):





										"""simple docstring"""




										SCREAMING_SNAKE_CASE_						:			Tuple       						= get_size_dict(lowerCAmelCase__    )
										if "height" not in size or "width" not in size:
													raise ValueError(F'''The size dictionary must have keys \'height\' and \'width\'. Got {size.keys()}'''    )
										return center_crop(lowerCAmelCase__       ,		size=(size['height'], size['width'])       ,		data_format=lowerCAmelCase__       ,		**lowerCAmelCase__    )






							def  UpperCamelCase__			(	self       ,		lowerCAmelCase__       ,		lowerCAmelCase__       ,		lowerCAmelCase__ = True       ,		lowerCAmelCase__ = None       ,		**lowerCAmelCase__       ,		):





										"""simple docstring"""




										if offset:
													SCREAMING_SNAKE_CASE_						:			Any       						= (image - 127.5) * scale
													if data_format is not None:
																SCREAMING_SNAKE_CASE_						:			Optional[Any]       						= to_channel_dimension_format(lowerCAmelCase__       ,		lowerCAmelCase__    )
													SCREAMING_SNAKE_CASE_						:			Optional[Any]       						= rescaled_image.astype(np.floataa    )
										else:
													SCREAMING_SNAKE_CASE_						:			Any       						= rescale(lowerCAmelCase__       ,		scale=lowerCAmelCase__       ,		data_format=lowerCAmelCase__       ,		**lowerCAmelCase__    )
										return rescaled_image






							def  UpperCamelCase__			(	self       ,		lowerCAmelCase__       ,		lowerCAmelCase__       ,		lowerCAmelCase__       ,		lowerCAmelCase__ = None       ,		**lowerCAmelCase__       ,		):





										"""simple docstring"""




										return normalize(lowerCAmelCase__       ,		mean=lowerCAmelCase__       ,		std=lowerCAmelCase__       ,		data_format=lowerCAmelCase__       ,		**lowerCAmelCase__    )






							def  UpperCamelCase__			(	self       ,		lowerCAmelCase__       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__=None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = None       ,		lowerCAmelCase__ = ChannelDimension.FIRST       ,		**lowerCAmelCase__       ,		):





										"""simple docstring"""




										SCREAMING_SNAKE_CASE_						:			List[str]       						= do_resize if do_resize is not None else self.do_resize
										SCREAMING_SNAKE_CASE_						:			Any       						= resample if resample is not None else self.resample
										SCREAMING_SNAKE_CASE_						:			str       						= do_center_crop if do_center_crop is not None else self.do_center_crop
										SCREAMING_SNAKE_CASE_						:			Union[str, Any]       						= do_rescale if do_rescale is not None else self.do_rescale
										SCREAMING_SNAKE_CASE_						:			Tuple       						= rescale_factor if rescale_factor is not None else self.rescale_factor
										SCREAMING_SNAKE_CASE_						:			Union[str, Any]       						= rescale_offset if rescale_offset is not None else self.rescale_offset
										SCREAMING_SNAKE_CASE_						:			Dict       						= do_normalize if do_normalize is not None else self.do_normalize
										SCREAMING_SNAKE_CASE_						:			Dict       						= image_mean if image_mean is not None else self.image_mean
										SCREAMING_SNAKE_CASE_						:			Any       						= image_std if image_std is not None else self.image_std
										SCREAMING_SNAKE_CASE_						:			Dict       						= include_top if include_top is not None else self.include_top

										SCREAMING_SNAKE_CASE_						:			List[Any]       						= size if size is not None else self.size
										SCREAMING_SNAKE_CASE_						:			str       						= get_size_dict(lowerCAmelCase__    )
										SCREAMING_SNAKE_CASE_						:			Any       						= crop_size if crop_size is not None else self.crop_size
										SCREAMING_SNAKE_CASE_						:			Tuple       						= get_size_dict(lowerCAmelCase__       ,		param_name='crop_size'    )

										SCREAMING_SNAKE_CASE_						:			str       						= make_list_of_images(lowerCAmelCase__    )

										if not valid_images(lowerCAmelCase__    ):
													raise ValueError(
													    'Invalid image type. Must be of type PIL.Image.Image, numpy.ndarray, '
													    'torch.Tensor, tf.Tensor or jax.ndarray.'    )

										if do_resize and size is None or resample is None:
													raise ValueError('Size and resample must be specified if do_resize is True.'    )

										if do_center_crop and crop_size is None:
													raise ValueError('Crop size must be specified if do_center_crop is True.'    )

										if do_rescale and rescale_factor is None:
													raise ValueError('Rescale factor must be specified if do_rescale is True.'    )

										if do_normalize and (image_mean is None or image_std is None):
													raise ValueError('Image mean and std must be specified if do_normalize is True.'    )

										# All transformations expect numpy arrays.
										SCREAMING_SNAKE_CASE_						:			Any       						= [to_numpy_array(lowerCAmelCase__    ) for image in images]

										if do_resize:
													SCREAMING_SNAKE_CASE_						:			Dict       						= [self.resize(image=lowerCAmelCase__       ,		size=lowerCAmelCase__       ,		resample=lowerCAmelCase__    ) for image in images]

										if do_center_crop:
													SCREAMING_SNAKE_CASE_						:			str       						= [self.center_crop(image=lowerCAmelCase__       ,		size=lowerCAmelCase__    ) for image in images]

										if do_rescale:
													SCREAMING_SNAKE_CASE_						:			List[Any]       						= [self.rescale(image=lowerCAmelCase__       ,		scale=lowerCAmelCase__       ,		offset=lowerCAmelCase__    ) for image in images]

										if do_normalize:
													SCREAMING_SNAKE_CASE_						:			Optional[Any]       						= [self.normalize(image=lowerCAmelCase__       ,		mean=lowerCAmelCase__       ,		std=lowerCAmelCase__    ) for image in images]

										if include_top:
													SCREAMING_SNAKE_CASE_						:			str       						= [self.normalize(image=lowerCAmelCase__       ,		mean=[0, 0, 0]       ,		std=lowerCAmelCase__    ) for image in images]

										SCREAMING_SNAKE_CASE_						:			int       						= [to_channel_dimension_format(lowerCAmelCase__       ,		lowerCAmelCase__    ) for image in images]

										SCREAMING_SNAKE_CASE_						:			Union[str, Any]       						= {'pixel_values': images}
										return BatchFeature(data=lowerCAmelCase__       ,		tensor_type=lowerCAmelCase__    )










'''simple docstring'''

import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    EulerAncestralDiscreteScheduler,
    PNDMScheduler,
    StableDiffusionModelEditingPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu, skip_mps

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineKarrasSchedulerTesterMixin, PipelineLatentTesterMixin, PipelineTesterMixin


enable_full_determinism()

@skip_mps
class __snake_case(      _lowerCAmelCase		,							_lowerCAmelCase		,							_lowerCAmelCase		,							unittest.TestCase					):


						'''simple docstring'''



						UpperCAmelCase							:    Optional[Any]           =		StableDiffusionModelEditingPipeline
						UpperCAmelCase							:    List[str]           =		TEXT_TO_IMAGE_PARAMS
						UpperCAmelCase							:    Optional[Any]           =		TEXT_TO_IMAGE_BATCH_PARAMS
						UpperCAmelCase							:    Optional[int]           =		TEXT_TO_IMAGE_IMAGE_PARAMS
						UpperCAmelCase							:    Optional[int]           =		TEXT_TO_IMAGE_IMAGE_PARAMS


						def 				__snake_case    (					self      )	->	Optional[Any]:
							torch.manual_seed(0      )
							lowerCAmelCase    =	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""")	,       cross_attention_dim=32	,       )
							lowerCAmelCase    =	DDIMScheduler()
							torch.manual_seed(0      )
							lowerCAmelCase    =	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	,       )
							torch.manual_seed(0      )
							lowerCAmelCase    =	CLIPTextConfig(
							    bos_token_id=0	,       eos_token_id=2	,       hidden_size=32	,       intermediate_size=37	,       layer_norm_eps=1e-05	,       num_attention_heads=4	,       num_hidden_layers=5	,       pad_token_id=1	,       vocab_size=1000	,       )
							lowerCAmelCase    =	CLIPTextModel(A_      )
							lowerCAmelCase    =	CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip"""      )

							lowerCAmelCase    =	{
							    """unet""": unet,
							    """scheduler""": scheduler,
							    """vae""": vae,
							    """text_encoder""": text_encoder,
							    """tokenizer""": tokenizer,
							    """safety_checker""": None,
							    """feature_extractor""": None,
							}
							return components


						def 				__snake_case    (					self	,       A_	,       A_=0      )	->	Optional[int]:
							lowerCAmelCase    =	torch.manual_seed(A_      )
							lowerCAmelCase    =	{
							    """prompt""": """A field of roses""",
							    """generator""": generator,
							    # Setting height and width to None to prevent OOMs on CPU.
							    """height""": None,
							    """width""": None,
							    """num_inference_steps""": 2,
							    """guidance_scale""": 6.0,
							    """output_type""": """numpy""",
							}
							return inputs


						def 				__snake_case    (					self      )	->	List[str]:
							lowerCAmelCase    =	"""cpu"""  # ensure determinism for the device-dependent torch.Generator
							lowerCAmelCase    =	self.get_dummy_components()
							lowerCAmelCase    =	StableDiffusionModelEditingPipeline(**A_      )
							lowerCAmelCase    =	sd_pipe.to(A_      )
							sd_pipe.set_progress_bar_config(disable=A_      )

							lowerCAmelCase    =	self.get_dummy_inputs(A_      )
							lowerCAmelCase    =	sd_pipe(**A_      ).images
							lowerCAmelCase    =	image[0, -3:, -3:, -1]
							assert image.shape == (1, 64, 64, 3)

							lowerCAmelCase    =	np.array([0.4_7_5_5, 0.5_1_3_2, 0.4_9_7_6, 0.3_9_0_4, 0.3_5_5_4, 0.4_7_6_5, 0.5_1_3_9, 0.5_1_5_8, 0.4_8_8_9]      )

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


						def 				__snake_case    (					self      )	->	str:
							lowerCAmelCase    =	"""cpu"""  # ensure determinism for the device-dependent torch.Generator
							lowerCAmelCase    =	self.get_dummy_components()
							lowerCAmelCase    =	StableDiffusionModelEditingPipeline(**A_      )
							lowerCAmelCase    =	sd_pipe.to(A_      )
							sd_pipe.set_progress_bar_config(disable=A_      )

							lowerCAmelCase    =	self.get_dummy_inputs(A_      )
							lowerCAmelCase    =	"""french fries"""
							lowerCAmelCase    =	sd_pipe(**A_	,       negative_prompt=A_      )
							lowerCAmelCase    =	output.images
							lowerCAmelCase    =	image[0, -3:, -3:, -1]

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

							lowerCAmelCase    =	np.array([0.4_9_9_2, 0.5_1_0_1, 0.5_0_0_4, 0.3_9_4_9, 0.3_6_0_4, 0.4_7_3_5, 0.5_2_1_6, 0.5_2_0_4, 0.4_9_1_3]      )

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


						def 				__snake_case    (					self      )	->	Optional[int]:
							lowerCAmelCase    =	"""cpu"""  # ensure determinism for the device-dependent torch.Generator
							lowerCAmelCase    =	self.get_dummy_components()
							lowerCAmelCase    =	EulerAncestralDiscreteScheduler(
							    beta_start=0.0_0_0_8_5	,       beta_end=0.0_1_2	,       beta_schedule="""scaled_linear"""      )
							lowerCAmelCase    =	StableDiffusionModelEditingPipeline(**A_      )
							lowerCAmelCase    =	sd_pipe.to(A_      )
							sd_pipe.set_progress_bar_config(disable=A_      )

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

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

							lowerCAmelCase    =	np.array([0.4_7_4_7, 0.5_3_7_2, 0.4_7_7_9, 0.4_9_8_2, 0.5_5_4_3, 0.4_8_1_6, 0.5_2_3_8, 0.4_9_0_4, 0.5_0_2_7]      )

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


						def 				__snake_case    (					self      )	->	Optional[Any]:
							lowerCAmelCase    =	"""cpu"""  # ensure determinism for the device-dependent torch.Generator
							lowerCAmelCase    =	self.get_dummy_components()
							lowerCAmelCase    =	PNDMScheduler()
							lowerCAmelCase    =	StableDiffusionModelEditingPipeline(**A_      )
							lowerCAmelCase    =	sd_pipe.to(A_      )
							sd_pipe.set_progress_bar_config(disable=A_      )

							lowerCAmelCase    =	self.get_dummy_inputs(A_      )
							# the pipeline does not expect pndm so test if it raises error.
							with self.assertRaises(A_      ):
								lowerCAmelCase    =	sd_pipe(**A_      ).images


						def 				__snake_case    (					self      )	->	str:
							super().test_inference_batch_single_identical(expected_max_diff=5e-3      )




						def 				__snake_case    (					self      )	->	Any:
							super().test_attention_slicing_forward_pass(expected_max_diff=5e-3      )







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


						'''simple docstring'''



						def 				__snake_case    (					self      )	->	int:
							super().tearDown()
							gc.collect()
							torch.cuda.empty_cache()


						def 				__snake_case    (					self	,       A_=0      )	->	Dict:
							lowerCAmelCase    =	torch.manual_seed(A_      )
							lowerCAmelCase    =	{
							    """prompt""": """A field of roses""",
							    """generator""": generator,
							    """num_inference_steps""": 3,
							    """guidance_scale""": 7.5,
							    """output_type""": """numpy""",
							}
							return inputs


						def 				__snake_case    (					self      )	->	int:
							lowerCAmelCase    =	"""CompVis/stable-diffusion-v1-4"""
							lowerCAmelCase    =	StableDiffusionModelEditingPipeline.from_pretrained(A_	,       safety_checker=A_      )
							pipe.to(A_      )
							pipe.set_progress_bar_config(disable=A_      )
							pipe.enable_attention_slicing()

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

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

							lowerCAmelCase    =	np.array(
							    [0.6_7_4_9_4_9_6, 0.6_3_8_6_4_5_3, 0.5_1_4_4_3_2_6_7, 0.6_6_0_9_4_9_0_5, 0.6_1_9_2_1_2_1_5, 0.5_4_9_1_3_3_2, 0.5_7_4_4_4_1_7, 0.5_8_0_7_5_1_0_6, 0.5_1_7_4_6_5_8]      )

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

							# make sure image changes after editing
							pipe.edit_model("""A pack of roses"""	,       """A pack of blue roses"""      )

							lowerCAmelCase    =	pipe(**A_      ).images
							lowerCAmelCase    =	image[0, -3:, -3:, -1].flatten()

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

							assert np.abs(expected_slice - image_slice      ).max() > 1e-1




						def 				__snake_case    (					self      )	->	str:
							torch.cuda.empty_cache()
							torch.cuda.reset_max_memory_allocated()
							torch.cuda.reset_peak_memory_stats()

							lowerCAmelCase    =	"""CompVis/stable-diffusion-v1-4"""
							lowerCAmelCase    =	DDIMScheduler.from_pretrained(A_	,       subfolder="""scheduler"""      )
							lowerCAmelCase    =	StableDiffusionModelEditingPipeline.from_pretrained(
							    A_	,       scheduler=A_	,       safety_checker=A_      )
							lowerCAmelCase    =	pipe.to(A_      )
							pipe.set_progress_bar_config(disable=A_      )
							pipe.enable_attention_slicing(1      )
							pipe.enable_sequential_cpu_offload()

							lowerCAmelCase    =	self.get_inputs()
							lowerCAmelCase    =	pipe(**A_      )

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