



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__(							lowerCamelCase     ,							lowerCamelCase     ,							unittest.TestCase	):

   '''simple docstring'''




   A    :  Union[str, Any]       				=    StableDiffusionSAGPipeline
   A    :  str       				=    TEXT_TO_IMAGE_PARAMS
   A    :  Tuple       				=    TEXT_TO_IMAGE_BATCH_PARAMS
   A    :  Any       				=    TEXT_TO_IMAGE_IMAGE_PARAMS
   A    :  Dict       				=    TEXT_TO_IMAGE_IMAGE_PARAMS
   A    :  Any       				=    False


   def 			UpperCAmelCase		(						self  :			Tuple)	->				Optional[int]:




         """simple docstring"""

         torch.manual_seed(0)
         lowercase__     =  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			,				)
         lowercase__     =  DDIMScheduler(
             beta_start=0.0_00_85			,				beta_end=0.0_12			,				beta_schedule='scaled_linear'			,				clip_sample=lowerCAmelCase			,				set_alpha_to_one=lowerCAmelCase			,				)
         torch.manual_seed(0)
         lowercase__     =  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)
         lowercase__     =  CLIPTextConfig(
             bos_token_id=0			,				eos_token_id=2			,				hidden_size=32			,				intermediate_size=37			,				layer_norm_eps=1E-0_5			,				num_attention_heads=4			,				num_hidden_layers=5			,				pad_token_id=1			,				vocab_size=10_00			,				)
         lowercase__     =  CLIPTextModel(lowerCAmelCase)
         lowercase__     =  CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip')

         lowercase__     =  {
             'unet': unet,
             'scheduler': scheduler,
             'vae': vae,
             'text_encoder': text_encoder,
             'tokenizer': tokenizer,
             'safety_checker': None,
             'feature_extractor': None,
         }
         return components


   def 			UpperCAmelCase		(						self  :			Any			,				lowerCAmelCase  :			str			,				lowerCAmelCase  :			Dict=0)	->				Optional[int]:




         """simple docstring"""

         if str(lowerCAmelCase).startswith('mps'):
               lowercase__     =  torch.manual_seed(lowerCAmelCase)
         else:
               lowercase__     =  torch.Generator(device=lowerCAmelCase).manual_seed(lowerCAmelCase)
         lowercase__     =  {
             'prompt': '.',
             'generator': generator,
             'num_inference_steps': 2,
             'guidance_scale': 1.0,
             'sag_scale': 1.0,
             'output_type': 'numpy',
         }
         return inputs



   def 			UpperCAmelCase		(						self  :			Optional[int])	->				List[str]:




         """simple docstring"""

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



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

   '''simple docstring'''




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




         """simple docstring"""

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


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




         """simple docstring"""

         lowercase__     =  StableDiffusionSAGPipeline.from_pretrained('CompVis/stable-diffusion-v1-4')
         lowercase__     =  sag_pipe.to(lowerCAmelCase)
         sag_pipe.set_progress_bar_config(disable=lowerCAmelCase)

         lowercase__     =  '.'
         lowercase__     =  torch.manual_seed(0)
         lowercase__     =  sag_pipe(
             [prompt]			,				generator=lowerCAmelCase			,				guidance_scale=7.5			,				sag_scale=1.0			,				num_inference_steps=20			,				output_type='np')

         lowercase__     =  output.images

         lowercase__     =  image[0, -3:, -3:, -1]

         assert image.shape == (1, 5_12, 5_12, 3)
         lowercase__     =  np.array([0.15_68, 0.17_38, 0.16_95, 0.16_93, 0.15_07, 0.17_05, 0.15_47, 0.17_51, 0.19_49])

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


   def 			UpperCAmelCase		(						self  :			Union[str, Any])	->				int:




         """simple docstring"""

         lowercase__     =  StableDiffusionSAGPipeline.from_pretrained('stabilityai/stable-diffusion-2-1-base')
         lowercase__     =  sag_pipe.to(lowerCAmelCase)
         sag_pipe.set_progress_bar_config(disable=lowerCAmelCase)

         lowercase__     =  '.'
         lowercase__     =  torch.manual_seed(0)
         lowercase__     =  sag_pipe(
             [prompt]			,				generator=lowerCAmelCase			,				guidance_scale=7.5			,				sag_scale=1.0			,				num_inference_steps=20			,				output_type='np')

         lowercase__     =  output.images

         lowercase__     =  image[0, -3:, -3:, -1]

         assert image.shape == (1, 5_12, 5_12, 3)
         lowercase__     =  np.array([0.34_59, 0.28_76, 0.25_37, 0.30_02, 0.26_71, 0.21_60, 0.30_26, 0.22_62, 0.23_71])

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



   def 			UpperCAmelCase		(						self  :			Union[str, Any])	->				int:




         """simple docstring"""

         lowercase__     =  StableDiffusionSAGPipeline.from_pretrained('stabilityai/stable-diffusion-2-1-base')
         lowercase__     =  sag_pipe.to(lowerCAmelCase)
         sag_pipe.set_progress_bar_config(disable=lowerCAmelCase)

         lowercase__     =  '.'
         lowercase__     =  torch.manual_seed(0)
         lowercase__     =  sag_pipe(
             [prompt]			,				width=7_68			,				height=5_12			,				generator=lowerCAmelCase			,				guidance_scale=7.5			,				sag_scale=1.0			,				num_inference_steps=20			,				output_type='np'			,				)

         lowercase__     =  output.images

         assert image.shape == (1, 5_12, 7_68, 3)





from __future__ import annotations

def   _lowerCAmelCase   (						A__						,  A__	):
      if b == 0:
            return (1, 0)
      ((lowercase__),	(lowercase__))     =  extended_euclid(A__						,  a % b	)
      lowercase__     =  a // b
      return (y, x - k * y)

def   _lowerCAmelCase   (						A__						,  A__						,  A__						,  A__	):
      ((lowercase__),	(lowercase__))     =  extended_euclid(A__						,  A__	)
      lowercase__     =  na * na
      lowercase__     =  ra * x * na + ra * y * na
      return (n % m + m) % m

def   _lowerCAmelCase   (						A__						,  A__	):
      ((lowercase__),	(lowercase__))     =  extended_euclid(A__						,  A__	)
      if b < 0:
            lowercase__     =  (b % n + n) % n
      return b

def   _lowerCAmelCase   (						A__						,  A__						,  A__						,  A__	):
      lowercase__,	lowercase__     =  invert_modulo(A__						,  A__	), invert_modulo(A__						,  A__	)
      lowercase__     =  na * na
      lowercase__     =  ra * x * na + ra * y * na
      return (n % m + m) % m


if __name__ == "__main__":
       from doctest import testmod

       testmod(name="chinese_remainder_theorem", verbose=True)
       testmod(name="chinese_remainder_theorem2", verbose=True)
       testmod(name="invert_modulo", verbose=True)
       testmod(name="extended_euclid", verbose=True)
