




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   ):
						_a							:					List[str]      =					StableUnCLIPImgaImgPipeline
						_a							:					Union[str, Any]      =					TEXT_GUIDED_IMAGE_VARIATION_PARAMS
						_a							:					List[Any]      =					TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
						_a							:					str      =					frozenset(
						    []   )  # TO-DO: update image_params once pipeline is refactored with VaeImageProcessor.preprocess
						_a							:					Any      =					frozenset([]   )






						def        __SCREAMING_SNAKE_CASE(     self    ):




											"""simple docstring"""



											__lowerCAmelCase            = 3_2
											__lowerCAmelCase            = embedder_hidden_size

											# image encoding components

											__lowerCAmelCase            = CLIPImageProcessor(crop_size=3_2	,    size=3_2    )

											torch.manual_seed(0    )
											__lowerCAmelCase            = CLIPVisionModelWithProjection(
											    CLIPVisionConfig(
											        hidden_size=_A	,    projection_dim=_A	,    num_hidden_layers=5	,    num_attention_heads=4	,    image_size=3_2	,    intermediate_size=3_7	,    patch_size=1	,    )    )

											# regular denoising components

											torch.manual_seed(0    )
											__lowerCAmelCase            = StableUnCLIPImageNormalizer(embedding_dim=_A    )
											__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=_A	,    projection_dim=3_2	,    intermediate_size=3_7	,    layer_norm_eps=1E-0_5	,    num_attention_heads=4	,    num_hidden_layers=5	,    pad_token_id=1	,    vocab_size=1_0_0_0	,    )    )

											torch.manual_seed(0    )
											__lowerCAmelCase            = UNetaDConditionModel(
											    sample_size=3_2	,    in_channels=4	,    out_channels=4	,    down_block_types=("CrossAttnDownBlock2D", "DownBlock2D")	,    up_block_types=("UpBlock2D", "CrossAttnUpBlock2D")	,    block_out_channels=(3_2, 6_4)	,    attention_head_dim=(2, 4)	,    class_embed_type="projection"	,    projection_class_embeddings_input_dim=embedder_projection_dim * 2	,    cross_attention_dim=_A	,    layers_per_block=1	,    upcast_attention=_A	,    use_linear_projection=_A	,    )

											torch.manual_seed(0    )
											__lowerCAmelCase            = DDIMScheduler(
											    beta_schedule="scaled_linear"	,    beta_start=0.0_00_85	,    beta_end=0.0_12	,    prediction_type="v_prediction"	,    set_alpha_to_one=_A	,    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        __SCREAMING_SNAKE_CASE(     self	,    _A	,    _A=0	,    _A=True    ):




											"""simple docstring"""



											if str(_A    ).startswith("mps"    ):
																__lowerCAmelCase            = torch.manual_seed(_A    )
											else:
																__lowerCAmelCase            = torch.Generator(device=_A    ).manual_seed(_A    )

											__lowerCAmelCase            = floats_tensor((1, 3, 3_2, 3_2)	,    rng=random.Random(_A    )    ).to(_A    )

											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(_A    )[0]

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






						@skip_mps
						def        __SCREAMING_SNAKE_CASE(     self    ):




											"""simple docstring"""



											__lowerCAmelCase            = "cpu"  # ensure determinism for the device-dependent torch.Generator
											__lowerCAmelCase            = self.get_dummy_components()
											__lowerCAmelCase            = StableUnCLIPImgaImgPipeline(**_A    )
											__lowerCAmelCase            = sd_pipe.to(_A    )
											sd_pipe.set_progress_bar_config(disable=_A    )

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

											assert image.shape == (1, 3_2, 3_2, 3)
											__lowerCAmelCase            = np.array([0.38_72, 0.72_24, 0.56_01, 0.47_41, 0.68_72, 0.58_14, 0.46_36, 0.38_67, 0.50_78]    )

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






						def        __SCREAMING_SNAKE_CASE(     self    ):




											"""simple docstring"""



											__lowerCAmelCase            = torch_device in ["cpu", "mps"]

											self._test_attention_slicing_forward_pass(test_max_difference=_A    )






						def        __SCREAMING_SNAKE_CASE(     self    ):




											"""simple docstring"""



											__lowerCAmelCase            = torch_device in ["cpu", "mps"]

											self._test_inference_batch_single_identical(test_max_difference=_A    )






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




											"""simple docstring"""



											self._test_xformers_attention_forwardGenerator_pass(test_max_difference=_A    )






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






						def        __SCREAMING_SNAKE_CASE(     self    ):




											"""simple docstring"""



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






						def        __SCREAMING_SNAKE_CASE(     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(_A    )
											pipe.set_progress_bar_config(disable=_A    )
											# 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(_A	,    "anime turle"	,    generator=_A	,    output_type="np"    )

											__lowerCAmelCase            = output.images[0]

											assert image.shape == (7_6_8, 7_6_8, 3)

											assert_mean_pixel_difference(_A	,    _A    )






						def        __SCREAMING_SNAKE_CASE(     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(_A    )
											pipe.set_progress_bar_config(disable=_A    )
											# 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(_A	,    "anime turle"	,    generator=_A	,    output_type="np"    )

											__lowerCAmelCase            = output.images[0]

											assert image.shape == (7_6_8, 7_6_8, 3)

											assert_mean_pixel_difference(_A	,    _A    )






						def        __SCREAMING_SNAKE_CASE(     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(_A    )
											pipe.set_progress_bar_config(disable=_A    )
											pipe.enable_attention_slicing()
											pipe.enable_sequential_cpu_offload()

											__lowerCAmelCase            = pipe(
											    _A	,    "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 * 1_0**9










def 			_a   (		SCREAMING_SNAKE_CASE_							:       int  ):
					if divisor % 5 == 0 or divisor % 2 == 0:
										return 0
					__lowerCAmelCase            = 1
					__lowerCAmelCase            = 1
					while repunit:
										__lowerCAmelCase            = (10 * repunit + 1) % divisor
										repunit_index += 1
					return repunit_index







def 			_a   (		SCREAMING_SNAKE_CASE_							:       int = 1_00_00_00  ):
					__lowerCAmelCase            = limit - 1
					if divisor % 2 == 0:
										divisor += 1
					while least_divisible_repunit(SCREAMING_SNAKE_CASE_  ) <= limit:
										divisor += 2
					return divisor


if __name__ == "__main__":
					print(f'''{solution() = }''')




