镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

[diskann-inmem] Spherical Quantization Round 2 - #1485

Merged
Mark Hildebrand (hildebrandmw) merged 5 commits into
mainfrom
mhildebr/inmem-spherical
Oct 22, 2026
Merged

Mark Hildebrand (hildebrandmw) merged 5 commits into
mainfrom
mhildebr/inmem-spherical

Conversation

@hildebrandmw

@hildebrandmw Mark Hildebrand (hildebrandmw) commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Turns out with the work done in #1469 and #1484, we can simplify the implementation of spherical quantization in diskann-inmem to also be behind Quantized. This does that and gets rid of the custom Spherical representation.

Since we now have a lot Quantizer monomorphizations, this also introduces quantized::Backed as kind of an intermediate type-erased quantizer to store in quantized::Config. The relationship goes like this:

  • The Quantized trait has an into_backend method for making a Backend. This can make use of private constructors and so is largely unimplementable by user code (they could do something weird by swapping out the quantizer, but that wouldn't cause us any issues since we call into_backend before calling any methods.
  • The IntoBackend trait is used to construct a backend. There is a blanket implementation for any Quantizer, delegating to Quantizer::into_backend. There is also an implementation for Backend which simply returns itself. Since Backend does not implement Quantizer, there is no coherence issue.
  • Config can then be constructed from a concrete Quantizer or from a Backend. The latter allows quantizers to be type-erased before constructing a Config, which simplifies a lot of set up code.
    Now, the reason to go with an into_backend method on the Quantizer trait is to give quantizers defined within diskann-inmem an escape hatch for potentially specializing inner::Quantizer, keeping the door open for hybrid PQ pruning if absolutely necessary.

@codecov-commenter

Codecov Comments Bot (codecov-commenter) commented Oct 21, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.66667% with 16 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.07%. Comparing base (2a26c7b) to head (61b1bdd).

Files with missing lines Patch % Lines
diskann-inmem/src/repr/quantized/spherical.rs 97.33% 6 Missing ⚠️
diskann-benchmark/src/index/inmem2.rs 70.58% 5 Missing ⚠️
diskann-inmem/integration/index/runner.rs 64.28% 5 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #1485      +/-   ##
==========================================
- Coverage   92.08%   91.07%   -1.02%     
==========================================
  Files         591      591              
  Lines      122196   121845     -351     
==========================================
- Hits       112523   110969    -1554     
- Misses       9673    10876    +1203     
Flag Coverage Δ
miri 91.07% <94.66%> (-1.02%) ⬇️
unittests 90.77% <94.66%> (-1.26%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
diskann-inmem/integration/index/object.rs 99.00% <ø> (ø)
diskann-inmem/src/repr/internal/intrusive.rs 100.00% <ø> (ø)
...ann-inmem/src/repr/internal/quantization/rerank.rs 98.75% <100.00%> (+1.22%) ⬆️
diskann-inmem/src/repr/mod.rs 93.75% <ø> (ø)
diskann-inmem/src/repr/quantized/mod.rs 98.42% <100.00%> (+0.04%) ⬆️
diskann-inmem/src/store/intrusive.rs 93.97% <100.00%> (-0.07%) ⬇️
diskann-quantization/src/spherical/quantizer.rs 98.29% <100.00%> (+0.01%) ⬆️
diskann-benchmark/src/index/inmem2.rs 62.10% <70.58%> (+0.97%) ⬆️
diskann-inmem/integration/index/runner.rs 91.78% <64.28%> (+3.21%) ⬆️
diskann-inmem/src/repr/quantized/spherical.rs 97.33% <97.33%> (ø)

... and 48 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Base automatically changed from mhildebr/inmem-scalar to main October 21, 2026 19:15
@hildebrandmw
Mark Hildebrand (hildebrandmw) marked this pull request as ready for review October 21, 2026 19:43
@hildebrandmw
Mark Hildebrand (hildebrandmw) requested review from a team and a balanced review from Copilot October 21, 2026 19:43

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

Static review identified no blocking issues in the migration or backend conversions; project tests were not run.

No open issues 🎉

What changed in this PR

Unifies spherical quantization with the shared Quantized representation, following the product and scalar quantization work.

Changes:

  • Adds a spherical adapter and type-erased Backend configuration.
  • Migrates integration and benchmark callers, removing the standalone representation.
  • Handles zero-norm rescaling and adds adapter tests.
File Description
diskann-quantization/​src/​spherical/​quantizer.rs Guards zero-norm rescaling; exposes concrete quantizers.
diskann-inmem/​src/​store/​intrusive.rs Removes guard access while retaining ownership.
diskann-inmem/​src/​repr/​spherical.rs Deletes the standalone spherical representation.
diskann-inmem/​src/​repr/​quantized/​spherical.rs Adds the spherical adapter and tests.
diskann-inmem/​src/​repr/​quantized/​mod.rs Adds Backend, conversions, and spherical exports.
diskann-inmem/​src/​repr/​mod.rs Removes standalone spherical exports.
diskann-inmem/​src/​repr/​internal/​quantization/​rerank.rs Removes the unused disabled configuration variant.
diskann-inmem/​src/​repr/​internal/​intrusive.rs Removes the unused guard accessor.
diskann-inmem/​integration/​index/​runner.rs Migrates spherical and scalar setup to backends.
diskann-inmem/​integration/​index/​object.rs Removes standalone spherical index registration.
diskann-benchmark/​src/​index/​inmem2.rs Migrates benchmark setup to shared configuration.

Review effort: Balanced

@hildebrandmw
Mark Hildebrand (hildebrandmw) merged commit df2af75 into main Oct 22, 2026
32 checks passed
@hildebrandmw
Mark Hildebrand (hildebrandmw) deleted the mhildebr/inmem-spherical branch October 22, 2026 23:04
Mark Hildebrand (hildebrandmw) added a commit that referenced this pull request Oct 26, 2026
# DiskANN v0.61.0

## Highlights

- **Quantization:** Added 3-bit spherical quantization with AVX2
acceleration, faster
  spherical encoding, and NEON float32 MinMax kernels.
- **In-memory indexing (experimental):** Added product quantization and
1-8-bit scalar
quantization, unified quantized representations, and AArch64
prefetching.
- **Multi-vector search:** Added `i8 x i8` and MinMax8 x MinMax4 MaxSim
kernels.
- **Fixes:** Preserve virtual start-point out-edges when writing disk
indexes, correctly
round-trip scalar quantization configurations without standard
deviation, and support
  zero-column mutable matrix iterators.

## Breaking changes and upgrading

Changes are concentrated in quantization APIs and experimental/tooling
crates.

* PQ training (#1467) - Training now returns `BasicTable`.
`SimplePivots` was removed.
Replace `flatten()` with `view_pivots().as_slice()` and use
`pivots_for(chunk)` for
  per-chunk access.
* PQ distance tables (#1458) - Change `ProcessInto` bounds to
`ProcessInto<f32>` and calls
from `process_into::<Metric>(...)` to `process_into::<Metric,
f32>(...)`.
* MaxSim kernels (#1429) - Generic kernel/erasure code now requires `T:
MaxSimElement` and
score buffers of `T::Score` (`f32` for floats, `i32` for `i8`). Update
`build_max_sim`
  error handling from `NotSupported` to `BuildMaxSimError`.
* `diskann-inmem` (#1485) - Replace `repr::Spherical` with
`repr::Quantized`. Wrap the
quantizer in `repr::quantized::spherical::Spherical::new(...)` when
configuring it.
  Configuration and `Rerank` types now live under `repr::quantized`.
* `diskann-benchmark-runner` (#1475) - `input::Registered` and public
`Registry::input` were
removed. Use the concrete `Input` implementation's `tag()` and
`example()` methods instead.

## All Changes
* Fix serialization round trip for QuantizationType::SQ without standard
deviation by @arrayka in #1461
* i8 x i8 MaxSim Kernels by @suri-kumkaran in
#1429
* Adding `subview_mut` to `MatrixMut` by @arkrishn94 in
#1463
* Add InsertResult::SuccessUpdate by @metajack in
#1449
* [diskann-quantization] PQ Infrastructure for `diskann-inmem` by
@hildebrandmw in #1458
* [diskann-quantization] Teach PQ training to return a `BasicTable`. by
@hildebrandmw in #1467
* [deps] Run `cargo-update` by @hildebrandmw in
#1452
* Support zero-column mutable matrix iterators by @arrayka in
#1462
* [diskann-quantization] Use `f32::NAN` instead of `core::f32::NAN`. by
@hildebrandmw in #1471
* [diskann-wide] Add `V4::new_checked_miri_uncached`. by @hildebrandmw
in #1480
* [diskann-wide] Add maddubs intrinsic wrappers to V3 and V4 by
@partychen in #1479
* Bump the github-actions group across 1 directory with 5 updates by
@dependabot[bot] in #1482
* [benchmark-runner] Simplify Input representation by @hildebrandmw in
#1475
* [diskann-quantization] Optimize spherical encoding scale search by
@xinyuwen2 in #1478
* [diskann-garnet] Implement XVCREATE, XVIMPORT by @metajack in
#1455
* [diskann-garnet] Support configurable start points and allow importing
start points by @metajack in
#1464
* [diskann-garnet] Add spherical 2-bit and 4-bit quantization by
@metajack in #1465
* [deps] Address depandabot issue 32 by @hildebrandmw in
#1496
* [diskann-disk] Preserve virtual start point out-edges when writing the
disk index by @doliawu in #1483
* [diskann-quantization] Add Neon F32 Minmax Kernels by @pfoxARM in
#1431
* [diskann-garnet] Add macOS arm64 support to NuGet publishing by
@metajack in #1495
* [diskann-disk] Require start points at index initialization. by
@hildebrandmw in #1497
* Expose metric-aware quantizer centroid distance by @cherryrhea in
#1395
* [diskann-inmem] Add support for Product Quantization by @hildebrandmw
in #1469
* Adds aarch64 prefetching into diskann-vector and diskann-inmem by
@pfoxARM in #1408
* [diskann-inmem] Add scalar quantization by @hildebrandmw in
#1484
* Bump the github-actions group with 3 updates by @dependabot[bot] in
#1505
* [diskann-inmem] Spherical Quantization Round 2 by @hildebrandmw in
#1485
* [diskann-quantization] Add SphericalQ 3-bit support and AVX2 kernel by
@xinyuwen2 in #1474
* [muilt-vetor] Add standalone MinMax8 x MinMax4 MaxSim kernel by
@partychen in #1494

## New Contributors
* @cherryrhea made their first contribution in
#1395

**Full Changelog**:
v0.60.0...v0.61.0

Co-authored-by: Mark Hildebrand <mhildebrand@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants