import gc
import random
import unittest

import numpy as np
import torch

from diffusers import (
    DDIMScheduler,
    KandinskyVaaControlnetPipeline,
    KandinskyVaaPriorPipeline,
    UNetaDConditionModel,
    VQModel,
)
from diffusers.utils import floats_tensor, load_image, load_numpy, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference


enable_full_determinism()


class      lowerCamelCase    (SCREAMING_SNAKE_CASE__     ,					unittest.TestCase    ):
  """simple docstring"""







  lowerCamelCase__   =  KandinskyVaaControlnetPipeline
  lowerCamelCase__   =  ['''image_embeds''', '''negative_image_embeds''', '''hint''']
  lowerCamelCase__   =  ['''image_embeds''', '''negative_image_embeds''', '''hint''']
  lowerCamelCase__   =  [
      '''generator''',
      '''height''',
      '''width''',
      '''latents''',
      '''guidance_scale''',
      '''num_inference_steps''',
      '''return_dict''',
      '''guidance_scale''',
      '''num_images_per_prompt''',
      '''output_type''',
      '''return_dict''',
  ]
  lowerCamelCase__   =  False







  @property
  def       __A   (							self       :				str      )     ->		Optional[int]:
        return 32







  @property
  def       __A   (							self       :				Optional[Any]      )     ->		Any:
        return 32







  @property
  def       __A   (							self       :				Any      )     ->		List[Any]:
        return self.time_input_dim







  @property
  def       __A   (							self       :				Tuple      )     ->		int:
        return self.time_input_dim * 4







  @property
  def       __A   (							self       :				Optional[int]      )     ->		Tuple:
        return 100







  @property
  def       __A   (							self       :				int      )     ->		Tuple:
        torch.manual_seed(0      )

        SCREAMING_SNAKE_CASE_      =     {
            "in_channels": 8,
            # Out channels is double in channels because predicts mean and variance
            "out_channels": 8,
            "addition_embed_type": "image_hint",
            "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,
            "encoder_hid_dim": self.text_embedder_hidden_size,
            "encoder_hid_dim_type": "image_proj",
            "cross_attention_dim": self.cross_attention_dim,
            "attention_head_dim": 4,
            "resnet_time_scale_shift": "scale_shift",
            "class_embed_type": None,
        }

        SCREAMING_SNAKE_CASE_      =     UNetaDConditionModel(**__magic_name__      )
        return model







  @property
  def       __A   (							self       :				Optional[int]      )     ->		str:
        return {
            "block_out_channels": [32, 32, 64, 64],
            "down_block_types": [
                "DownEncoderBlock2D",
                "DownEncoderBlock2D",
                "DownEncoderBlock2D",
                "AttnDownEncoderBlock2D",
            ],
            "in_channels": 3,
            "latent_channels": 4,
            "layers_per_block": 1,
            "norm_num_groups": 8,
            "norm_type": "spatial",
            "num_vq_embeddings": 12,
            "out_channels": 3,
            "up_block_types": ["AttnUpDecoderBlock2D", "UpDecoderBlock2D", "UpDecoderBlock2D", "UpDecoderBlock2D"],
            "vq_embed_dim": 4,
        }







  @property
  def       __A   (							self       :				List[str]      )     ->		Dict:
        torch.manual_seed(0      )
        SCREAMING_SNAKE_CASE_      =     VQModel(**self.dummy_movq_kwargs      )
        return model







  def       __A   (							self       :				Dict      )     ->		Optional[int]:
        SCREAMING_SNAKE_CASE_      =     self.dummy_unet
        SCREAMING_SNAKE_CASE_      =     self.dummy_movq

        SCREAMING_SNAKE_CASE_      =     DDIMScheduler(
            num_train_timesteps=1_000     ,   beta_schedule="linear"     ,   beta_start=0.0_0085     ,   beta_end=0.012     ,   clip_sample=__magic_name__     ,   set_alpha_to_one=__magic_name__     ,   steps_offset=1     ,   prediction_type="epsilon"     ,   thresholding=__magic_name__     ,   )

        SCREAMING_SNAKE_CASE_      =     {
            "unet": unet,
            "scheduler": scheduler,
            "movq": movq,
        }
        return components







  def       __A   (							self       :				int     ,   __magic_name__       :				Any     ,   __magic_name__       :				Optional[int]=0      )     ->		List[str]:
        SCREAMING_SNAKE_CASE_      =     floats_tensor((1, self.text_embedder_hidden_size)     ,   rng=random.Random(__magic_name__      )      ).to(__magic_name__      )
        SCREAMING_SNAKE_CASE_      =     floats_tensor((1, self.text_embedder_hidden_size)     ,   rng=random.Random(seed + 1      )      ).to(
            __magic_name__      )

        # create hint
        SCREAMING_SNAKE_CASE_      =     floats_tensor((1, 3, 64, 64)     ,   rng=random.Random(__magic_name__      )      ).to(__magic_name__      )

        if str(__magic_name__      ).startswith("mps"      ):
              SCREAMING_SNAKE_CASE_      =     torch.manual_seed(__magic_name__      )
        else:
              SCREAMING_SNAKE_CASE_      =     torch.Generator(device=__magic_name__      ).manual_seed(__magic_name__      )
        SCREAMING_SNAKE_CASE_      =     {
            "image_embeds": image_embeds,
            "negative_image_embeds": negative_image_embeds,
            "hint": hint,
            "generator": generator,
            "height": 64,
            "width": 64,
            "guidance_scale": 4.0,
            "num_inference_steps": 2,
            "output_type": "np",
        }
        return inputs







  def       __A   (							self       :				Optional[int]      )     ->		Any:
        SCREAMING_SNAKE_CASE_      =     "cpu"

        SCREAMING_SNAKE_CASE_      =     self.get_dummy_components()

        SCREAMING_SNAKE_CASE_      =     self.pipeline_class(**__magic_name__      )
        SCREAMING_SNAKE_CASE_      =     pipe.to(__magic_name__      )

        pipe.set_progress_bar_config(disable=__magic_name__      )

        SCREAMING_SNAKE_CASE_      =     pipe(**self.get_dummy_inputs(__magic_name__      )      )
        SCREAMING_SNAKE_CASE_      =     output.images

        SCREAMING_SNAKE_CASE_      =     pipe(
            **self.get_dummy_inputs(__magic_name__      )     ,   return_dict=__magic_name__     ,   )[0]

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

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

        SCREAMING_SNAKE_CASE_      =     np.array(
            [0.695_9826, 0.86_8279, 0.755_8092, 0.6876_9467, 0.8580_5804, 0.6597_7496, 0.4488_5302, 0.595_9111, 0.425_1595]      )

        assert (
            np.abs(image_slice.flatten() - expected_slice      ).max() < 1e-2
        ), F''' expected_slice {expected_slice}, but got {image_slice.flatten()}'''

        assert (
            np.abs(image_from_tuple_slice.flatten() - expected_slice      ).max() < 1e-2
        ), F''' expected_slice {expected_slice}, but got {image_from_tuple_slice.flatten()}'''



