Skip to content

Commit 3d54f78

Browse files
committed
Refactored unit tests
1 parent 1518619 commit 3d54f78

7 files changed

+773
-1750
lines changed

test/flann_hierarchical_test.cpp

Lines changed: 33 additions & 233 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class HierarchicalIndex_Brief100K : public FLANNTestFixture
1717
typedef Distance::ResultType DistanceType;
1818
flann::Matrix<unsigned char> data;
1919
flann::Matrix<unsigned char> query;
20-
flann::Matrix<size_t> match;
20+
flann::Matrix<size_t> gt_indices;
2121
flann::Matrix<DistanceType> dists;
2222
flann::Matrix<DistanceType> gt_dists;
2323
flann::Matrix<size_t> indices;
@@ -30,279 +30,79 @@ class HierarchicalIndex_Brief100K : public FLANNTestFixture
3030
fflush(stdout);
3131
flann::load_from_file(data, "brief100K.h5", "dataset");
3232
flann::load_from_file(query, "brief100K.h5", "query");
33-
34-
dists = flann::Matrix<DistanceType>(new DistanceType[query.rows * k_nn_], query.rows, k_nn_);
35-
indices = flann::Matrix<size_t>(new size_t[query.rows * k_nn_], query.rows, k_nn_);
36-
3733
printf("done\n");
3834

39-
// The matches are bogus so we compute them the hard way
40-
// flann::load_from_file(match,"brief100K.h5","indices");
41-
4235
flann::Index<Distance> index(data, flann::LinearIndexParams());
4336
index.buildIndex();
4437

4538
start_timer("Searching KNN for ground truth...");
46-
match = flann::Matrix<size_t>(new size_t[query.rows * k_nn_], query.rows, k_nn_);
39+
gt_indices = flann::Matrix<size_t>(new size_t[query.rows * k_nn_], query.rows, k_nn_);
4740
gt_dists = flann::Matrix<DistanceType>(new DistanceType[query.rows * k_nn_], query.rows, k_nn_);
48-
index.knnSearch(query, match, gt_dists, k_nn_, flann::SearchParams(-1));
41+
index.knnSearch(query, gt_indices, gt_dists, k_nn_, flann::SearchParams(-1));
4942
printf("done (%g seconds)\n", stop_timer());
43+
44+
dists = flann::Matrix<DistanceType>(new DistanceType[query.rows * k_nn_], query.rows, k_nn_);
45+
indices = flann::Matrix<size_t>(new size_t[query.rows * k_nn_], query.rows, k_nn_);
5046
}
5147

52-
void TearDown()
53-
{
54-
delete[] data.ptr();
55-
delete[] query.ptr();
56-
delete[] match.ptr();
57-
delete[] gt_dists.ptr();
58-
delete[] dists.ptr();
59-
delete[] indices.ptr();
60-
}
48+
void TearDown()
49+
{
50+
delete[] data.ptr();
51+
delete[] query.ptr();
52+
delete[] dists.ptr();
53+
delete[] indices.ptr();
54+
delete[] gt_indices.ptr();
55+
delete[] gt_dists.ptr();
56+
}
6157
};
6258

6359

64-
6560
TEST_F(HierarchicalIndex_Brief100K, TestSearch)
6661
{
67-
flann::Index<Distance> index(data, flann::HierarchicalClusteringIndexParams());
68-
start_timer("Building hierarchical clustering index...");
69-
index.buildIndex();
70-
printf("done (%g seconds)\n", stop_timer());
71-
72-
start_timer("Searching KNN...");
73-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
74-
printf("done (%g seconds)\n", stop_timer());
75-
76-
float precision = computePrecisionDiscrete(gt_dists, dists);
77-
EXPECT_GE(precision, 0.9);
78-
printf("Precision: %g\n", precision);
62+
TestSearch<Distance>(data, flann::HierarchicalClusteringIndexParams(),
63+
query, indices, dists, k_nn_, flann::SearchParams(2000), 0.9, gt_indices, gt_dists);
7964
}
8065

81-
TEST_F(HierarchicalIndex_Brief100K, TestIncremental)
66+
TEST_F(HierarchicalIndex_Brief100K, TestAddIncremental)
8267
{
83-
size_t size1 = data.rows/2-1;
84-
size_t size2 = data.rows-size1;
85-
Matrix<ElementType> data1(data[0], size1, data.cols);
86-
Matrix<ElementType> data2(data[size1], size2, data.cols);
87-
88-
flann::Index<Distance> index(data1, flann::HierarchicalClusteringIndexParams());
89-
start_timer("Building hierarchical clustering index...");
90-
index.buildIndex();
91-
index.addPoints(data2);
92-
printf("done (%g seconds)\n", stop_timer());
93-
94-
start_timer("Searching KNN...");
95-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
96-
printf("done (%g seconds)\n", stop_timer());
97-
98-
float precision = computePrecisionDiscrete(gt_dists, dists);
99-
EXPECT_GE(precision, 0.87);
100-
printf("Precision: %g\n", precision);
68+
TestAddIncremental<Distance>(data, flann::HierarchicalClusteringIndexParams(),
69+
query, indices, dists, k_nn_, flann::SearchParams(2000), 0.87, gt_indices, gt_dists);
10170
}
10271

