From f5913b783d2b58d88a65e668b4803b34efa2e9a2 Mon Sep 17 00:00:00 2001 From: ruvnet Date: Sun, 26 Apr 2026 16:00:14 -0400 Subject: [PATCH] =?UTF-8?q?fix(acorn):=20clippy=20clean-up=20=E2=80=94=20s?= =?UTF-8?q?ort=5Fby=5Fkey,=20is=5Fempty,=20redundant=20closures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI's `Clippy (deny warnings)` flagged three lints introduced by the previous optimization commit: - `unnecessary_sort_by` (graph.rs:158, 176) → use `sort_by_key` - `len_without_is_empty` (graph.rs) → add `AcornGraph::is_empty` and `if graph.is_empty()` in search.rs - `redundant_closure` (main.rs:65, 159, 160) → pass the predicate directly to `recall_at_k` instead of `|id| pred(id)` No semantic change. Co-Authored-By: claude-flow --- crates/ruvector-acorn/src/graph.rs | 8 ++++++-- crates/ruvector-acorn/src/main.rs | 6 +++--- crates/ruvector-acorn/src/search.rs | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/ruvector-acorn/src/graph.rs b/crates/ruvector-acorn/src/graph.rs index 3d412013..3fca3971 100644 --- a/crates/ruvector-acorn/src/graph.rs +++ b/crates/ruvector-acorn/src/graph.rs @@ -126,6 +126,10 @@ impl AcornGraph { self.data.len() / self.dim.max(1) } + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + /// Borrow vector `i` as a contiguous slice — the hot path for L2². #[inline(always)] pub fn row(&self, i: usize) -> &[f32] { @@ -155,7 +159,7 @@ pub fn flat_k_nearest(data: &[Vec], query: &[f32], k: usize) -> Vec { } } let mut out: Vec<(OrdF32, u32)> = heap.into_sorted_vec(); - out.sort_by(|a, b| a.0.cmp(&b.0)); + out.sort_by_key(|a| a.0); out.into_iter().map(|(_, id)| id).collect() } @@ -173,7 +177,7 @@ pub fn exact_filtered_knn( .filter(|&i| predicate(i as u32)) .map(|i| (OrdF32(l2_sq(&data[i], query)), i as u32)) .collect(); - scored.sort_by(|a, b| a.0.cmp(&b.0)); + scored.sort_by_key(|a| a.0); scored.truncate(k); scored.into_iter().map(|(_, id)| id).collect() } diff --git a/crates/ruvector-acorn/src/main.rs b/crates/ruvector-acorn/src/main.rs index fabf5b22..ddeadfb8 100644 --- a/crates/ruvector-acorn/src/main.rs +++ b/crates/ruvector-acorn/src/main.rs @@ -62,7 +62,7 @@ fn run_variant( sel_pct: f64, predicate: &(dyn Fn(u32) -> bool + Sync), ) { - let recall = recall_at_k(data, queries, K, |id| predicate(id), index); + let recall = recall_at_k(data, queries, K, predicate, index); let qps = bench_qps(index, queries, K, predicate); let mem_mb = index.memory_bytes() as f64 / 1_048_576.0; println!( @@ -156,8 +156,8 @@ fn main() { println!("{}", "-".repeat(44)); for sel_frac in [0.50, 0.20, 0.10, 0.05, 0.02, 0.01] { let pred = selectivity_predicate(N, sel_frac); - let r_flat = recall_at_k(&data, &queries, K, |id| pred(id), &flat); - let r_acorn = recall_at_k(&data, &queries, K, |id| pred(id), &acorng); + let r_flat = recall_at_k(&data, &queries, K, pred, &flat); + let r_acorn = recall_at_k(&data, &queries, K, pred, &acorng); println!( "{:>7.0}% {:>16.1}% {:>16.1}%", sel_frac * 100.0, diff --git a/crates/ruvector-acorn/src/search.rs b/crates/ruvector-acorn/src/search.rs index dd10e844..98e2ee61 100644 --- a/crates/ruvector-acorn/src/search.rs +++ b/crates/ruvector-acorn/src/search.rs @@ -34,7 +34,7 @@ pub fn acorn_search( ef: usize, predicate: impl Fn(u32) -> bool, ) -> Vec<(u32, f32)> { - if graph.len() == 0 { + if graph.is_empty() { return vec![]; } let n = graph.len();