'''simple docstring'''

import numpy as np

import datasets


lowerCAmelCase_ : Optional[int]						  =      "\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"

lowerCAmelCase_ : Optional[int]						  =      "\\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"

lowerCAmelCase_ : Union[str, 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 							lowercase						(						datasets.Metric ):


   def __UpperCAmelCase       (   self				:	Tuple)      ->					Optional[int]:
         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				:	List[str]   ,		__lowerCAmelCase				:	Union[str, Any]   ,		__lowerCAmelCase				:	Union[str, Any])      ->					int:
         # convert to numpy arrays
         lowercase_     =      np.array(__lowerCAmelCase)
         lowercase_     =      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
         lowercase_     =      X - np.mean(__lowerCAmelCase)
         lowercase_     =      np.cov(reference_distribution.T)
         try:
               lowercase_     =      np.linalg.inv(__lowerCAmelCase)
         except np.linalg.LinAlgError:
               lowercase_     =      np.linalg.pinv(__lowerCAmelCase)
         lowercase_     =      np.dot(__lowerCAmelCase   ,		__lowerCAmelCase)
         lowercase_     =      np.dot(__lowerCAmelCase   ,		X_minus_mu.T).diagonal()

         return {"mahalanobis": mahal_dist}







'''simple docstring'''

def __a (	__lowerCamelCase			:						int = 600_851_475_143				)	->							int:
      '''simple docstring'''


      try:
            lowercase_     =      int(__lowerCamelCase				)
      except (TypeError, ValueError):
            raise TypeError("Parameter n must be int or castable to int."				)
      if n <= 0:
            raise ValueError("Parameter n must be greater than or equal to one."				)
      lowercase_     =      1
      lowercase_     =      2
      while i * i <= n:
            while n % i == 0:
                  lowercase_     =      i
                  n //= i
            i += 1
      if n > 1:
            lowercase_     =      n
      return int(__lowerCamelCase				)


if __name__ == "__main__":
       print(F'''{solution() = }''')






