




import torch

from diffusers import KDPMaAncestralDiscreteScheduler
from diffusers.utils import torch_device

from .test_schedulers import SchedulerCommonTest

class 						A__      (					snake_case__			):







    """simple docstring"""

    __magic_name__    						=	(KDPMaAncestralDiscreteScheduler,)
    __magic_name__    						=	10
    def 	a_    ( self    ,      **__snake_case					):
         snake_case					=       {
             '''num_train_timesteps''': 1_1_0_0,
             '''beta_start''': 0.0001,
             '''beta_end''': 0.02,
             '''beta_schedule''': '''linear''',
         }

         config.update(**__snake_case					)
         return config
    def 	a_    ( self					):
         for timesteps in [1_0, 5_0, 1_0_0, 1_0_0_0]:
              self.check_over_configs(num_train_timesteps=__snake_case					)
    def 	a_    ( self					):
         for beta_start, beta_end in zip([0.0_0001, 0.0001, 0.001]    ,      [0.0002, 0.002, 0.02]					):
              self.check_over_configs(beta_start=__snake_case    ,      beta_end=__snake_case					)
    def 	a_    ( self					):
         for schedule in ["linear", "scaled_linear"]:
              self.check_over_configs(beta_schedule=__snake_case					)
    def 	a_    ( self					):
         if torch_device == "mps":
              return
         snake_case					=       self.scheduler_classes[0]
         snake_case					=       self.get_scheduler_config()
         snake_case					=       scheduler_class(**__snake_case					)

         scheduler.set_timesteps(self.num_inference_steps					)

         snake_case					=       torch.manual_seed(0					)

         snake_case					=       self.dummy_model()
         snake_case					=       self.dummy_sample_deter * scheduler.init_noise_sigma
         snake_case					=       sample.to(__snake_case					)

         for i, t in enumerate(scheduler.timesteps					):
              snake_case					=       scheduler.scale_model_input(__snake_case    ,      __snake_case					)

              snake_case					=       model(__snake_case    ,      __snake_case					)

              snake_case					=       scheduler.step(__snake_case    ,      __snake_case    ,      __snake_case    ,      generator=__snake_case					)
              snake_case					=       output.prev_sample

         snake_case					=       torch.sum(torch.abs(__snake_case					)					)
         snake_case					=       torch.mean(torch.abs(__snake_case					)					)

         assert abs(result_sum.item() - 1_3_8_4_9.3_8_7_7					) < 1E-2
         assert abs(result_mean.item() - 18.0331					) < 5E-3
    def 	a_    ( self					):
         for prediction_type in ["epsilon", "v_prediction"]:
              self.check_over_configs(prediction_type=__snake_case					)
    def 	a_    ( self					):
         if torch_device == "mps":
              return
         snake_case					=       self.scheduler_classes[0]
         snake_case					=       self.get_scheduler_config(prediction_type='''v_prediction'''					)
         snake_case					=       scheduler_class(**__snake_case					)

         scheduler.set_timesteps(self.num_inference_steps					)

         snake_case					=       self.dummy_model()
         snake_case					=       self.dummy_sample_deter * scheduler.init_noise_sigma
         snake_case					=       sample.to(__snake_case					)

         snake_case					=       torch.manual_seed(0					)

         for i, t in enumerate(scheduler.timesteps					):
              snake_case					=       scheduler.scale_model_input(__snake_case    ,      __snake_case					)

              snake_case					=       model(__snake_case    ,      __snake_case					)

              snake_case					=       scheduler.step(__snake_case    ,      __snake_case    ,      __snake_case    ,      generator=__snake_case					)
              snake_case					=       output.prev_sample

         snake_case					=       torch.sum(torch.abs(__snake_case					)					)
         snake_case					=       torch.mean(torch.abs(__snake_case					)					)

         assert abs(result_sum.item() - 328.9970					) < 1E-2
         assert abs(result_mean.item() - 0.4284					) < 1E-3




    def 	a_    ( self					):
         if torch_device == "mps":
              return
         snake_case					=       self.scheduler_classes[0]
         snake_case					=       self.get_scheduler_config()
         snake_case					=       scheduler_class(**__snake_case					)

         scheduler.set_timesteps(self.num_inference_steps    ,      device=__snake_case					)
         snake_case					=       torch.manual_seed(0					)

         snake_case					=       self.dummy_model()
         snake_case					=       self.dummy_sample_deter.to(__snake_case					) * scheduler.init_noise_sigma

         for t in scheduler.timesteps:
              snake_case					=       scheduler.scale_model_input(__snake_case    ,      __snake_case					)

              snake_case					=       model(__snake_case    ,      __snake_case					)

              snake_case					=       scheduler.step(__snake_case    ,      __snake_case    ,      __snake_case    ,      generator=__snake_case					)
              snake_case					=       output.prev_sample

         snake_case					=       torch.sum(torch.abs(__snake_case					)					)
         snake_case					=       torch.mean(torch.abs(__snake_case					)					)

         assert abs(result_sum.item() - 1_3_8_4_9.3_8_1_8					) < 1E-1
         assert abs(result_mean.item() - 18.0331					) < 1E-3








