public void JointEntropyTest()
        {
            var a = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
            var b = new[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 };

            Assert.AreEqual(4, PipExtensions.JointEntropy(a, b), 1e-300);
        }
        public void MutualInformationTest()
        {
            var a = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
            var b = new[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 };

            Assert.AreEqual(1, PipExtensions.MutualInformation(a, b), 1e-300);
        }
        public void MinkowskiDistanceTest()
        {
            var v1         = new[] { 1.0, 2, 3, 4, 5 };
            var v2         = new[] { -1.0, 0, 3, 2, 8 };
            var distanceL1 = PipExtensions.MinkowskiDistance(v1, v2, 1);
            var distanceL2 = PipExtensions.MinkowskiDistance(v1, v2, 2);

            Assert.AreEqual(9, distanceL1, 1e-300);
            Assert.AreEqual(Math.Sqrt(21), distanceL2, 1e-300);
        }
        public void HammingDistanceTest()
        {
            var v1 = new[] { 1.0, 2, 3, 4, 5 };
            var v2 = new[] { -1.0, 0, 3, 2, 8 };
            var s1 = "abcdef".ToCharArray();
            var s2 = "axcyzf".ToCharArray();
            var d1 = PipExtensions.HammingDistance(v1, v2);
            var d2 = PipExtensions.HammingDistance(s1, s2);

            Assert.AreEqual(4, d1);
            Assert.AreEqual(3, d2);
        }
        public void QFunctionTest()
        {
            var array = new[]
            {
                0.0, 0.1, 0.2, 0.3, 0.4, -0.5, -1.0, -1.5, -2.0, -3.0
            };
            var ans = new[]
            {
                0.500000000, 0.460172163, 0.420740291, 0.382088578, 0.344578258,
                0.308537539, 0.158655254, 0.066807201, 0.022750132, 0.001349898
            };

            for (var i = 0; i < array.Length; i++)
            {
                Assert.AreEqual(ans[i], PipExtensions.QFunction(array[i], 0, 1), 1e-6);
            }
        }
        public void ErfTest()
        {
            var array = new[]
            {
                0.00, 0.05, 0.10, 0.20, 0.30, 0.40, 0.50, 1.00, 1.50, 2.00
            };
            var ans = new[]
            {
                0.0000000, 0.0563720, 0.1124629, 0.2227026, 0.3286268,
                0.4283924, 0.5204999, 0.8427008, 0.9661051, 0.9953223
            };

            for (var i = 0; i < array.Length; i++)
            {
                Assert.AreEqual(ans[i], PipExtensions.Erf(array[i]), 1e-6);
            }
        }