def test_statistics(self): self.a = Distribution(cyclic=True) self.a.add({0.0: 0.0, pi / 2: 1.0}) self.assertAlmostEqual(vector_sum(self.a)[0], 1.0) self.assertAlmostEqual(weighted_average(self.a), pi / 2) self.assertAlmostEqual(vector_sum(self.a)[1], weighted_average(self.a)) self.assertAlmostEqual(selectivity(self.a), 1.0) self.a.add({-pi / 2: 1.0}) # (should be like 3pi/2) self.assertAlmostEqual(vector_sum(self.a)[0], 0.0) self.assertAlmostEqual(weighted_average(self.a), 0.0) self.assertAlmostEqual(selectivity(self.a), 0.0) self.a.add({3 * pi / 8: 0.3}) self.assertAlmostEqual(vector_sum(self.a)[0], 0.3) self.assertAlmostEqual(weighted_average(self.a), 3 * pi / 8) self.assertAlmostEqual(selectivity(self.a), vector_sum(self.a)[0] / 2.3) self.c = Distribution((0.0, 1.0), cyclic=True) self.c.add({0.0: 1.0, 0.25: 1.0}) self.assertAlmostEqual(vector_sum(self.c)[0], (1.0 + 1.0)**0.5) self.assertAlmostEqual(weighted_average(self.c), vector_sum(self.c)[1]) self.assertEqual(vector_sum(self.c)[1], atan2(1.0, 1.0) / (2 * pi)) self.c.add({1.75: 1.0}) # added beyond bounds self.assertAlmostEqual(vector_sum(self.c)[0], 1.0) self.assertEqual(weighted_average(self.c), 0.0) self.d = Distribution(axis_bounds=(0.0, 1.0), cyclic=False, keep_peak=False) self.assertEqual(self.d.undefined_vals, 0) self.assertAlmostEqual(selectivity(self.d), 1.0) self.d.add({0.0: 0.0}) self.assertAlmostEqual(selectivity(self.d), 1.0) self.d.add({0.5: 0.0}) self.assertAlmostEqual(selectivity(self.d), 0.0) # note that selectivity() actually includes a call to DSF_WeightedAverage self.assertEqual(self.d.undefined_vals, 4) self.assertAlmostEqual(weighted_average(self.d), 0.0) self.assertEqual(self.d.undefined_vals, 6) self.d.add({0.0: 1.0}) self.assertAlmostEqual(selectivity(self.d), 1.0) self.assertEqual(self.d.undefined_vals, 6) self.d.add({0.5: 1.0}) self.assertAlmostEqual(selectivity(self.d), 0.0) self.d.add({0.75: 2.0}) self.assertAlmostEqual(selectivity(self.d), 0.25)
def setUp(self): self.h = Distribution((0.0, 5.0)) self.h.add({0: 0.0}) self.h.add({1: 0.1}) self.h.add({2: 0.2}) self.h.add({2: 0.2}) self.h.add({3: 0.3}) self.h.add({3: 0.3}) self.h.add({3: 0.3}) self.h.add({4: 0.4}) self.h.add({4: 0.4}) self.h.add({4: 0.4}) self.h.add({4: 0.4}) self.h.add({5: 0.5}) self.h.add({5: 0.5}) self.h.add({5: 0.5}) self.h.add({5: 0.5}) self.h.add({5: 0.5}) self.g = copy.deepcopy(self.h) self.g.add({0: 0.0}) self.g.add({1: 0.1}) self.g.add({2: 0.2}) self.g.add({3: 0.3}) self.g.add({4: 0.4}) self.g.add({5: 0.5})
def test_lissom_statistics(self): self.assertEqual(len(self.h.values()), 6) self.assertAlmostEqual(self.h.total_value, 5.5) self.assertEqual(self.h.total_count, 16) self.assertAlmostEqual(max(self.h.values()), 2.5) self.assertAlmostEqual(min(self.h.values()), 0.0) self.assertEqual(max(self.h.counts()), 5) self.assertEqual(min(self.h.counts()), 1) self.assertAlmostEqual(self.g.total_value, 7.0) self.assertEqual(self.g.total_count, 22) self.assertAlmostEqual(sum(self.g.values()), 7.0) self.assertAlmostEqual(self.g.weighted_sum(), 28.0) # (should return _weighted_average:) self.assertAlmostEqual(weighted_average(self.g), 28.0 / sum(self.g.values())) self.assertAlmostEqual(vector_sum(self.g)[1], 4.40449904283) self.q = Distribution((0, 4), cyclic=True) self.q.add({3: 1}) self.q.add({0: 0, 1: 0, 2: 0, 4: 0}) self.assertAlmostEqual(vector_sum(self.q)[0], 1.0) self.assertAlmostEqual(weighted_average(self.q), 3.0) self.assertAlmostEqual(vector_sum(self.q)[1], 3.0) # Example where this matches LISSOM by using an empty bin at 5. self.rr = Distribution( (0, 5), cyclic=True ) # 5 because in the L. test example 0 and 4 are distinct self.rr.add({0: 1, 1: 1, 2: 1, 3: 1, 4: 1}) self.assertAlmostEqual(vector_sum(self.rr)[0], 0.0) self.assertAlmostEqual(weighted_average(self.rr), vector_sum(self.rr)[1]) self.rr.add({1: 2}) self.assertAlmostEqual(vector_sum(self.rr)[0], 2.0) self.assertAlmostEqual(weighted_average(self.rr), 1.0) self.rr.add({3: 2}) self.assertAlmostEqual(vector_sum(self.rr)[0], 2 * 2 * cos(2 * pi / 5)) self.assertAlmostEqual(weighted_average(self.rr), 2.0)
def test_lissom_peak_histogram(self): self.p = Distribution((0, 2), keep_peak=True) self.p.add({0: 1.0}) self.p.add({2: 9.9}) self.p.add({2: 3.3}) self.p.add({0: 1.0}) self.p.add({1: 0.3}) self.p.add({1: 84.0}) self.p.add({1: 36.0}) self.assertAlmostEqual(self.p.get_value(0), 1.0) self.assertAlmostEqual(self.p.get_value(1), 84.0) self.assertAlmostEqual(self.p.get_value(2), 9.9) self.assertEqual(self.p.get_count(0), 2) self.assertEqual(self.p.get_count(1), 3) self.assertEqual(self.p.get_count(2), 2)