






"""simple docstring"""





import random
import unittest

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

from diffusers import KandinskyVaaPriorEmbaEmbPipeline, PriorTransformer, UnCLIPScheduler
from diffusers.utils import floats_tensor, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, skip_mps

from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()







class 		_a       (						lowercase_    ,					unittest.TestCase   ):





   '''simple docstring'''






   UpperCamelCase__      					=    KandinskyVaaPriorEmbaEmbPipeline
   UpperCamelCase__      					=    ["""prompt""", """image"""]
   UpperCamelCase__      					=    ["""prompt""", """image"""]
   UpperCamelCase__      					=    [
       """num_images_per_prompt""",
       """strength""",
       """generator""",
       """num_inference_steps""",
       """latents""",
       """negative_prompt""",
       """guidance_scale""",
       """output_type""",
       """return_dict""",
   ]
   UpperCamelCase__      					=    False





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




          '''simple docstring'''




          return 32





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




          '''simple docstring'''




          return 32





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




          '''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)	-> str:




          '''simple docstring'''




          return 100





   @property
   def __lowercase    (   self)	-> Any:




          '''simple docstring'''




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





   @property
   def __lowercase    (   self)	-> Tuple:




          '''simple docstring'''




          torch.manual_seed(0)
          lowercase__:    Union[str, Any]        =      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=1_000			,				)
          return CLIPTextModelWithProjection(UpperCAmelCase_)





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




          '''simple docstring'''




          torch.manual_seed(0)

          lowercase__:    str        =      {
              "num_attention_heads": 2,
              "attention_head_dim": 12,
              "embedding_dim": self.text_embedder_hidden_size,
              "num_layers": 1,
          }

          lowercase__:    str        =      PriorTransformer(**UpperCAmelCase_)
          # clip_std and clip_mean is initialized to be 0 so PriorTransformer.post_process_latents will always return 0 - set clip_std to be 1 so it won't return 0
          lowercase__:    Any        =      nn.Parameter(torch.ones(model.clip_std.shape))
          return model





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




          '''simple docstring'''




          torch.manual_seed(0)
          lowercase__:    Dict        =      CLIPVisionConfig(
              hidden_size=self.text_embedder_hidden_size			,				image_size=224			,				projection_dim=self.text_embedder_hidden_size			,				intermediate_size=37			,				num_attention_heads=4			,				num_channels=3			,				num_hidden_layers=5			,				patch_size=14			,				)

          lowercase__:    int        =      CLIPVisionModelWithProjection(UpperCAmelCase_)
          return model





   @property
   def __lowercase    (   self)	-> int:




          '''simple docstring'''




          lowercase__:    Tuple        =      CLIPImageProcessor(
              crop_size=224			,				do_center_crop=UpperCAmelCase_			,				do_normalize=UpperCAmelCase_			,				do_resize=UpperCAmelCase_			,				image_mean=[0.48_14_54_66, 0.4_57_82_75, 0.40_82_10_73]			,				image_std=[0.26_86_29_54, 0.26_13_02_58, 0.27_57_77_11]			,				resample=3			,				size=224			,				)

          return image_processor





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




          '''simple docstring'''




          lowercase__:    str        =      self.dummy_prior
          lowercase__:    str        =      self.dummy_image_encoder
          lowercase__:    str        =      self.dummy_text_encoder
          lowercase__:    int        =      self.dummy_tokenizer
          lowercase__:    Tuple        =      self.dummy_image_processor

          lowercase__:    int        =      UnCLIPScheduler(
              variance_type="fixed_small_log"			,				prediction_type="sample"			,				num_train_timesteps=1_000			,				clip_sample=UpperCAmelCase_			,				clip_sample_range=10.0			,				)

          lowercase__:    Union[str, Any]        =      {
              "prior": prior,
              "image_encoder": image_encoder,
              "text_encoder": text_encoder,
              "tokenizer": tokenizer,
              "scheduler": scheduler,
              "image_processor": image_processor,
          }

          return components





   def __lowercase    (   self			,				UpperCAmelCase_			,				UpperCAmelCase_=0)	-> Optional[int]:




          '''simple docstring'''




          if str(UpperCAmelCase_).startswith("mps"):
                 lowercase__:    Tuple        =      torch.manual_seed(UpperCAmelCase_)
          else:
                 lowercase__:    str        =      torch.Generator(device=UpperCAmelCase_).manual_seed(UpperCAmelCase_)

          lowercase__:    Dict        =      floats_tensor((1, 3, 64, 64)			,				rng=random.Random(UpperCAmelCase_)).to(UpperCAmelCase_)
          lowercase__:    int        =      image.cpu().permute(0			,				2			,				3			,				1)[0]
          lowercase__:    List[Any]        =      Image.fromarray(np.uinta(UpperCAmelCase_)).convert("RGB").resize((256, 256))

          lowercase__:    List[Any]        =      {
              "prompt": "horse",
              "image": init_image,
              "strength": 0.5,
              "generator": generator,
              "guidance_scale": 4.0,
              "num_inference_steps": 2,
              "output_type": "np",
          }
          return inputs





   def __lowercase    (   self)	-> Any:




          '''simple docstring'''




          lowercase__:    Optional[int]        =      "cpu"

          lowercase__:    Tuple        =      self.get_dummy_components()

          lowercase__:    Dict        =      self.pipeline_class(**UpperCAmelCase_)
          lowercase__:    Optional[int]        =      pipe.to(UpperCAmelCase_)

          pipe.set_progress_bar_config(disable=UpperCAmelCase_)

          lowercase__:    Optional[Any]        =      pipe(**self.get_dummy_inputs(UpperCAmelCase_))
          lowercase__:    Optional[int]        =      output.image_embeds

          lowercase__:    int        =      pipe(
              **self.get_dummy_inputs(UpperCAmelCase_)			,				return_dict=UpperCAmelCase_			,				)[0]

          lowercase__:    Optional[Any]        =      image[0, -10:]
          lowercase__:    Dict        =      image_from_tuple[0, -10:]

          assert image.shape == (1, 32)

          lowercase__:    int        =      np.array(
              [
                  0.1_07_12_84,
                  1.3_33_02_71,
                  0.61_26_02_23,
                  -0.6_69_10_65,
                  -0.3_84_68_52,
                  -1.0_30_36_61,
                  0.22_71_61_11,
                  0.03_34_89_01,
                  0.30_04_06_75,
                  -0.24_80_50_29,
              ])

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





   @skip_mps
   def __lowercase    (   self)	-> Dict:




          '''simple docstring'''




          lowercase__:    Any        =      torch_device == "cpu"
          lowercase__:    List[Any]        =      True
          lowercase__:    Optional[int]        =      False

          self._test_inference_batch_single_identical(
              test_max_difference=UpperCAmelCase_			,				relax_max_difference=UpperCAmelCase_			,				test_mean_pixel_difference=UpperCAmelCase_			,				)





   @skip_mps
   def __lowercase    (   self)	-> str:




          '''simple docstring'''




          lowercase__:    Union[str, Any]        =      torch_device == "cpu"
          lowercase__:    Optional[Any]        =      False

          self._test_attention_slicing_forward_pass(
              test_max_difference=UpperCAmelCase_			,				test_mean_pixel_difference=UpperCAmelCase_			,				)














"""simple docstring"""





def     A(  snake_case_						,       snake_case_		):
       """simple docstring"""





       assert isinstance(snake_case_						,       snake_case_		), F"""The input value of [set_a={set_a}] is not a set"""
       assert isinstance(snake_case_						,       snake_case_		), F"""The input value of [set_b={set_b}] is not a set"""

       return {a + b for a in set_a for b in set_b}


if __name__ == "__main__":
  from doctest import testmod

  testmod()






