


from argparse import ArgumentParser

from . import BaseTransformersCLICommand
def       UpperCAmelCase__						(UpperCamelCase_    ):



     """simple docstring"""






     return DownloadCommand(args.model							,args.cache_dir							,args.force							,args.trust_remote_code    )

class   A__ (   snake_case__     ):







    """simple docstring"""

    @staticmethod
    def 		a_      (	__snake_case   ):
         snake_case					=    parser.add_parser('''download'''   )
         download_parser.add_argument(
             '''--cache-dir'''      , type=__snake_case      , default=__snake_case      , help='''Path to location to store the models'''   )
         download_parser.add_argument(
             '''--force'''      , action='''store_true'''      , help='''Force the model to be download even if already in cache-dir'''   )
         download_parser.add_argument(
             '''--trust-remote-code'''      , action='''store_true'''      , help='''Whether or not to allow for custom models defined on the Hub in their own modeling files. Use only if you\'ve reviewed the code as it will execute on your local machine'''      , )
         download_parser.add_argument('''model'''      , type=__snake_case      , help='''Name of the model to download'''   )
         download_parser.set_defaults(func=__snake_case   )
    def __init__(	self      , __snake_case      , __snake_case      , __snake_case      , __snake_case   ):
         snake_case					=    model
         snake_case					=    cache
         snake_case					=    force
         snake_case					=    trust_remote_code




    def 		a_      (	self   ):
         from ..models.auto import AutoModel, AutoTokenizer

         AutoModel.from_pretrained(
             self._model      , cache_dir=self._cache      , force_download=self._force      , trust_remote_code=self._trust_remote_code   )
         AutoTokenizer.from_pretrained(
             self._model      , cache_dir=self._cache      , force_download=self._force      , trust_remote_code=self._trust_remote_code   )








import gc
import random
import unittest

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

from diffusers import (
    DiffusionPipeline,
    UnCLIPImageVariationPipeline,
    UnCLIPScheduler,
    UNetaDConditionModel,
    UNetaDModel,
)
from diffusers.pipelines.unclip.text_proj import UnCLIPTextProjModel
from diffusers.utils import floats_tensor, load_numpy, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, load_image, require_torch_gpu, skip_mps

from ..pipeline_params import IMAGE_VARIATION_BATCH_PARAMS, IMAGE_VARIATION_PARAMS
from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference


enable_full_determinism()

