
"""simple docstring"""


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


A_    							=					"""CompVis/stable-diffusion-v1-1"""
A_    							=					"""CompVis/stable-diffusion-v1-2"""
A_    							=					"""CompVis/stable-diffusion-v1-3"""
A_    							=					"""CompVis/stable-diffusion-v1-4"""




class  __lowerCamelCase  ( lowerCAmelCase			):




				def __init__(				self							,						UpperCAmelCase							,						UpperCAmelCase							,						UpperCAmelCase							,						UpperCAmelCase							,						UpperCAmelCase							,						UpperCAmelCase							,						UpperCAmelCase							,						UpperCAmelCase = True							,						):
							super()._init_()

							lowerCamelCase_					=  StableDiffusionPipeline.from_pretrained(UpperCAmelCase   )
							lowerCamelCase_					=  StableDiffusionPipeline.from_pretrained(UpperCAmelCase   )
							lowerCamelCase_					=  StableDiffusionPipeline.from_pretrained(UpperCAmelCase   )
							lowerCamelCase_					=  StableDiffusionPipeline(
							    vae=UpperCAmelCase							,						text_encoder=UpperCAmelCase							,						tokenizer=UpperCAmelCase							,						unet=UpperCAmelCase							,						scheduler=UpperCAmelCase							,						safety_checker=UpperCAmelCase							,						feature_extractor=UpperCAmelCase							,						requires_safety_checker=UpperCAmelCase							,						)

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




				@property
				def        UpperCAmelCase__						(				self   ):
							return {k: getattr(self							,						UpperCAmelCase   ) for k in self.config.keys() if not k.startswith('''_'''   )}




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




				def        UpperCAmelCase__						(				self   ):
							self.enable_attention_slicing(UpperCAmelCase   )




				@torch.no_grad()
				def        UpperCAmelCase__						(				self							,						UpperCAmelCase							,						UpperCAmelCase = 512							,						UpperCAmelCase = 512							,						UpperCAmelCase = 50							,						UpperCAmelCase = 7.5							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						UpperCAmelCase = 0.0							,						UpperCAmelCase = None							,						UpperCAmelCase = None							,						UpperCAmelCase = "pil"							,						UpperCAmelCase = True							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						**UpperCAmelCase							,						):
							return self.pipea(
							    prompt=UpperCAmelCase							,						height=UpperCAmelCase							,						width=UpperCAmelCase							,						num_inference_steps=UpperCAmelCase							,						guidance_scale=UpperCAmelCase							,						negative_prompt=UpperCAmelCase							,						num_images_per_prompt=UpperCAmelCase							,						eta=UpperCAmelCase							,						generator=UpperCAmelCase							,						latents=UpperCAmelCase							,						output_type=UpperCAmelCase							,						return_dict=UpperCAmelCase							,						callback=UpperCAmelCase							,						callback_steps=UpperCAmelCase							,						**UpperCAmelCase							,						)




				@torch.no_grad()
				def        UpperCAmelCase__						(				self							,						UpperCAmelCase							,						UpperCAmelCase = 512							,						UpperCAmelCase = 512							,						UpperCAmelCase = 50							,						UpperCAmelCase = 7.5							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						UpperCAmelCase = 0.0							,						UpperCAmelCase = None							,						UpperCAmelCase = None							,						UpperCAmelCase = "pil"							,						UpperCAmelCase = True							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						**UpperCAmelCase							,						):
							return self.pipea(
							    prompt=UpperCAmelCase							,						height=UpperCAmelCase							,						width=UpperCAmelCase							,						num_inference_steps=UpperCAmelCase							,						guidance_scale=UpperCAmelCase							,						negative_prompt=UpperCAmelCase							,						num_images_per_prompt=UpperCAmelCase							,						eta=UpperCAmelCase							,						generator=UpperCAmelCase							,						latents=UpperCAmelCase							,						output_type=UpperCAmelCase							,						return_dict=UpperCAmelCase							,						callback=UpperCAmelCase							,						callback_steps=UpperCAmelCase							,						**UpperCAmelCase							,						)




				@torch.no_grad()
				def        UpperCAmelCase__						(				self							,						UpperCAmelCase							,						UpperCAmelCase = 512							,						UpperCAmelCase = 512							,						UpperCAmelCase = 50							,						UpperCAmelCase = 7.5							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						UpperCAmelCase = 0.0							,						UpperCAmelCase = None							,						UpperCAmelCase = None							,						UpperCAmelCase = "pil"							,						UpperCAmelCase = True							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						**UpperCAmelCase							,						):
							return self.pipea(
							    prompt=UpperCAmelCase							,						height=UpperCAmelCase							,						width=UpperCAmelCase							,						num_inference_steps=UpperCAmelCase							,						guidance_scale=UpperCAmelCase							,						negative_prompt=UpperCAmelCase							,						num_images_per_prompt=UpperCAmelCase							,						eta=UpperCAmelCase							,						generator=UpperCAmelCase							,						latents=UpperCAmelCase							,						output_type=UpperCAmelCase							,						return_dict=UpperCAmelCase							,						callback=UpperCAmelCase							,						callback_steps=UpperCAmelCase							,						**UpperCAmelCase							,						)




				@torch.no_grad()
				def        UpperCAmelCase__						(				self							,						UpperCAmelCase							,						UpperCAmelCase = 512							,						UpperCAmelCase = 512							,						UpperCAmelCase = 50							,						UpperCAmelCase = 7.5							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						UpperCAmelCase = 0.0							,						UpperCAmelCase = None							,						UpperCAmelCase = None							,						UpperCAmelCase = "pil"							,						UpperCAmelCase = True							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						**UpperCAmelCase							,						):
							return self.pipea(
							    prompt=UpperCAmelCase							,						height=UpperCAmelCase							,						width=UpperCAmelCase							,						num_inference_steps=UpperCAmelCase							,						guidance_scale=UpperCAmelCase							,						negative_prompt=UpperCAmelCase							,						num_images_per_prompt=UpperCAmelCase							,						eta=UpperCAmelCase							,						generator=UpperCAmelCase							,						latents=UpperCAmelCase							,						output_type=UpperCAmelCase							,						return_dict=UpperCAmelCase							,						callback=UpperCAmelCase							,						callback_steps=UpperCAmelCase							,						**UpperCAmelCase							,						)





				@torch.no_grad()
				def        UpperCAmelCase__						(				self							,						UpperCAmelCase							,						UpperCAmelCase = 512							,						UpperCAmelCase = 512							,						UpperCAmelCase = 50							,						UpperCAmelCase = 7.5							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						UpperCAmelCase = 0.0							,						UpperCAmelCase = None							,						UpperCAmelCase = None							,						UpperCAmelCase = "pil"							,						UpperCAmelCase = True							,						UpperCAmelCase = None							,						UpperCAmelCase = 1							,						**UpperCAmelCase							,						):
							lowerCamelCase_					=  '''cuda''' if torch.cuda.is_available() else '''cpu'''
							self.to(UpperCAmelCase   )

							# 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
							lowerCamelCase_					=  self.textaimg_sda_a(
							    prompt=UpperCAmelCase							,						height=UpperCAmelCase							,						width=UpperCAmelCase							,						num_inference_steps=UpperCAmelCase							,						guidance_scale=UpperCAmelCase							,						negative_prompt=UpperCAmelCase							,						num_images_per_prompt=UpperCAmelCase							,						eta=UpperCAmelCase							,						generator=UpperCAmelCase							,						latents=UpperCAmelCase							,						output_type=UpperCAmelCase							,						return_dict=UpperCAmelCase							,						callback=UpperCAmelCase							,						callback_steps=UpperCAmelCase							,						**UpperCAmelCase							,						)

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

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

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

							# 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 tempfile
