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())