public void IsMetricTest()
{
Assert.IsTrue(Distance.IsMetric(Distance.Euclidean));
Assert.IsTrue(Distance.IsMetric((double[] a, double[] b) => Distance.Manhattan(a, b)));
Assert.IsTrue(Distance.IsMetric((int[] a, int[] b) => Distance.Manhattan(a, b)));
Assert.IsFalse(Distance.IsMetric(Distance.Hamming));
Assert.IsTrue(Distance.IsMetric((double[] a, double[] b) => new Minkowski(1).Distance(a, b)));
Assert.IsTrue(Distance.IsMetric((double[] a, double[] b) => new Levenshtein<double>().Distance(a, b)));
Assert.IsTrue(Distance.IsMetric(Distance.Chebyshev));
Assert.IsTrue(Distance.IsMetric(Distance.Hellinger));
Assert.IsFalse(Distance.IsMetric(Distance.Cosine));
Assert.IsFalse(Distance.IsMetric(Distance.SquareEuclidean));
Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Math.Pow(Distance.Manhattan(a, b), 2)));
Assert.IsFalse(Distance.IsMetric(Distance.BrayCurtis));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => new Minkowski(2).Distance(a, b)));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => new Minkowski(3).Distance(a, b)));
Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Distance.Kulczynski(a, b)));
Assert.IsTrue(Distance.IsMetric((double[] a, double[] b) => Distance.Jaccard(a, b)));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Distance.RogersTanimoto(a, b)));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Distance.SokalMichener(a, b)));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Distance.SokalSneath(a, b)));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Distance.Yule(a, b)));
// Assert.IsFalse(Distance.IsMetric((double[] a, double[] b) => Distance.Dice(a, b)));
Assert.IsTrue(Distance.IsMetric<double[]>(new Euclidean()));
Assert.IsTrue(Distance.IsMetric<double[]>(new Manhattan()));
Assert.IsFalse(Distance.IsMetric<double[]>(new Hamming()));
Assert.IsTrue(Distance.IsMetric<double[]>(new Minkowski(1)));
Assert.IsTrue(Distance.IsMetric(new Levenshtein()));
Assert.IsTrue(Distance.IsMetric(new Chebyshev()));
Assert.IsFalse(Distance.IsMetric(new Cosine()));
Assert.IsTrue(Distance.IsMetric(new Hellinger()));
Assert.IsFalse(Distance.IsMetric(new SquareEuclidean()));
Assert.IsFalse(Distance.IsMetric(new BrayCurtis()));
// Assert.IsFalse(Distance.IsMetric<double[]>(new Minkowski(2)));
// Assert.IsFalse(Distance.IsMetric<double[]>(new Minkowski(3)));
Assert.IsFalse(Distance.IsMetric<double[]>(new Kulczynski()));
Assert.IsTrue(Distance.IsMetric<double[]>(new Jaccard<double>()));
Assert.IsFalse(Distance.IsMetric<double[]>(new RogersTanimoto()));
Assert.IsFalse(Distance.IsMetric<double[]>(new SokalMichener()));
Assert.IsFalse(Distance.IsMetric<double[]>(new SokalSneath()));
Assert.IsFalse(Distance.IsMetric<double[]>(new Yule()));
Assert.IsFalse(Distance.IsMetric<double[]>(new Dice()));
// Assert.IsFalse(Distance.IsMetric(Dissimilarity.RusselRao));
}
}