import unittest

from huggingface_hub import HfFolder, delete_repo
from parameterized import parameterized
from requests.exceptions import HTTPError

from transformers import AutoConfig, GenerationConfig
from transformers.testing_utils import TOKEN, USER, is_staging_test




class  __lowerCamelCase  ( unittest.TestCase			):




				@parameterized.expand([(None,), ('''foo.json''',)]   )
				def        UpperCAmelCase__						(				self							,						UpperCAmelCase   ):
							lowerCamelCase_					=  GenerationConfig(
							    do_sample=UpperCAmelCase							,						temperature=0.7							,						length_penalty=1.0							,						bad_words_ids=[[1, 2, 3], [4, 5]]							,						)
							with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(UpperCAmelCase							,						config_name=UpperCAmelCase   )
										lowerCamelCase_					=  GenerationConfig.from_pretrained(UpperCAmelCase							,						config_name=UpperCAmelCase   )

							# Checks parameters that were specified
							self.assertEqual(loaded_config.do_sample							,						UpperCAmelCase   )
							self.assertEqual(loaded_config.temperature							,						0.7   )
							self.assertEqual(loaded_config.length_penalty							,						1.0   )
							self.assertEqual(loaded_config.bad_words_ids							,						[[1, 2, 3], [4, 5]]   )

							# Checks parameters that were not specified (defaults)
							self.assertEqual(loaded_config.top_k							,						50   )
							self.assertEqual(loaded_config.max_length							,						20   )
							self.assertEqual(loaded_config.max_time							,						UpperCAmelCase   )




				def        UpperCAmelCase__						(				self   ):
							lowerCamelCase_					=  AutoConfig.from_pretrained('''gpt2'''   )
							lowerCamelCase_					=  GenerationConfig.from_model_config(UpperCAmelCase   )
							lowerCamelCase_					=  GenerationConfig()

							# The generation config has loaded a few non-default parameters from the model config
							self.assertNotEqual(UpperCAmelCase							,						UpperCAmelCase   )

							# One of those parameters is eos_token_id -- check if it matches
							self.assertNotEqual(generation_config_from_model.eos_token_id							,						default_generation_config.eos_token_id   )
							self.assertEqual(generation_config_from_model.eos_token_id							,						model_config.eos_token_id   )




				def        UpperCAmelCase__						(				self   ):
							lowerCamelCase_					=  GenerationConfig()
							lowerCamelCase_					=  {
							    '''max_new_tokens''': 1024,
							    '''foo''': '''bar''',
							}
							lowerCamelCase_					=  copy.deepcopy(UpperCAmelCase   )
							lowerCamelCase_					=  generation_config.update(**UpperCAmelCase   )

							# update_kwargs was not modified (no side effects)
							self.assertEqual(UpperCAmelCase							,						UpperCAmelCase   )

							# update_kwargs was used to update the config on valid attributes
							self.assertEqual(generation_config.max_new_tokens							,						1024   )

							# `.update()` returns a dictionary of unused kwargs
							self.assertEqual(UpperCAmelCase							,						{'''foo''': '''bar'''}   )




				def        UpperCAmelCase__						(				self   ):
							lowerCamelCase_					=  GenerationConfig()
							lowerCamelCase_					=  '''bar'''

							with tempfile.TemporaryDirectory('''test-generation-config'''   ) as tmp_dir:
										generation_config.save_pretrained(UpperCAmelCase   )

										lowerCamelCase_					=  GenerationConfig.from_pretrained(UpperCAmelCase   )
							# update_kwargs was used to update the config on valid attributes
							self.assertEqual(new_config.foo							,						'''bar'''   )

							lowerCamelCase_					=  GenerationConfig.from_model_config(UpperCAmelCase   )
							assert not hasattr(UpperCAmelCase							,						'''foo'''   )  # no new kwargs should be initialized if from config





				def        UpperCAmelCase__						(				self   ):
							lowerCamelCase_					=  GenerationConfig()
							self.assertEqual(default_config.temperature							,						1.0   )
							self.assertEqual(default_config.do_sample							,						UpperCAmelCase   )
							self.assertEqual(default_config.num_beams							,						1   )

							lowerCamelCase_					=  GenerationConfig(
							    do_sample=UpperCAmelCase							,						temperature=0.7							,						length_penalty=1.0							,						bad_words_ids=[[1, 2, 3], [4, 5]]							,						)
							self.assertEqual(config.temperature							,						0.7   )
							self.assertEqual(config.do_sample							,						UpperCAmelCase   )
							self.assertEqual(config.num_beams							,						1   )

							with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(UpperCAmelCase   )
										lowerCamelCase_					=  GenerationConfig.from_pretrained(UpperCAmelCase							,						temperature=1.0   )

							self.assertEqual(loaded_config.temperature							,						1.0   )
							self.assertEqual(loaded_config.do_sample							,						UpperCAmelCase   )
							self.assertEqual(loaded_config.num_beams							,						1   )  # default value




