ruvector/crates
ruvnet 499dec61a5 feat(ruvector-diskann): wire Quantizer trait into search path — codes load-bearing
Closes the architectural gap surfaced in PR #383: previously
`DiskAnnIndex.pq_codes` was dead storage. `search()` called
`graph.greedy_search` over `FlatVectors` (full f32 originals)
and exact-L2² rerank — `self.pq_codes` was read by neither.

Today's PQ "savings" were on-disk only; in DRAM the index still
held full f32 vectors. RaBitQ inherited the same gap.

This PR makes the `Quantizer` trait load-bearing in the DiskANN
hot path so both backends (PQ + RaBitQ) actually consult their
codes during graph traversal.

## What changes

1. **New `greedy_search_with_codes` in `graph.rs`** — generalizes
   `greedy_search_fast` to accept an arbitrary `distance_fn` closure
   over node ids. The original `greedy_search_fast` stays unchanged
   for back-compat. Surprise observation worth recording: the old
   `greedy_search_fast` was coupled to f32 distance via inline
   `l2_squared(...)` calls inside the loop, NOT via type signatures.
   The "abstraction gap" PR #383 left was three lines, not an
   architectural mismatch.

2. **`DiskAnnIndex` carries `enum QuantizerBackend`** rather than
   `Option<ProductQuantizer>`. Hybrid pattern chosen because:
       Option A (generic `DiskAnnIndex<Q>`) — would cascade through
         `ruvector-diskann-node`'s NAPI binding and any other crate
         using `DiskAnnIndex` by name. Too much ripple.
       Option B (`Box<dyn Quantizer>`) — impossible because
         `Quantizer::Query` is an associated type; trait isn't
         object-safe.
       Hybrid (this PR): match-once-per-search on the backend enum,
         dispatch into a monomorphic closure. Hot loop stays
         branch-free.

3. **Builder API**: `DiskAnnConfig::with_quantizer_kind()`,
   `with_rerank_factor()`, `with_rabitq_seed()`,
   `with_originals_in_memory()`. All have `Default` impls so existing
   call sites compile unchanged after a `..Default::default()` patch.

4. **`with_originals_in_memory(false)` plumbed but not yet honored**.
   `build()` rejects with `InvalidConfig` for now — the disk-backed
   rerank path that would land the actual 17.5× DRAM compression is
   the natural next PR. The trait-driven traversal shipped here is
   the prerequisite. Measured codes-vs-originals memory ratio at
   D=128, n=2000: **codes 40 KB, originals 1024 KB, ratio 0.039
   (~25× smaller)** — once originals can be evicted, dataset-level
   compression will exceed the 17.5× target.

## Recall numbers

| Path | recall@10 | Notes |
|---|---|---|
| Flat f32 (legacy) | 1.000 | n=1k, dim=64, 30 queries |
| **PQ before this PR** | (≈ 1.000) | Codes never read — PQ was effectively no-op on recall |
| **PQ after this PR** | 0.897 | Trait-driven, M=8, rerank_factor=4. Reflects actual quantization noise. |
| **RaBitQ after this PR** | 0.967 | Trait-driven, search_beam=512, rerank_factor=40 |

PQ recall now reflects real quantization noise because PQ codes
are *used* during traversal. 0.897 is well above the 0.85 floor
required by the regression test.

## NAPI binding patch

`ruvector-diskann-node/src/lib.rs:48` was using a struct literal
that listed every `DiskAnnConfig` field. Adding the four new fields
broke that initializer. One-line `..Default::default()` fix
restores it without growing the NAPI override surface (all new
fields have sensible defaults).