@slow
@require_torch_gpu
class      lowerCamelCase    (unittest.TestCase    ):
  """simple docstring"""







  def       __A   (							self       :				Any      )     ->		Tuple:
        # clean up the VRAM after each test
        super().tearDown()
        gc.collect()
        torch.cuda.empty_cache()







  def       __A   (							self       :				List[Any]      )     ->		Union[str, Any]:
        SCREAMING_SNAKE_CASE_      =     load_numpy(
            "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
            "/kandinskyv22/kandinskyv22_controlnet_robotcat_fp16.npy"      )

        SCREAMING_SNAKE_CASE_      =     load_image(
            "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
            "/kandinskyv22/hint_image_cat.png"      )
        SCREAMING_SNAKE_CASE_      =     torch.from_numpy(np.array(__magic_name__      )      ).float() / 255.0
        SCREAMING_SNAKE_CASE_      =     hint.permute(2     ,   0     ,   1      ).unsqueeze(0      )

        SCREAMING_SNAKE_CASE_      =     KandinskyVaaPriorPipeline.from_pretrained(
            "kandinsky-community/kandinsky-2-2-prior"     ,   torch_dtype=torch.floataa      )
        pipe_prior.to(__magic_name__      )

        SCREAMING_SNAKE_CASE_      =     KandinskyVaaControlnetPipeline.from_pretrained(
            "kandinsky-community/kandinsky-2-2-controlnet-depth"     ,   torch_dtype=torch.floataa      )
        SCREAMING_SNAKE_CASE_      =     pipeline.to(__magic_name__      )
        pipeline.set_progress_bar_config(disable=__magic_name__      )

        SCREAMING_SNAKE_CASE_      =     "A robot, 4k photo"

        SCREAMING_SNAKE_CASE_      =     torch.Generator(device="cuda"      ).manual_seed(0      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     pipe_prior(
            __magic_name__     ,   generator=__magic_name__     ,   num_inference_steps=5     ,   negative_prompt=""     ,   ).to_tuple()

        SCREAMING_SNAKE_CASE_      =     torch.Generator(device="cuda"      ).manual_seed(0      )
        SCREAMING_SNAKE_CASE_      =     pipeline(
            image_embeds=__magic_name__     ,   negative_image_embeds=__magic_name__     ,   hint=__magic_name__     ,   generator=__magic_name__     ,   num_inference_steps=100     ,   output_type="np"     ,   )

        SCREAMING_SNAKE_CASE_      =     output.images[0]

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

        assert_mean_pixel_difference(__magic_name__     ,   __magic_name__      )



import warnings

from transformers import AutoTokenizer
from transformers.utils import is_torch_available
from transformers.utils.generic import ExplicitEnum

from ...processing_utils import ProcessorMixin


if is_torch_available():
      import torch


class      lowerCamelCase    (SCREAMING_SNAKE_CASE__    ):
  """simple docstring"""







  lowerCamelCase__   =  '''char'''
  lowerCamelCase__   =  '''bpe'''
  lowerCamelCase__   =  '''wp'''



A   :     Tuple       =				(DecodeType.CHARACTER, DecodeType.BPE, DecodeType.WORDPIECE)


class      lowerCamelCase    (SCREAMING_SNAKE_CASE__    ):
  """simple docstring"""







  lowerCamelCase__   =  ['''image_processor''', '''char_tokenizer''']
  lowerCamelCase__   =  '''ViTImageProcessor'''
  lowerCamelCase__   =  '''MgpstrTokenizer'''







  def __init__(							self       :				Optional[Any]     ,   __magic_name__       :				Tuple=None     ,   __magic_name__       :				int=None     ,   **__magic_name__       :				Optional[Any]      )     ->		str:
        SCREAMING_SNAKE_CASE_      =     None
        if "feature_extractor" in kwargs:
              warnings.warn(
                  "The `feature_extractor` argument is deprecated and will be removed in v5, use `image_processor`"
                  " instead."     ,   __magic_name__     ,   )
              SCREAMING_SNAKE_CASE_      =     kwargs.pop("feature_extractor"      )

        SCREAMING_SNAKE_CASE_      =     image_processor if image_processor is not None else feature_extractor
        if image_processor is None:
              raise ValueError("You need to specify an `image_processor`."      )
        if tokenizer is None:
              raise ValueError("You need to specify a `tokenizer`."      )

        SCREAMING_SNAKE_CASE_      =     tokenizer
        SCREAMING_SNAKE_CASE_      =     AutoTokenizer.from_pretrained("gpt2"      )
        SCREAMING_SNAKE_CASE_      =     AutoTokenizer.from_pretrained("bert-base-uncased"      )

        super().__init__(__magic_name__     ,   __magic_name__      )







  def __call__(							self       :				Dict     ,   __magic_name__       :				Union[str, Any]=None     ,   __magic_name__       :				Union[str, Any]=None     ,   __magic_name__       :				Dict=None     ,   **__magic_name__       :				Tuple      )     ->		int:
        if images is None and text is None:
              raise ValueError("You need to specify either an `images` or `text` input to process."      )

        if images is not None:
              SCREAMING_SNAKE_CASE_      =     self.image_processor(__magic_name__     ,   return_tensors=__magic_name__     ,   **__magic_name__      )
        if text is not None:
              SCREAMING_SNAKE_CASE_      =     self.char_tokenizer(__magic_name__     ,   return_tensors=__magic_name__     ,   **__magic_name__      )

        if text is None:
              return inputs
        elif images is None:
              return encodings
        else:
              SCREAMING_SNAKE_CASE_      =     encodings["input_ids"]
              return inputs







  def       __A   (							self       :				Tuple     ,   __magic_name__       :				int      )     ->		Any:
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     sequences
        SCREAMING_SNAKE_CASE_      =     char_preds.size(0      )

        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     self._decode_helper(__magic_name__     ,   "char"      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     self._decode_helper(__magic_name__     ,   "bpe"      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     self._decode_helper(__magic_name__     ,   "wp"      )

        SCREAMING_SNAKE_CASE_      =     []
        SCREAMING_SNAKE_CASE_      =     []
        for i in range(__magic_name__      ):
              SCREAMING_SNAKE_CASE_      =     [char_scores[i], bpe_scores[i], wp_scores[i]]
              SCREAMING_SNAKE_CASE_      =     [char_strs[i], bpe_strs[i], wp_strs[i]]
              SCREAMING_SNAKE_CASE_      =     scores.index(max(__magic_name__      )      )
              final_strs.append(strs[max_score_index]      )
              final_scores.append(scores[max_score_index]      )

        SCREAMING_SNAKE_CASE_      =     {}
        SCREAMING_SNAKE_CASE_      =     final_strs
        SCREAMING_SNAKE_CASE_      =     final_scores
        SCREAMING_SNAKE_CASE_      =     char_strs
        SCREAMING_SNAKE_CASE_      =     bpe_strs
        SCREAMING_SNAKE_CASE_      =     wp_strs
        return out







  def       __A   (							self       :				int     ,   __magic_name__       :				List[Any]     ,   __magic_name__       :				str      )     ->		Any:
        if format == DecodeType.CHARACTER:
              SCREAMING_SNAKE_CASE_      =     self.char_decode
              SCREAMING_SNAKE_CASE_      =     1
              SCREAMING_SNAKE_CASE_      =     "[s]"
        elif format == DecodeType.BPE:
              SCREAMING_SNAKE_CASE_      =     self.bpe_decode
              SCREAMING_SNAKE_CASE_      =     2
              SCREAMING_SNAKE_CASE_      =     "#"
        elif format == DecodeType.WORDPIECE:
              SCREAMING_SNAKE_CASE_      =     self.wp_decode
              SCREAMING_SNAKE_CASE_      =     102
              SCREAMING_SNAKE_CASE_      =     "[SEP]"
        else:
              raise ValueError(F'''Format {format} is not supported.'''      )

        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     [], []
        SCREAMING_SNAKE_CASE_      =     pred_logits.size(0      )
        SCREAMING_SNAKE_CASE_      =     pred_logits.size(1      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     pred_logits.topk(1     ,   dim=-1     ,   largest=__magic_name__     ,   sorted=__magic_name__      )
        SCREAMING_SNAKE_CASE_      =     preds_index.view(-1     ,   __magic_name__      )[:, 1:]
        SCREAMING_SNAKE_CASE_      =     decoder(__magic_name__      )
        SCREAMING_SNAKE_CASE_   ,       SCREAMING_SNAKE_CASE_      =     torch.nn.functional.softmax(__magic_name__     ,   dim=2      ).max(dim=2      )
        SCREAMING_SNAKE_CASE_      =     preds_max_prob[:, 1:]

        for index in range(__magic_name__      ):
              SCREAMING_SNAKE_CASE_      =     preds_str[index].find(__magic_name__      )
              SCREAMING_SNAKE_CASE_      =     preds_str[index][:pred_eos]
              SCREAMING_SNAKE_CASE_      =     preds_index[index].cpu().tolist()
              SCREAMING_SNAKE_CASE_      =     pred_index.index(__magic_name__      ) if eos_token in pred_index else -1
              SCREAMING_SNAKE_CASE_      =     preds_max_prob[index][: pred_eos_index + 1]
              SCREAMING_SNAKE_CASE_      =     pred_max_prob.cumprod(dim=0      )[-1] if pred_max_prob.nelement() != 0 else 0.0
              dec_strs.append(__magic_name__      )
              conf_scores.append(__magic_name__      )

        return dec_strs, conf_scores







  def       __A   (							self       :				Any     ,   __magic_name__       :				Dict      )     ->		List[str]:
        SCREAMING_SNAKE_CASE_      =     [seq.replace(" "     ,   ""      ) for seq in self.char_tokenizer.batch_decode(__magic_name__      )]
        return decode_strs







  def       __A   (							self       :				Any     ,   __magic_name__       :				Union[str, Any]      )     ->		Tuple:
        return self.bpe_tokenizer.batch_decode(__magic_name__      )







  def       __A   (							self       :				str     ,   __magic_name__       :				Dict      )     ->		List[Any]:
        SCREAMING_SNAKE_CASE_      =     [seq.replace(" "     ,   ""      ) for seq in self.wp_tokenizer.batch_decode(__magic_name__      )]
        return decode_strs


