



'''simple docstring'''



import math
import time
from typing import Dict, List, Optional

from torch.utils.data import Dataset

from transformers import SeqaSeqTrainer, is_torch_tpu_available
from transformers.trainer_utils import PredictionOutput, speed_metrics


if is_torch_tpu_available(check_device=False):
							import torch_xla.core.xla_model as xm
							import torch_xla.debug.metrics as met
class 						lowerCamelCase_				(       snake_case_      ):







						def __init__(	self :   Union[str, Any]					,     *lowerCAmelCase__ :   List[str]					,     lowerCAmelCase__ :   Optional[int]=None					,     lowerCAmelCase__ :   Tuple=None					,     **lowerCAmelCase__ :   Optional[Any]					):

													"""simple docstring"""
													super().__init__(*lowerCAmelCase__					,     **lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   Any         =      eval_examples
													SCREAMING_SNAKE_CASE       :   int         =      post_process_function







						def        __lowercase     (	self :   int					,     lowerCAmelCase__ :   Optional[Dataset] = None					,     lowerCAmelCase__ :   Union[str, Any]=None					,     lowerCAmelCase__ :   Optional[List[str]] = None					,     lowerCAmelCase__ :   str = "eval"					,     **lowerCAmelCase__ :   Tuple					,     ):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      gen_kwargs.copy()
													SCREAMING_SNAKE_CASE       :   int         =      (
													    gen_kwargs['''max_length'''] if gen_kwargs.get('''max_length'''					) is not None else self.args.generation_max_length
													)
													SCREAMING_SNAKE_CASE       :   Any         =      (
													    gen_kwargs['''num_beams'''] if gen_kwargs.get('''num_beams'''					) is not None else self.args.generation_num_beams
													)
													SCREAMING_SNAKE_CASE       :   Tuple         =      gen_kwargs

													SCREAMING_SNAKE_CASE       :   Dict         =      self.eval_dataset if eval_dataset is None else eval_dataset
													SCREAMING_SNAKE_CASE       :   Tuple         =      self.get_eval_dataloader(lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   Optional[int]         =      self.eval_examples if eval_examples is None else eval_examples

													# Temporarily disable metric computation, we will do it in the loop here.
													SCREAMING_SNAKE_CASE       :   List[str]         =      self.compute_metrics
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      None
													SCREAMING_SNAKE_CASE       :   Dict         =      time.time()
													SCREAMING_SNAKE_CASE       :   List[str]         =      self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
													try:
																				SCREAMING_SNAKE_CASE       :   Tuple         =      eval_loop(
																				    lowerCAmelCase__					,     description='''Evaluation'''					,     prediction_loss_only=True if compute_metrics is None else None					,     ignore_keys=lowerCAmelCase__					,     metric_key_prefix=lowerCAmelCase__					,     )
													finally:
																				SCREAMING_SNAKE_CASE       :   Tuple         =      compute_metrics
													SCREAMING_SNAKE_CASE       :   str         =      self.args.eval_batch_size * self.args.world_size
													if F"""{metric_key_prefix}_jit_compilation_time""" in output.metrics:
																				start_time += output.metrics[F"""{metric_key_prefix}_jit_compilation_time"""]
													output.metrics.update(
													    speed_metrics(
													        lowerCAmelCase__					,     lowerCAmelCase__					,     num_samples=output.num_samples					,     num_steps=math.ceil(output.num_samples / total_batch_size					)					,     )					)

													if self.post_process_function is not None and self.compute_metrics is not None and self.args.should_save:
																				# Only the main node write the results by default
																				SCREAMING_SNAKE_CASE       :   Dict         =      self.post_process_function(lowerCAmelCase__					,     lowerCAmelCase__					,     lowerCAmelCase__					)
																				SCREAMING_SNAKE_CASE       :   List[Any]         =      self.compute_metrics(lowerCAmelCase__					)

																				# Prefix all keys with metric_key_prefix + '_'
																				for key in list(metrics.keys()					):
																											if not key.startswith(F"""{metric_key_prefix}_"""					):
																																		SCREAMING_SNAKE_CASE       :   Tuple         =      metrics.pop(lowerCAmelCase__					)

																				metrics.update(output.metrics					)
													else:
																				SCREAMING_SNAKE_CASE       :   Any         =      output.metrics

													if self.args.should_log:
																				# Only the main node log the results by default
																				self.log(lowerCAmelCase__					)

													if self.args.tpu_metrics_debug or self.args.debug:
																				# tpu-comment: Logging debug metrics for PyTorch/XLA (compile, execute times, ops, etc.)
																				xm.master_print(met.metrics_report()					)

													SCREAMING_SNAKE_CASE       :   List[str]         =      self.callback_handler.on_evaluate(self.args					,     self.state					,     self.control					,     lowerCAmelCase__					)
													return metrics







						def        __lowercase     (	self :   Union[str, Any]					,     lowerCAmelCase__ :   Any					,     lowerCAmelCase__ :   List[str]					,     lowerCAmelCase__ :   str=None					,     lowerCAmelCase__ :   str = "test"					,     **lowerCAmelCase__ :   Union[str, Any]					):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      gen_kwargs.copy()

													SCREAMING_SNAKE_CASE       :   str         =      self.get_test_dataloader(lowerCAmelCase__					)

													# Temporarily disable metric computation, we will do it in the loop here.
													SCREAMING_SNAKE_CASE       :   Dict         =      self.compute_metrics
													SCREAMING_SNAKE_CASE       :   Optional[Any]         =      None
													SCREAMING_SNAKE_CASE       :   str         =      time.time()
													SCREAMING_SNAKE_CASE       :   Dict         =      self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop
													try:
																				SCREAMING_SNAKE_CASE       :   int         =      eval_loop(
																				    lowerCAmelCase__					,     description='''Prediction'''					,     prediction_loss_only=True if compute_metrics is None else None					,     ignore_keys=lowerCAmelCase__					,     metric_key_prefix=lowerCAmelCase__					,     )
													finally:
																				SCREAMING_SNAKE_CASE       :   str         =      compute_metrics

													SCREAMING_SNAKE_CASE       :   List[str]         =      self.args.eval_batch_size * self.args.world_size
													if F"""{metric_key_prefix}_jit_compilation_time""" in output.metrics:
																				start_time += output.metrics[F"""{metric_key_prefix}_jit_compilation_time"""]
													output.metrics.update(
													    speed_metrics(
													        lowerCAmelCase__					,     lowerCAmelCase__					,     num_samples=output.num_samples					,     num_steps=math.ceil(output.num_samples / total_batch_size					)					,     )					)
													if self.post_process_function is None or self.compute_metrics is None:
																				return output

													SCREAMING_SNAKE_CASE       :   Dict         =      self.post_process_function(lowerCAmelCase__					,     lowerCAmelCase__					,     lowerCAmelCase__					,     '''predict'''					)
													SCREAMING_SNAKE_CASE       :   Any         =      self.compute_metrics(lowerCAmelCase__					)

													# Prefix all keys with metric_key_prefix + '_'
													for key in list(metrics.keys()					):
																				if not key.startswith(F"""{metric_key_prefix}_"""					):
																											SCREAMING_SNAKE_CASE       :   Optional[Any]         =      metrics.pop(lowerCAmelCase__					)
													metrics.update(output.metrics					)
													return PredictionOutput(predictions=predictions.predictions					,     label_ids=predictions.label_ids					,     metrics=lowerCAmelCase__					)









'''simple docstring'''



import gc
import random
import unittest

import numpy as np
import torch
from PIL import Image
from transformers import XLMRobertaTokenizerFast

from diffusers import DDIMScheduler, KandinskyInpaintPipeline, KandinskyPriorPipeline, UNetaDConditionModel, VQModel
from diffusers.pipelines.kandinsky.text_encoder import MCLIPConfig, MultilingualCLIP
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_				(       snake_case_     ,					unittest.TestCase      ):
						_lowerCAmelCase  : str						  =					KandinskyInpaintPipeline
						_lowerCAmelCase  : List[Any]						  =					['prompt', 'image_embeds', 'negative_image_embeds', 'image', 'mask_image']
						_lowerCAmelCase  : int						  =					[
						    'prompt',
						    'negative_prompt',
						    'image_embeds',
						    'negative_image_embeds',
						    'image',
						    'mask_image',
						]
						_lowerCAmelCase  : List[str]						  =					[
						    'generator',
						    'height',
						    'width',
						    'latents',
						    'guidance_scale',
						    'negative_prompt',
						    'num_inference_steps',
						    'return_dict',
						    'guidance_scale',
						    'num_images_per_prompt',
						    'output_type',
						    'return_dict',
						]
						_lowerCAmelCase  : Union[str, Any]						  =					False







						@property
						def        __lowercase     (	self :   str					):

													"""simple docstring"""
													return 32







						@property
						def        __lowercase     (	self :   str					):

													"""simple docstring"""
													return 32







						@property
						def        __lowercase     (	self :   Optional[int]					):

													"""simple docstring"""
													return self.time_input_dim







						@property
						def        __lowercase     (	self :   int					):

													"""simple docstring"""
													return self.time_input_dim * 4







						@property
						def        __lowercase     (	self :   int					):

													"""simple docstring"""
													return 1_00







						@property
						def        __lowercase     (	self :   Tuple					):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   Optional[int]         =      XLMRobertaTokenizerFast.from_pretrained('''YiYiXu/tiny-random-mclip-base'''					)
													return tokenizer







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

													"""simple docstring"""
													torch.manual_seed(0					)
													SCREAMING_SNAKE_CASE       :   List[Any]         =      MCLIPConfig(
													    numDims=self.cross_attention_dim					,     transformerDimensions=self.text_embedder_hidden_size					,     hidden_size=self.text_embedder_hidden_size					,     intermediate_size=37					,     num_attention_heads=4					,     num_hidden_layers=5					,     vocab_size=10_05					,     )

													SCREAMING_SNAKE_CASE       :   Any         =      MultilingualCLIP(lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      text_encoder.eval()

													return text_encoder







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

													"""simple docstring"""
													torch.manual_seed(0					)

													SCREAMING_SNAKE_CASE       :   Tuple         =      {
													    '''in_channels''': 9,
													    # Out channels is double in channels because predicts mean and variance
													    '''out_channels''': 8,
													    '''addition_embed_type''': '''text_image''',
													    '''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''': '''text_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       :   Union[str, Any]         =      UNetaDConditionModel(**lowerCAmelCase__					)
													return model







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

													"""simple docstring"""
													return {
													    "block_out_channels": [32, 64],
													    "down_block_types": ["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",
													    ],
													    "vq_embed_dim": 4,
													}







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

													"""simple docstring"""
													torch.manual_seed(0					)
													SCREAMING_SNAKE_CASE       :   Optional[Any]         =      VQModel(**self.dummy_movq_kwargs					)
													return model







						def        __lowercase     (	self :   Optional[int]					):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   Any         =      self.dummy_text_encoder
													SCREAMING_SNAKE_CASE       :   Tuple         =      self.dummy_tokenizer
													SCREAMING_SNAKE_CASE       :   int         =      self.dummy_unet
													SCREAMING_SNAKE_CASE       :   str         =      self.dummy_movq

													SCREAMING_SNAKE_CASE       :   Optional[int]         =      DDIMScheduler(
													    num_train_timesteps=10_00					,     beta_schedule='''linear'''					,     beta_start=0.0_0085					,     beta_end=0.012					,     clip_sample=lowerCAmelCase__					,     set_alpha_to_one=lowerCAmelCase__					,     steps_offset=1					,     prediction_type='''epsilon'''					,     thresholding=lowerCAmelCase__					,     )

													SCREAMING_SNAKE_CASE       :   Optional[int]         =      {
													    '''text_encoder''': text_encoder,
													    '''tokenizer''': tokenizer,
													    '''unet''': unet,
													    '''scheduler''': scheduler,
													    '''movq''': movq,
													}

													return components







						def        __lowercase     (	self :   Dict					,     lowerCAmelCase__ :   Optional[Any]					,     lowerCAmelCase__ :   List[Any]=0					):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      floats_tensor((1, self.cross_attention_dim)					,     rng=random.Random(lowerCAmelCase__					)					).to(lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   List[Any]         =      floats_tensor((1, self.cross_attention_dim)					,     rng=random.Random(seed + 1					)					).to(lowerCAmelCase__					)
													# create init_image
													SCREAMING_SNAKE_CASE       :   Optional[Any]         =      floats_tensor((1, 3, 64, 64)					,     rng=random.Random(lowerCAmelCase__					)					).to(lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   Tuple         =      image.cpu().permute(0					,     2					,     3					,     1					)[0]
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      Image.fromarray(np.uinta(lowerCAmelCase__					)					).convert('''RGB'''					).resize((2_56, 2_56)					)
													# create mask
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      np.ones((64, 64)					,     dtype=np.floataa					)
													SCREAMING_SNAKE_CASE       :   str         =      0

													if str(lowerCAmelCase__					).startswith('''mps'''					):
																				SCREAMING_SNAKE_CASE       :   Tuple         =      torch.manual_seed(lowerCAmelCase__					)
													else:
																				SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      torch.Generator(device=lowerCAmelCase__					).manual_seed(lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   Tuple         =      {
													    '''prompt''': '''horse''',
													    '''image''': init_image,
													    '''mask_image''': mask,
													    '''image_embeds''': image_embeds,
													    '''negative_image_embeds''': negative_image_embeds,
													    '''generator''': generator,
													    '''height''': 64,
													    '''width''': 64,
													    '''num_inference_steps''': 2,
													    '''guidance_scale''': 4.0,
													    '''output_type''': '''np''',
													}
													return inputs







						def        __lowercase     (	self :   List[Any]					):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   Any         =      '''cpu'''

													SCREAMING_SNAKE_CASE       :   Dict         =      self.get_dummy_components()

													SCREAMING_SNAKE_CASE       :   Optional[int]         =      self.pipeline_class(**lowerCAmelCase__					)
													SCREAMING_SNAKE_CASE       :   int         =      pipe.to(lowerCAmelCase__					)

													pipe.set_progress_bar_config(disable=lowerCAmelCase__					)

													SCREAMING_SNAKE_CASE       :   str         =      pipe(**self.get_dummy_inputs(lowerCAmelCase__					)					)
													SCREAMING_SNAKE_CASE       :   int         =      output.images

													SCREAMING_SNAKE_CASE       :   int         =      pipe(
													    **self.get_dummy_inputs(lowerCAmelCase__					)					,     return_dict=lowerCAmelCase__					,     )[0]

													SCREAMING_SNAKE_CASE       :   Optional[Any]         =      image[0, -3:, -3:, -1]
													SCREAMING_SNAKE_CASE       :   Dict         =      image_from_tuple[0, -3:, -3:, -1]

													print(F"""image.shape {image.shape}"""					)

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

													SCREAMING_SNAKE_CASE       :   List[str]         =      np.array(
													    [0.832_6919, 0.7379_0467, 0.2091_8581, 0.930_9612, 0.551_1791, 0.4371_3328, 0.551_3321, 0.4992_2934, 0.5949_7786]					)

													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()}"""







						def        __lowercase     (	self :   str					):

													"""simple docstring"""
													super().test_inference_batch_single_identical(expected_max_diff=3e-3					)


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







						def        __lowercase     (	self :   List[str]					):

													"""simple docstring"""
													# clean up the VRAM after each test
													super().tearDown()
													gc.collect()
													torch.cuda.empty_cache()







						def        __lowercase     (	self :   Dict					):

													"""simple docstring"""
													SCREAMING_SNAKE_CASE       :   List[Any]         =      load_numpy(
													    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
													    '''/kandinsky/kandinsky_inpaint_cat_with_hat_fp16.npy'''					)

													SCREAMING_SNAKE_CASE       :   Optional[Any]         =      load_image(
													    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main''' '''/kandinsky/cat.png'''					)
													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      np.ones((7_68, 7_68)					,     dtype=np.floataa					)
													SCREAMING_SNAKE_CASE       :   List[str]         =      0

													SCREAMING_SNAKE_CASE       :   Dict         =      '''a hat'''

													SCREAMING_SNAKE_CASE       :   str         =      KandinskyPriorPipeline.from_pretrained(
													    '''kandinsky-community/kandinsky-2-1-prior'''					,     torch_dtype=torch.floataa					)
													pipe_prior.to(lowerCAmelCase__					)

													SCREAMING_SNAKE_CASE       :   Union[str, Any]         =      KandinskyInpaintPipeline.from_pretrained(
													    '''kandinsky-community/kandinsky-2-1-inpaint'''					,     torch_dtype=torch.floataa					)
													SCREAMING_SNAKE_CASE       :   Dict         =      pipeline.to(lowerCAmelCase__					)
													pipeline.set_progress_bar_config(disable=lowerCAmelCase__					)

													SCREAMING_SNAKE_CASE       :   Optional[int]         =      torch.Generator(device='''cpu'''					).manual_seed(0					)
													SCREAMING_SNAKE_CASE       ,SCREAMING_SNAKE_CASE       :   Any         =      pipe_prior(
													    lowerCAmelCase__					,     generator=lowerCAmelCase__					,     num_inference_steps=5					,     negative_prompt=''''''					,     ).to_tuple()

													SCREAMING_SNAKE_CASE       :   Tuple         =      pipeline(
													    lowerCAmelCase__					,     image=lowerCAmelCase__					,     mask_image=lowerCAmelCase__					,     image_embeds=lowerCAmelCase__					,     negative_image_embeds=lowerCAmelCase__					,     generator=lowerCAmelCase__					,     num_inference_steps=1_00					,     height=7_68					,     width=7_68					,     output_type='''np'''					,     )

													SCREAMING_SNAKE_CASE       :   Tuple         =      output.images[0]

													assert image.shape == (7_68, 7_68, 3)

													assert_mean_pixel_difference(lowerCAmelCase__					,     lowerCAmelCase__					)




