

from typing import Any, Callable, Dict, List, Optional, Union

import torch
from transformers import CLIPImageProcessor, CLIPTextModel, CLIPTokenizer

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    DiffusionPipeline,
    LMSDiscreteScheduler,
    PNDMScheduler,
    StableDiffusionPipeline,
    UNetaDConditionModel,
)
from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput
from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker


lowerCAmelCase__		      =       'CompVis/stable-diffusion-v1-1'
lowerCAmelCase__		      =       'CompVis/stable-diffusion-v1-2'
lowerCAmelCase__		      =       'CompVis/stable-diffusion-v1-3'
lowerCAmelCase__		      =       'CompVis/stable-diffusion-v1-4'

class     a__  (    a_	):
			"""simple docstring"""







			def __init__(			self					,					lowercase					,					lowercase					,					lowercase					,					lowercase					,					lowercase					,					lowercase					,					lowercase					,					lowercase = True					,					)     ->  Dict:
							'''simple docstring'''






							super()._init_()

							A__						=	StableDiffusionPipeline.from_pretrained(_lowerCamelCase				)
							A__						=	StableDiffusionPipeline.from_pretrained(_lowerCamelCase				)
							A__						=	StableDiffusionPipeline.from_pretrained(_lowerCamelCase				)
							A__						=	StableDiffusionPipeline(
							    vae=_lowerCamelCase					,					text_encoder=_lowerCamelCase					,					tokenizer=_lowerCamelCase					,					unet=_lowerCamelCase					,					scheduler=_lowerCamelCase					,					safety_checker=_lowerCamelCase					,					feature_extractor=_lowerCamelCase					,					requires_safety_checker=_lowerCamelCase					,					)

							self.register_modules(pipelinea=self.pipea					,					pipelinea=self.pipea					,					pipelinea=self.pipea					,					pipelinea=self.pipea				)


			@property
			def    UpperCamelCase						(			self				)     ->  Tuple:
							'''simple docstring'''






							return {k: getattr(self					,					_lowerCamelCase				) for k in self.config.keys() if not k.startswith("_"				)}


			def    UpperCamelCase						(			self					,					lowercase = "auto"				)     ->  Tuple:
							'''simple docstring'''






							if slice_size == "auto":
											# half the attention head size is usually a good trade-off between
											# speed and memory
											A__						=	self.unet.config.attention_head_dim // 2
							self.unet.set_attention_slice(_lowerCamelCase				)


			def    UpperCamelCase						(			self				)     ->  List[Any]:
							'''simple docstring'''






							self.enable_attention_slicing(_lowerCamelCase				)


			@torch.no_grad()
			def    UpperCamelCase						(			self					,					lowercase					,					lowercase = 512					,					lowercase = 512					,					lowercase = 50					,					lowercase = 7.5					,					lowercase = None					,					lowercase = 1					,					lowercase = 0.0					,					lowercase = None					,					lowercase = None					,					lowercase = "pil"					,					lowercase = True					,					lowercase = None					,					lowercase = 1					,					**lowercase					,					)     ->  Tuple:
							'''simple docstring'''






							return self.pipea(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)


			@torch.no_grad()
			def    UpperCamelCase						(			self					,					lowercase					,					lowercase = 512					,					lowercase = 512					,					lowercase = 50					,					lowercase = 7.5					,					lowercase = None					,					lowercase = 1					,					lowercase = 0.0					,					lowercase = None					,					lowercase = None					,					lowercase = "pil"					,					lowercase = True					,					lowercase = None					,					lowercase = 1					,					**lowercase					,					)     ->  List[Any]:
							'''simple docstring'''






							return self.pipea(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)


			@torch.no_grad()
			def    UpperCamelCase						(			self					,					lowercase					,					lowercase = 512					,					lowercase = 512					,					lowercase = 50					,					lowercase = 7.5					,					lowercase = None					,					lowercase = 1					,					lowercase = 0.0					,					lowercase = None					,					lowercase = None					,					lowercase = "pil"					,					lowercase = True					,					lowercase = None					,					lowercase = 1					,					**lowercase					,					)     ->  Any:
							'''simple docstring'''






							return self.pipea(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)


			@torch.no_grad()
			def    UpperCamelCase						(			self					,					lowercase					,					lowercase = 512					,					lowercase = 512					,					lowercase = 50					,					lowercase = 7.5					,					lowercase = None					,					lowercase = 1					,					lowercase = 0.0					,					lowercase = None					,					lowercase = None					,					lowercase = "pil"					,					lowercase = True					,					lowercase = None					,					lowercase = 1					,					**lowercase					,					)     ->  Optional[int]:
							'''simple docstring'''






							return self.pipea(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)


			@torch.no_grad()
			def    UpperCamelCase						(			self					,					lowercase					,					lowercase = 512					,					lowercase = 512					,					lowercase = 50					,					lowercase = 7.5					,					lowercase = None					,					lowercase = 1					,					lowercase = 0.0					,					lowercase = None					,					lowercase = None					,					lowercase = "pil"					,					lowercase = True					,					lowercase = None					,					lowercase = 1					,					**lowercase					,					)     ->  int:
							'''simple docstring'''






							A__						=	"cuda" if torch.cuda.is_available() else "cpu"
							self.to(_lowerCamelCase				)

							# Checks if the height and width are divisible by 8 or not
							if height % 8 != 0 or width % 8 != 0:
											raise ValueError(F'`height` and `width` must be divisible by 8 but are {height} and {width}.'				)

							# Get first result from Stable Diffusion Checkpoint v1.1
							A__						=	self.textaimg_sda_a(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)

							# Get first result from Stable Diffusion Checkpoint v1.2
							A__						=	self.textaimg_sda_a(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)

							# Get first result from Stable Diffusion Checkpoint v1.3
							A__						=	self.textaimg_sda_a(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)

							# Get first result from Stable Diffusion Checkpoint v1.4
							A__						=	self.textaimg_sda_a(
							    prompt=_lowerCamelCase					,					height=_lowerCamelCase					,					width=_lowerCamelCase					,					num_inference_steps=_lowerCamelCase					,					guidance_scale=_lowerCamelCase					,					negative_prompt=_lowerCamelCase					,					num_images_per_prompt=_lowerCamelCase					,					eta=_lowerCamelCase					,					generator=_lowerCamelCase					,					latents=_lowerCamelCase					,					output_type=_lowerCamelCase					,					return_dict=_lowerCamelCase					,					callback=_lowerCamelCase					,					callback_steps=_lowerCamelCase					,					**_lowerCamelCase					,					)

							# Get all result images into a single list and pass it via StableDiffusionPipelineOutput for final result
							return StableDiffusionPipelineOutput([resa[0], resa[0], resa[0], resa[0]]				)









