Esempio n. 1
0
class TestKDTree(unittest.TestCase):
    def setUp(self):
        self.dim = 3
        self.count = 20
        points = np.random.randint(low=0, high=20,
                                   size=(self.count, self.dim)).tolist()

        self.tree = KDTree(self.dim)
        for p in points:
            self.tree.insert(p)

        np.random.shuffle(points)
        self.points = points

    def test_contain(self):
        for p in self.points:
            self.assertTrue(self.tree.contain(p))

        random_points = np.random.randint(low=30, size=(self.count,
                                                        self.dim)).tolist()
        for p in random_points:
            self.assertFalse(self.tree.contain(p))

    def test_find_min(self):
        for d in range(self.dim):
            sorted_at_dim = sorted(self.points, key=operator.itemgetter(d))
            min_at_dim = sorted_at_dim[0][d]
            candidate_min_at_dim = list(
                filter(lambda point: point[d] == min_at_dim, sorted_at_dim))

            self.assertIn(self.tree.find_min(d, 0, self.tree.root),
                          candidate_min_at_dim)

    def test_delete(self):
        for p in self.points:
            self.tree.delete(p)
            self.assertFalse(self.tree.contain(p))

    def test_nearest_neighbor(self):
        for p in self.points:
            self.assertListEqual(self.tree.find_nearest(p), p)

        random_points = np.random.randint(low=0, high=20, size=(20, self.dim))
        for p in random_points:
            nearest_point = self.tree.find_nearest(p)
            points = np.array(self.points)

            self.assertEqual(min(linalg.norm(points - p, axis=1)),
                             linalg.norm(nearest_point - p))

    def test_k_nearest_neighbor(self):
        for p in self.points:
            self.assertListEqual(self.tree.find_k_nearest(p, 1), [p])

        random_points = np.random.randint(low=0, high=20, size=(20, self.dim))
        for p in random_points:
            nearest_points = self.tree.find_k_nearest(p, 5)
            nearest_points = np.array(nearest_points)
            points = np.unique(self.points, axis=0)

            n_dists = linalg.norm(nearest_points - p, axis=1)
            dists = np.sort(linalg.norm(points - p, axis=1))[:5]

            self.assertListEqual(n_dists.tolist(), dists.tolist())