


"""simple docstring"""



import gc
import random
import unittest

import numpy as np
import torch
from transformers import (
    CLIPImageProcessor,
    CLIPTextConfig,
    CLIPTextModel,
    CLIPTokenizer,
    CLIPVisionConfig,
    CLIPVisionModelWithProjection,
)

from diffusers import AutoencoderKL, DDIMScheduler, DDPMScheduler, StableUnCLIPImgaImgPipeline, UNetaDConditionModel
from diffusers.pipelines.pipeline_utils import DiffusionPipeline
from diffusers.pipelines.stable_diffusion.stable_unclip_image_normalizer import StableUnCLIPImageNormalizer
from diffusers.utils.import_utils import is_xformers_available
from diffusers.utils.testing_utils import (
    enable_full_determinism,
    floats_tensor,
    load_image,
    load_numpy,
    require_torch_gpu,
    skip_mps,
    slow,
    torch_device,
)

from ..pipeline_params import TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS, TEXT_GUIDED_IMAGE_VARIATION_PARAMS
from ..test_pipelines_common import (
    PipelineKarrasSchedulerTesterMixin,
    PipelineLatentTesterMixin,
    PipelineTesterMixin,
    assert_mean_pixel_difference,
)


enable_full_determinism()







class    __a						( __snake_case					,			__snake_case					,			__snake_case					,			unittest.TestCase							):
				lowerCamelCase     :       Tuple			       =StableUnCLIPImgaImgPipeline
				lowerCamelCase     :       Optional[int]			       =TEXT_GUIDED_IMAGE_VARIATION_PARAMS
				lowerCamelCase     :       Union[str, Any]			       =TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
				lowerCamelCase     :       Dict			       =frozenset(
				    []							)  # TO-DO: update image_params once pipeline is refactored with VaeImageProcessor.preprocess
				lowerCamelCase     :       Dict			       =frozenset([]							)







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			32
					lowerCAmelCase_      							=			embedder_hidden_size

					# image encoding components

					lowerCAmelCase_      							=			CLIPImageProcessor(crop_size=32      ,	size=32   )

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			CLIPVisionModelWithProjection(
					    CLIPVisionConfig(
					        hidden_size=UpperCAmelCase      ,	projection_dim=UpperCAmelCase      ,	num_hidden_layers=5      ,	num_attention_heads=4      ,	image_size=32      ,	intermediate_size=37      ,	patch_size=1      ,	)   )

					# regular denoising components

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			StableUnCLIPImageNormalizer(embedding_dim=UpperCAmelCase   )
					lowerCAmelCase_      							=			DDPMScheduler(beta_schedule='''squaredcos_cap_v2'''   )

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''   )

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			CLIPTextModel(
					    CLIPTextConfig(
					        bos_token_id=0      ,	eos_token_id=2      ,	hidden_size=UpperCAmelCase      ,	projection_dim=32      ,	intermediate_size=37      ,	layer_norm_eps=1E-0_5      ,	num_attention_heads=4      ,	num_hidden_layers=5      ,	pad_token_id=1      ,	vocab_size=1000      ,	)   )

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			UNetaDConditionModel(
					    sample_size=32      ,	in_channels=4      ,	out_channels=4      ,	down_block_types=('''CrossAttnDownBlock2D''', '''DownBlock2D''')      ,	up_block_types=('''UpBlock2D''', '''CrossAttnUpBlock2D''')      ,	block_out_channels=(32, 64)      ,	attention_head_dim=(2, 4)      ,	class_embed_type='''projection'''      ,	projection_class_embeddings_input_dim=embedder_projection_dim * 2      ,	cross_attention_dim=UpperCAmelCase      ,	layers_per_block=1      ,	upcast_attention=UpperCAmelCase      ,	use_linear_projection=UpperCAmelCase      ,	)

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			DDIMScheduler(
					    beta_schedule='''scaled_linear'''      ,	beta_start=0.0_0_0_8_5      ,	beta_end=0.0_1_2      ,	prediction_type='''v_prediction'''      ,	set_alpha_to_one=UpperCAmelCase      ,	steps_offset=1      ,	)

					torch.manual_seed(0   )
					lowerCAmelCase_      							=			AutoencoderKL()

					lowerCAmelCase_      							=			{
					    # image encoding components
					    '''feature_extractor''': feature_extractor,
					    '''image_encoder''': image_encoder.eval(),
					    # image noising components
					    '''image_normalizer''': image_normalizer.eval(),
					    '''image_noising_scheduler''': image_noising_scheduler,
					    # regular denoising components
					    '''tokenizer''': tokenizer,
					    '''text_encoder''': text_encoder.eval(),
					    '''unet''': unet.eval(),
					    '''scheduler''': scheduler,
					    '''vae''': vae.eval(),
					}

					return components







				def      lowerCamelCase_     ( self      ,	UpperCAmelCase      ,	UpperCAmelCase=0      ,	UpperCAmelCase=True   ):

					'''simple docstring'''






					if str(UpperCAmelCase   ).startswith('''mps'''   ):
						lowerCAmelCase_      							=			torch.manual_seed(UpperCAmelCase   )
					else:
						lowerCAmelCase_      							=			torch.Generator(device=UpperCAmelCase   ).manual_seed(UpperCAmelCase   )

					lowerCAmelCase_      							=			floats_tensor((1, 3, 32, 32)      ,	rng=random.Random(UpperCAmelCase   )   ).to(UpperCAmelCase   )

					if pil_image:
						lowerCAmelCase_      							=			input_image * 0.5 + 0.5
						lowerCAmelCase_      							=			input_image.clamp(0      ,	1   )
						lowerCAmelCase_      							=			input_image.cpu().permute(0      ,	2      ,	3      ,	1   ).float().numpy()
						lowerCAmelCase_      							=			DiffusionPipeline.numpy_to_pil(UpperCAmelCase   )[0]

					return {
					    "prompt": "An anime racoon running a marathon",
					    "image": input_image,
					    "generator": generator,
					    "num_inference_steps": 2,
					    "output_type": "np",
					}







				@skip_mps
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			'''cpu'''  # ensure determinism for the device-dependent torch.Generator
					lowerCAmelCase_      							=			self.get_dummy_components()
					lowerCAmelCase_      							=			StableUnCLIPImgaImgPipeline(**UpperCAmelCase   )
					lowerCAmelCase_      							=			sd_pipe.to(UpperCAmelCase   )
					sd_pipe.set_progress_bar_config(disable=UpperCAmelCase   )

					lowerCAmelCase_      							=			self.get_dummy_inputs(UpperCAmelCase   )
					inputs.update({'''image_embeds''': None}   )
					lowerCAmelCase_      							=			sd_pipe(**UpperCAmelCase   ).images
					lowerCAmelCase_      							=			image[0, -3:, -3:, -1]

					assert image.shape == (1, 32, 32, 3)
					lowerCAmelCase_      							=			np.array([0.3_8_7_2, 0.7_2_2_4, 0.5_6_0_1, 0.4_7_4_1, 0.6_8_7_2, 0.5_8_1_4, 0.4_6_3_6, 0.3_8_6_7, 0.5_0_7_8]   )

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







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			torch_device in ['''cpu''', '''mps''']

					self._test_attention_slicing_forward_pass(test_max_difference=UpperCAmelCase   )







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			torch_device in ['''cpu''', '''mps''']

					self._test_inference_batch_single_identical(test_max_difference=UpperCAmelCase   )







				@unittest.skipIf(
				    torch_device != '''cuda''' or not is_xformers_available()      ,	reason='''XFormers attention is only available with CUDA and `xformers` installed'''      ,	)
				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					self._test_xformers_attention_forwardGenerator_pass(test_max_difference=UpperCAmelCase   )







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







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






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







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			load_image(
					    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/turtle.png'''   )

					lowerCAmelCase_      							=			load_numpy(
					    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/stable_unclip_2_1_l_img2img_anime_turtle_fp16.npy'''   )

					lowerCAmelCase_      							=			StableUnCLIPImgaImgPipeline.from_pretrained(
					    '''fusing/stable-unclip-2-1-l-img2img'''      ,	torch_dtype=torch.floataa   )
					pipe.to(UpperCAmelCase   )
					pipe.set_progress_bar_config(disable=UpperCAmelCase   )
					# stable unclip will oom when integration tests are run on a V100,
					# so turn on memory savings
					pipe.enable_attention_slicing()
					pipe.enable_sequential_cpu_offload()

					lowerCAmelCase_      							=			torch.Generator(device='''cpu'''   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipe(UpperCAmelCase      ,	'''anime turle'''      ,	generator=UpperCAmelCase      ,	output_type='''np'''   )

					lowerCAmelCase_      							=			output.images[0]

					assert image.shape == (768, 768, 3)

					assert_mean_pixel_difference(UpperCAmelCase      ,	UpperCAmelCase   )







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			load_image(
					    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/turtle.png'''   )

					lowerCAmelCase_      							=			load_numpy(
					    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/stable_unclip_2_1_h_img2img_anime_turtle_fp16.npy'''   )

					lowerCAmelCase_      							=			StableUnCLIPImgaImgPipeline.from_pretrained(
					    '''fusing/stable-unclip-2-1-h-img2img'''      ,	torch_dtype=torch.floataa   )
					pipe.to(UpperCAmelCase   )
					pipe.set_progress_bar_config(disable=UpperCAmelCase   )
					# stable unclip will oom when integration tests are run on a V100,
					# so turn on memory savings
					pipe.enable_attention_slicing()
					pipe.enable_sequential_cpu_offload()

					lowerCAmelCase_      							=			torch.Generator(device='''cpu'''   ).manual_seed(0   )
					lowerCAmelCase_      							=			pipe(UpperCAmelCase      ,	'''anime turle'''      ,	generator=UpperCAmelCase      ,	output_type='''np'''   )

					lowerCAmelCase_      							=			output.images[0]

					assert image.shape == (768, 768, 3)

					assert_mean_pixel_difference(UpperCAmelCase      ,	UpperCAmelCase   )







				def      lowerCamelCase_     ( self   ):

					'''simple docstring'''






					lowerCAmelCase_      							=			load_image(
					    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/turtle.png'''   )

					torch.cuda.empty_cache()
					torch.cuda.reset_max_memory_allocated()
					torch.cuda.reset_peak_memory_stats()

					lowerCAmelCase_      							=			StableUnCLIPImgaImgPipeline.from_pretrained(
					    '''fusing/stable-unclip-2-1-h-img2img'''      ,	torch_dtype=torch.floataa   )
					lowerCAmelCase_      							=			pipe.to(UpperCAmelCase   )
					pipe.set_progress_bar_config(disable=UpperCAmelCase   )
					pipe.enable_attention_slicing()
					pipe.enable_sequential_cpu_offload()

					lowerCAmelCase_      							=			pipe(
					    UpperCAmelCase      ,	'''anime turtle'''      ,	num_inference_steps=2      ,	output_type='''np'''      ,	)

					lowerCAmelCase_      							=			torch.cuda.max_memory_allocated()
					# make sure that less than 7 GB is allocated
					assert mem_bytes < 7 * 10**9



"""simple docstring"""



from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder


# @@protoc_insertion_point(imports)

lowercase_							=							_symbol_database.Default()


lowercase_							=							_descriptor_pool.Default().AddSerializedFile(
    b'\n\x19sentencepiece_model.proto\x12\rsentencepiece"\x80\x0c\n\x0bTrainerSpec\x12\r\n\x05input\x18\x01 \x03(\t\x12\x14\n\x0cinput_format\x18\x07 \x01(\t\x12\x14\n\x0cmodel_prefix\x18\x02 \x01(\t\x12\x41\n\nmodel_type\x18\x03 \x01(\x0e\x32$.sentencepiece.TrainerSpec.ModelType:\x07UNIGRAM\x12\x18\n\nvocab_size\x18\x04 \x01(\x05:\x04\x38\x30\x30\x30\x12\x17\n\x0f\x61\x63\x63\x65pt_language\x18\x05 \x03(\t\x12 \n\x15self_test_sample_size\x18\x06 \x01(\x05:\x01\x30\x12*\n\x1b\x65nable_differential_privacy\x18\x32 \x01(\x08:\x05\x66\x61lse\x12+\n differential_privacy_noise_level\x18\x33 \x01(\x02:\x01\x30\x12\x32\n\'differential_privacy_clipping_threshold\x18\x34 \x01(\x04:\x01\x30\x12"\n\x12\x63haracter_coverage\x18\n \x01(\x02:\x06\x30.9995\x12\x1e\n\x13input_sentence_size\x18\x0b \x01(\x04:\x01\x30\x12$\n\x16shuffle_input_sentence\x18\x13 \x01(\x08:\x04true\x12 \n\x14mining_sentence_size\x18\x0c \x01(\x05\x42\x02\x18\x01\x12"\n\x16training_sentence_size\x18\r \x01(\x05\x42\x02\x18\x01\x12(\n\x17seed_sentencepiece_size\x18\x0e \x01(\x05:\x07\x31\x30\x30\x30\x30\x30\x30\x12\x1e\n\x10shrinking_factor\x18\x0f \x01(\x02:\x04\x30.75\x12!\n\x13max_sentence_length\x18\x12 \x01(\x05:\x04\x34\x31\x39\x32\x12\x17\n\x0bnum_threads\x18\x10 \x01(\x05:\x02\x31\x36\x12\x1d\n\x12num_sub_iterations\x18\x11 \x01(\x05:\x01\x32\x12$\n\x18max_sentencepiece_length\x18\x14 \x01(\x05:\x02\x31\x36\x12%\n\x17split_by_unicode_script\x18\x15 \x01(\x08:\x04true\x12\x1d\n\x0fsplit_by_number\x18\x17 \x01(\x08:\x04true\x12!\n\x13split_by_whitespace\x18\x16 \x01(\x08:\x04true\x12)\n\x1atreat_whitespace_as_suffix\x18\x18 \x01(\x08:\x05\x66\x61lse\x12+\n\x1c\x61llow_whitespace_only_pieces\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0csplit_digits\x18\x19 \x01(\x08:\x05\x66\x61lse\x12#\n\x19pretokenization_delimiter\x18\x35 \x01(\t:\x00\x12\x17\n\x0f\x63ontrol_symbols\x18\x1e \x03(\t\x12\x1c\n\x14user_defined_symbols\x18\x1f \x03(\t\x12\x16\n\x0erequired_chars\x18$ \x01(\t\x12\x1c\n\rbyte_fallback\x18# \x01(\x08:\x05\x66\x61lse\x12+\n\x1dvocabulary_output_piece_score\x18  \x01(\x08:\x04true\x12\x1e\n\x10hard_vocab_limit\x18! \x01(\x08:\x04true\x12\x1c\n\ruse_all_vocab\x18" \x01(\x08:\x05\x66\x61lse\x12\x11\n\x06unk_id\x18( \x01(\x05:\x01\x30\x12\x11\n\x06\x62os_id\x18) \x01(\x05:\x01\x31\x12\x11\n\x06\x65os_id\x18* \x01(\x05:\x01\x32\x12\x12\n\x06pad_id\x18+ \x01(\x05:\x02-1\x12\x18\n\tunk_piece\x18- \x01(\t:\x05<unk>\x12\x16\n\tbos_piece\x18. \x01(\t:\x03<s>\x12\x17\n\teos_piece\x18/ \x01(\t:\x04</s>\x12\x18\n\tpad_piece\x18\x30 \x01(\t:\x05<pad>\x12\x1a\n\x0bunk_surface\x18, \x01(\t:\x05 \xe2\x81\x87 \x12+\n\x1ctrain_extremely_large_corpus\x18\x31 \x01(\x08:\x05\x66\x61lse"5\n\tModelType\x12\x0b\n\x07UNIGRAM\x10\x01\x12\x07\n\x03\x42PE\x10\x02\x12\x08\n\x04WORD\x10\x03\x12\x08\n\x04\x43HAR\x10\x04*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02"\xd1\x01\n\x0eNormalizerSpec\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1c\n\x14precompiled_charsmap\x18\x02 \x01(\x0c\x12\x1e\n\x10\x61\x64\x64_dummy_prefix\x18\x03 \x01(\x08:\x04true\x12&\n\x18remove_extra_whitespaces\x18\x04 \x01(\x08:\x04true\x12 \n\x12\x65scape_whitespaces\x18\x05 \x01(\x08:\x04true\x12\x1e\n\x16normalization_rule_tsv\x18\x06 \x01(\t*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02"y\n\x0cSelfTestData\x12\x33\n\x07samples\x18\x01 \x03(\x0b\x32".sentencepiece.SelfTestData.Sample\x1a)\n\x06Sample\x12\r\n\x05input\x18\x01 \x01(\t\x12\x10\n\x08\x65xpected\x18\x02 \x01(\t*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02"\xfe\x03\n\nModelProto\x12\x37\n\x06pieces\x18\x01 \x03(\x0b\x32\'.sentencepiece.ModelProto.SentencePiece\x12\x30\n\x0ctrainer_spec\x18\x02 \x01(\x0b\x32\x1a.sentencepiece.TrainerSpec\x12\x36\n\x0fnormalizer_spec\x18\x03 \x01(\x0b\x32\x1d.sentencepiece.NormalizerSpec\x12\x33\n\x0eself_test_data\x18\x04 \x01(\x0b\x32\x1b.sentencepiece.SelfTestData\x12\x38\n\x11\x64\x65normalizer_spec\x18\x05 \x01(\x0b\x32\x1d.sentencepiece.NormalizerSpec\x1a\xd2\x01\n\rSentencePiece\x12\r\n\x05piece\x18\x01 \x01(\t\x12\r\n\x05score\x18\x02 \x01(\x02\x12\x42\n\x04type\x18\x03 \x01(\x0e\x32,.sentencepiece.ModelProto.SentencePiece.Type:\x06NORMAL"T\n\x04Type\x12\n\n\x06NORMAL\x10\x01\x12\x0b\n\x07UNKNOWN\x10\x02\x12\x0b\n\x07\x43ONTROL\x10\x03\x12\x10\n\x0cUSER_DEFINED\x10\x04\x12\x08\n\x04\x42YTE\x10\x06\x12\n\n\x06UNUSED\x10\x05*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02*\t\x08\xc8\x01\x10\x80\x80\x80\x80\x02\x42\x02H\x03'
)

lowercase_							=							globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'sentencepiece_model_pb2', _globals)
if _descriptor._USE_C_DESCRIPTORS is False:
		lowercase_							=							None
		lowercase_							=							b'H\003'
		# (generated by protobuf compiler, but `_TRAINERSPEC` is not defined)
		# _TRAINERSPEC.fields_by_name["mining_sentence_size"]._options = None
		# _TRAINERSPEC.fields_by_name["mining_sentence_size"]._serialized_options = b"\030\001"
		# _TRAINERSPEC.fields_by_name["training_sentence_size"]._options = None
		# _TRAINERSPEC.fields_by_name["training_sentence_size"]._serialized_options = b"\030\001"
		lowercase_							=							45
		lowercase_							=							15_81
		lowercase_							=							15_17
		lowercase_							=							15_70
		lowercase_							=							15_84
		lowercase_							=							17_93
		lowercase_							=							17_95
		lowercase_							=							19_16
		lowercase_							=							18_64
		lowercase_							=							19_05
		lowercase_							=							19_19
		lowercase_							=							24_29
		lowercase_							=							22_08
		lowercase_							=							24_18
		lowercase_							=							23_23
		lowercase_							=							24_07
# @@protoc_insertion_point(module_scope)