


import unittest

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

from diffusers import KandinskyVaaPriorPipeline, 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 lowerCAmelCase_						(			lowerCamelCase__ ,						unittest.TestCase	):

 '''simple docstring'''

 __snake_case												=  KandinskyVaaPriorPipeline
 __snake_case												=  ["prompt"]
 __snake_case												=  ["prompt", "negative_prompt"]
 __snake_case												=  [
     "num_images_per_prompt",
     "generator",
     "num_inference_steps",
     "latents",
     "negative_prompt",
     "guidance_scale",
     "output_type",
     "return_dict",
 ]
 __snake_case												=  False



 @property
 def 						UpperCamelCase__					(     self ):
       return 32



 @property
 def 						UpperCamelCase__					(     self ):
       return 32



 @property
 def 						UpperCamelCase__					(     self ):
       return self.time_input_dim



 @property
 def 						UpperCamelCase__					(     self ):
       return self.time_input_dim * 4



 @property
 def 						UpperCamelCase__					(     self ):
       return 1_00



 @property
 def 						UpperCamelCase__					(     self ):
       snake_case_	=				CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip''' )
       return tokenizer



 @property
 def 						UpperCamelCase__					(     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=37		,				layer_norm_eps=1E-05		,				num_attention_heads=4		,				num_hidden_layers=5		,				pad_token_id=1		,				vocab_size=10_00		,				)
       return CLIPTextModelWithProjection(_UpperCAmelCase )



 @property
 def 						UpperCamelCase__					(     self ):
       torch.manual_seed(0 )

       snake_case_	=				{
           '''num_attention_heads''': 2,
           '''attention_head_dim''': 12,
           '''embedding_dim''': self.text_embedder_hidden_size,
           '''num_layers''': 1,
       }

       snake_case_	=				PriorTransformer(**_UpperCAmelCase )
       # 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
       snake_case_	=				nn.Parameter(torch.ones(model.clip_std.shape ) )
       return model



 @property
 def 						UpperCamelCase__					(     self ):
       torch.manual_seed(0 )
       snake_case_	=				CLIPVisionConfig(
           hidden_size=self.text_embedder_hidden_size		,				image_size=2_24		,				projection_dim=self.text_embedder_hidden_size		,				intermediate_size=37		,				num_attention_heads=4		,				num_channels=3		,				num_hidden_layers=5		,				patch_size=14		,				)

       snake_case_	=				CLIPVisionModelWithProjection(_UpperCAmelCase )
       return model



 @property
 def 						UpperCamelCase__					(     self ):
       snake_case_	=				CLIPImageProcessor(
           crop_size=2_24		,				do_center_crop=_UpperCAmelCase		,				do_normalize=_UpperCAmelCase		,				do_resize=_UpperCAmelCase		,				image_mean=[0.48_145_466, 0.4_578_275, 0.40_821_073]		,				image_std=[0.26_862_954, 0.26_130_258, 0.27_577_711]		,				resample=3		,				size=2_24		,				)

       return image_processor



 def 						UpperCamelCase__					(     self ):
       snake_case_	=				self.dummy_prior
       snake_case_	=				self.dummy_image_encoder
       snake_case_	=				self.dummy_text_encoder
       snake_case_	=				self.dummy_tokenizer
       snake_case_	=				self.dummy_image_processor

       snake_case_	=				UnCLIPScheduler(
           variance_type='''fixed_small_log'''		,				prediction_type='''sample'''		,				num_train_timesteps=10_00		,				clip_sample=_UpperCAmelCase		,				clip_sample_range=10.0		,				)

       snake_case_	=				{
           '''prior''': prior,
           '''image_encoder''': image_encoder,
           '''text_encoder''': text_encoder,
           '''tokenizer''': tokenizer,
           '''scheduler''': scheduler,
           '''image_processor''': image_processor,
       }

       return components



 def 						UpperCamelCase__					(     self		,				_UpperCAmelCase		,				_UpperCAmelCase=0 ):
       if str(_UpperCAmelCase ).startswith('''mps''' ):
             snake_case_	=				torch.manual_seed(_UpperCAmelCase )
       else:
             snake_case_	=				torch.Generator(device=_UpperCAmelCase ).manual_seed(_UpperCAmelCase )
       snake_case_	=				{
           '''prompt''': '''horse''',
           '''generator''': generator,
           '''guidance_scale''': 4.0,
           '''num_inference_steps''': 2,
           '''output_type''': '''np''',
       }
       return inputs



 def 						UpperCamelCase__					(     self ):
       snake_case_	=				'''cpu'''

       snake_case_	=				self.get_dummy_components()

       snake_case_	=				self.pipeline_class(**_UpperCAmelCase )
       snake_case_	=				pipe.to(_UpperCAmelCase )

       pipe.set_progress_bar_config(disable=_UpperCAmelCase )

       snake_case_	=				pipe(**self.get_dummy_inputs(_UpperCAmelCase ) )
       snake_case_	=				output.image_embeds

       snake_case_	=				pipe(
           **self.get_dummy_inputs(_UpperCAmelCase )		,				return_dict=_UpperCAmelCase		,				)[0]

       snake_case_	=				image[0, -10:]
       snake_case_	=				image_from_tuple[0, -10:]

       assert image.shape == (1, 32)

       snake_case_	=				np.array(
           [-0.0_532, 1.7_120, 0.3_656, -1.0_852, -0.8_946, -1.1_756, 0.4_348, 0.2_482, 0.5_146, -0.1_156] )

       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 						UpperCamelCase__					(     self ):
       snake_case_	=				torch_device == '''cpu'''
       snake_case_	=				True
       snake_case_	=				False

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





 @skip_mps
 def 						UpperCamelCase__					(     self ):
       snake_case_	=				torch_device == '''cpu'''
       snake_case_	=				False

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



import numpy as np

import datasets


UpperCAmelCase      =   """
Compute the Mahalanobis Distance

Mahalonobis distance is the distance between a point and a distribution.
And not between two distinct points. It is effectively a multivariate equivalent of the Euclidean distance.
It was introduced by Prof. P. C. Mahalanobis in 1936
and has been used in various statistical applications ever since
[source: https://www.machinelearningplus.com/statistics/mahalanobis-distance/]
"""

UpperCAmelCase      =   """\
@article{de2000mahalanobis,
  title={The mahalanobis distance},
  author={De Maesschalck, Roy and Jouan-Rimbaud, Delphine and Massart, D{\'e}sir{\'e} L},
  journal={Chemometrics and intelligent laboratory systems},
  volume={50},
  number={1},
  pages={1--18},
  year={2000},
  publisher={Elsevier}
}
"""

UpperCAmelCase      =   """
Args:
    X: List of datapoints to be compared with the `reference_distribution`.
    reference_distribution: List of datapoints from the reference distribution we want to compare to.
Returns:
    mahalanobis: The Mahalonobis distance for each datapoint in `X`.
Examples:

    >>> mahalanobis_metric = datasets.load_metric(\"mahalanobis\")
    >>> results = mahalanobis_metric.compute(reference_distribution=[[0, 1], [1, 0]], X=[[0, 1]])
    >>> print(results)
    {'mahalanobis': array([0.5])}
"""







@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION ,						_KWARGS_DESCRIPTION	)
class lowerCAmelCase_						(			datasets.Metric	):

 '''simple docstring'''

 def 						UpperCamelCase__					(     self ):
       return datasets.MetricInfo(
           description=_DESCRIPTION		,				citation=_CITATION		,				inputs_description=_KWARGS_DESCRIPTION		,				features=datasets.Features(
               {
                   '''X''': datasets.Sequence(datasets.Value('''float'''		,				id='''sequence''' )		,				id='''X''' ),
               } )		,				)





 def 						UpperCamelCase__					(     self		,				_UpperCAmelCase		,				_UpperCAmelCase ):
       # convert to numpy arrays
       snake_case_	=				np.array(_UpperCAmelCase )
       snake_case_	=				np.array(_UpperCAmelCase )

       # Assert that arrays are 2D
       if len(X.shape ) != 2:
             raise ValueError('''Expected `X` to be a 2D vector''' )
       if len(reference_distribution.shape ) != 2:
             raise ValueError('''Expected `reference_distribution` to be a 2D vector''' )
       if reference_distribution.shape[0] < 2:
             raise ValueError(
                 '''Expected `reference_distribution` to be a 2D vector with more than one element in the first dimension''' )

       # Get mahalanobis distance for each prediction
       snake_case_	=				X - np.mean(_UpperCAmelCase )
       snake_case_	=				np.cov(reference_distribution.T )
       try:
             snake_case_	=				np.linalg.inv(_UpperCAmelCase )
       except np.linalg.LinAlgError:
             snake_case_	=				np.linalg.pinv(_UpperCAmelCase )
       snake_case_	=				np.dot(_UpperCAmelCase		,				_UpperCAmelCase )
       snake_case_	=				np.dot(_UpperCAmelCase		,				X_minus_mu.T ).diagonal()

       return {"mahalanobis": mahal_dist}