

import unittest

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

from diffusers import KandinskyPriorPipeline, PriorTransformer, UnCLIPScheduler
from diffusers.utils import torch_device
from diffusers.utils.testing_utils import enable_full_determinism, skip_mps

from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()







class        SCREAMING_SNAKE_CASE      (	UpperCamelCase__					,							unittest.TestCase ):






					"""simple docstring"""



					lowercase__       				= KandinskyPriorPipeline
					lowercase__       				= ["""prompt"""]
					lowercase__       				= ["""prompt""", """negative_prompt"""]
					lowercase__       				= [
					    """num_images_per_prompt""",
					    """generator""",
					    """num_inference_steps""",
					    """latents""",
					    """negative_prompt""",
					    """guidance_scale""",
					    """output_type""",
					    """return_dict""",
					]
					lowercase__       				= False







					@property
					def  __lowerCAmelCase				( self    :       int	):
						return 3_2







					@property
					def  __lowerCAmelCase				( self    :       List[Any]	):
						return 3_2







					@property
					def  __lowerCAmelCase				( self    :       str	):
						return self.time_input_dim







					@property
					def  __lowerCAmelCase				( self    :       List[str]	):
						return self.time_input_dim * 4







					@property
					def  __lowerCAmelCase				( self    :       int	):
						return 1_0_0







					@property
					def  __lowerCAmelCase				( self    :       Any	):
						lowerCAmelCase__			:		Union[str, Any]						       =			CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''	)
						return tokenizer







					@property
					def  __lowerCAmelCase				( self    :       Any	):
						torch.manual_seed(0	)
						lowerCAmelCase__			:		str						       =			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(lowerCAmelCase__	)







					@property
					def  __lowerCAmelCase				( self    :       int	):
						torch.manual_seed(0	)

						lowerCAmelCase__			:		Optional[int]						       =			{
						    "num_attention_heads": 2,
						    "attention_head_dim": 1_2,
						    "embedding_dim": self.text_embedder_hidden_size,
						    "num_layers": 1,
						}

						lowerCAmelCase__			:		Any						       =			PriorTransformer(**lowerCAmelCase__	)
						# clip_std and clip_mean is initialized to be 0 so PriorTransformer.post_process_latents will always return 0 - set clip_std to be 1 so it won't return 0
						lowerCAmelCase__			:		List[Any]						       =			nn.Parameter(torch.ones(model.clip_std.shape	)	)
						return model







					@property
					def  __lowerCAmelCase				( self    :       Union[str, Any]	):
						torch.manual_seed(0	)
						lowerCAmelCase__			:		List[Any]						       =			CLIPVisionConfig(
						    hidden_size=self.text_embedder_hidden_size     ,image_size=2_2_4     ,projection_dim=self.text_embedder_hidden_size     ,intermediate_size=3_7     ,num_attention_heads=4     ,num_channels=3     ,num_hidden_layers=5     ,patch_size=1_4     ,)

						lowerCAmelCase__			:		List[str]						       =			CLIPVisionModelWithProjection(lowerCAmelCase__	)
						return model







					@property
					def  __lowerCAmelCase				( self    :       Dict	):
						lowerCAmelCase__			:		Optional[int]						       =			CLIPImageProcessor(
						    crop_size=2_2_4     ,do_center_crop=lowerCAmelCase__     ,do_normalize=lowerCAmelCase__     ,do_resize=lowerCAmelCase__     ,image_mean=[0.4814_5466, 0.457_8275, 0.4082_1073]     ,image_std=[0.2686_2954, 0.2613_0258, 0.2757_7711]     ,resample=3     ,size=2_2_4     ,)

						return image_processor







					def  __lowerCAmelCase				( self    :       str	):
						lowerCAmelCase__			:		Any						       =			self.dummy_prior
						lowerCAmelCase__			:		List[Any]						       =			self.dummy_image_encoder
						lowerCAmelCase__			:		List[Any]						       =			self.dummy_text_encoder
						lowerCAmelCase__			:		Optional[int]						       =			self.dummy_tokenizer
						lowerCAmelCase__			:		Union[str, Any]						       =			self.dummy_image_processor

						lowerCAmelCase__			:		List[str]						       =			UnCLIPScheduler(
						    variance_type='''fixed_small_log'''     ,prediction_type='''sample'''     ,num_train_timesteps=1_0_0_0     ,clip_sample=lowerCAmelCase__     ,clip_sample_range=10.0     ,)

						lowerCAmelCase__			:		Optional[Any]						       =			{
						    "prior": prior,
						    "image_encoder": image_encoder,
						    "text_encoder": text_encoder,
						    "tokenizer": tokenizer,
						    "scheduler": scheduler,
						    "image_processor": image_processor,
						}

						return components







					def  __lowerCAmelCase				( self    :       Optional[Any]     ,lowercase_    :       Any     ,lowercase_    :       str=0	):




						if str(lowerCAmelCase__	).startswith('''mps'''	):
							lowerCAmelCase__			:		List[str]						       =			torch.manual_seed(lowerCAmelCase__	)
						else:
							lowerCAmelCase__			:		str						       =			torch.Generator(device=lowerCAmelCase__	).manual_seed(lowerCAmelCase__	)
						lowerCAmelCase__			:		Tuple						       =			{
						    "prompt": "horse",
						    "generator": generator,
						    "guidance_scale": 4.0,
						    "num_inference_steps": 2,
						    "output_type": "np",
						}
						return inputs







					def  __lowerCAmelCase				( self    :       Any	):
						lowerCAmelCase__			:		int						       =			"cpu"

						lowerCAmelCase__			:		Dict						       =			self.get_dummy_components()

						lowerCAmelCase__			:		Optional[Any]						       =			self.pipeline_class(**lowerCAmelCase__	)
						lowerCAmelCase__			:		str						       =			pipe.to(lowerCAmelCase__	)

						pipe.set_progress_bar_config(disable=lowerCAmelCase__	)

						lowerCAmelCase__			:		Dict						       =			pipe(**self.get_dummy_inputs(lowerCAmelCase__	)	)
						lowerCAmelCase__			:		str						       =			output.image_embeds

						lowerCAmelCase__			:		List[Any]						       =			pipe(
						    **self.get_dummy_inputs(lowerCAmelCase__	)     ,return_dict=lowerCAmelCase__     ,)[0]

						lowerCAmelCase__			:		int						       =			image[0, -1_0:]
						lowerCAmelCase__			:		Tuple						       =			image_from_tuple[0, -1_0:]

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

						lowerCAmelCase__			:		Any						       =			np.array(
						    [-0.0532, 1.7120, 0.3656, -1.0852, -0.8946, -1.1756, 0.4348, 0.2482, 0.5146, -0.1156]	)

						assert np.abs(image_slice.flatten() - expected_slice	).max() < 1E-2
						assert np.abs(image_from_tuple_slice.flatten() - expected_slice	).max() < 1E-2







					@skip_mps
					def  __lowerCAmelCase				( self    :       Union[str, Any]	):
						lowerCAmelCase__			:		Optional[Any]						       =			torch_device == "cpu"
						lowerCAmelCase__			:		Any						       =			True
						lowerCAmelCase__			:		str						       =			False

						self._test_inference_batch_single_identical(
						    test_max_difference=lowerCAmelCase__     ,relax_max_difference=lowerCAmelCase__     ,test_mean_pixel_difference=lowerCAmelCase__     ,)







					@skip_mps
					def  __lowerCAmelCase				( self    :       str	):
						lowerCAmelCase__			:		Union[str, Any]						       =			torch_device == "cpu"
						lowerCAmelCase__			:		Optional[Any]						       =			False

						self._test_attention_slicing_forward_pass(
						    test_max_difference=lowerCAmelCase__     ,test_mean_pixel_difference=lowerCAmelCase__     ,)