103-
TEST_F(HierarchicalIndex_Brief100K, TestIncremental2)
72+
TEST_F(HierarchicalIndex_Brief100K, TestAddIncremental2)
10473
{
105-
size_t size1 = data.rows/2+1;
106-
size_t size2 = data.rows-size1;
107-
Matrix<ElementType> data1(data[0], size1, data.cols);
108-
Matrix<ElementType> data2(data[size1], size2, data.cols);
109-
110-
flann::Index<Distance> index(data1, flann::HierarchicalClusteringIndexParams());
111-
start_timer("Building hierarchical clustering index...");
112-
index.buildIndex();
113-
index.addPoints(data2);
114-
printf("done (%g seconds)\n", stop_timer());
115-
116-
start_timer("Searching KNN...");
117-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
118-
printf("done (%g seconds)\n", stop_timer());
119-
120-
float precision = computePrecisionDiscrete(gt_dists, dists);
121-
EXPECT_GE(precision, 0.87);
122-
printf("Precision: %g\n", precision);
74+
TestAddIncremental2<Distance>(data, flann::HierarchicalClusteringIndexParams(),
75+
query, indices, dists, k_nn_, flann::SearchParams(2000), 0.87, gt_indices, gt_dists);
12376
}
12477

12578
TEST_F(HierarchicalIndex_Brief100K, TestRemove)
12679
{
127-
flann::Index<Distance> index(data, flann::HierarchicalClusteringIndexParams());
128-
start_timer("Building hierarchical clustering index...");
129-
index.buildIndex();
130-
printf("done (%g seconds)\n", stop_timer());
131-
132-
start_timer("Searching KNN before removing points...");
133-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000) );
134-
printf("done (%g seconds)\n", stop_timer());
135-
136-
// remove about 50% of neighbors found
137-
std::set<int> neighbors;
138-
for (size_t i=0;i<indices.rows;++i) {
139-
for (size_t j=0;j<indices.cols;++j) {
140-
if (rand_double()<0.5) {
141-
neighbors.insert(indices[i][j]);
142-
}
143-
}
144-
}
145-
146-
flann::DynamicBitset removed(data.rows);
147-
148-
for (std::set<int>::iterator it = neighbors.begin(); it!=neighbors.end();++it) {
149-
index.removePoint(*it);
150-
removed.set(*it);
151-
}
152-
153-
// also remove 10% of the initial points
154-
size_t offset = data.rows/10;
155-
for (size_t i=0;i<offset;++i) {
156-
index.removePoint(i);
157-
removed.set(i);
158-
}
159-
160-
size_t new_size = 0;
161-
for (size_t i=0;i<removed.size();++i) {
162-
if (!removed.test(i)) ++new_size;
163-
}
164-
165-
EXPECT_EQ(index.size(), new_size);
166-
167-
start_timer("Searching KNN after remove points...");
168-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000) );
169-
printf("done (%g seconds)\n", stop_timer());
170-
171-
for (size_t i=0;i<indices.rows;++i) {
172-
for (size_t j=0;j<indices.cols;++j) {
173-
EXPECT_GE(indices[i][j], offset);
174-
EXPECT_TRUE(neighbors.find(indices[i][j])==neighbors.end());
175-
}
176-
}
177-
178-
// rebuild index
179-
index.buildIndex();
180-
181-
EXPECT_EQ(index.size(), new_size);
182-
183-
start_timer("Searching KNN after remove points and rebuild index...");
184-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000) );
185-
printf("done (%g seconds)\n", stop_timer());
186-
187-
for (size_t i=0;i<indices.rows;++i) {
188-
for (size_t j=0;j<indices.cols;++j) {
189-
EXPECT_GE(indices[i][j], offset);
190-
EXPECT_TRUE(neighbors.find(indices[i][j])==neighbors.end());
191-
}
192-
}
80+
TestRemove<Distance>(data, flann::HierarchicalClusteringIndexParams(),
81+
query, indices, dists, k_nn_, flann::SearchParams(2000));
19382
}
19483