@is_staging_test
class  __lowerCamelCase  ( unittest.TestCase			):




				@classmethod
				def        UpperCAmelCase__						(				cls   ):
							lowerCamelCase_					=  TOKEN
							HfFolder.save_token(UpperCAmelCase   )




				@classmethod
				def        UpperCAmelCase__						(				cls   ):
							try:
										delete_repo(token=cls._token							,						repo_id='''test-generation-config'''   )
							except HTTPError:
										pass

							try:
										delete_repo(token=cls._token							,						repo_id='''valid_org/test-generation-config-org'''   )
							except HTTPError:
										pass




				def        UpperCAmelCase__						(				self   ):
							lowerCamelCase_					=  GenerationConfig(
							    do_sample=UpperCAmelCase							,						temperature=0.7							,						length_penalty=1.0							,						)
							config.push_to_hub('''test-generation-config'''							,						use_auth_token=self._token   )

							lowerCamelCase_					=  GenerationConfig.from_pretrained(f"{USER}/test-generation-config"   )
							for k, v in config.to_dict().items():
										if k != "transformers_version":
													self.assertEqual(UpperCAmelCase							,						getattr(UpperCAmelCase							,						UpperCAmelCase   )   )

        # Reset repo
							delete_repo(token=self._token							,						repo_id='''test-generation-config'''   )

							# Push to hub via save_pretrained
							with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(
										    UpperCAmelCase							,						repo_id='''test-generation-config'''							,						push_to_hub=UpperCAmelCase							,						use_auth_token=self._token   )

							lowerCamelCase_					=  GenerationConfig.from_pretrained(f"{USER}/test-generation-config"   )
							for k, v in config.to_dict().items():
										if k != "transformers_version":
													self.assertEqual(UpperCAmelCase							,						getattr(UpperCAmelCase							,						UpperCAmelCase   )   )





				def        UpperCAmelCase__						(				self   ):
							lowerCamelCase_					=  GenerationConfig(
							    do_sample=UpperCAmelCase							,						temperature=0.7							,						length_penalty=1.0							,						)
							config.push_to_hub('''valid_org/test-generation-config-org'''							,						use_auth_token=self._token   )

							lowerCamelCase_					=  GenerationConfig.from_pretrained('''valid_org/test-generation-config-org'''   )
							for k, v in config.to_dict().items():
										if k != "transformers_version":
													self.assertEqual(UpperCAmelCase							,						getattr(UpperCAmelCase							,						UpperCAmelCase   )   )

        # Reset repo
							delete_repo(token=self._token							,						repo_id='''valid_org/test-generation-config-org'''   )

							# Push to hub via save_pretrained
							with tempfile.TemporaryDirectory() as tmp_dir:
										config.save_pretrained(
										    UpperCAmelCase							,						repo_id='''valid_org/test-generation-config-org'''							,						push_to_hub=UpperCAmelCase							,						use_auth_token=self._token   )

							lowerCamelCase_					=  GenerationConfig.from_pretrained('''valid_org/test-generation-config-org'''   )
							for k, v in config.to_dict().items():
										if k != "transformers_version":
													self.assertEqual(UpperCAmelCase							,						getattr(UpperCAmelCase							,						UpperCAmelCase   )   )