"""simple docstring"""





from collections import OrderedDict
from typing import Any, List, Mapping, Optional

from ... import PreTrainedTokenizer, TensorType, is_torch_available
from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfigWithPast, PatchingSpec
from ...utils import logging


__UpperCamelCase						:   str							   =	logging.get_logger(__name__)

__UpperCamelCase						:   Union[str, Any]							   =	{
    '''gpt2''': '''https://huggingface.co/gpt2/resolve/main/config.json''',
    '''gpt2-medium''': '''https://huggingface.co/gpt2-medium/resolve/main/config.json''',
    '''gpt2-large''': '''https://huggingface.co/gpt2-large/resolve/main/config.json''',
    '''gpt2-xl''': '''https://huggingface.co/gpt2-xl/resolve/main/config.json''',
    '''distilgpt2''': '''https://huggingface.co/distilgpt2/resolve/main/config.json''',
}







class        SCREAMING_SNAKE_CASE      (	a_ ):






					"""simple docstring"""



					lowercase__       				= "gpt2"
					lowercase__       				= ["past_key_values"]
					lowercase__       				= {
					    "hidden_size": "n_embd",
					    "max_position_embeddings": "n_positions",
					    "num_attention_heads": "n_head",
					    "num_hidden_layers": "n_layer",
					}







					def __init__( self    :       List[str]     ,lowercase_    :       Dict=5_0_2_5_7     ,lowercase_    :       Dict=1_0_2_4     ,lowercase_    :       Any=7_6_8     ,lowercase_    :       str=1_2     ,lowercase_    :       int=1_2     ,lowercase_    :       List[Any]=None     ,lowercase_    :       Dict="gelu_new"     ,lowercase_    :       Any=0.1     ,lowercase_    :       Optional[Any]=0.1     ,lowercase_    :       Tuple=0.1     ,lowercase_    :       Dict=1E-5     ,lowercase_    :       List[Any]=0.02     ,lowercase_    :       Tuple="cls_index"     ,lowercase_    :       Optional[int]=True     ,lowercase_    :       Union[str, Any]=None     ,lowercase_    :       Optional[Any]=True     ,lowercase_    :       List[Any]=0.1     ,lowercase_    :       List[str]=True     ,lowercase_    :       int=True     ,lowercase_    :       Optional[Any]=5_0_2_5_6     ,lowercase_    :       Dict=5_0_2_5_6     ,lowercase_    :       Union[str, Any]=False     ,lowercase_    :       Optional[Any]=False     ,**lowercase_    :       Dict     ,):
						lowerCAmelCase__			:		Tuple						       =			vocab_size
						lowerCAmelCase__			:		List[Any]						       =			n_positions
						lowerCAmelCase__			:		Optional[int]						       =			n_embd
						lowerCAmelCase__			:		Tuple						       =			n_layer
						lowerCAmelCase__			:		Optional[Any]						       =			n_head
						lowerCAmelCase__			:		List[Any]						       =			n_inner
						lowerCAmelCase__			:		Any						       =			activation_function
						lowerCAmelCase__			:		Optional[int]						       =			resid_pdrop
						lowerCAmelCase__			:		str						       =			embd_pdrop
						lowerCAmelCase__			:		Tuple						       =			attn_pdrop
						lowerCAmelCase__			:		List[str]						       =			layer_norm_epsilon
						lowerCAmelCase__			:		Union[str, Any]						       =			initializer_range
						lowerCAmelCase__			:		Optional[int]						       =			summary_type
						lowerCAmelCase__			:		Optional[Any]						       =			summary_use_proj
						lowerCAmelCase__			:		List[str]						       =			summary_activation
						lowerCAmelCase__			:		Optional[int]						       =			summary_first_dropout
						lowerCAmelCase__			:		Dict						       =			summary_proj_to_labels
						lowerCAmelCase__			:		Dict						       =			scale_attn_weights
						lowerCAmelCase__			:		Dict						       =			use_cache
						lowerCAmelCase__			:		List[Any]						       =			scale_attn_by_inverse_layer_idx
						lowerCAmelCase__			:		int						       =			reorder_and_upcast_attn

						lowerCAmelCase__			:		List[str]						       =			bos_token_id
						lowerCAmelCase__			:		List[str]						       =			eos_token_id

						super().__init__(bos_token_id=lowercase_     ,eos_token_id=lowercase_     ,**lowercase_	)







