Truncate more often to prevent unnecessary looping
This commit is contained in:
parent
1d5cd4e6ec
commit
f627769667
|
@ -497,6 +497,9 @@ impl Search {
|
||||||
/// M * 2 links per node), but for performance reasons we often call this function on the data
|
/// M * 2 links per node), but for performance reasons we often call this function on the data
|
||||||
/// representation matching the zero layer even when we're referring to a higher layer. In that
|
/// representation matching the zero layer even when we're referring to a higher layer. In that
|
||||||
/// case, we use `links` to constrain the number of per-candidate links we consider for search.
|
/// case, we use `links` to constrain the number of per-candidate links we consider for search.
|
||||||
|
///
|
||||||
|
/// Invariants: `self.nearest` should be in sorted (nearest first) order, and should be
|
||||||
|
/// truncated to `self.ef`.
|
||||||
fn search<L: Layer, P: Point>(&mut self, point: &P, layer: L, points: &[P], links: usize) {
|
fn search<L: Layer, P: Point>(&mut self, point: &P, layer: L, points: &[P], links: usize) {
|
||||||
while let Some(Reverse(candidate)) = self.candidates.pop() {
|
while let Some(Reverse(candidate)) = self.candidates.pop() {
|
||||||
if let Some(furthest) = self.nearest.last() {
|
if let Some(furthest) = self.nearest.last() {
|
||||||
|
@ -508,9 +511,11 @@ impl Search {
|
||||||
for pid in layer.nearest_iter(candidate.pid).take(links) {
|
for pid in layer.nearest_iter(candidate.pid).take(links) {
|
||||||
self.push(pid, point, points);
|
self.push(pid, point, points);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
self.nearest.truncate(self.ef);
|
// If we don't truncate here, `furthest` will be further out than necessary, making
|
||||||
|
// us continue looping while we could have broken out.
|
||||||
|
self.nearest.truncate(self.ef);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_neighbor_heuristic<P: Point>(
|
fn add_neighbor_heuristic<P: Point>(
|
||||||
|
|
Loading…
Reference in New Issue