class   A__ (   snake_case__	, unittest.TestCase     ):







    """simple docstring"""

    __magic_name__        =		UnCLIPImageVariationPipeline
    __magic_name__        =		IMAGE_VARIATION_PARAMS - {'height', 'width', 'guidance_scale'}
    __magic_name__        =		IMAGE_VARIATION_BATCH_PARAMS

    __magic_name__        =		[
        'generator',
        'return_dict',
        'decoder_num_inference_steps',
        'super_res_num_inference_steps',
    ]
    __magic_name__        =		False
    @property
    def 		a_      (	self   ):
         return 3_2
    @property
    def 		a_      (	self   ):
         return 3_2
    @property
    def 		a_      (	self   ):
         return self.time_input_dim
    @property
    def 		a_      (	self   ):
         return self.time_input_dim * 4
    @property
    def 		a_      (	self   ):
         return 1_0_0
    @property
    def 		a_      (	self   ):
         snake_case					=    CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''   )
         return tokenizer
    @property
    def 		a_      (	self   ):
         torch.manual_seed(0   )
         snake_case					=    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=3_7      , layer_norm_eps=1E-05      , num_attention_heads=4      , num_hidden_layers=5      , pad_token_id=1      , vocab_size=1_0_0_0      , )
         return CLIPTextModelWithProjection(__snake_case   )
    @property
    def 		a_      (	self   ):
         torch.manual_seed(0   )
         snake_case					=    CLIPVisionConfig(
             hidden_size=self.text_embedder_hidden_size      , projection_dim=self.text_embedder_hidden_size      , num_hidden_layers=5      , num_attention_heads=4      , image_size=3_2      , intermediate_size=3_7      , patch_size=1      , )
         return CLIPVisionModelWithProjection(__snake_case   )
    @property
    def 		a_      (	self   ):
         torch.manual_seed(0   )

         snake_case					=    {
             '''clip_embeddings_dim''': self.text_embedder_hidden_size,
             '''time_embed_dim''': self.time_embed_dim,
             '''cross_attention_dim''': self.cross_attention_dim,
         }

         snake_case					=    UnCLIPTextProjModel(**__snake_case   )
         return model
    @property
    def 		a_      (	self   ):
         torch.manual_seed(0   )

         snake_case					=    {
             '''sample_size''': 3_2,
             # 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''',
         }

         snake_case					=    UNetaDConditionModel(**__snake_case   )
         return model
    @property
    def 		a_      (	self   ):
         return {
             "sample_size": 6_4,
             "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 		a_      (	self   ):
         torch.manual_seed(0   )

         snake_case					=    UNetaDModel(**self.dummy_super_res_kwargs   )
         return model
    @property
    def 		a_      (	self   ):
         # seeded differently to get different unet than `self.dummy_super_res_first`
         torch.manual_seed(1   )

         snake_case					=    UNetaDModel(**self.dummy_super_res_kwargs   )
         return model
    def 		a_      (	self   ):
         snake_case					=    self.dummy_decoder
         snake_case					=    self.dummy_text_proj
         snake_case					=    self.dummy_text_encoder
         snake_case					=    self.dummy_tokenizer
         snake_case					=    self.dummy_super_res_first
         snake_case					=    self.dummy_super_res_last

         snake_case					=    UnCLIPScheduler(
             variance_type='''learned_range'''      , prediction_type='''epsilon'''      , num_train_timesteps=1_0_0_0      , )

         snake_case					=    UnCLIPScheduler(
             variance_type='''fixed_small_log'''      , prediction_type='''epsilon'''      , num_train_timesteps=1_0_0_0      , )

         snake_case					=    CLIPImageProcessor(crop_size=3_2      , size=3_2   )

         snake_case					=    self.dummy_image_encoder

         return {
             "decoder": decoder,
             "text_encoder": text_encoder,
             "tokenizer": tokenizer,
             "text_proj": text_proj,
             "feature_extractor": feature_extractor,
             "image_encoder": image_encoder,
             "super_res_first": super_res_first,
             "super_res_last": super_res_last,
             "decoder_scheduler": decoder_scheduler,
             "super_res_scheduler": super_res_scheduler,
         }
    def 		a_      (	self      , __snake_case      , __snake_case=0      , __snake_case=True   ):
         snake_case					=    floats_tensor((1, 3, 3_2, 3_2)      , rng=random.Random(__snake_case   )   ).to(__snake_case   )
         if str(__snake_case   ).startswith('''mps'''   ):
              snake_case					=    torch.manual_seed(__snake_case   )
         else:
              snake_case					=    torch.Generator(device=__snake_case   ).manual_seed(__snake_case   )

         if pil_image:
              snake_case					=    input_image * 0.5 + 0.5
              snake_case					=    input_image.clamp(0      , 1   )
              snake_case					=    input_image.cpu().permute(0      , 2      , 3      , 1   ).float().numpy()
              snake_case					=    DiffusionPipeline.numpy_to_pil(__snake_case   )[0]

         return {
             "image": input_image,
             "generator": generator,
             "decoder_num_inference_steps": 2,
             "super_res_num_inference_steps": 2,
             "output_type": "np",
         }
    def 		a_      (	self   ):
         snake_case					=    '''cpu'''

         snake_case					=    self.get_dummy_components()

         snake_case					=    self.pipeline_class(**__snake_case   )
         snake_case					=    pipe.to(__snake_case   )

         pipe.set_progress_bar_config(disable=__snake_case   )

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )

         snake_case					=    pipe(**__snake_case   )
         snake_case					=    output.images

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )

         snake_case					=    pipe(
             **__snake_case      , return_dict=__snake_case      , )[0]

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

         assert image.shape == (1, 6_4, 6_4, 3)

         snake_case					=    np.array(
             [
                 0.9997,
                 0.0002,
                 0.9997,
                 0.9997,
                 0.9969,
                 0.0023,
                 0.9997,
                 0.9969,
                 0.9970,
             ]   )

         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 		a_      (	self   ):
         snake_case					=    '''cpu'''

         snake_case					=    self.get_dummy_components()

         snake_case					=    self.pipeline_class(**__snake_case   )
         snake_case					=    pipe.to(__snake_case   )

         pipe.set_progress_bar_config(disable=__snake_case   )

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )

         snake_case					=    pipe(**__snake_case   )
         snake_case					=    output.images

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )

         snake_case					=    pipe(
             **__snake_case      , return_dict=__snake_case      , )[0]

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

         assert image.shape == (1, 6_4, 6_4, 3)

         snake_case					=    np.array([0.9997, 0.0003, 0.9997, 0.9997, 0.9970, 0.0024, 0.9997, 0.9971, 0.9971]   )

         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 		a_      (	self   ):
         snake_case					=    '''cpu'''

         snake_case					=    self.get_dummy_components()

         snake_case					=    self.pipeline_class(**__snake_case   )
         snake_case					=    pipe.to(__snake_case   )

         pipe.set_progress_bar_config(disable=__snake_case   )

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )
         snake_case					=    [
             pipeline_inputs['''image'''],
             pipeline_inputs['''image'''],
         ]

         snake_case					=    pipe(**__snake_case   )
         snake_case					=    output.images

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )
         snake_case					=    [
             tuple_pipeline_inputs['''image'''],
             tuple_pipeline_inputs['''image'''],
         ]

         snake_case					=    pipe(
             **__snake_case      , return_dict=__snake_case      , )[0]

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

         assert image.shape == (2, 6_4, 6_4, 3)

         snake_case					=    np.array(
             [
                 0.9997,
                 0.9989,
                 0.0008,
                 0.0021,
                 0.9960,
                 0.0018,
                 0.0014,
                 0.0002,
                 0.9933,
             ]   )

         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 		a_      (	self   ):
         snake_case					=    torch.device('''cpu'''   )

         class   A__ :







             """simple docstring"""

             __magic_name__        =		1






         snake_case					=    self.get_dummy_components()

         snake_case					=    self.pipeline_class(**__snake_case   )
         snake_case					=    pipe.to(__snake_case   )

         pipe.set_progress_bar_config(disable=__snake_case   )

         snake_case					=    torch.Generator(device=__snake_case   ).manual_seed(0   )
         snake_case					=    pipe.decoder.dtype
         snake_case					=    1

         snake_case					=    (
             batch_size,
             pipe.decoder.config.in_channels,
             pipe.decoder.config.sample_size,
             pipe.decoder.config.sample_size,
         )
         snake_case					=    pipe.prepare_latents(
             __snake_case      , dtype=__snake_case      , device=__snake_case      , generator=__snake_case      , latents=__snake_case      , scheduler=DummyScheduler()   )

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

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )

         snake_case					=    pipe(
             **__snake_case      , decoder_latents=__snake_case      , super_res_latents=__snake_case   ).images

         snake_case					=    self.get_dummy_inputs(__snake_case      , pil_image=__snake_case   )
         # Don't pass image, instead pass embedding
         snake_case					=    pipeline_inputs.pop('''image'''   )
         snake_case					=    pipe.image_encoder(__snake_case   ).image_embeds

         snake_case					=    pipe(
             **__snake_case      , decoder_latents=__snake_case      , super_res_latents=__snake_case      , image_embeddings=__snake_case      , ).images

         # make sure passing text embeddings manually is identical
         assert np.abs(img_out_a - img_out_a   ).max() < 1E-4
    @skip_mps
    def 		a_      (	self   ):
         snake_case					=    torch_device == '''cpu'''

         # Check is relaxed because there is not a torch 2.0 sliced attention added kv processor
         snake_case					=    1E-2

         self._test_attention_slicing_forward_pass(
             test_max_difference=__snake_case      , expected_max_diff=__snake_case   )
    @skip_mps
    def 		a_      (	self   ):
         snake_case					=    torch_device == '''cpu'''
         snake_case					=    True
         snake_case					=    [
             '''decoder_num_inference_steps''',
             '''super_res_num_inference_steps''',
         ]

         self._test_inference_batch_single_identical(
             test_max_difference=__snake_case      , relax_max_difference=__snake_case      , additional_params_copy_to_batched_inputs=__snake_case      , )
    def 		a_      (	self   ):
         snake_case					=    [
             '''decoder_num_inference_steps''',
             '''super_res_num_inference_steps''',
         ]

         if torch_device == "mps":
              # TODO: MPS errors with larger batch sizes
              snake_case					=    [2, 3]
              self._test_inference_batch_consistent(
                  batch_sizes=__snake_case      , additional_params_copy_to_batched_inputs=__snake_case      , )
         else:
              self._test_inference_batch_consistent(
                  additional_params_copy_to_batched_inputs=__snake_case   )
    @skip_mps
    def 		a_      (	self   ):
         return super().test_dict_tuple_outputs_equivalent()
    @skip_mps
    def 		a_      (	self   ):
         return super().test_save_load_local()




    @skip_mps
    def 		a_      (	self   ):
         return super().test_save_load_optional_components()






@slow
@require_torch_gpu
class   A__ (   unittest.TestCase     ):







    """simple docstring"""

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




    def 		a_      (	self   ):
         snake_case					=    load_image(
             '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/unclip/cat.png'''   )
         snake_case					=    load_numpy(
             '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
             '''/unclip/karlo_v1_alpha_cat_variation_fp16.npy'''   )

         snake_case					=    UnCLIPImageVariationPipeline.from_pretrained(
             '''kakaobrain/karlo-v1-alpha-image-variations'''      , torch_dtype=torch.floataa   )
         snake_case					=    pipeline.to(__snake_case   )
         pipeline.set_progress_bar_config(disable=__snake_case   )

         snake_case					=    torch.Generator(device='''cpu'''   ).manual_seed(0   )
         snake_case					=    pipeline(
             __snake_case      , generator=__snake_case      , output_type='''np'''      , )

         snake_case					=    output.images[0]

         assert image.shape == (2_5_6, 2_5_6, 3)

         assert_mean_pixel_difference(__snake_case      , __snake_case      , 1_5   )