class        SCREAMING_SNAKE_CASE      (	a_ ):






					"""simple docstring"""



					def __init__( self    :       Optional[int]     ,lowercase_    :       PretrainedConfig     ,lowercase_    :       str = "default"     ,lowercase_    :       List[PatchingSpec] = None     ,lowercase_    :       bool = False     ,):
						super().__init__(lowercase_     ,task=lowercase_     ,patching_specs=lowercase_     ,use_past=lowercase_	)
						if not getattr(self._config     ,'''pad_token_id'''     ,lowercase_	):
							# TODO: how to do that better?
							lowerCAmelCase__			:		int						       =			0







					@property
					def  __lowerCAmelCase				( self    :       List[str]	):
						lowerCAmelCase__			:		Any						       =			OrderedDict({'''input_ids''': {0: '''batch''', 1: '''sequence'''}}	)
						if self.use_past:
							self.fill_with_past_key_values_(lowercase_     ,direction='''inputs'''	)
							lowerCAmelCase__			:		str						       =			{0: '''batch''', 1: '''past_sequence + sequence'''}
						else:
							lowerCAmelCase__			:		List[str]						       =			{0: '''batch''', 1: '''sequence'''}

						return common_inputs







					@property
					def  __lowerCAmelCase				( self    :       Any	):
						return self._config.n_layer







					@property
					def  __lowerCAmelCase				( self    :       List[str]	):
						return self._config.n_head







					def  __lowerCAmelCase				( self    :       Union[str, Any]     ,lowercase_    :       PreTrainedTokenizer     ,lowercase_    :       int = -1     ,lowercase_    :       int = -1     ,lowercase_    :       bool = False     ,lowercase_    :       Optional[TensorType] = None     ,):
						lowerCAmelCase__			:		Any						       =			super(lowercase_     ,self	).generate_dummy_inputs(
						    lowercase_     ,batch_size=lowercase_     ,seq_length=lowercase_     ,is_pair=lowercase_     ,framework=lowercase_	)

						# We need to order the input in the way they appears in the forward()
						lowerCAmelCase__			:		List[Any]						       =			OrderedDict({'''input_ids''': common_inputs['''input_ids''']}	)

						# Need to add the past_keys
						if self.use_past:
							if not is_torch_available():
								raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''	)
							else:
								import torch

								lowerCAmelCase__       ,lowerCAmelCase__			:		List[Any]						       =			common_inputs['''input_ids'''].shape
								# Not using the same length for past_key_values
								lowerCAmelCase__			:		Dict						       =			seqlen + 2
								lowerCAmelCase__			:		Optional[Any]						       =			(
								    batch,
								    self.num_attention_heads,
								    past_key_values_length,
								    self._config.hidden_size // self.num_attention_heads,
								)
								lowerCAmelCase__			:		Tuple						       =			[
								    (torch.zeros(lowercase_	), torch.zeros(lowercase_	)) for _ in range(self.num_layers	)
								]

						lowerCAmelCase__			:		Any						       =			common_inputs['''attention_mask''']
						if self.use_past:
							lowerCAmelCase__			:		Optional[Any]						       =			ordered_inputs['''attention_mask'''].dtype
							lowerCAmelCase__			:		Union[str, Any]						       =			torch.cat(
							    [ordered_inputs['''attention_mask'''], torch.ones(lowercase_     ,lowercase_     ,dtype=lowercase_	)]     ,dim=1	)

						return ordered_inputs







					@property
					def  __lowerCAmelCase				( self    :       str	):
						return 1_3




