





import gc
import random
import unittest

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

from diffusers import (
    DiffusionPipeline,
    UnCLIPImageVariationPipeline,
    UnCLIPScheduler,
    UNetaDConditionModel,
    UNetaDModel,
)
from diffusers.pipelines.unclip.text_proj import UnCLIPTextProjModel
from diffusers.utils import floats_tensor, load_numpy, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, load_image, require_torch_gpu, skip_mps

from ..pipeline_params import IMAGE_VARIATION_BATCH_PARAMS, IMAGE_VARIATION_PARAMS
from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference


enable_full_determinism()




class        SCREAMING_SNAKE_CASE__					(		UpperCamelCase__							,   unittest.TestCase ):
 __SCREAMING_SNAKE_CASE							=      UnCLIPImageVariationPipeline
 __SCREAMING_SNAKE_CASE							=      IMAGE_VARIATION_PARAMS - {'''height''', '''width''', '''guidance_scale'''}
 __SCREAMING_SNAKE_CASE							=      IMAGE_VARIATION_BATCH_PARAMS

 __SCREAMING_SNAKE_CASE							=      [
     '''generator''',
     '''return_dict''',
     '''decoder_num_inference_steps''',
     '''super_res_num_inference_steps''',
 ]
 __SCREAMING_SNAKE_CASE							=      False



 @property
 def 							UpperCamelCase     (				self					):
        return 32



 @property
 def 							UpperCamelCase     (				self					):
        return 32



 @property
 def 							UpperCamelCase     (				self					):
        return self.time_input_dim



 @property
 def 							UpperCamelCase     (				self					):
        return self.time_input_dim * 4



 @property
 def 							UpperCamelCase     (				self					):
        return 100



 @property
 def 							UpperCamelCase     (				self					):
        A__		   =		CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''					)
        return tokenizer



 @property
 def 							UpperCamelCase     (				self					):
        torch.manual_seed(0					)
        A__		   =		CLIPTextConfig(
            bos_token_id=0,eos_token_id=2,hidden_size=self.text_embedder_hidden_size,projection_dim=self.text_embedder_hidden_size,intermediate_size=37,layer_norm_eps=1E-05,num_attention_heads=4,num_hidden_layers=5,pad_token_id=1,vocab_size=1000,)
        return CLIPTextModelWithProjection(__lowerCamelCase					)



 @property
 def 							UpperCamelCase     (				self					):
        torch.manual_seed(0					)
        A__		   =		CLIPVisionConfig(
            hidden_size=self.text_embedder_hidden_size,projection_dim=self.text_embedder_hidden_size,num_hidden_layers=5,num_attention_heads=4,image_size=32,intermediate_size=37,patch_size=1,)
        return CLIPVisionModelWithProjection(__lowerCamelCase					)



 @property
 def 							UpperCamelCase     (				self					):
        torch.manual_seed(0					)

        A__		   =		{
            '''clip_embeddings_dim''': self.text_embedder_hidden_size,
            '''time_embed_dim''': self.time_embed_dim,
            '''cross_attention_dim''': self.cross_attention_dim,
        }

        A__		   =		UnCLIPTextProjModel(**__lowerCamelCase					)
        return model



 @property
 def 							UpperCamelCase     (				self					):
        torch.manual_seed(0					)

        A__		   =		{
            '''sample_size''': 32,
            # RGB in channels
            '''in_channels''': 3,
            # Out channels is double in channels because predicts mean and variance
            '''out_channels''': 6,
            '''down_block_types''': ('''ResnetDownsampleBlock2D''', '''SimpleCrossAttnDownBlock2D'''),
            '''up_block_types''': ('''SimpleCrossAttnUpBlock2D''', '''ResnetUpsampleBlock2D'''),
            '''mid_block_type''': '''UNetMidBlock2DSimpleCrossAttn''',
            '''block_out_channels''': (self.block_out_channels_a, self.block_out_channels_a * 2),
            '''layers_per_block''': 1,
            '''cross_attention_dim''': self.cross_attention_dim,
            '''attention_head_dim''': 4,
            '''resnet_time_scale_shift''': '''scale_shift''',
            '''class_embed_type''': '''identity''',
        }

        A__		   =		UNetaDConditionModel(**__lowerCamelCase					)
        return model



 @property
 def 							UpperCamelCase     (				self					):
        return {
            "sample_size": 64,
            "layers_per_block": 1,
            "down_block_types": ("ResnetDownsampleBlock2D", "ResnetDownsampleBlock2D"),
            "up_block_types": ("ResnetUpsampleBlock2D", "ResnetUpsampleBlock2D"),
            "block_out_channels": (self.block_out_channels_a, self.block_out_channels_a * 2),
            "in_channels": 6,
            "out_channels": 3,
        }



 @property
 def 							UpperCamelCase     (				self					):
        torch.manual_seed(0					)

        A__		   =		UNetaDModel(**self.dummy_super_res_kwargs					)
        return model



 @property
 def 							UpperCamelCase     (				self					):
        # seeded differently to get different unet than `self.dummy_super_res_first`
        torch.manual_seed(1					)

        A__		   =		UNetaDModel(**self.dummy_super_res_kwargs					)
        return model



 def 							UpperCamelCase     (				self					):
        A__		   =		self.dummy_decoder
        A__		   =		self.dummy_text_proj
        A__		   =		self.dummy_text_encoder
        A__		   =		self.dummy_tokenizer
        A__		   =		self.dummy_super_res_first
        A__		   =		self.dummy_super_res_last

        A__		   =		UnCLIPScheduler(
            variance_type='''learned_range''',prediction_type='''epsilon''',num_train_timesteps=1000,)

        A__		   =		UnCLIPScheduler(
            variance_type='''fixed_small_log''',prediction_type='''epsilon''',num_train_timesteps=1000,)

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

        A__		   =		self.dummy_image_encoder

        return {
            "decoder": decoder,
            "text_encoder": text_encoder,
            "tokenizer": tokenizer,
            "text_proj": text_proj,
            "feature_extractor": feature_extractor,
            "image_encoder": image_encoder,
            "super_res_first": super_res_first,
            "super_res_last": super_res_last,
            "decoder_scheduler": decoder_scheduler,
            "super_res_scheduler": super_res_scheduler,
        }



 def 							UpperCamelCase     (				self,__lowerCamelCase,__lowerCamelCase=0,__lowerCamelCase=True					):
        A__		   =		floats_tensor((1, 3, 32, 32),rng=random.Random(__lowerCamelCase					)					).to(__lowerCamelCase					)
        if str(__lowerCamelCase					).startswith('''mps'''					):
               A__		   =		torch.manual_seed(__lowerCamelCase					)
        else:
               A__		   =		torch.Generator(device=__lowerCamelCase					).manual_seed(__lowerCamelCase					)

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

        return {
            "image": input_image,
            "generator": generator,
            "decoder_num_inference_steps": 2,
            "super_res_num_inference_steps": 2,
            "output_type": "np",
        }



 def 							UpperCamelCase     (				self					):
        A__		   =		'''cpu'''

        A__		   =		self.get_dummy_components()

        A__		   =		self.pipeline_class(**__lowerCamelCase					)
        A__		   =		pipe.to(__lowerCamelCase					)

        pipe.set_progress_bar_config(disable=__lowerCamelCase					)

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)

        A__		   =		pipe(**__lowerCamelCase					)
        A__		   =		output.images

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)

        A__		   =		pipe(
            **__lowerCamelCase,return_dict=__lowerCamelCase,)[0]

        A__		   =		image[0, -3:, -3:, -1]
        A__		   =		image_from_tuple[0, -3:, -3:, -1]

        assert image.shape == (1, 64, 64, 3)

        A__		   =		np.array(
            [
                0.9997,
                0.0002,
                0.9997,
                0.9997,
                0.9969,
                0.0023,
                0.9997,
                0.9969,
                0.9970,
            ]					)

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



 def 							UpperCamelCase     (				self					):
        A__		   =		'''cpu'''

        A__		   =		self.get_dummy_components()

        A__		   =		self.pipeline_class(**__lowerCamelCase					)
        A__		   =		pipe.to(__lowerCamelCase					)

        pipe.set_progress_bar_config(disable=__lowerCamelCase					)

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)

        A__		   =		pipe(**__lowerCamelCase					)
        A__		   =		output.images

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)

        A__		   =		pipe(
            **__lowerCamelCase,return_dict=__lowerCamelCase,)[0]

        A__		   =		image[0, -3:, -3:, -1]
        A__		   =		image_from_tuple[0, -3:, -3:, -1]

        assert image.shape == (1, 64, 64, 3)

        A__		   =		np.array([0.9997, 0.0003, 0.9997, 0.9997, 0.9970, 0.0024, 0.9997, 0.9971, 0.9971]					)

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



 def 							UpperCamelCase     (				self					):
        A__		   =		'''cpu'''

        A__		   =		self.get_dummy_components()

        A__		   =		self.pipeline_class(**__lowerCamelCase					)
        A__		   =		pipe.to(__lowerCamelCase					)

        pipe.set_progress_bar_config(disable=__lowerCamelCase					)

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)
        A__		   =		[
            pipeline_inputs['''image'''],
            pipeline_inputs['''image'''],
        ]

        A__		   =		pipe(**__lowerCamelCase					)
        A__		   =		output.images

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)
        A__		   =		[
            tuple_pipeline_inputs['''image'''],
            tuple_pipeline_inputs['''image'''],
        ]

        A__		   =		pipe(
            **__lowerCamelCase,return_dict=__lowerCamelCase,)[0]

        A__		   =		image[0, -3:, -3:, -1]
        A__		   =		image_from_tuple[0, -3:, -3:, -1]

        assert image.shape == (2, 64, 64, 3)

        A__		   =		np.array(
            [
                0.9997,
                0.9989,
                0.0008,
                0.0021,
                0.9960,
                0.0018,
                0.0014,
                0.0002,
                0.9933,
            ]					)

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



 def 							UpperCamelCase     (				self					):
        A__		   =		torch.device('''cpu'''					)




        class        SCREAMING_SNAKE_CASE__					:
         __SCREAMING_SNAKE_CASE							=      1
        A__		   =		self.get_dummy_components()

        A__		   =		self.pipeline_class(**__lowerCamelCase					)
        A__		   =		pipe.to(__lowerCamelCase					)

        pipe.set_progress_bar_config(disable=__lowerCamelCase					)

        A__		   =		torch.Generator(device=__lowerCamelCase					).manual_seed(0					)
        A__		   =		pipe.decoder.dtype
        A__		   =		1

        A__		   =		(
            batch_size,
            pipe.decoder.config.in_channels,
            pipe.decoder.config.sample_size,
            pipe.decoder.config.sample_size,
        )
        A__		   =		pipe.prepare_latents(
            __lowerCamelCase,dtype=__lowerCamelCase,device=__lowerCamelCase,generator=__lowerCamelCase,latents=__lowerCamelCase,scheduler=DummyScheduler()					)

        A__		   =		(
            batch_size,
            pipe.super_res_first.config.in_channels // 2,
            pipe.super_res_first.config.sample_size,
            pipe.super_res_first.config.sample_size,
        )
        A__		   =		pipe.prepare_latents(
            __lowerCamelCase,dtype=__lowerCamelCase,device=__lowerCamelCase,generator=__lowerCamelCase,latents=__lowerCamelCase,scheduler=DummyScheduler()					)

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)

        A__		   =		pipe(
            **__lowerCamelCase,decoder_latents=__lowerCamelCase,super_res_latents=__lowerCamelCase					).images

        A__		   =		self.get_dummy_inputs(__lowerCamelCase,pil_image=__lowerCamelCase					)
        # Don't pass image, instead pass embedding
        A__		   =		pipeline_inputs.pop('''image'''					)
        A__		   =		pipe.image_encoder(__lowerCamelCase					).image_embeds

        A__		   =		pipe(
            **__lowerCamelCase,decoder_latents=__lowerCamelCase,super_res_latents=__lowerCamelCase,image_embeddings=__lowerCamelCase,).images

        # make sure passing text embeddings manually is identical
        assert np.abs(img_out_a - img_out_a					).max() < 1E-4



 @skip_mps
 def 							UpperCamelCase     (				self					):
        A__		   =		torch_device == '''cpu'''

        # Check is relaxed because there is not a torch 2.0 sliced attention added kv processor
        A__		   =		1E-2

        self._test_attention_slicing_forward_pass(
            test_max_difference=__lowerCamelCase,expected_max_diff=__lowerCamelCase					)



 @skip_mps
 def 							UpperCamelCase     (				self					):
        A__		   =		torch_device == '''cpu'''
        A__		   =		True
        A__		   =		[
            '''decoder_num_inference_steps''',
            '''super_res_num_inference_steps''',
        ]

        self._test_inference_batch_single_identical(
            test_max_difference=__lowerCamelCase,relax_max_difference=__lowerCamelCase,additional_params_copy_to_batched_inputs=__lowerCamelCase,)



 def 							UpperCamelCase     (				self					):
        A__		   =		[
            '''decoder_num_inference_steps''',
            '''super_res_num_inference_steps''',
        ]

        if torch_device == "mps":
               # TODO: MPS errors with larger batch sizes
               A__		   =		[2, 3]
               self._test_inference_batch_consistent(
                   batch_sizes=__lowerCamelCase,additional_params_copy_to_batched_inputs=__lowerCamelCase,)
        else:
               self._test_inference_batch_consistent(
                   additional_params_copy_to_batched_inputs=__lowerCamelCase					)



 @skip_mps
 def 							UpperCamelCase     (				self					):
        return super().test_dict_tuple_outputs_equivalent()



 @skip_mps
 def 							UpperCamelCase     (				self					):
        return super().test_save_load_local()




 @skip_mps
 def 							UpperCamelCase     (				self					):
        return super().test_save_load_optional_components()




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



 def 							UpperCamelCase     (				self					):
        # clean up the VRAM after each test
        super().tearDown()
        gc.collect()
        torch.cuda.empty_cache()




 def 							UpperCamelCase     (				self					):
        A__		   =		load_image(
            '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/unclip/cat.png'''					)
        A__		   =		load_numpy(
            '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
            '''/unclip/karlo_v1_alpha_cat_variation_fp16.npy'''					)

        A__		   =		UnCLIPImageVariationPipeline.from_pretrained(
            '''kakaobrain/karlo-v1-alpha-image-variations''',torch_dtype=torch.floataa					)
        A__		   =		pipeline.to(__lowerCamelCase					)
        pipeline.set_progress_bar_config(disable=__lowerCamelCase					)

        A__		   =		torch.Generator(device='''cpu'''					).manual_seed(0					)
        A__		   =		pipeline(
            __lowerCamelCase,generator=__lowerCamelCase,output_type='''np''',)

        A__		   =		output.images[0]

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

        assert_mean_pixel_difference(__lowerCamelCase,__lowerCamelCase,15					)












from __future__ import annotations

import math
from collections.abc import Callable


def       UpperCamelCase__(			UpperCamelCase__     :			Callable[[int | float], int | float]					,	UpperCamelCase__     :			int | float					,	UpperCamelCase__     :			int | float					,	UpperCamelCase__     :			int = 1_00					,	)->float:
       A__		   =		x_start
       A__		   =		fnc(UpperCamelCase__    )
       A__		   =		0.0

       for _ in range(UpperCamelCase__    ):
              # Approximates curve as a sequence of linear lines and sums their length
              A__		   =		(x_end - x_start) / steps + xa
              A__		   =		fnc(UpperCamelCase__    )
              length += math.hypot(xa - xa					,	fxa - fxa    )

              # Increment step
              A__		   =		xa
              A__		   =		fxa

       return length


if __name__ == "__main__":


       def       UpperCamelCase__(			UpperCamelCase__     :			Union[str, Any]    )->Dict:
              return math.sin(10 * x    )

       print('f(x) = sin(10 * x)')
       print('The length of the curve from x = -10 to x = 10 is:')
       a__: str							   =						10
       while i <= 100_000:
              print(F"With {i} steps: {line_length(f, -10, 10, i)}")
              i *= 10





