
"""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


lowerCamelCase__			:							str      =      False




@skip_mps
class 					lowercase__(					lowerCamelCase__		,    lowerCamelCase__		,    lowerCamelCase__		,    unittest.TestCase ):
	'''simple docstring'''

	UpperCamelCase				=	StableDiffusionAttendAndExcitePipeline
	UpperCamelCase				=	False
	UpperCamelCase				=	TEXT_TO_IMAGE_PARAMS
	UpperCamelCase				=	TEXT_TO_IMAGE_BATCH_PARAMS.union({"""token_indices"""} )
	UpperCamelCase				=	TEXT_TO_IMAGE_IMAGE_PARAMS
	UpperCamelCase				=	TEXT_TO_IMAGE_IMAGE_PARAMS





	@classmethod
	def 	__lowerCAmelCase			(    cls     :str       )				->      Optional[Any]:







			'''simple docstring'''




			super().setUpClass()
			torch.use_deterministic_algorithms(__snake_case       )





	@classmethod
	def 	__lowerCAmelCase			(    cls     :int       )				->      Dict:







			'''simple docstring'''




			super().tearDownClass()
			torch.use_deterministic_algorithms(__snake_case       )





	def 	__lowerCAmelCase			(    self     :List[Any]       )				->      List[Any]:







			'''simple docstring'''




			torch.manual_seed(0       )
			SCREAMING_SNAKE_CASE							:  Dict					=			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=__snake_case		,			)
			SCREAMING_SNAKE_CASE							:  List[Any]					=			DDIMScheduler(
			    beta_start=0.0_0_0_8_5		,			beta_end=0.0_1_2		,			beta_schedule='''scaled_linear'''		,			clip_sample=__snake_case		,			set_alpha_to_one=__snake_case		,			)
			torch.manual_seed(0       )
			SCREAMING_SNAKE_CASE							:  Union[str, 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		,			sample_size=1_28		,			)
			torch.manual_seed(0       )
			SCREAMING_SNAKE_CASE							:  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=10_00		,			hidden_act='''gelu'''		,			projection_dim=5_12		,			)
			SCREAMING_SNAKE_CASE							:  Union[str, Any]					=			CLIPTextModel(__snake_case       )
			SCREAMING_SNAKE_CASE							:  Union[str, Any]					=			CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''       )

			SCREAMING_SNAKE_CASE							:  List[str]					=			{
			    'unet': unet,
			    'scheduler': scheduler,
			    'vae': vae,
			    'text_encoder': text_encoder,
			    'tokenizer': tokenizer,
			    'safety_checker': None,
			    'feature_extractor': None,
			}

			return components





	def 	__lowerCAmelCase			(    self     :Any		,			lowerCamelCase_     :Tuple		,			lowerCamelCase_     :int=0       )				->      Dict:







			'''simple docstring'''




			if str(__snake_case       ).startswith('''mps'''       ):
					SCREAMING_SNAKE_CASE							:  Any					=			torch.manual_seed(__snake_case       )
			else:
					SCREAMING_SNAKE_CASE							:  str					=			torch.Generator(device=__snake_case       ).manual_seed(__snake_case       )
			SCREAMING_SNAKE_CASE							:  int					=			{
			    '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 	__lowerCAmelCase			(    self     :Optional[Any]       )				->      Tuple:







			'''simple docstring'''




			SCREAMING_SNAKE_CASE							:  Optional[Any]					=			'cpu'

			SCREAMING_SNAKE_CASE							:  Optional[int]					=			self.get_dummy_components()
			SCREAMING_SNAKE_CASE							:  Union[str, Any]					=			self.pipeline_class(**__snake_case       )
			pipe.to(__snake_case       )
			pipe.set_progress_bar_config(disable=__snake_case       )

			SCREAMING_SNAKE_CASE							:  List[str]					=			self.get_dummy_inputs(__snake_case       )
			SCREAMING_SNAKE_CASE							:  int					=			pipe(**__snake_case       ).images
			SCREAMING_SNAKE_CASE							:  Dict					=			image[0, -3:, -3:, -1]

			self.assertEqual(image.shape		,			(1, 64, 64, 3)       )
			SCREAMING_SNAKE_CASE							:  Union[str, Any]					=			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]       )
			SCREAMING_SNAKE_CASE							:  Dict					=			np.abs(image_slice.flatten() - expected_slice       ).max()
			self.assertLessEqual(__snake_case		,			1E-3       )





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







			'''simple docstring'''




			super().test_cpu_offload_forward_pass(expected_max_diff=5E-4       )





	def 	__lowerCAmelCase			(    self     :Optional[Any]       )				->      Optional[Any]:







			'''simple docstring'''




			self._test_inference_batch_consistent(batch_sizes=[1, 2]       )





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







			'''simple docstring'''




			self._test_inference_batch_single_identical(batch_size=2		,			expected_max_diff=7E-4       )





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







			'''simple docstring'''




			super().test_dict_tuple_outputs_equivalent(expected_max_difference=3E-3       )





	def 	__lowerCAmelCase			(    self     :Any       )				->      List[str]:







			'''simple docstring'''




			super().test_pt_np_pil_outputs_equivalent(expected_max_diff=5E-4       )





	def 	__lowerCAmelCase			(    self     :Optional[Any]       )				->      Dict:







			'''simple docstring'''




			super().test_save_load_local(expected_max_difference=5E-4       )







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







			'''simple docstring'''




			super().test_save_load_optional_components(expected_max_difference=4E-4       )





@require_torch_gpu
@slow
class 					lowercase__(					unittest.TestCase ):
	'''simple docstring'''

	@classmethod
	def 	__lowerCAmelCase			(    cls     :Optional[int]       )				->      List[str]:







			'''simple docstring'''




			super().setUpClass()
			torch.use_deterministic_algorithms(__snake_case       )





	@classmethod
	def 	__lowerCAmelCase			(    cls     :Dict       )				->      Optional[Any]:







			'''simple docstring'''




			super().tearDownClass()
			torch.use_deterministic_algorithms(__snake_case       )





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







			'''simple docstring'''




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







	def 	__lowerCAmelCase			(    self     :int       )				->      str:







			'''simple docstring'''




			SCREAMING_SNAKE_CASE							:  List[str]					=			torch.manual_seed(51       )

			SCREAMING_SNAKE_CASE							:  List[Any]					=			StableDiffusionAttendAndExcitePipeline.from_pretrained(
			    '''CompVis/stable-diffusion-v1-4'''		,			safety_checker=__snake_case		,			torch_dtype=torch.floataa       )
			pipe.to('''cuda'''       )

			SCREAMING_SNAKE_CASE							:  Optional[int]					=			'a painting of an elephant with glasses'
			SCREAMING_SNAKE_CASE							:  int					=			[5, 7]

			SCREAMING_SNAKE_CASE							:  Optional[int]					=			pipe(
			    prompt=__snake_case		,			token_indices=__snake_case		,			guidance_scale=7.5		,			generator=__snake_case		,			num_inference_steps=5		,			max_iter_to_alter=5		,			output_type='''numpy'''		,			).images[0]

			SCREAMING_SNAKE_CASE							:  Optional[Any]					=			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'''






from typing import Callable, Optional

from .. import Features
from ..packaged_modules.generator.generator import Generator
from .abc import AbstractDatasetInputStream

class 				a__(   lowerCamelCase__      ):







    def __init__( self					:    int		,     __snake_case					:    Callable		,     __snake_case					:    Optional[Features] = None		,     __snake_case					:    str = None		,     __snake_case					:    bool = False		,     __snake_case					:    bool = False		,     __snake_case					:    Optional[dict] = None		,     __snake_case					:    Optional[int] = None		,     **__snake_case					:    Optional[int]		,     ):
      super().__init__(
          features=__snake_case		,     cache_dir=__snake_case		,     keep_in_memory=__snake_case		,     streaming=__snake_case		,     num_proc=__snake_case		,     **__snake_case		,     )
      a		:   List[Any]	  =	Generator(
          cache_dir=__snake_case		,     features=__snake_case		,     generator=__snake_case		,     gen_kwargs=__snake_case		,     **__snake_case		,     )







    def      lowercase_			( self					:    Any      ):
      # Build iterable dataset
      if self.streaming:
        a		:   Optional[int]	  =	self.builder.as_streaming_dataset(split='train'      )
      # Build regular (map-style) dataset
      else:
        a		:   List[Any]	  =	None
        a		:   Any	  =	None
        a		:   Optional[int]	  =	None
        a		:   List[str]	  =	None

        self.builder.download_and_prepare(
            download_config=__snake_case		,     download_mode=__snake_case		,     verification_mode=__snake_case		,     base_path=__snake_case		,     num_proc=self.num_proc		,     )
        a		:   Dict	  =	self.builder.as_dataset(
            split='train'		,     verification_mode=__snake_case		,     in_memory=self.keep_in_memory      )
      return dataset