






'''simple docstring'''







import os
from shutil import copyfile
from typing import TYPE_CHECKING, Optional, Tuple

from tokenizers import processors

from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import is_sentencepiece_available, logging
from ...utils.versions import require_version


if TYPE_CHECKING:
       from transformers.pipelines.conversational import Conversation

require_version('''tokenizers>=0.13.3''')

if is_sentencepiece_available():
       from .tokenization_llama import LlamaTokenizer
else:
       __A      :       Union[str, Any]      =	None

__A      :       Tuple      =	logging.get_logger(__name__)
__A      :       Optional[Any]      =	{'''vocab_file''': '''tokenizer.model''', '''tokenizer_file''': '''tokenizer.json'''}

__A  ,		__A      :       Any      =	'''[INST]''', '''[/INST]'''
__A  ,		__A      :       int      =	'''<<SYS>>\n''', '''\n<</SYS>>\n\n'''

# fmt: off
__A      :       List[Any]      =	'''You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your\
answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure\
that your responses are socially unbiased and positive in nature.

If a question does not make any sense, or is not factually coherent, explain why instead of answering something not\
correct. If you don\'t know the answer to a question, please don\'t share false information.'''






class 					a__    (			lowerCamelCase						):
     '''simple docstring'''







     _snake_case             =  VOCAB_FILES_NAMES
     _snake_case             =  LlamaTokenizer
     _snake_case             =  'left'
     _snake_case             =  ['input_ids', 'attention_mask']






     def __init__(self    :	Optional[Any]				,				lowercase__    :	Dict=None				,				lowercase__    :	Dict=None				,				lowercase__    :	str=False				,				lowercase__    :	int="<unk>"				,				lowercase__    :	Optional[Any]="<s>"				,				lowercase__    :	List[Any]="</s>"				,				lowercase__    :	Any=True				,				lowercase__    :	Union[str, Any]=False				,				**lowercase__    :	str				,				)  ->       int:
           super().__init__(
               vocab_file=lowercase__				,				tokenizer_file=lowercase__				,				clean_up_tokenization_spaces=lowercase__				,				unk_token=lowercase__				,				bos_token=lowercase__				,				eos_token=lowercase__				,				**lowercase__				,				)
           __A		   =      add_bos_token
           __A		   =      add_eos_token
           self.update_post_processor()

           __A		   =      vocab_file
           __A		   =      False if not self.vocab_file else True






     def     _UpperCamelCase   (self    :	int					)  ->       int:
           __A		   =      self.bos_token
           __A		   =      self.bos_token_id

           __A		   =      self.eos_token
           __A		   =      self.eos_token_id

           __A		   =      f"{(bos+':0 ') * self.add_bos_token}$A:0{(' '+eos+':0') * self.add_eos_token}"
           __A		   =      f"{single}{(' '+bos+':1') * self.add_bos_token} $B:1{(' '+eos+':1') * self.add_eos_token}"

           __A		   =      []
           if self.add_bos_token:
                 special_tokens.append((bos, bos_token_id)					)
           if self.add_eos_token:
                 special_tokens.append((eos, eos_token_id)					)
           __A		   =      processors.TemplateProcessing(
               single=lowercase__				,				pair=lowercase__				,				special_tokens=lowercase__					)






     @property
     def     _UpperCamelCase   (self    :	Optional[int]					)  ->       int:
           return self._add_eos_token






     @property
     def     _UpperCamelCase   (self    :	Any					)  ->       Optional[int]:
           return self._add_bos_token






     @add_eos_token.setter
     def     _UpperCamelCase   (self    :	int				,				lowercase__    :	List[str]					)  ->       Union[str, Any]:
           __A		   =      value
           self.update_post_processor()






     @add_bos_token.setter
     def     _UpperCamelCase   (self    :	List[str]				,				lowercase__    :	int					)  ->       int:
           __A		   =      value
           self.update_post_processor()






     def     _UpperCamelCase   (self    :	Optional[Any]				,				lowercase__    :	Optional[int]				,				lowercase__    :	Optional[Any] = None					)  ->       Tuple[str]:







           if not self.can_save_slow_tokenizer:
                 raise ValueError(
                     "Your fast tokenizer does not have the necessary information to save the vocabulary for a slow "
                     "tokenizer."					)

           if not os.path.isdir(lowercase__					):
                 logger.error(f"Vocabulary path ({save_directory}) should be a directory"					)
                 return
           __A		   =      os.path.join(
               lowercase__				,				(filename_prefix + "-" if filename_prefix else "") + VOCAB_FILES_NAMES["vocab_file"]					)

           if os.path.abspath(self.vocab_file					) != os.path.abspath(lowercase__					):
                 copyfile(self.vocab_file				,				lowercase__					)

           return (out_vocab_file,)






     def     _UpperCamelCase   (self    :	List[Any]				,				lowercase__    :	Union[str, Any]					)  ->       int:
           __A		   =      list(conversation.iter_texts()					)
           if not all([is_user for is_user, msg in dialogue[::2]]					) or not all(
               [not is_user for is_user, msg in dialogue[1::2]]					):
                 raise ValueError(
                     "The model only supports \'user\' and \'assistant\' roles, starting with user and alternating (u/a/u/a/u...)"					)

           __A		   =      []
           if len(conversation.past_user_inputs					) > 0:
                 if not conversation.past_user_inputs[0].startswith(lowercase__					) or E_SYS not in conversation.past_user_inputs[0]:
                       __A		   =      (
                           B_SYS + DEFAULT_SYSTEM_PROMPT + E_SYS + conversation.past_user_inputs[0]
                       )
           elif not dialogue[0][1].startswith(lowercase__					) or E_SYS not in dialogue[0][1]:
                 __A		   =      (dialogue[0][0], B_SYS + DEFAULT_SYSTEM_PROMPT + E_SYS + dialogue[0][1])

           dialog_tokens += sum(
               [
                   [self.bos_token_id]
                   + self.encode(
                       f"{B_INST} {(prompt[1]).strip()} {E_INST} {(answer[1]).strip()} "				,				add_special_tokens=lowercase__					)
                   + [self.eos_token_id]
                   for prompt, answer in zip(dialogue[::2]				,				dialogue[1::2]					)
               ]				,				[]				,				)
           if not (dialogue[-1][0]):
                 raise ValueError(f"Last message must be from user, got {dialogue[-1]['role']}"					)
           dialog_tokens += [self.bos_token_id] + self.encode(
               f"{B_INST} {(dialogue[-1][1]).strip()} {E_INST}"				,				add_special_tokens=lowercase__					)
           return dialog_tokens










'''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


