


'''simple docstring'''
import numpy as np

import datasets


UpperCAmelCase_ :     List[str]								=      '\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'

UpperCAmelCase_ :     str								=      '\\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'

UpperCAmelCase_ :     str								=      '\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				):




 '''simple docstring'''


 def  snake_case__   (      self						):

  """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  snake_case__   (      self      ,      __lowercase      ,      __lowercase						):

  """simple docstring"""







  __A  :		Dict       =			np.array(__lowercase						)
  __A  :		Dict       =			np.array(__lowercase						)

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

  return {"mahalanobis": mahal_dist}










'''simple docstring'''
from collections.abc import Sequence


def 			_lowercase       (				UpperCamelCase__       :					Sequence[float],				UpperCamelCase__       :					float			):
 return sum(c * (x**i) for i, c in enumerate(UpperCamelCase__			)			)


def 			_lowercase       (				UpperCamelCase__       :					Sequence[float],				UpperCamelCase__       :					float			):
 __A  :		Optional[Any]       =			0.0
 for coeff in reversed(UpperCamelCase__			):
  __A  :		List[str]       =			result * x + coeff
 return result


if __name__ == "__main__":
 UpperCAmelCase_ :     Any								=      (0.0, 0.0, 5.0, 9.3, 7.0)
 UpperCAmelCase_ :     Any								=      10.0
 print(evaluate_poly(poly, x))
 print(horner(poly, x))






