






'''simple docstring'''







from collections import Counter
from functools import total_ordering

from data_structures.heap.heap import Heap






@total_ordering
class 					a__    :
     '''simple docstring'''







     def __init__(self    :	Any				,				lowercase__    :	str				,				lowercase__    :	int					)  ->       None:
           __A		   =      word
           __A		   =      count






     def __eq__(self    :	str				,				lowercase__    :	object					)  ->       bool:
           if not isinstance(lowercase__				,				lowercase__					):
                 return NotImplemented
           return self.count == other.count






     def __lt__(self    :	List[Any]				,				lowercase__    :	object					)  ->       bool:
           if not isinstance(lowercase__				,				lowercase__					):
                 return NotImplemented
           return self.count < other.count







def 						_UpperCamelCase							(     snake_case__							,			snake_case__							):
      __A		   =      Heap()
      __A		   =      Counter(snake_case__							)
      heap.build_max_heap(
          [WordCount(snake_case__							,			snake_case__							) for word, count in count_by_word.items()]							)
      return [heap.extract_max().word for _ in range(min(snake_case__							,			len(snake_case__							)							)							)]


if __name__ == "__main__":
       import doctest

       doctest.testmod()










'''simple docstring'''







import gc
import unittest

import numpy as np
import torch
from transformers import CLIPTextConfig, CLIPTextModelWithProjection, CLIPTokenizer

from diffusers import PriorTransformer, UnCLIPPipeline, UnCLIPScheduler, UNetaDConditionModel, UNetaDModel
from diffusers.pipelines.unclip.text_proj import UnCLIPTextProjModel
from diffusers.utils import load_numpy, nightly, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu, skip_mps

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference


enable_full_determinism()






