import numpy as np

import datasets


lowercase_     :   Dict 				=				"\nCompute the Mahalanobis Distance\n\nMahalonobis distance is the distance between a point and a distribution.\nAnd not between two distinct points. It is effectively a multivariate equivalent of the Euclidean distance.\nIt was introduced by Prof. P. C. Mahalanobis in 1936\nand has been used in various statistical applications ever since\n[source: https://www.machinelearningplus.com/statistics/mahalanobis-distance/]\n"

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

lowercase_     :   Any 				=				"\nArgs:\n    X: List of datapoints to be compared with the `reference_distribution`.\n    reference_distribution: List of datapoints from the reference distribution we want to compare to.\nReturns:\n    mahalanobis: The Mahalonobis distance for each datapoint in `X`.\nExamples:\n\n    >>> mahalanobis_metric = datasets.load_metric(\"mahalanobis\")\n    >>> results = mahalanobis_metric.compute(reference_distribution=[[0, 1], [1, 0]], X=[[0, 1]])\n    >>> print(results)\n    {'mahalanobis': array([0.5])}\n"






@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION    ,     _KWARGS_DESCRIPTION    )
class 		_lowerCamelCase		(   datasets.Metric    ):
    def 						UpperCamelCase_				(  self   )       ->					Optional[Any]:
     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 , lowerCAmelCase , lowerCAmelCase   )       ->					List[str]:
     SCREAMING_SNAKE_CASE__:   Tuple=      np.array(lowerCAmelCase_   )
     SCREAMING_SNAKE_CASE__:   Dict=      np.array(lowerCAmelCase_   )

     # 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
     SCREAMING_SNAKE_CASE__:   Optional[int]=      X - np.mean(lowerCAmelCase_   )
     SCREAMING_SNAKE_CASE__:   List[Any]=      np.cov(reference_distribution.T   )
     try:
      SCREAMING_SNAKE_CASE__:   Optional[int]=      np.linalg.inv(lowerCAmelCase_   )
     except np.linalg.LinAlgError:
      SCREAMING_SNAKE_CASE__:   Optional[int]=      np.linalg.pinv(lowerCAmelCase_   )
     SCREAMING_SNAKE_CASE__:   List[str]=      np.dot(lowerCAmelCase_ , lowerCAmelCase_   )
     SCREAMING_SNAKE_CASE__:   str=      np.dot(lowerCAmelCase_ , X_minus_mu.T   ).diagonal()

     return {"mahalanobis": mahal_dist}


# tests directory-specific settings - this file is run automatically
# by pytest before any tests are run

import sys
import warnings
from os.path import abspath, dirname, join


# allow having multiple repository checkouts and not needing to remember to rerun
# 'pip install -e .[dev]' when switching between checkouts and running tests.
lowercase_     :   List[str] 				=				abspath(join(dirname(dirname(__file__)), 'src'))
sys.path.insert(1, git_repo_path)

# silence FutureWarning warnings in tests since often we can't act on them until
# they become normal warnings - i.e. the tests still need to test the current functionality
warnings.simplefilter(action='ignore', category=FutureWarning)







def 			A__      (	snake_case_ :		Optional[int]      ):
 from diffusers.utils.testing_utils import pytest_addoption_shared

 pytest_addoption_shared(snake_case_      )







def 			A__      (	snake_case_ :		Optional[int]      ):
 from diffusers.utils.testing_utils import pytest_terminal_summary_main

 SCREAMING_SNAKE_CASE__:   Optional[int]=      terminalreporter.config.getoption('''--make-reports'''      )
 if make_reports:
  pytest_terminal_summary_main(snake_case_       ,				id=snake_case_      )

