

"""simple docstring"""






import numpy as np

import datasets


_lowercase				:				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"

_lowercase				:				Tuple   		=		"\\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				:				List[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  __SCREAMING_SNAKE_CASE			(   datasets.Metric     ):


					'''simple docstring'''





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

								return {"mahalanobis": mahal_dist}









"""simple docstring"""






def   snake_case__     (	__lowerCamelCase       :					int = 10							,	__lowerCamelCase       :					int = 22			):
			"""simple docstring"""
			lowerCamelCase__	:	Optional[Any]				=range(1							,	__lowerCamelCase			)
			lowerCamelCase__	:	str				=range(1							,	__lowerCamelCase			)
			return sum(
			    1 for power in powers for base in bases if len(str(base**power			)			) == power			)


if __name__ == "__main__":
		print(f'{solution(1_0, 2_2) = }')