"""simple docstring"""



import copy
import json
import os
import tempfile

from transformers import is_torch_available

from .test_configuration_utils import config_common_kwargs

class        a     (   a_	):







    def __init__(			self							,		_lowerCamelCase							,		_lowerCamelCase=None							,		_lowerCamelCase=True							,		_lowerCamelCase=None							,		**_lowerCamelCase       ):
      lowercase							    =       parent
      lowercase							    =       config_class
      lowercase							    =       has_text_modality
      lowercase							    =       kwargs
      lowercase							    =       common_properties







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       self.config_class(**self.inputs_dict       )
      lowercase							    =       (
          ['hidden_size', 'num_attention_heads', 'num_hidden_layers']
          if self.common_properties is None
          else self.common_properties
      )

      # Add common fields for text models
      if self.has_text_modality:
        common_properties.extend(['vocab_size']       )

      # Test that config has the common properties as getters
      for prop in common_properties:
        self.parent.assertTrue(hasattr(_lowerCamelCase							,		_lowerCamelCase       )							,		msg=F'`{prop}` does not exist'       )

      # Test that config has the common properties as setter
      for idx, name in enumerate(_lowerCamelCase       ):
        try:
          setattr(_lowerCamelCase							,		_lowerCamelCase							,		_lowerCamelCase       )
          self.parent.assertEqual(
              getattr(_lowerCamelCase							,		_lowerCamelCase       )							,		_lowerCamelCase							,		msg=F'`{name} value {idx} expected, but was {getattr(_lowerCamelCase							,		_lowerCamelCase       )}'       )
        except NotImplementedError:
          # Some models might not be able to implement setters for common_properties
          # In that case, a NotImplementedError is raised
          pass

        # Test if config class can be called with Config(prop_name=..)
      for idx, name in enumerate(_lowerCamelCase       ):
        try:
          lowercase							    =       self.config_class(**{name: idx}       )
          self.parent.assertEqual(
              getattr(_lowerCamelCase							,		_lowerCamelCase       )							,		_lowerCamelCase							,		msg=F'`{name} value {idx} expected, but was {getattr(_lowerCamelCase							,		_lowerCamelCase       )}'       )
        except NotImplementedError:
          # Some models might not be able to implement setters for common_properties
          # In that case, a NotImplementedError is raised
          pass







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       self.config_class(**self.inputs_dict       )
      lowercase							    =       json.loads(config.to_json_string()       )
      for key, value in self.inputs_dict.items():
        self.parent.assertEqual(obj[key]							,		_lowerCamelCase       )







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       self.config_class(**self.inputs_dict       )

      with tempfile.TemporaryDirectory() as tmpdirname:
        lowercase							    =       os.path.join(_lowerCamelCase							,		'config.json'       )
        config_first.to_json_file(_lowerCamelCase       )
        lowercase							    =       self.config_class.from_json_file(_lowerCamelCase       )

      self.parent.assertEqual(config_second.to_dict()							,		config_first.to_dict()       )







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       self.config_class(**self.inputs_dict       )

      with tempfile.TemporaryDirectory() as tmpdirname:
        config_first.save_pretrained(_lowerCamelCase       )
        lowercase							    =       self.config_class.from_pretrained(_lowerCamelCase       )

      self.parent.assertEqual(config_second.to_dict()							,		config_first.to_dict()       )







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       self.config_class(**self.inputs_dict       )

      lowercase							    =       'test'
      with tempfile.TemporaryDirectory() as tmpdirname:
        lowercase							    =       os.path.join(_lowerCamelCase							,		_lowerCamelCase       )
        config_first.save_pretrained(_lowerCamelCase       )
        lowercase							    =       self.config_class.from_pretrained(_lowerCamelCase							,		subfolder=_lowerCamelCase       )

      self.parent.assertEqual(config_second.to_dict()							,		config_first.to_dict()       )







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       self.config_class(**self.inputs_dict							,		num_labels=5       )
      self.parent.assertEqual(len(config.idalabel       )							,		5       )
      self.parent.assertEqual(len(config.labelaid       )							,		5       )

      lowercase							    =       3
      self.parent.assertEqual(len(config.idalabel       )							,		3       )
      self.parent.assertEqual(len(config.labelaid       )							,		3       )







    def 			UpperCamelCase_      (			self       ):
      if self.config_class.is_composition:
        return
      lowercase							    =       self.config_class()
      self.parent.assertIsNotNone(_lowerCamelCase       )







    def 			UpperCamelCase_      (			self       ):
      lowercase							    =       copy.deepcopy(_lowerCamelCase       )
      lowercase							    =       self.config_class(**_lowerCamelCase       )
      lowercase							    =       []
      for key, value in config_common_kwargs.items():
        if key == "torch_dtype":
          if not is_torch_available():
            continue
          else:
            import torch

            if config.torch_dtype != torch.floataa:
              wrong_values.append(('torch_dtype', config.torch_dtype, torch.floataa)       )
        elif getattr(_lowerCamelCase							,		_lowerCamelCase       ) != value:
          wrong_values.append((key, getattr(_lowerCamelCase							,		_lowerCamelCase       ), value)       )

      if len(_lowerCamelCase       ) > 0:
        lowercase							    =       '\n'.join([F'- {v[0]}: got {v[1]} instead of {v[2]}' for v in wrong_values]       )
        raise ValueError(F'The following keys were not properly set in the config:\n{errors}'       )







    def 			UpperCamelCase_      (			self       ):
      self.create_and_test_config_common_properties()
      self.create_and_test_config_to_json_string()
      self.create_and_test_config_to_json_file()
      self.create_and_test_config_from_and_save_pretrained()
      self.create_and_test_config_from_and_save_pretrained_subfolder()
      self.create_and_test_config_with_num_labels()
      self.check_config_can_be_init_without_params()
      self.check_config_arguments_init()


