



import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionSAGPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

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


enable_full_determinism()



class 						UpperCAmelCase_					( a     ,      a     ,      unittest.TestCase):
							lowerCamelCase__         =	StableDiffusionSAGPipeline
							lowerCamelCase__         =	TEXT_TO_IMAGE_PARAMS
							lowerCamelCase__         =	TEXT_TO_IMAGE_BATCH_PARAMS
							lowerCamelCase__         =	TEXT_TO_IMAGE_IMAGE_PARAMS
							lowerCamelCase__         =	TEXT_TO_IMAGE_IMAGE_PARAMS
							lowerCamelCase__         =	False







							def      snake_case__   (     self):

														'''simple docstring'''

														torch.manual_seed(0)
														_lowerCAmelCase  :							int				     =					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  :							Any				     =					DDIMScheduler(
														    beta_start=0.00_085,    beta_end=0.012,    beta_schedule="scaled_linear",    clip_sample=__a,    set_alpha_to_one=__a,    )
														torch.manual_seed(0)
														_lowerCAmelCase  :							Optional[Any]				     =					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  :							Any				     =					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  :							List[str]				     =					CLIPTextModel(__a)
														_lowerCAmelCase  :							Optional[Any]				     =					CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip")

														_lowerCAmelCase  :							Optional[Any]				     =					{
														    "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):

														'''simple docstring'''

														if str(__a).startswith("mps"):
																					_lowerCAmelCase  :							Any				     =					torch.manual_seed(__a)
														else:
																					_lowerCAmelCase  :							int				     =					torch.Generator(device=__a).manual_seed(__a)
														_lowerCAmelCase  :							Tuple				     =					{
														    "prompt": ".",
														    "generator": generator,
														    "num_inference_steps": 2,
														    "guidance_scale": 1.0,
														    "sag_scale": 1.0,
														    "output_type": "numpy",
														}
														return inputs







							def      snake_case__   (     self):

														'''simple docstring'''

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



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







							def      snake_case__   (     self):

														'''simple docstring'''

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







							def      snake_case__   (     self):

														'''simple docstring'''

														_lowerCAmelCase  :							Any				     =					StableDiffusionSAGPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
														_lowerCAmelCase  :							str				     =					sag_pipe.to(__a)
														sag_pipe.set_progress_bar_config(disable=__a)

														_lowerCAmelCase  :							Any				     =					"."
														_lowerCAmelCase  :							Tuple				     =					torch.manual_seed(0)
														_lowerCAmelCase  :							List[Any]				     =					sag_pipe(
														    [prompt],    generator=__a,    guidance_scale=7.5,    sag_scale=1.0,    num_inference_steps=20,    output_type="np")

														_lowerCAmelCase  :							Any				     =					output.images

														_lowerCAmelCase  :							Any				     =					image[0, -3:, -3:, -1]

														assert image.shape == (1, 512, 512, 3)
														_lowerCAmelCase  :							List[str]				     =					np.array([0.1_568, 0.1_738, 0.1_695, 0.1_693, 0.1_507, 0.1_705, 0.1_547, 0.1_751, 0.1_949])

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







							def      snake_case__   (     self):

														'''simple docstring'''

														_lowerCAmelCase  :							Tuple				     =					StableDiffusionSAGPipeline.from_pretrained("stabilityai/stable-diffusion-2-1-base")
														_lowerCAmelCase  :							List[Any]				     =					sag_pipe.to(__a)
														sag_pipe.set_progress_bar_config(disable=__a)

														_lowerCAmelCase  :							List[str]				     =					"."
														_lowerCAmelCase  :							List[str]				     =					torch.manual_seed(0)
														_lowerCAmelCase  :							Optional[int]				     =					sag_pipe(
														    [prompt],    generator=__a,    guidance_scale=7.5,    sag_scale=1.0,    num_inference_steps=20,    output_type="np")

														_lowerCAmelCase  :							List[Any]				     =					output.images

														_lowerCAmelCase  :							Optional[Any]				     =					image[0, -3:, -3:, -1]

														assert image.shape == (1, 512, 512, 3)
														_lowerCAmelCase  :							Any				     =					np.array([0.3_459, 0.2_876, 0.2_537, 0.3_002, 0.2_671, 0.2_160, 0.3_026, 0.2_262, 0.2_371])

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







							def      snake_case__   (     self):

														'''simple docstring'''

														_lowerCAmelCase  :							Dict				     =					StableDiffusionSAGPipeline.from_pretrained("stabilityai/stable-diffusion-2-1-base")
														_lowerCAmelCase  :							int				     =					sag_pipe.to(__a)
														sag_pipe.set_progress_bar_config(disable=__a)

														_lowerCAmelCase  :							Optional[Any]				     =					"."
														_lowerCAmelCase  :							Union[str, Any]				     =					torch.manual_seed(0)
														_lowerCAmelCase  :							List[str]				     =					sag_pipe(
														    [prompt],    width=768,    height=512,    generator=__a,    guidance_scale=7.5,    sag_scale=1.0,    num_inference_steps=20,    output_type="np",    )

														_lowerCAmelCase  :							Any				     =					output.images

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





def        A       (      _lowerCamelCase       ,				_lowerCamelCase						):





							'''simple docstring'''




							return price * (1 + tax_rate)


if __name__ == "__main__":
						print(f'''{price_plus_tax(100, 0.25) = }''')
						print(f'''{price_plus_tax(125.50, 0.05) = }''')
