



'''simple docstring'''


import numpy as np

import datasets


lowercase							       =			"\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							       =			"\\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							       =			"\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 	UpperCAmelCase	(		datasets.Metric):


	'''simple docstring'''




	def       lowercase_  (   self) ->      Optional[Any]:



						"""simple docstring"""







						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       lowercase_  (   self							,  lowerCAmelCase_							,  lowerCAmelCase_) ->      Optional[Any]:



						"""simple docstring"""







						a_       		=np.array(_UpperCamelCase)
						a_       		=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
						a_       		=X - np.mean(_UpperCamelCase)
						a_       		=np.cov(reference_distribution.T)
						try:
											a_       		=np.linalg.inv(_UpperCamelCase)
						except np.linalg.LinAlgError:
											a_       		=np.linalg.pinv(_UpperCamelCase)
						a_       		=np.dot(_UpperCamelCase							,  _UpperCamelCase)
						a_       		=np.dot(_UpperCamelCase							,  X_minus_mu.T).diagonal()

						return {"mahalanobis": mahal_dist}







'''simple docstring'''


from typing import Any

import numpy as np






def  UpperCAmelCase_       (		lowercase__       ):


     '''simple docstring'''







     return np.array_equal(lowercase__       ,	matrix.conjugate().T       )






def  UpperCAmelCase_       (		lowercase__       ,	lowercase__       ):


     '''simple docstring'''







     a_       		=v.conjugate().T
     a_       		=v_star.dot(lowercase__       )
     assert isinstance(lowercase__       ,	np.ndarray       )
     return (v_star_dot.dot(lowercase__       )) / (v_star.dot(lowercase__       ))






def  UpperCAmelCase_       (		):


     '''simple docstring'''







     a_       		=np.array([[2, 2 + 1j, 4], [2 - 1j, 3, 1j], [4, -1j, 1]]       )
     a_       		=np.array([[1], [2], [3]]       )
     assert is_hermitian(lowercase__       ), F"""{a} is not hermitian."""
     print(rayleigh_quotient(lowercase__       ,	lowercase__       )       )

     a_       		=np.array([[1, 2, 4], [2, 3, -1], [4, -1, 1]]       )
     assert is_hermitian(lowercase__       ), F"""{a} is not hermitian."""
     assert rayleigh_quotient(lowercase__       ,	lowercase__       ) == float(3       )


if __name__ == "__main__":
  import doctest

  doctest.testmod()
  tests()