19584
TEST_F(HierarchicalIndex_Brief100K, TestSave)
19685
{
197-
198-
flann::Index<Distance> index(data, flann::HierarchicalClusteringIndexParams());
199-
start_timer("Building hierarchical clustering index...");
200-
index.buildIndex();
201-
printf("done (%g seconds)\n", stop_timer());
202-
203-
start_timer("Searching KNN...");
204-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
205-
printf("done (%g seconds)\n", stop_timer());
206-
207-
index.save("hierarchical_clustering_brief.idx");
208-
209-
printf("Loading hierarchical clustering index\n");
210-
flann::Index<Distance> index_saved(data, flann::SavedIndexParams("hierarchical_clustering_brief.idx"));
211-
212-
start_timer("Searching KNN...");
213-
index_saved.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
214-
printf("done (%g seconds)\n", stop_timer());
215-
216-
217-
float precision = computePrecisionDiscrete(gt_dists, dists);
218-
EXPECT_GE(precision, 0.9);
219-
printf("Precision: %g\n", precision);
220-
86+
TestSave<Distance>(data, flann::HierarchicalClusteringIndexParams(),
87+
query, indices, dists, k_nn_, flann::SearchParams(2000), 0.87, gt_indices, gt_dists);
22188
}
22289

22390

22491
TEST_F(HierarchicalIndex_Brief100K, TestCopy)
22592
{
226-
flann::Index<Distance> index(data, flann::HierarchicalClusteringIndexParams());
227-
start_timer("Building hierarchical clustering index...");
228-
index.buildIndex();
229-
printf("done (%g seconds)\n", stop_timer());
230-
231-
start_timer("Searching KNN...");
232-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
233-
printf("done (%g seconds)\n", stop_timer());
234-
235-
float precision = compute_precision(match, indices);
236-
printf("Precision: %g\n", precision);
237-
EXPECT_GE(precision, 0.75);
238-
239-
// test copy constructor
240-
flann::Index<Distance> index2(index);
241-
242-
start_timer("Searching KNN...");
243-
index2.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
244-
printf("done (%g seconds)\n", stop_timer());
245-
246-
float precision2 = compute_precision(match, indices);
247-
printf("Precision: %g\n", precision2);
248-
EXPECT_EQ(precision, precision2);
249-
250-
// test assignment operator
251-
flann::Index<Distance> index3(data, flann::HierarchicalClusteringIndexParams());
252-
index3 = index;
253-
254-
start_timer("Searching KNN...");
255-
index3.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
256-
printf("done (%g seconds)\n", stop_timer());
257-
258-
float precision3 = compute_precision(match, indices);
259-
printf("Precision: %g\n", precision3);
260-
EXPECT_EQ(precision, precision3);
261-
93+
TestCopy<Distance>(data, flann::HierarchicalClusteringIndexParams(),
94+
query, indices, dists, k_nn_, flann::SearchParams(2000), 0.87, gt_indices, gt_dists);
26295
}
26396

26497
TEST_F(HierarchicalIndex_Brief100K, TestCopy2)
26598
{
266-
flann::HierarchicalClusteringIndex<Distance> index(data, flann::HierarchicalClusteringIndexParams());
267-
start_timer("Building hierarchical clustering index...");
268-
index.buildIndex();
269-
printf("done (%g seconds)\n", stop_timer());
270-
271-
start_timer("Searching KNN...");
272-
index.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
273-
printf("done (%g seconds)\n", stop_timer());
274-
275-
float precision = compute_precision(match, indices);
276-
printf("Precision: %g\n", precision);
277-
EXPECT_GE(precision, 0.75);
278-
279-
// test copy constructor
280-
flann::HierarchicalClusteringIndex<Distance > index2(index);
281-
282-
start_timer("Searching KNN...");
283-
index2.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
284-
printf("done (%g seconds)\n", stop_timer());
285-
286-
float precision2 = compute_precision(match, indices);
287-
printf("Precision: %g\n", precision2);
288-
EXPECT_EQ(precision, precision2);
289-
290-
// test assignment operator
291-
flann::HierarchicalClusteringIndex<Distance> index3(data, flann::HierarchicalClusteringIndexParams());
292-
index3 = index;
293-
294-
start_timer("Searching KNN...");
295-
index3.knnSearch(query, indices, dists, k_nn_, flann::SearchParams(2000));
296-
printf("done (%g seconds)\n", stop_timer());
297-
298-
float precision3 = compute_precision(match, indices);
299-
printf("Precision: %g\n", precision3);
300-
EXPECT_EQ(precision, precision3);
99+
TestCopy2<flann::HierarchicalClusteringIndex<Distance> >(data, flann::HierarchicalClusteringIndexParams(),
100+
query, indices, dists, k_nn_, flann::SearchParams(2000), 0.87, gt_indices, gt_dists);
301101
}
302102

303103

304104
int main(int argc, char** argv)
305105
{
306-
testing::InitGoogleTest(&argc, argv);
307-
return RUN_ALL_TESTS();
106+
testing::InitGoogleTest(&argc, argv);
107+
return RUN_ALL_TESTS();
308108
}

0 commit comments

Comments
 (0)