@@ -17,7 +17,7 @@ class HierarchicalIndex_Brief100K : public FLANNTestFixture
17
17
typedef Distance::ResultType DistanceType;
18
18
flann::Matrix<unsigned char > data;
19
19
flann::Matrix<unsigned char > query;
20
- flann::Matrix<size_t > match ;
20
+ flann::Matrix<size_t > gt_indices ;
21
21
flann::Matrix<DistanceType> dists;
22
22
flann::Matrix<DistanceType> gt_dists;
23
23
flann::Matrix<size_t > indices;
@@ -30,279 +30,79 @@ class HierarchicalIndex_Brief100K : public FLANNTestFixture
30
30
fflush (stdout);
31
31
flann::load_from_file (data, " brief100K.h5" , " dataset" );
32
32
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
-
37
33
printf (" done\n " );
38
34
39
- // The matches are bogus so we compute them the hard way
40
- // flann::load_from_file(match,"brief100K.h5","indices");
41
-
42
35
flann::Index<Distance> index (data, flann::LinearIndexParams ());
43
36
index.buildIndex ();
44
37
45
38
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_);
47
40
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 ));
49
42
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_);
50
46
}
51
47
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
+ }
61
57
};
62
58
63
59
64
-
65
60
TEST_F (HierarchicalIndex_Brief100K, TestSearch)
66
61
{
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);
79
64
}
80
65
81
- TEST_F (HierarchicalIndex_Brief100K, TestIncremental )
66
+ TEST_F (HierarchicalIndex_Brief100K, TestAddIncremental )
82
67
{
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);
101
70
}
102
71
103
- TEST_F (HierarchicalIndex_Brief100K, TestIncremental2 )
72
+ TEST_F (HierarchicalIndex_Brief100K, TestAddIncremental2 )
104
73
{
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);
123
76
}
124
77
125
78
TEST_F (HierarchicalIndex_Brief100K, TestRemove)
126
79
{
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 ));
193
82
}
194
83
195
84
TEST_F (HierarchicalIndex_Brief100K, TestSave)
196
85
{
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);
221
88
}
222
89
223
90
224
91
TEST_F (HierarchicalIndex_Brief100K, TestCopy)
225
92
{
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);
262
95
}
263
96
264
97
TEST_F (HierarchicalIndex_Brief100K, TestCopy2)
265
98
{
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);
301
101
}
302
102
303
103
304
104
int main (int argc, char ** argv)
305
105
{
306
- testing::InitGoogleTest (&argc, argv);
307
- return RUN_ALL_TESTS ();
106
+ testing::InitGoogleTest (&argc, argv);
107
+ return RUN_ALL_TESTS ();
308
108
}
0 commit comments