## Verification

  cargo build --workspace                                              → 0 errors
  cargo build -p ruvector-diskann --no-default-features                → OK (PQ-only)
  cargo clippy --workspace --all-targets --no-deps -- -D warnings      → exit 0
  cargo fmt --all --check                                              → exit 0
  cargo test -p ruvector-diskann --features rabitq                     → 30 / 30
                                                                          (was 26 in PR #383)

New tests in `tests/quantizer_search_uses_codes.rs`:
  - spy-quantizer codes-consulted assertion (proves codes are now
    consulted; would fail before this PR)
  - recall@10 vs brute-force baseline (≥ 0.85 floor)
  - PQ recall regression (no drop vs the old "ignore codes,
    brute-force rerank" behavior, after accounting for actual
    quantization noise)
  - codes-vs-originals memory ratio sanity check
  - greedy_search_with_codes ≡ greedy_search_fast under f32 distance

Refs: PR #383 (DiskANN Quantizer trait + RaBitQ backend),
docs/research/rabitq-integration/05-roadmap.md Phase 1

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-25 21:51:10 -04:00
..
agentic-robotics-benchmarks feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00
agentic-robotics-core feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00
agentic-robotics-embedded feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00
agentic-robotics-mcp feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00
agentic-robotics-node feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00
agentic-robotics-rt feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00
cognitum-gate-kernel chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
cognitum-gate-tilezero chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
mcp-brain chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
mcp-brain-server chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
mcp-gate style: apply rustfmt across entire codebase 2026-01-28 17:00:26 +00:00
micro-hnsw-wasm feat(quality): ADR-144 monorepo quality analysis — Phase 1 critical fixes (#336) 2026-04-06 21:19:13 -04:00
neural-trader-coherence style: apply cargo fmt formatting 2026-03-12 20:57:18 -04:00
neural-trader-core feat: add neural-trader-wasm crate with WASM bindings and ADR-086 2026-03-08 16:17:58 +00:00
neural-trader-replay style: apply cargo fmt formatting 2026-03-12 20:57:18 -04:00
neural-trader-strategies chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
neural-trader-wasm style: apply cargo fmt formatting 2026-03-12 20:57:18 -04:00
prime-radiant chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
profiling Reorganize repository structure 2025-11-19 20:53:37 +00:00
ruQu chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruqu-algorithms chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruqu-core chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruqu-exotic chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruqu-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-attention chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-attention-cli fix: migrate attention/dag/tiny-dancer to workspace versioning and fix all dep version specs 2026-02-23 13:29:46 +00:00
ruvector-attention-node chore: Update attention NAPI-RS binaries for all platforms 2026-04-26 00:47:37 +00:00
ruvector-attention-unified-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-attention-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-attn-mincut chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-bench chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-cli chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-cluster chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-cnn docs(sdk): add deep planning review for ruvector Python SDK 2026-04-25 20:28:54 -04:00
ruvector-cnn-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-cognitive-container fix: format all files, add EXO crate READMEs, convert path deps to version deps 2026-02-27 16:21:14 +00:00
ruvector-coherence chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-collections chore(workspace): cargo fmt — mechanical whitespace fix across 427 files 2026-04-24 10:44:02 -04:00
ruvector-consciousness chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-consciousness-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-core chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-crv chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-dag chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-dag-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-decompiler chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-decompiler-wasm feat(decompiler): WASM Louvain pipeline — npx now produces 589+ modules 2026-04-03 15:25:23 +00:00
ruvector-delta-consensus chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-delta-core chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-delta-graph chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-delta-index chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-delta-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-diskann feat(ruvector-diskann): wire Quantizer trait into search path — codes load-bearing 2026-04-25 21:51:10 -04:00
ruvector-diskann-node feat(ruvector-diskann): wire Quantizer trait into search path — codes load-bearing 2026-04-25 21:51:10 -04:00
ruvector-dither chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-domain-expansion chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-domain-expansion-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-economy-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-exotic-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-filter chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-fpga-transformer chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-fpga-transformer-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-gnn chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-gnn-node chore: Update GNN NAPI-RS binaries for all platforms 2026-04-26 00:49:13 +00:00
ruvector-gnn-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-graph chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-graph-node chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-graph-transformer chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-graph-transformer-node chore: Update graph transformer NAPI-RS binaries for all platforms 2026-04-26 00:53:18 +00:00
ruvector-graph-transformer-wasm chore: Update graph transformer NAPI-RS binaries for all platforms 2026-04-26 00:53:18 +00:00
ruvector-graph-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-hyperbolic-hnsw feat(prime-radiant): Universal Coherence Engine with Sheaf Laplacian AI Safety (#131) 2026-01-22 21:27:27 -05:00
ruvector-hyperbolic-hnsw-wasm feat(training): RuvLTRA v2.4 Ecosystem Edition - 100% routing accuracy (#123) 2026-01-20 20:08:30 -05:00
ruvector-kalshi chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-learning-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-math chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-math-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-metrics feat(quality): ADR-144 monorepo quality analysis — Phase 1 critical fixes (#336) 2026-04-06 21:19:13 -04:00
ruvector-mincut chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-mincut-brain-node fix(brain): defer sparsifier build on startup for large graphs 2026-03-24 12:29:52 +00:00
ruvector-mincut-gated-transformer chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-mincut-gated-transformer-wasm fix: resolve compilation errors across workspace 2026-03-16 23:15:25 -04:00
ruvector-mincut-node chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-mincut-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-nervous-system chore(workspace): fix pre-existing test flakes + add CI -D warnings enforcement 2026-04-25 20:17:47 -04:00
ruvector-nervous-system-wasm style: apply rustfmt across entire codebase 2026-01-28 17:00:26 +00:00
ruvector-node chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-postgres chore: bump workspace to v2.2.0, sona to v0.2.0 2026-04-20 13:56:53 -04:00
ruvector-profiler fix: apply cargo fmt across workspace and fix CI issues 2026-02-21 20:56:38 +00:00
ruvector-rabitq perf(rabitq): AVX-512 VPOPCNTDQ scan variant — +10.5% single-thread at n=100k 2026-04-24 09:55:12 -04:00
ruvector-raft chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-replication chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-robotics chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-router-cli fix: add version specs to path dependencies for crates.io publishing 2026-02-23 03:14:45 +00:00
ruvector-router-core chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-router-ffi fix(router): 7 bugs in @ruvector/router — broken wrapper, score inversion, DB crashes (#333) 2026-04-06 16:27:46 -04:00
ruvector-router-wasm fix: add version specs to path dependencies for crates.io publishing 2026-02-23 03:14:45 +00:00
ruvector-rulake chore(rulake): add version to ruvector-rabitq path dep for crates.io 2026-04-24 10:15:18 -04:00
ruvector-server chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-snapshot chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-solver chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-solver-node chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-solver-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-sparse-inference chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-sparse-inference-wasm fix: resolve 5 P0 critical issues + 2 pre-existing compile errors 2026-03-06 14:03:42 +00:00
ruvector-sparsifier chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-sparsifier-wasm chore(workspace): cargo fmt — mechanical whitespace fix across 427 files 2026-04-24 10:44:02 -04:00
ruvector-temporal-tensor chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-temporal-tensor-wasm feat: Add ADR-017 temporal tensor compression with tiered quantization 2026-02-06 00:28:21 +00:00
ruvector-tiny-dancer-core chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-tiny-dancer-node chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-tiny-dancer-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-verified chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-verified-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvector-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvix chore(workspace): make full cargo build --workspace exit 0 2026-04-25 18:06:27 -04:00
ruvllm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvllm-cli chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
ruvllm-wasm chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
rvAgent chore(workspace): fix pre-existing test flakes + add CI -D warnings enforcement 2026-04-25 20:17:47 -04:00
rvf chore(workspace): cargo fmt nested workspaces — rvf/, examples/* 2026-04-24 10:51:14 -04:00
rvlite chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
rvm feat(quality): ADR-144 monorepo quality analysis — Phase 1 critical fixes (#336) 2026-04-06 21:19:13 -04:00
sona chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
thermorust chore(workspace): clippy-clean every crate under -D warnings + fmt + repair pre-existing broken benches 2026-04-25 17:00:20 -04:00
agentic-robotics-README.md feat: Add agentic-robotics crates and SOTA integration research 2026-02-27 02:54:01 +00:00