Skip to content

Commit b5a5846

Browse files
Michael Norrisfacebook-github-bot
Michael Norris
authored andcommitted
Add more unit testing for HNSW [3/n] (facebookresearch#4059)
Summary: Pull Request resolved: facebookresearch#4059 Add unit test to compare reference version with optimized version. Reviewed By: mengdilin Differential Revision: D66793367 fbshipit-source-id: 8da25e79f66d079f76d237c10fc3db4a0def767d
1 parent 713f379 commit b5a5846

File tree

3 files changed

+62
-7
lines changed

3 files changed

+62
-7
lines changed

faiss/impl/HNSW.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ void add_link(
351351
}
352352
}
353353

354+
} // namespace
355+
354356
/// search neighbors on a single level, starting from an entry point
355357
void search_neighbors_to_add(
356358
HNSW& hnsw,
@@ -359,10 +361,8 @@ void search_neighbors_to_add(
359361
int entry_point,
360362
float d_entry_point,
361363
int level,
362-
VisitedTable& vt) {
363-
// selects a version
364-
const bool reference_version = false;
365-
364+
VisitedTable& vt,
365+
bool reference_version) {
366366
// top is nearest candidate
367367
std::priority_queue<NodeDistFarther> candidates;
368368

@@ -385,7 +385,14 @@ void search_neighbors_to_add(
385385
size_t begin, end;
386386
hnsw.neighbor_range(currNode, level, &begin, &end);
387387

388-
// select a version, based on a flag
388+
// The reference version is not used, but kept here because:
389+
// 1. It is easier to switch back if the optimized version has a problem
390+
// 2. It serves as a starting point for new optimizations
391+
// 3. It helps understand the code
392+
// 4. It ensures the reference version is still compilable if the
393+
// optimized version changes
394+
// The reference and the optimized versions' results are compared in
395+
// test_hnsw.cpp
389396
if (reference_version) {
390397
// a reference version
391398
for (size_t i = begin; i < end; i++) {
@@ -470,8 +477,6 @@ void search_neighbors_to_add(
470477
vt.advance();
471478
}
472479

473-
} // namespace
474-
475480
/// Finds neighbors and builds links with them, starting from an entry
476481
/// point. The own neighbor list is assumed to be locked.
477482
void HNSW::add_links_starting_from(

faiss/impl/HNSW.h

+10
Original file line numberDiff line numberDiff line change
@@ -281,4 +281,14 @@ std::priority_queue<HNSW::Node> search_from_candidate_unbounded(
281281
VisitedTable* vt,
282282
HNSWStats& stats);
283283

284+
void search_neighbors_to_add(
285+
HNSW& hnsw,
286+
DistanceComputer& qdis,
287+
std::priority_queue<HNSW::NodeDistCloser>& results,
288+
int entry_point,
289+
float d_entry_point,
290+
int level,
291+
VisitedTable& vt,
292+
bool reference_version = false);
293+
284294
} // namespace faiss

tests/test_hnsw.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -541,3 +541,43 @@ TEST_F(HNSWTest, TEST_search_from_candidates) {
541541
EXPECT_EQ(reference_stats.n1, stats.n1);
542542
EXPECT_EQ(reference_stats.n2, stats.n2);
543543
}
544+
545+
TEST_F(HNSWTest, TEST_search_neighbors_to_add) {
546+
omp_set_num_threads(1);
547+
548+
faiss::VisitedTable vt(index->ntotal);
549+
faiss::VisitedTable reference_vt(index->ntotal);
550+
551+
std::priority_queue<faiss::HNSW::NodeDistCloser> link_targets;
552+
std::priority_queue<faiss::HNSW::NodeDistCloser> reference_link_targets;
553+
554+
faiss::search_neighbors_to_add(
555+
index->hnsw,
556+
*dis,
557+
link_targets,
558+
index->hnsw.entry_point,
559+
(*dis)(index->hnsw.entry_point),
560+
index->hnsw.max_level,
561+
vt,
562+
false);
563+
564+
faiss::search_neighbors_to_add(
565+
index->hnsw,
566+
*dis,
567+
reference_link_targets,
568+
index->hnsw.entry_point,
569+
(*dis)(index->hnsw.entry_point),
570+
index->hnsw.max_level,
571+
reference_vt,
572+
true);
573+
574+
EXPECT_EQ(link_targets.size(), reference_link_targets.size());
575+
while (!link_targets.empty()) {
576+
auto val = link_targets.top();
577+
auto reference_val = reference_link_targets.top();
578+
EXPECT_EQ(val.d, reference_val.d);
579+
EXPECT_EQ(val.id, reference_val.id);
580+
link_targets.pop();
581+
reference_link_targets.pop();
582+
}
583+
}

0 commit comments

Comments
 (0)