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       __a  (   A__	,       unittest.TestCase	):
 _lowerCAmelCase	:	Tuple				=			UnCLIPImageVariationPipeline
 _lowerCAmelCase	:	Dict				=			IMAGE_VARIATION_PARAMS - {'''height''', '''width''', '''guidance_scale'''}
 _lowerCAmelCase	:	Dict				=			IMAGE_VARIATION_BATCH_PARAMS

 _lowerCAmelCase	:	Any				=			[
     '''generator''',
     '''return_dict''',
     '''decoder_num_inference_steps''',
     '''super_res_num_inference_steps''',
 ]
 _lowerCAmelCase	:	str				=			False







 @property
 def  __lowercase (		self :       Optional[Any]						):


      '''simple docstring'''






      return 32







 @property
 def  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      return 32







 @property
 def  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      return self.time_input_dim







 @property
 def  __lowercase (		self :       Union[str, Any]						):


      '''simple docstring'''






      return self.time_input_dim * 4







 @property
 def  __lowercase (		self :       List[Any]						):


      '''simple docstring'''






      return 1_00







 @property
 def  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      UpperCamelCase__      :       Union[str, Any]	    =  CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"						)
      return tokenizer







 @property
 def  __lowercase (		self :       Optional[Any]						):


      '''simple docstring'''






      torch.manual_seed(0						)
      UpperCamelCase__      :       int	    =  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-0_5							,       num_attention_heads=4							,       num_hidden_layers=5							,       pad_token_id=1							,       vocab_size=10_00							,       )
      return CLIPTextModelWithProjection(__A						)







 @property
 def  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      torch.manual_seed(0						)
      UpperCamelCase__      :       List[Any]	    =  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(__A						)







 @property
 def  __lowercase (		self :       str						):


      '''simple docstring'''






      torch.manual_seed(0						)

      UpperCamelCase__      :       Tuple	    =  {
          "clip_embeddings_dim": self.text_embedder_hidden_size,
          "time_embed_dim": self.time_embed_dim,
          "cross_attention_dim": self.cross_attention_dim,
      }

      UpperCamelCase__      :       int	    =  UnCLIPTextProjModel(**__A						)
      return model







 @property
 def  __lowercase (		self :       Tuple						):


      '''simple docstring'''






      torch.manual_seed(0						)

      UpperCamelCase__      :       Any	    =  {
          "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",
      }

      UpperCamelCase__      :       Any	    =  UNetaDConditionModel(**__A						)
      return model







 @property
 def  __lowercase (		self :       Tuple						):


      '''simple docstring'''






      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  __lowercase (		self :       List[Any]						):


      '''simple docstring'''






      torch.manual_seed(0						)

      UpperCamelCase__      :       Dict	    =  UNetaDModel(**self.dummy_super_res_kwargs						)
      return model







 @property
 def  __lowercase (		self :       List[Any]						):


      '''simple docstring'''






      torch.manual_seed(1						)

      UpperCamelCase__      :       int	    =  UNetaDModel(**self.dummy_super_res_kwargs						)
      return model







 def  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      UpperCamelCase__      :       Optional[Any]	    =  self.dummy_decoder
      UpperCamelCase__      :       int	    =  self.dummy_text_proj
      UpperCamelCase__      :       Tuple	    =  self.dummy_text_encoder
      UpperCamelCase__      :       int	    =  self.dummy_tokenizer
      UpperCamelCase__      :       Dict	    =  self.dummy_super_res_first
      UpperCamelCase__      :       Dict	    =  self.dummy_super_res_last

      UpperCamelCase__      :       Any	    =  UnCLIPScheduler(
          variance_type="learned_range"							,       prediction_type="epsilon"							,       num_train_timesteps=10_00							,       )

      UpperCamelCase__      :       Dict	    =  UnCLIPScheduler(
          variance_type="fixed_small_log"							,       prediction_type="epsilon"							,       num_train_timesteps=10_00							,       )

      UpperCamelCase__      :       Any	    =  CLIPImageProcessor(crop_size=32							,       size=32						)

      UpperCamelCase__      :       List[str]	    =  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  __lowercase (		self :       Dict							,       SCREAMING_SNAKE_CASE :       List[str]							,       SCREAMING_SNAKE_CASE :       Any=0							,       SCREAMING_SNAKE_CASE :       Union[str, Any]=True						):


      '''simple docstring'''






      UpperCamelCase__      :       Tuple	    =  floats_tensor((1, 3, 32, 32)							,       rng=random.Random(__A						)						).to(__A						)
      if str(__A						).startswith("mps"						):
           UpperCamelCase__      :       Tuple	    =  torch.manual_seed(__A						)
      else:
           UpperCamelCase__      :       str	    =  torch.Generator(device=__A						).manual_seed(__A						)

      if pil_image:
           UpperCamelCase__      :       Optional[int]	    =  input_image * 0.5 + 0.5
           UpperCamelCase__      :       Optional[int]	    =  input_image.clamp(0							,       1						)
           UpperCamelCase__      :       List[str]	    =  input_image.cpu().permute(0							,       2							,       3							,       1						).float().numpy()
           UpperCamelCase__      :       List[str]	    =  DiffusionPipeline.numpy_to_pil(__A						)[0]

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







 def  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      UpperCamelCase__      :       Tuple	    =  "cpu"

      UpperCamelCase__      :       List[str]	    =  self.get_dummy_components()

      UpperCamelCase__      :       Dict	    =  self.pipeline_class(**__A						)
      UpperCamelCase__      :       Any	    =  pipe.to(__A						)

      pipe.set_progress_bar_config(disable=__A						)

      UpperCamelCase__      :       Union[str, Any]	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)

      UpperCamelCase__      :       Any	    =  pipe(**__A						)
      UpperCamelCase__      :       List[Any]	    =  output.images

      UpperCamelCase__      :       Union[str, Any]	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)

      UpperCamelCase__      :       Any	    =  pipe(
          **__A							,       return_dict=__A							,       )[0]

      UpperCamelCase__      :       Dict	    =  image[0, -3:, -3:, -1]
      UpperCamelCase__      :       List[str]	    =  image_from_tuple[0, -3:, -3:, -1]

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

      UpperCamelCase__      :       Optional[Any]	    =  np.array(
          [
              0.9_9_9_7,
              0.0_0_0_2,
              0.9_9_9_7,
              0.9_9_9_7,
              0.9_9_6_9,
              0.0_0_2_3,
              0.9_9_9_7,
              0.9_9_6_9,
              0.9_9_7_0,
          ]						)

      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  __lowercase (		self :       Optional[int]						):


      '''simple docstring'''






      UpperCamelCase__      :       Optional[int]	    =  "cpu"

      UpperCamelCase__      :       Union[str, Any]	    =  self.get_dummy_components()

      UpperCamelCase__      :       Union[str, Any]	    =  self.pipeline_class(**__A						)
      UpperCamelCase__      :       Optional[Any]	    =  pipe.to(__A						)

      pipe.set_progress_bar_config(disable=__A						)

      UpperCamelCase__      :       Union[str, Any]	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)

      UpperCamelCase__      :       List[Any]	    =  pipe(**__A						)
      UpperCamelCase__      :       Dict	    =  output.images

      UpperCamelCase__      :       Tuple	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)

      UpperCamelCase__      :       Any	    =  pipe(
          **__A							,       return_dict=__A							,       )[0]

      UpperCamelCase__      :       Optional[Any]	    =  image[0, -3:, -3:, -1]
      UpperCamelCase__      :       Union[str, Any]	    =  image_from_tuple[0, -3:, -3:, -1]

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

      UpperCamelCase__      :       List[Any]	    =  np.array([0.9_9_9_7, 0.0_0_0_3, 0.9_9_9_7, 0.9_9_9_7, 0.9_9_7_0, 0.0_0_2_4, 0.9_9_9_7, 0.9_9_7_1, 0.9_9_7_1]						)

      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  __lowercase (		self :       Any						):


      '''simple docstring'''






      UpperCamelCase__      :       Dict	    =  "cpu"

      UpperCamelCase__      :       Any	    =  self.get_dummy_components()

      UpperCamelCase__      :       Union[str, Any]	    =  self.pipeline_class(**__A						)
      UpperCamelCase__      :       str	    =  pipe.to(__A						)

      pipe.set_progress_bar_config(disable=__A						)

      UpperCamelCase__      :       Dict	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)
      UpperCamelCase__      :       List[str]	    =  [
          pipeline_inputs["image"],
          pipeline_inputs["image"],
      ]

      UpperCamelCase__      :       Optional[int]	    =  pipe(**__A						)
      UpperCamelCase__      :       List[Any]	    =  output.images

      UpperCamelCase__      :       Union[str, Any]	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)
      UpperCamelCase__      :       Union[str, Any]	    =  [
          tuple_pipeline_inputs["image"],
          tuple_pipeline_inputs["image"],
      ]

      UpperCamelCase__      :       str	    =  pipe(
          **__A							,       return_dict=__A							,       )[0]

      UpperCamelCase__      :       List[str]	    =  image[0, -3:, -3:, -1]
      UpperCamelCase__      :       int	    =  image_from_tuple[0, -3:, -3:, -1]

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

      UpperCamelCase__      :       Any	    =  np.array(
          [
              0.9_9_9_7,
              0.9_9_8_9,
              0.0_0_0_8,
              0.0_0_2_1,
              0.9_9_6_0,
              0.0_0_1_8,
              0.0_0_1_4,
              0.0_0_0_2,
              0.9_9_3_3,
          ]						)

      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  __lowercase (		self :       List[str]						):


      '''simple docstring'''






      UpperCamelCase__      :       List[str]	    =  torch.device("cpu"						)





      class       __a  :
       _lowerCAmelCase	:	Union[str, Any]				=			1







      UpperCamelCase__      :       str	    =  self.get_dummy_components()

      UpperCamelCase__      :       List[Any]	    =  self.pipeline_class(**__A						)
      UpperCamelCase__      :       Dict	    =  pipe.to(__A						)

      pipe.set_progress_bar_config(disable=__A						)

      UpperCamelCase__      :       Any	    =  torch.Generator(device=__A						).manual_seed(0						)
      UpperCamelCase__      :       List[str]	    =  pipe.decoder.dtype
      UpperCamelCase__      :       Optional[int]	    =  1

      UpperCamelCase__      :       List[Any]	    =  (
          batch_size,
          pipe.decoder.config.in_channels,
          pipe.decoder.config.sample_size,
          pipe.decoder.config.sample_size,
      )
      UpperCamelCase__      :       str	    =  pipe.prepare_latents(
          __A							,       dtype=__A							,       device=__A							,       generator=__A							,       latents=__A							,       scheduler=DummyScheduler()						)

      UpperCamelCase__      :       str	    =  (
          batch_size,
          pipe.super_res_first.config.in_channels // 2,
          pipe.super_res_first.config.sample_size,
          pipe.super_res_first.config.sample_size,
      )
      UpperCamelCase__      :       int	    =  pipe.prepare_latents(
          __A							,       dtype=__A							,       device=__A							,       generator=__A							,       latents=__A							,       scheduler=DummyScheduler()						)

      UpperCamelCase__      :       Union[str, Any]	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)

      UpperCamelCase__      :       Dict	    =  pipe(
          **__A							,       decoder_latents=__A							,       super_res_latents=__A						).images

      UpperCamelCase__      :       str	    =  self.get_dummy_inputs(__A							,       pil_image=__A						)
      # Don't pass image, instead pass embedding
      UpperCamelCase__      :       Optional[Any]	    =  pipeline_inputs.pop("image"						)
      UpperCamelCase__      :       List[str]	    =  pipe.image_encoder(__A						).image_embeds

      UpperCamelCase__      :       List[str]	    =  pipe(
          **__A							,       decoder_latents=__A							,       super_res_latents=__A							,       image_embeddings=__A							,       ).images

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







 @skip_mps
 def  __lowercase (		self :       Dict						):


      '''simple docstring'''






      UpperCamelCase__      :       List[Any]	    =  torch_device == "cpu"

      # Check is relaxed because there is not a torch 2.0 sliced attention added kv processor
      UpperCamelCase__      :       Any	    =  1e-2

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







 @skip_mps
 def  __lowercase (		self :       Any						):


      '''simple docstring'''






      UpperCamelCase__      :       Any	    =  torch_device == "cpu"
      UpperCamelCase__      :       str	    =  True
      UpperCamelCase__      :       Dict	    =  [
          "decoder_num_inference_steps",
          "super_res_num_inference_steps",
      ]

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







 def  __lowercase (		self :       Dict						):


      '''simple docstring'''






      UpperCamelCase__      :       List[Any]	    =  [
          "decoder_num_inference_steps",
          "super_res_num_inference_steps",
      ]

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







 @skip_mps
 def  __lowercase (		self :       Optional[int]						):


      '''simple docstring'''






      return super().test_dict_tuple_outputs_equivalent()







 @skip_mps
 def  __lowercase (		self :       Any						):


      '''simple docstring'''






      return super().test_save_load_local()







 @skip_mps
 def  __lowercase (		self :       Tuple						):


      '''simple docstring'''






      return super().test_save_load_optional_components()







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







 def  __lowercase (		self :       Union[str, Any]						):


      '''simple docstring'''






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







 def  __lowercase (		self :       int						):


      '''simple docstring'''






      UpperCamelCase__      :       Union[str, Any]	    =  load_image(
          "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/unclip/cat.png"						)
      UpperCamelCase__      :       Any	    =  load_numpy(
          "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
          "/unclip/karlo_v1_alpha_cat_variation_fp16.npy"						)

      UpperCamelCase__      :       Any	    =  UnCLIPImageVariationPipeline.from_pretrained(
          "kakaobrain/karlo-v1-alpha-image-variations"							,       torch_dtype=torch.floataa						)
      UpperCamelCase__      :       Dict	    =  pipeline.to(__A						)
      pipeline.set_progress_bar_config(disable=__A						)

      UpperCamelCase__      :       Union[str, Any]	    =  torch.Generator(device="cpu"						).manual_seed(0						)
      UpperCamelCase__      :       Dict	    =  pipeline(
          __A							,       generator=__A							,       output_type="np"							,       )

      UpperCamelCase__      :       Union[str, Any]	    =  output.images[0]

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

      assert_mean_pixel_difference(__A							,       __A							,       15						)







from __future__ import annotations







def 		SCREAMING_SNAKE_CASE							( __lowerCAmelCase ,   __lowerCAmelCase      )			->     bool:
     if len(__lowerCAmelCase      ) == 0:
          return False
     UpperCamelCase__      :       Any	    =  len(__lowerCAmelCase      ) // 2
     if a_list[midpoint] == item:
          return True
     if item < a_list[midpoint]:
          return binary_search(a_list[:midpoint] ,   __lowerCAmelCase      )
     else:
          return binary_search(a_list[midpoint + 1 :] ,   __lowerCAmelCase      )


if __name__ == "__main__":
 lowerCamelCase     :							Any    =input('''Enter numbers separated by comma:\n''').strip()
 lowerCamelCase     :							Dict    =[int(item.strip()) for item in user_input.split(''',''')]
 lowerCamelCase     :							List[str]    =int(input('''Enter the number to be found in the list:\n''').strip())
 lowerCamelCase     :							Union[str, Any]    ='''''' if binary_search(sequence, target) else '''not '''
 print(F"""{target} was {not_str}found in {sequence}""")