import unittest

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

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

from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()
class SCREAMING_SNAKE_CASE_		(      __lowerCAmelCase  ,     unittest.TestCase		):
   __lowerCAmelCase           =				KandinskyVaaPriorPipeline
   __lowerCAmelCase           =				["""prompt"""]
   __lowerCAmelCase           =				["""prompt""", """negative_prompt"""]
   __lowerCAmelCase           =				[
       """num_images_per_prompt""",
       """generator""",
       """num_inference_steps""",
       """latents""",
       """negative_prompt""",
       """guidance_scale""",
       """output_type""",
       """return_dict""",
   ]
   __lowerCAmelCase           =				False







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





    """simple docstring"""


    return 32







   @property
   def 						lowerCamelCase_	(     self						:						str				):





    """simple docstring"""


    return 32







   @property
   def 						lowerCamelCase_	(     self						:						Any				):





    """simple docstring"""


    return self.time_input_dim







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





    """simple docstring"""


    return self.time_input_dim * 4







   @property
   def 						lowerCamelCase_	(     self						:						Dict				):





    """simple docstring"""


    return 100







   @property
   def 						lowerCamelCase_	(     self						:						str				):





    """simple docstring"""


    UpperCamelCase			  =      CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip"""				)
    return tokenizer







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





    """simple docstring"""


    torch.manual_seed(0				)
    UpperCamelCase			  =      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 						lowerCamelCase_	(     self						:						int				):





    """simple docstring"""


    torch.manual_seed(0				)

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

    UpperCamelCase			  =      PriorTransformer(**lowerCamelCase_				)
    # 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
    UpperCamelCase			  =      nn.Parameter(torch.ones(model.clip_std.shape				)				)
    return model







   @property
   def 						lowerCamelCase_	(     self						:						Dict				):





    """simple docstring"""


    torch.manual_seed(0				)
    UpperCamelCase			  =      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   ,   )

    UpperCamelCase			  =      CLIPVisionModelWithProjection(lowerCamelCase_				)
    return model







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





    """simple docstring"""


    UpperCamelCase			  =      CLIPImageProcessor(
        crop_size=224   ,   do_center_crop=lowerCamelCase_   ,   do_normalize=lowerCamelCase_   ,   do_resize=lowerCamelCase_   ,   image_mean=[0.4_8_1_4_5_4_6_6, 0.4_5_7_8_2_7_5, 0.4_0_8_2_1_0_7_3]   ,   image_std=[0.2_6_8_6_2_9_5_4, 0.2_6_1_3_0_2_5_8, 0.2_7_5_7_7_7_1_1]   ,   resample=3   ,   size=224   ,   )

    return image_processor







   def 						lowerCamelCase_	(     self						:						Optional[Any]				):





    """simple docstring"""


    UpperCamelCase			  =      self.dummy_prior
    UpperCamelCase			  =      self.dummy_image_encoder
    UpperCamelCase			  =      self.dummy_text_encoder
    UpperCamelCase			  =      self.dummy_tokenizer
    UpperCamelCase			  =      self.dummy_image_processor

    UpperCamelCase			  =      UnCLIPScheduler(
        variance_type="""fixed_small_log"""   ,   prediction_type="""sample"""   ,   num_train_timesteps=1000   ,   clip_sample=lowerCamelCase_   ,   clip_sample_range=1_0.0   ,   )

    UpperCamelCase			  =      {
        """prior""": prior,
        """image_encoder""": image_encoder,
        """text_encoder""": text_encoder,
        """tokenizer""": tokenizer,
        """scheduler""": scheduler,
        """image_processor""": image_processor,
    }

    return components







   def 						lowerCamelCase_	(     self						:						Tuple   ,   lowerCamelCase_						:						List[Any]   ,   lowerCamelCase_						:						List[str]=0				):





    """simple docstring"""


    if str(lowerCamelCase_				).startswith("""mps"""				):
     UpperCamelCase			  =      torch.manual_seed(lowerCamelCase_				)
    else:
     UpperCamelCase			  =      torch.Generator(device=lowerCamelCase_				).manual_seed(lowerCamelCase_				)
    UpperCamelCase			  =      {
        """prompt""": """horse""",
        """generator""": generator,
        """guidance_scale""": 4.0,
        """num_inference_steps""": 2,
        """output_type""": """np""",
    }
    return inputs







   def 						lowerCamelCase_	(     self						:						Optional[int]				):





    """simple docstring"""


    UpperCamelCase			  =      """cpu"""

    UpperCamelCase			  =      self.get_dummy_components()

    UpperCamelCase			  =      self.pipeline_class(**lowerCamelCase_				)
    UpperCamelCase			  =      pipe.to(lowerCamelCase_				)

    pipe.set_progress_bar_config(disable=lowerCamelCase_				)

    UpperCamelCase			  =      pipe(**self.get_dummy_inputs(lowerCamelCase_				)				)
    UpperCamelCase			  =      output.image_embeds

    UpperCamelCase			  =      pipe(
        **self.get_dummy_inputs(lowerCamelCase_				)   ,   return_dict=lowerCamelCase_   ,   )[0]

    UpperCamelCase			  =      image[0, -10:]
    UpperCamelCase			  =      image_from_tuple[0, -10:]

    assert image.shape == (1, 32)

    UpperCamelCase			  =      np.array(
        [-0.0_5_3_2, 1.7_1_2_0, 0.3_6_5_6, -1.0_8_5_2, -0.8_9_4_6, -1.1_7_5_6, 0.4_3_4_8, 0.2_4_8_2, 0.5_1_4_6, -0.1_1_5_6]				)

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





    """simple docstring"""


    UpperCamelCase			  =      torch_device == """cpu"""
    UpperCamelCase			  =      True
    UpperCamelCase			  =      False

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







   @skip_mps
   def 						lowerCamelCase_	(     self						:						Union[str, Any]				):





    """simple docstring"""


    UpperCamelCase			  =      torch_device == """cpu"""
    UpperCamelCase			  =      False

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

import random
import unittest

import numpy as np

import transformers
from transformers import is_flax_available, is_torch_available
from transformers.testing_utils import is_pt_flax_cross_test, require_flax


if is_flax_available():
     import os

     import jax.numpy as jnp
     from jax import jit

     from transformers import AutoTokenizer, FlaxAutoModelForCausalLM
     from transformers.modeling_flax_pytorch_utils import load_flax_weights_in_pytorch_model

     _SCREAMING_SNAKE_CASE 		=      """0.12"""  # assumed parallelism: 8


if is_torch_available():
     import torch





def 			lowercase(	UpperCamelCase_							,					UpperCamelCase_							,					UpperCamelCase_=None       )		->	int:







 '''simple docstring'''
 if rng is None:
  UpperCamelCase			  =      random.Random()

 UpperCamelCase			  =      1
 for dim in shape:
  total_dims *= dim

 UpperCamelCase			  =      []
 for _ in range(UpperCamelCase_       ):
  values.append(rng.randint(0							,					vocab_size - 1       )       )

 UpperCamelCase			  =      np.array(UpperCamelCase_							,					dtype=jnp.intaa       ).reshape(UpperCamelCase_       )

 return output





def 			lowercase(	UpperCamelCase_							,					UpperCamelCase_=None       )		->	List[str]:







 '''simple docstring'''
 UpperCamelCase			  =      ids_tensor(UpperCamelCase_							,					vocab_size=2							,					rng=UpperCamelCase_       )
 # make sure that at least one token is attended to for each batch
 UpperCamelCase			  =      1
 return attn_mask
@require_flax
class SCREAMING_SNAKE_CASE_		:
   __lowerCAmelCase           =				None
   __lowerCAmelCase           =				()







   def 						lowerCamelCase_	(     self						:						Tuple				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase			  =      self.model_tester.prepare_config_and_inputs_for_common()

    # cut to half length & take max batch_size 3
    UpperCamelCase			  =      2
    UpperCamelCase			  =      inputs["""input_ids"""].shape[-1] // 2
    UpperCamelCase			  =      inputs["""input_ids"""][:max_batch_size, :sequence_length]

    UpperCamelCase			  =      jnp.ones_like(lowerCamelCase_				)
    UpperCamelCase			  =      attention_mask[:max_batch_size, :sequence_length]

    # generate max 5 tokens
    UpperCamelCase			  =      input_ids.shape[-1] + 5
    if config.eos_token_id is not None and config.pad_token_id is None:
     # hack to allow generate for models such as GPT2 as is done in `generate()`
     UpperCamelCase			  =      config.eos_token_id
    return config, input_ids, attention_mask, max_length







   @is_pt_flax_cross_test
   def 						lowerCamelCase_	(     self						:						Dict				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      False
    UpperCamelCase			  =      max_length
    UpperCamelCase			  =      0

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model_class.__name__[4:]  # Skip the "Flax" at the beginning
     UpperCamelCase			  =      getattr(lowerCamelCase_   ,   lowerCamelCase_				)
     UpperCamelCase			  =      pt_model_class(lowerCamelCase_				).eval()
     UpperCamelCase			  =      load_flax_weights_in_pytorch_model(lowerCamelCase_   ,   flax_model.params				)

     UpperCamelCase			  =      flax_model.generate(lowerCamelCase_				).sequences
     UpperCamelCase			  =      pt_model.generate(torch.tensor(lowerCamelCase_   ,   dtype=torch.long				)				)

     if flax_generation_outputs.shape[-1] > pt_generation_outputs.shape[-1]:
      UpperCamelCase			  =      flax_generation_outputs[:, : pt_generation_outputs.shape[-1]]

     self.assertListEqual(pt_generation_outputs.numpy().tolist()   ,   flax_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						List[str]				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      False
    UpperCamelCase			  =      max_length

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						List[Any]				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      True
    UpperCamelCase			  =      max_length

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						Any				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      False
    UpperCamelCase			  =      max_length
    UpperCamelCase			  =      2

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						int				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      False
    UpperCamelCase			  =      max_length
    UpperCamelCase			  =      2
    UpperCamelCase			  =      2

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[0]   ,   input_ids.shape[0] * config.num_return_sequences				)







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





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      True
    UpperCamelCase			  =      max_length
    UpperCamelCase			  =      0.8
    UpperCamelCase			  =      10
    UpperCamelCase			  =      0.3
    UpperCamelCase			  =      1
    UpperCamelCase			  =      8
    UpperCamelCase			  =      9

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						Optional[int]				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      max_length
    UpperCamelCase			  =      1
    UpperCamelCase			  =      8
    UpperCamelCase			  =      9

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						Any				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()
    UpperCamelCase			  =      max_length
    UpperCamelCase			  =      2
    UpperCamelCase			  =      1
    UpperCamelCase			  =      8
    UpperCamelCase			  =      9

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						int				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()

    # pad attention mask on the left
    UpperCamelCase			  =      attention_mask.at[(0, 0)].set(0				)

    UpperCamelCase			  =      False
    UpperCamelCase			  =      max_length

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_   ,   attention_mask=lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_   ,   attention_mask=lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







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





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()

    # pad attention mask on the left
    UpperCamelCase			  =      attention_mask.at[(0, 0)].set(0				)

    UpperCamelCase			  =      True
    UpperCamelCase			  =      max_length

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_   ,   attention_mask=lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_   ,   attention_mask=lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)







   def 						lowerCamelCase_	(     self						:						Any				):





    """simple docstring"""


    UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase  ,     UpperCamelCase			  =      self._get_input_ids_and_config()

    # pad attention mask on the left
    UpperCamelCase			  =      attention_mask.at[(0, 0)].set(0				)

    UpperCamelCase			  =      2
    UpperCamelCase			  =      max_length

    for model_class in self.all_generative_model_classes:
     UpperCamelCase			  =      model_class(lowerCamelCase_				)

     UpperCamelCase			  =      model.generate(lowerCamelCase_   ,   attention_mask=lowerCamelCase_				).sequences
     self.assertEqual(generation_outputs.shape[-1]   ,   lowerCamelCase_				)

     UpperCamelCase			  =      jit(model.generate				)
     UpperCamelCase			  =      jit_generate(lowerCamelCase_   ,   attention_mask=lowerCamelCase_				).sequences

     self.assertListEqual(generation_outputs.tolist()   ,   jit_generation_outputs.tolist()				)





@require_flax
class SCREAMING_SNAKE_CASE_		(      unittest.TestCase		):







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





    """simple docstring"""


    UpperCamelCase			  =      AutoTokenizer.from_pretrained("""hf-internal-testing/tiny-bert"""				)
    UpperCamelCase			  =      FlaxAutoModelForCausalLM.from_pretrained("""hf-internal-testing/tiny-bert-flax-only"""				)

    UpperCamelCase			  =      """Hello world"""
    UpperCamelCase			  =      tokenizer(lowerCamelCase_   ,   return_tensors="""np"""				).input_ids

    # typos are quickly detected (the correct argument is `do_sample`)
    with self.assertRaisesRegex(lowerCamelCase_   ,   """do_samples"""				):
     model.generate(lowerCamelCase_   ,   do_samples=lowerCamelCase_				)

    # arbitrary arguments that will not be used anywhere are also not accepted
    with self.assertRaisesRegex(lowerCamelCase_   ,   """foo"""				):
     UpperCamelCase			  =      {"""foo""": """bar"""}
     model.generate(lowerCamelCase_   ,   **lowerCamelCase_				)
