

'''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__						:       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__						:       Tuple										=						"\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     a			(				datasets.Metric       ):






						"""simple docstring"""




						def       __magic_name__							(							self					:      Tuple  ):



								'''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       __magic_name__							(							self					:      Dict			,			snake_case_					:      Any			,			snake_case_					:      List[Any]  ):



								'''simple docstring'''



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

								return {"mahalanobis": mahal_dist}






'''simple docstring'''


def 	_a       (				__lowerCAmelCase		:      int     ):

		"""simple docstring"""

		if p < 2:
				raise ValueError('''p should not be less than 2!'''     )
		elif p == 2:
				return True

		snake_case__						:       Any       						=  4
		snake_case__						:       int       						=  (1 << p) - 1
		for _ in range(p - 2     ):
				snake_case__						:       Tuple       						=  ((s * s) - 2) % m
		return s == 0


if __name__ == "__main__":
					print(lucas_lehmer_test(7))
					print(lucas_lehmer_test(11))