class 					a__    (			lowerCamelCase ,						unittest.TestCase						):
     '''simple docstring'''







     _snake_case             =  UnCLIPPipeline
     _snake_case             =  TEXT_TO_IMAGE_PARAMS - {
         'negative_prompt',
         'height',
         'width',
         'negative_prompt_embeds',
         'guidance_scale',
         'prompt_embeds',
         'cross_attention_kwargs',
     }
     _snake_case             =  TEXT_TO_IMAGE_BATCH_PARAMS
     _snake_case             =  [
         'generator',
         'return_dict',
         'prior_num_inference_steps',
         'decoder_num_inference_steps',
         'super_res_num_inference_steps',
     ]
     _snake_case             =  False






     @property
     def     _UpperCamelCase   (self    :	Dict					)  ->       Union[str, Any]:
           return 32






     @property
     def     _UpperCamelCase   (self    :	Optional[Any]					)  ->       Union[str, Any]:
           return 32






     @property
     def     _UpperCamelCase   (self    :	str					)  ->       Dict:
           return self.time_input_dim






     @property
     def     _UpperCamelCase   (self    :	List[Any]					)  ->       int:
           return self.time_input_dim * 4






     @property
     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       List[str]:
           return 100






     @property
     def     _UpperCamelCase   (self    :	Tuple					)  ->       Optional[Any]:
           __A		   =      CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"					)
           return tokenizer






     @property
     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       Tuple:
           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(lowercase__					)






     @property
     def     _UpperCamelCase   (self    :	int					)  ->       Optional[Any]:
           torch.manual_seed(0					)

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

           __A		   =      PriorTransformer(**lowercase__					)
           return model






     @property
     def     _UpperCamelCase   (self    :	Union[str, Any]					)  ->       Union[str, Any]:
           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(**lowercase__					)
           return model






     @property
     def     _UpperCamelCase   (self    :	Optional[Any]					)  ->       Tuple:
           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(**lowercase__					)
           return model






     @property
     def     _UpperCamelCase   (self    :	Any					)  ->       str:
           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    :	List[str]					)  ->       List[str]:
           torch.manual_seed(0					)

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






     @property
     def     _UpperCamelCase   (self    :	str					)  ->       Optional[Any]:
           # 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    :	Any					)  ->       Any:
           __A		   =      self.dummy_prior
           __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="fixed_small_log"				,				prediction_type="sample"				,				num_train_timesteps=1000				,				clip_sample_range=5.0				,				)

           __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		   =      {
               "prior": prior,
               "decoder": decoder,
               "text_proj": text_proj,
               "text_encoder": text_encoder,
               "tokenizer": tokenizer,
               "super_res_first": super_res_first,
               "super_res_last": super_res_last,
               "prior_scheduler": prior_scheduler,
               "decoder_scheduler": decoder_scheduler,
               "super_res_scheduler": super_res_scheduler,
           }

           return components






     def     _UpperCamelCase   (self    :	int				,				lowercase__    :	Union[str, Any]				,				lowercase__    :	Any=0					)  ->       str:
           if str(lowercase__					).startswith("mps"					):
                 __A		   =      torch.manual_seed(lowercase__					)
           else:
                 __A		   =      torch.Generator(device=lowercase__					).manual_seed(lowercase__					)
           __A		   =      {
               "prompt": "horse",
               "generator": generator,
               "prior_num_inference_steps": 2,
               "decoder_num_inference_steps": 2,
               "super_res_num_inference_steps": 2,
               "output_type": "numpy",
           }
           return inputs






     def     _UpperCamelCase   (self    :	str					)  ->       Tuple:
           __A		   =      "cpu"

           __A		   =      self.get_dummy_components()

           __A		   =      self.pipeline_class(**lowercase__					)
           __A		   =      pipe.to(lowercase__					)

           pipe.set_progress_bar_config(disable=lowercase__					)

           __A		   =      pipe(**self.get_dummy_inputs(lowercase__					)					)
           __A		   =      output.images

           __A		   =      pipe(
               **self.get_dummy_inputs(lowercase__					)				,				return_dict=lowercase__				,				)[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.99_97,
                   0.99_88,
                   0.00_28,
                   0.99_97,
                   0.99_84,
                   0.99_65,
                   0.00_29,
                   0.99_86,
                   0.00_25,
               ]					)

           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    :	Optional[Any]					)  ->       Optional[Any]:
           __A		   =      torch.device("cpu"					)






           class 					a__    :
                '''simple docstring'''







                _snake_case             =  1







           __A		   =      self.get_dummy_components()

           __A		   =      self.pipeline_class(**lowercase__					)
           __A		   =      pipe.to(lowercase__					)

           __A		   =      components["prior"]
           __A		   =      components["decoder"]
           __A		   =      components["super_res_first"]
           __A		   =      components["tokenizer"]
           __A		   =      components["text_encoder"]

           __A		   =      torch.Generator(device=lowercase__					).manual_seed(0					)
           __A		   =      prior.dtype
           __A		   =      1

           __A		   =      (batch_size, prior.config.embedding_dim)
           __A		   =      pipe.prepare_latents(
               lowercase__				,				dtype=lowercase__				,				device=lowercase__				,				generator=lowercase__				,				latents=lowercase__				,				scheduler=DummyScheduler()					)
           __A		   =      (batch_size, decoder.config.in_channels, decoder.config.sample_size, decoder.config.sample_size)
           __A		   =      pipe.prepare_latents(
               lowercase__				,				dtype=lowercase__				,				device=lowercase__				,				generator=lowercase__				,				latents=lowercase__				,				scheduler=DummyScheduler()					)

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

           pipe.set_progress_bar_config(disable=lowercase__					)

           __A		   =      "this is a prompt example"

           __A		   =      torch.Generator(device=lowercase__					).manual_seed(0					)
           __A		   =      pipe(
               [prompt]				,				generator=lowercase__				,				prior_num_inference_steps=2				,				decoder_num_inference_steps=2				,				super_res_num_inference_steps=2				,				prior_latents=lowercase__				,				decoder_latents=lowercase__				,				super_res_latents=lowercase__				,				output_type="np"				,				)
           __A		   =      output.images

           __A		   =      tokenizer(
               lowercase__				,				padding="max_length"				,				max_length=tokenizer.model_max_length				,				return_tensors="pt"				,				)
           __A		   =      text_encoder(text_inputs.input_ids					)
           __A		   =      text_inputs.attention_mask

           __A		   =      torch.Generator(device=lowercase__					).manual_seed(0					)
           __A		   =      pipe(
               generator=lowercase__				,				prior_num_inference_steps=2				,				decoder_num_inference_steps=2				,				super_res_num_inference_steps=2				,				prior_latents=lowercase__				,				decoder_latents=lowercase__				,				super_res_latents=lowercase__				,				text_model_output=lowercase__				,				text_attention_mask=lowercase__				,				output_type="np"				,				)[0]

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






     @skip_mps
     def     _UpperCamelCase   (self    :	str					)  ->       str:
           __A		   =      torch_device == "cpu"

           self._test_attention_slicing_forward_pass(test_max_difference=lowercase__				,				expected_max_diff=0.01					)






     @skip_mps
     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       str:
           __A		   =      torch_device == "cpu"
           __A		   =      True
           __A		   =      [
               "prior_num_inference_steps",
               "decoder_num_inference_steps",
               "super_res_num_inference_steps",
           ]

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






     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       Optional[int]:
           __A		   =      [
               "prior_num_inference_steps",
               "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=lowercase__				,				additional_params_copy_to_batched_inputs=lowercase__				,				)
           else:
                 self._test_inference_batch_consistent(
                     additional_params_copy_to_batched_inputs=lowercase__					)






     @skip_mps
     def     _UpperCamelCase   (self    :	int					)  ->       int:
           return super().test_dict_tuple_outputs_equivalent()






     @skip_mps
     def     _UpperCamelCase   (self    :	Optional[Any]					)  ->       int:
           return super().test_save_load_local()






     @skip_mps
     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       Any:
           return super().test_save_load_optional_components()







@nightly
class 					a__    (			unittest.TestCase						):
     '''simple docstring'''







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






     def     _UpperCamelCase   (self    :	Union[str, Any]					)  ->       Tuple:
           __A		   =      load_numpy(
               "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
               "/unclip/karlo_v1_alpha_horse_cpu.npy"					)

           __A		   =      UnCLIPPipeline.from_pretrained("kakaobrain/karlo-v1-alpha"					)
           pipeline.set_progress_bar_config(disable=lowercase__					)

           __A		   =      torch.manual_seed(0					)
           __A		   =      pipeline(
               "horse"				,				num_images_per_prompt=1				,				generator=lowercase__				,				output_type="np"				,				)

           __A		   =      output.images[0]

           assert image.shape == (256, 256, 3)
           assert np.abs(expected_image - image					).max() < 1e-1







@slow
@require_torch_gpu
class 					a__    (			unittest.TestCase						):
     '''simple docstring'''







     def     _UpperCamelCase   (self    :	Optional[Any]					)  ->       List[str]:
           # clean up the VRAM after each test
           super().tearDown()
           gc.collect()
           torch.cuda.empty_cache()






     def     _UpperCamelCase   (self    :	List[Any]					)  ->       Dict:
           __A		   =      load_numpy(
               "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"
               "/unclip/karlo_v1_alpha_horse_fp16.npy"					)

           __A		   =      UnCLIPPipeline.from_pretrained("kakaobrain/karlo-v1-alpha"				,				torch_dtype=torch.floataa					)
           __A		   =      pipeline.to(lowercase__					)
           pipeline.set_progress_bar_config(disable=lowercase__					)

           __A		   =      torch.Generator(device="cpu"					).manual_seed(0					)
           __A		   =      pipeline(
               "horse"				,				generator=lowercase__				,				output_type="np"				,				)

           __A		   =      output.images[0]

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

           assert_mean_pixel_difference(lowercase__				,				lowercase__					)






     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       Any:
           torch.cuda.empty_cache()
           torch.cuda.reset_max_memory_allocated()
           torch.cuda.reset_peak_memory_stats()

           __A		   =      UnCLIPPipeline.from_pretrained("kakaobrain/karlo-v1-alpha"				,				torch_dtype=torch.floataa					)
           __A		   =      pipe.to(lowercase__					)
           pipe.set_progress_bar_config(disable=lowercase__					)
           pipe.enable_attention_slicing()
           pipe.enable_sequential_cpu_offload()

           __A		   =      pipe(
               "horse"				,				num_images_per_prompt=1				,				prior_num_inference_steps=2				,				decoder_num_inference_steps=2				,				super_res_num_inference_steps=2				,				output_type="np"				,				)

           __A		   =      torch.cuda.max_memory_allocated()
           # make sure that less than 7 GB is allocated
           assert mem_bytes < 7 * 10**9


