






"""simple docstring"""




import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionAttendAndExcitePipeline,
    UNetaDConditionModel,
)
from diffusers.utils import load_numpy, skip_mps, slow
from diffusers.utils.testing_utils import 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 PipelineKarrasSchedulerTesterMixin, PipelineLatentTesterMixin, PipelineTesterMixin


_snake_case          =   False






@skip_mps
class        UpperCamelCase			(	snake_case_		,     snake_case_		,     snake_case_		,     unittest.TestCase      ):
 UpperCamelCase					:       List[Any]			=					StableDiffusionAttendAndExcitePipeline
 UpperCamelCase					:       Union[str, Any]			=					False
 UpperCamelCase					:       Tuple			=					TEXT_TO_IMAGE_PARAMS
 UpperCamelCase					:       int			=					TEXT_TO_IMAGE_BATCH_PARAMS.union({'''token_indices'''}      )
 UpperCamelCase					:       List[str]			=					TEXT_TO_IMAGE_IMAGE_PARAMS
 UpperCamelCase					:       List[Any]			=					TEXT_TO_IMAGE_IMAGE_PARAMS


 @classmethod
 def _lowercase	(     cls		:						Union[str, Any]							)					->       Optional[Any]:
   super().setUpClass()
   torch.use_deterministic_algorithms(UpperCAmelCase__							)


 @classmethod
 def _lowercase	(     cls		:						List[Any]							)					->       Tuple:
   super().tearDownClass()
   torch.use_deterministic_algorithms(UpperCAmelCase__							)


 def _lowercase	(     self		:						List[str]							)					->       Optional[int]:
   torch.manual_seed(0							)
   _a  :       Optional[Any]             =	UNetaDConditionModel(
       block_out_channels=(32, 64)							,						layers_per_block=1							,						sample_size=32							,						in_channels=4							,						out_channels=4							,						down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")							,						up_block_types=("""CrossAttnUpBlock2D""", """UpBlock2D""")							,						cross_attention_dim=32							,						attention_head_dim=(2, 4)							,						use_linear_projection=UpperCAmelCase__							,						)
   _a  :       List[str]             =	DDIMScheduler(
       beta_start=0.0_0_0_8_5							,						beta_end=0.0_1_2							,						beta_schedule="""scaled_linear"""							,						clip_sample=UpperCAmelCase__							,						set_alpha_to_one=UpperCAmelCase__							,						)
   torch.manual_seed(0							)
   _a  :       str             =	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							)
   _a  :       Optional[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							,						hidden_act="""gelu"""							,						projection_dim=512							,						)
   _a  :       int             =	CLIPTextModel(UpperCAmelCase__							)
   _a  :       Union[str, Any]             =	CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip"""							)

   _a  :       Optional[Any]             =	{
       """unet""": unet,
       """scheduler""": scheduler,
       """vae""": vae,
       """text_encoder""": text_encoder,
       """tokenizer""": tokenizer,
       """safety_checker""": None,
       """feature_extractor""": None,
   }

   return components


 def _lowercase	(     self		:						Union[str, Any]							,						UpperCAmelCase__		:						int							,						UpperCAmelCase__		:						Optional[int]=0							)					->       Any:
   if str(UpperCAmelCase__							).startswith("""mps"""							):
     _a  :       Dict             =	torch.manual_seed(UpperCAmelCase__							)
   else:
     _a  :       str             =	torch.Generator(device=UpperCAmelCase__							).manual_seed(UpperCAmelCase__							)
   _a  :       Any             =	{
       """prompt""": """a cat and a frog""",
       """token_indices""": [2, 5],
       """generator""": generator,
       """num_inference_steps""": 1,
       """guidance_scale""": 6.0,
       """output_type""": """numpy""",
       """max_iter_to_alter""": 2,
       """thresholds""": {0: 0.7},
   }
   return inputs


 def _lowercase	(     self		:						Dict							)					->       Optional[Any]:
   _a  :       Optional[int]             =	"""cpu"""

   _a  :       int             =	self.get_dummy_components()
   _a  :       Optional[Any]             =	self.pipeline_class(**UpperCAmelCase__							)
   pipe.to(UpperCAmelCase__							)
   pipe.set_progress_bar_config(disable=UpperCAmelCase__							)

   _a  :       List[str]             =	self.get_dummy_inputs(UpperCAmelCase__							)
   _a  :       Optional[int]             =	pipe(**UpperCAmelCase__							).images
   _a  :       List[Any]             =	image[0, -3:, -3:, -1]

   self.assertEqual(image.shape							,						(1, 64, 64, 3)							)
   _a  :       str             =	np.array(
       [0.6_3_9_0_5_3_6_4, 0.6_2_8_9_7_3_0_7, 0.4_8_5_9_9_0_1_7, 0.5_1_3_3_6_2_4, 0.5_5_5_0_0_4_8, 0.4_5_7_6_9_5_1_6, 0.5_0_3_2_6_9_7_3, 0.5_0_2_3_1_3_9, 0.4_5_3_8_4_4_9_6]							)
   _a  :       Any             =	np.abs(image_slice.flatten() - expected_slice							).max()
   self.assertLessEqual(UpperCAmelCase__							,						1E-3							)


 def _lowercase	(     self		:						int							)					->       int:
   super().test_cpu_offload_forward_pass(expected_max_diff=5E-4							)


 def _lowercase	(     self		:						List[str]							)					->       Optional[Any]:
   # NOTE: Larger batch sizes cause this test to timeout, only test on smaller batches
   self._test_inference_batch_consistent(batch_sizes=[1, 2]							)


 def _lowercase	(     self		:						List[str]							)					->       List[str]:
   self._test_inference_batch_single_identical(batch_size=2							,						expected_max_diff=7E-4							)


 def _lowercase	(     self		:						str							)					->       Any:
   super().test_dict_tuple_outputs_equivalent(expected_max_difference=3E-3							)


 def _lowercase	(     self		:						Optional[int]							)					->       str:
   super().test_pt_np_pil_outputs_equivalent(expected_max_diff=5E-4							)


 def _lowercase	(     self		:						Optional[Any]							)					->       Any:
   super().test_save_load_local(expected_max_difference=5E-4							)







 def _lowercase	(     self		:						Any							)					->       Optional[Any]:
   super().test_save_load_optional_components(expected_max_difference=4E-4							)







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


 @classmethod
 def _lowercase	(     cls		:						int							)					->       List[Any]:
   super().setUpClass()
   torch.use_deterministic_algorithms(UpperCAmelCase__							)


 @classmethod
 def _lowercase	(     cls		:						str							)					->       int:
   super().tearDownClass()
   torch.use_deterministic_algorithms(UpperCAmelCase__							)


 def _lowercase	(     self		:						Union[str, Any]							)					->       Union[str, Any]:
   super().tearDown()
   gc.collect()
   torch.cuda.empty_cache()







 def _lowercase	(     self		:						int							)					->       Union[str, Any]:
   _a  :       Dict             =	torch.manual_seed(51							)

   _a  :       Union[str, Any]             =	StableDiffusionAttendAndExcitePipeline.from_pretrained(
       """CompVis/stable-diffusion-v1-4"""							,						safety_checker=UpperCAmelCase__							,						torch_dtype=torch.floataa							)
   pipe.to("""cuda"""							)

   _a  :       List[Any]             =	"""a painting of an elephant with glasses"""
   _a  :       int             =	[5, 7]

   _a  :       Optional[Any]             =	pipe(
       prompt=UpperCAmelCase__							,						token_indices=UpperCAmelCase__							,						guidance_scale=7.5							,						generator=UpperCAmelCase__							,						num_inference_steps=5							,						max_iter_to_alter=5							,						output_type="""numpy"""							,						).images[0]

   _a  :       int             =	load_numpy(
       """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/attend-and-excite/elephant_glasses.npy"""							)
   assert np.abs((expected_image - image).max()							) < 5E-1









"""simple docstring"""




_snake_case          =   '\n# Transformers installation\n! pip install transformers datasets\n# To install from source instead of the last release, comment the command above and uncomment the following one.\n# ! pip install git+https://github.com/huggingface/transformers.git\n'

_snake_case          =   [{'type': 'code', 'content': INSTALL_CONTENT}]
_snake_case          =   {
    '{processor_class}': 'FakeProcessorClass',
    '{model_class}': 'FakeModelClass',
    '{object_class}': 'FakeObjectClass',
}