import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMParallelScheduler,
    DDPMParallelScheduler,
    StableDiffusionParadigmsPipeline,
    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 						A__      (					snake_case__ ,      snake_case__ ,      unittest.TestCase			):







    """simple docstring"""

    __magic_name__    						=	StableDiffusionParadigmsPipeline
    __magic_name__    						=	TEXT_TO_IMAGE_PARAMS
    __magic_name__    						=	TEXT_TO_IMAGE_BATCH_PARAMS
    __magic_name__    						=	TEXT_TO_IMAGE_IMAGE_PARAMS
    __magic_name__    						=	TEXT_TO_IMAGE_IMAGE_PARAMS
    def 	a_    ( self					):
         torch.manual_seed(0					)
         snake_case					=       UNetaDConditionModel(
             block_out_channels=(3_2, 6_4)    ,      layers_per_block=2    ,      sample_size=3_2    ,      in_channels=4    ,      out_channels=4    ,      down_block_types=('''DownBlock2D''', '''CrossAttnDownBlock2D''')    ,      up_block_types=('''CrossAttnUpBlock2D''', '''UpBlock2D''')    ,      cross_attention_dim=3_2    ,      attention_head_dim=(2, 4)    ,      use_linear_projection=__snake_case    ,      )
         snake_case					=       DDIMParallelScheduler(
             beta_start=0.0_0085    ,      beta_end=0.012    ,      beta_schedule='''scaled_linear'''    ,      clip_sample=__snake_case    ,      set_alpha_to_one=__snake_case    ,      )
         torch.manual_seed(0					)
         snake_case					=       AutoencoderKL(
             block_out_channels=[3_2, 6_4]    ,      in_channels=3    ,      out_channels=3    ,      down_block_types=['''DownEncoderBlock2D''', '''DownEncoderBlock2D''']    ,      up_block_types=['''UpDecoderBlock2D''', '''UpDecoderBlock2D''']    ,      latent_channels=4    ,      sample_size=1_2_8    ,      )
         torch.manual_seed(0					)
         snake_case					=       CLIPTextConfig(
             bos_token_id=0    ,      eos_token_id=2    ,      hidden_size=3_2    ,      intermediate_size=3_7    ,      layer_norm_eps=1E-05    ,      num_attention_heads=4    ,      num_hidden_layers=5    ,      pad_token_id=1    ,      vocab_size=1_0_0_0    ,      hidden_act='''gelu'''    ,      projection_dim=5_1_2    ,      )
         snake_case					=       CLIPTextModel(__snake_case					)
         snake_case					=       CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''					)

         snake_case					=       {
             '''unet''': unet,
             '''scheduler''': scheduler,
             '''vae''': vae,
             '''text_encoder''': text_encoder,
             '''tokenizer''': tokenizer,
             '''safety_checker''': None,
             '''feature_extractor''': None,
         }
         return components
    def 	a_    ( self    ,      __snake_case    ,      __snake_case=0					):
         if str(__snake_case					).startswith('''mps'''					):
              snake_case					=       torch.manual_seed(__snake_case					)
         else:
              snake_case					=       torch.Generator(device=__snake_case					).manual_seed(__snake_case					)
         snake_case					=       {
             '''prompt''': '''a photograph of an astronaut riding a horse''',
             '''generator''': generator,
             '''num_inference_steps''': 1_0,
             '''guidance_scale''': 6.0,
             '''output_type''': '''numpy''',
             '''parallel''': 3,
             '''debug''': True,
         }
         return inputs
    def 	a_    ( self					):
         snake_case					=       '''cpu'''  # ensure determinism for the device-dependent torch.Generator
         snake_case					=       self.get_dummy_components()
         snake_case					=       StableDiffusionParadigmsPipeline(**__snake_case					)
         snake_case					=       sd_pipe.to(__snake_case					)
         sd_pipe.set_progress_bar_config(disable=__snake_case					)

         snake_case					=       self.get_dummy_inputs(__snake_case					)
         snake_case					=       sd_pipe(**__snake_case					).images
         snake_case					=       image[0, -3:, -3:, -1]
         assert image.shape == (1, 6_4, 6_4, 3)

         snake_case					=       np.array([0.4773, 0.5417, 0.4723, 0.4925, 0.5631, 0.4752, 0.5240, 0.4935, 0.5023]					)

         assert np.abs(image_slice.flatten() - expected_slice					).max() < 1E-2
    def 	a_    ( self					):
         snake_case					=       '''cpu'''  # ensure determinism for the device-dependent torch.Generator
         snake_case					=       self.get_dummy_components()
         torch.manual_seed(0					)
         snake_case					=       DDPMParallelScheduler()
         torch.manual_seed(0					)
         snake_case					=       StableDiffusionParadigmsPipeline(**__snake_case					)
         snake_case					=       sd_pipe.to(__snake_case					)
         sd_pipe.set_progress_bar_config(disable=__snake_case					)

         snake_case					=       self.get_dummy_inputs(__snake_case					)
         snake_case					=       sd_pipe(**__snake_case					).images
         snake_case					=       image[0, -3:, -3:, -1]
         assert image.shape == (1, 6_4, 6_4, 3)

         snake_case					=       np.array([0.3573, 0.4420, 0.4960, 0.4799, 0.3796, 0.3879, 0.4819, 0.4365, 0.4468]					)

         assert np.abs(image_slice.flatten() - expected_slice					).max() < 1E-2
    def 	a_    ( self					):
         super().test_inference_batch_consistent(batch_sizes=[1, 2]					)
    def 	a_    ( self					):
         super().test_inference_batch_single_identical(batch_size=2    ,      expected_max_diff=3E-3					)




    def 	a_    ( self					):
         snake_case					=       '''cpu'''  # ensure determinism for the device-dependent torch.Generator
         snake_case					=       self.get_dummy_components()
         snake_case					=       StableDiffusionParadigmsPipeline(**__snake_case					)
         snake_case					=       sd_pipe.to(__snake_case					)
         sd_pipe.set_progress_bar_config(disable=__snake_case					)

         snake_case					=       self.get_dummy_inputs(__snake_case					)
         snake_case					=       '''french fries'''
         snake_case					=       sd_pipe(**__snake_case    ,      negative_prompt=__snake_case					)
         snake_case					=       output.images
         snake_case					=       image[0, -3:, -3:, -1]

         assert image.shape == (1, 6_4, 6_4, 3)

         snake_case					=       np.array([0.4771, 0.5420, 0.4683, 0.4918, 0.5636, 0.4725, 0.5230, 0.4923, 0.5015]					)

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






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







    """simple docstring"""

    def 	a_    ( self					):
         super().tearDown()
         gc.collect()
         torch.cuda.empty_cache()
    def 	a_    ( self    ,      __snake_case=0					):
         snake_case					=       torch.Generator(device=__snake_case					).manual_seed(__snake_case					)
         snake_case					=       {
             '''prompt''': '''a photograph of an astronaut riding a horse''',
             '''generator''': generator,
             '''num_inference_steps''': 1_0,
             '''guidance_scale''': 7.5,
             '''output_type''': '''numpy''',
             '''parallel''': 3,
             '''debug''': True,
         }
         return inputs




    def 	a_    ( self					):
         snake_case					=       '''stabilityai/stable-diffusion-2-base'''
         snake_case					=       DDIMParallelScheduler.from_pretrained(__snake_case    ,      subfolder='''scheduler'''					)
         snake_case					=       StableDiffusionParadigmsPipeline.from_pretrained(__snake_case    ,      scheduler=__snake_case    ,      safety_checker=__snake_case					)
         pipe.to(__snake_case					)
         pipe.set_progress_bar_config(disable=__snake_case					)
         pipe.enable_attention_slicing()

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

         assert image.shape == (1, 5_1_2, 5_1_2, 3)

         snake_case					=       np.array([0.9622, 0.9602, 0.9748, 0.9591, 0.9630, 0.9691, 0.9661, 0.9631, 0.9741]					)

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




