Skip to content

Releases: microsoft/DiskANN

diskann-garnet v2.0.3

12 Jun 17:19
3012df0

Choose a tag to compare

Fixed race condition where IDs could be handed out multiple times.

diskann-garnet v2.0.2

09 Jun 14:09
543b350

Choose a tag to compare

Fixed issue where quantizer training could be retriggered.

diskann-garnet 2.0.1

05 Jun 20:49
3ef1ac2

Choose a tag to compare

Small bugfix release. Fixes handling of missing quant vectors during delete().

diskann-garnet v2.0.0

02 Jun 14:30
77f9e9d

Choose a tag to compare

This release adds support for I8 vectors as well as binary (BIN) and scalar 8-bit (Q8) quantizers. For f32 vectors, the available quantizers are now NOQUANT, BIN, and Q8. For u8 and i8 vectors, XNOQUANT_U8, XNOQUANT_I8, XBIN_U8, and XBIN_I8 are available.

The version is now 2.0.0 to account for the FFI changes.

Note, quantization support is not yet persisted to disk, so this release should be used for in-memory workloads only. Persistence will follow shortly.

DiskANN v0.53.0

28 May 16:01
f8bbf3e

Choose a tag to compare

DiskANN v0.53.0 Release Notes

Breaking Changes

An AI generated, human reviewed list of changes is summarized below.

Paged search overhauled — channel-based API (#1078)

PagedSearchState and its 'static-bound pause/resume model have been replaced with an async, channel-based interface. The recommended way to drive paged search is now via a tokio::sync::mpsc channel, with the searcher embedded in an otherwise-'static future. See the rendered RFC for the new shape. Callers wired against PagedSearchState must migrate to the channel API.

Users of paged search via wrapped_async::DiskANNIndex that know their inner futures will never suspend can use the new wrapped_async::DiskANNIndex::paged_search_no_await; this will efficiently run paged searches with minimal synchronization overhead.

DiskANNIndex::flat_search removed (#1076)

DiskANNIndex::flat_search and the IdIterator trait have been removed from the diskann crate. Equivalent functionality lives on the new inherent method DiskIndexSearcher::flat_search in diskann-disk. This unblocks the experimental directions in #1067 and #983.

// Before
diskann_index.flat_search(query, ...)?;

// After
disk_index_searcher.flat_search(query, ...).await?;

DiskIndexSearcher::flat_search now batched (#1097)

The new DiskIndexSearcher::flat_search uses the bulk pq_distances path instead of one-vector-at-a-time Accessor::build_query_computer + evaluate_similarity. Downstream behavior is equivalent but tighter resource bounds apply.

centroid removed from PQ interfaces (#1010)

The dataset-centroid argument has been removed from FixedChunkPQTable construction, populate, and most other PQ APIs. The shift only ever worked for L2 distance and was silently ignored for inner-product / cosine, so passing it was a footgun. When an L2 shift is required, fold it into the PQ pivots instead (the library now does this internally).

// Before
let table = FixedChunkPQTable::new(.., centroid, ..);

// After — drop the centroid argument
let table = FixedChunkPQTable::new(.., ..);

Flat search interface (#983)

A new flat module in diskann adds a provider-agnostic brute-force search surface, mirroring the shape of graph search. Backends implement a single trait, DistancesUnordered<C> (in flat/strategy.rs), which fuses iteration and distance computation, allowing any backend (in-memory, quantized, disk, remote) to plug into a shared algorithm. See the rendered RFC. This is additive but is the new canonical surface — direct ad-hoc flat-search call sites should migrate.

bf_tree extracted into diskann-bftree crate (#1020)

The bf_tree provider has been moved out of diskann-providers (previously at diskann-providers/src/model/graph/provider/async_/bf_tree/) into a new standalone diskann-bftree crate. Along with the move:

  • Switched from PQ to spherical quantization.
  • Dropped dependencies on DeletionCheck, AsDeletionCheck, and RemoveDeletedIdsAndCopy.
  • Simplified generics.

Consumers must update their Cargo.toml to depend on diskann-bftree and update import paths.

direct_distance_impl and inner_product_raw re-exposed (#1081)

direct_distance_impl (free function) and FixedChunkPQTable::inner_product_raw are pub again after being privatized in #1044. Restored to unblock a downstream user. Not breaking in the typical direction — this restores previously available API surface.

MinMax recompress takes a grid-scale parameter (#1109)

The MinMax recompress API now accepts a grid-scale parameter.

New Features

  • SIMD-optimized L2-squared norm (#1107)
  • Significantly faster bitmap computation (#1099)
  • Large speedup on the bitmap construction path used by filtered search.
  • LLVM IR bloat regression check in CI (#1083)
  • CI now flags regressions in generated LLVM IR size, helping catch unintended monomorphization blow-ups.
  • Recall computation fix for under-k groundtruth (#1069)

Full List of Changes

New Contributors

Full Changelog: v0.52.0...v0.53.0

diskann-garnet v1.0.27

19 May 23:29
d7bf689

Choose a tag to compare

This release adds stack protectors to the diskann-garnet library.

DiskANN v0.52.0

12 May 21:07
c7dfae6

Choose a tag to compare

DiskANN v0.52.0 Release Notes

Breaking Changes

An AI generated, human reviewed list of changes is summarized below.

get_degree_stats signature changed (#998)

DiskANNIndex::get_degree_stats now takes an explicit iterator of IDs instead of requiring the data provider to implement IntoIterator.

// Before — provider had to impl IntoIterator
index.get_degree_stats(&mut accessor)?;

// After — caller supplies the ID iterator
index.get_degree_stats(&mut accessor, id_iter)?;

PQ dimension contract tightened; entries now &[f32] only (#1044)

With AlignedBoxWithSlice removed from the PQ path, the dimension handling has been refactored into a three-layer contract:

Layer Where Contract
Boundary (inmem) QueryComputer::new, MultiQueryComputer::new, DistanceComputer::evaluate_similarity len == dim (returns Err on mismatch)
Boundary (disk) PQScratch::set len >= dim, slices to [..dim]
Internal TableL2/IP/Cosine::{new, populate} Trusted — no re-validation

Other changes:

  • PQ table populate/distance methods now accept &[f32] instead of <U: Into<f32>>. Callers must pre-decode quantized vectors via VectorRepr::as_f32.
  • Generic trampoline impls (&Vec<u8>, &&[u8]) on QueryComputer / DistanceComputer have been removed.

calculate_chunk_offsets relocated to ChunkOffsets constructors (#976)

The free functions calculate_chunk_offsets and calculate_chunk_offsets_auto have been moved into constructors on ChunkOffsets / ChunkOffsetsView in diskann-quantization::views.

// Before
let offsets = calculate_chunk_offsets(dim, num_chunks);

// After (allocating)
let offsets = ChunkOffsets::partition(dim, num_chunks)?;

// After (zero-alloc, borrows caller-owned scratch)
let view = ChunkOffsetsView::partition_into(dim, &mut scratch)?;

Additionally, get_chunk_from_training_data has been moved from public API.

CachingProvider removed (#1052)

The entire diskann_providers::model::graph::provider::async_::caching module has been deleted.

Why: The CachingProvider was an experiment in transparent caching over DataProvider. In practice it required double monomorphization of the indexing code, didn't save integration work for bulk methods like on_elements_unordered/distances_unordered, and was complex to maintain. An internal user who …migrated off it removed ~1,000 lines of code, improved compile times by ~20%, and substantially reduced complexity.

Upgrade: Manage caching directly in your DataProvider implementation.

New Features

AVX-512 4-bit distance kernels (#1045)

Native V4 (AVX-512) specializations for 4-bit packed vector distance computations:

  • SquaredL2 — 16 × u32 lanes per iteration via _mm512_madd_epi16.
  • InnerProduct — AVX-512 VNNI (_mm512_dpbusd_epi32) over u8x64 / i8x64 operands.

Previously, V4 hardware fell back to two AVX2 (V3) kernel invocations per 512-bit chunk. The native kernels double per-instruction throughput. No API changes — existing code benefits automatically on AVX-512 capable hardware.

Merged PRs

New Contributors

Full Changelog: v0.51.0...v0.52.0

DiskANN v0.51.0

05 May 20:21
d06369e

Choose a tag to compare

What's Changed

Full Changelog: v0.50.1...v0.51.0

DiskANN v0.50.1

27 Apr 20:19
56e3b7f

Choose a tag to compare

Bumping to 0.50.1 to propagate changes to consumers.

Changes since previous bump:

What's Changed

  • Add more agentic guard rails by @hildebrandmw in #871
  • Cleanup diskann-benchmark-runner and friends. by @hildebrandmw in #865
  • Use --all-targets for the no-default-features CI run. by @hildebrandmw in #874
  • Remove unused normalizing_util.rs from diskann-providers by @Copilot in #902
  • Benchmark Support for A/B Tests by @hildebrandmw in #900
  • [diskann-garnet] Bump diskann-garnet to 1.0.26 by @tiagonapoli in #925
  • Remove the AdjacencyList from diskann-providers by @hildebrandmw in #915
  • [PQ cleanup] Part 1: Move pq_scratch, quantizer_preprocess and pq_dataset to diskann-disk by @arkrishn94 in #930
  • Forbid Debug in diskann-benchmark by @arrayka in #914
  • Remove DebugProvider by @JordanMaples in #923
  • [diskann-garnet] Create workflow to publish to nuget by @tiagonapoli in #926
  • Move k-means implementation from diskann-providers to diskann-disk by @Copilot in #933
  • Inline minmax distance evaluations by @arkrishn94 in #935
  • Use rust-toolchain.toml in CI by @hildebrandmw in #934
  • Add a globally blocking CI gate. by @hildebrandmw in #932
  • Remove utils/math_util.rs from diskann-providers by @Copilot in #921
  • Bump rand from 0.9.2 to 0.9.3 by @dependabot[bot] in #945
  • Remove OPQ and friends by @arkrishn94 in #947
  • Migrate test_flaky_consolidate from diskann_providers to diskann by @JordanMaples in #942
  • Remove GraphDataType from diskann-providers by @wuw92 in #950
  • Remove unused method extract_best_l_candidates in NeighborPriorityQueue by @doliawu in #951
  • Add Debug bounds to VectorRepr's distance GATs. by @hildebrandmw in #948
  • Add benchmark pipeline with Rust-native A/B validation by @YuanyuanTian-hh in #912
  • Remove unnecessary Default bound from Neighbor's VectorIdType by @doliawu in #956
  • Replace AlignedBoxWithSlice with plain Vec / Matrix where alignment is unused by @wuw92 in #955
  • [minmax] 8-bit benchmark by @arkrishn94 in #959
  • Add MultiInsertStrategy implementations for BfTreeProvider by @hildebrandmw in #949
  • Replace AlignedBoxWithSlice with Vec in PQScratch and disk fp vector caches by @wuw92 in #960
  • Adding unit tests for paged_search by @JordanMaples in #962
  • Remove AlignedBoxWithSlice wrapper and add alias to Poly<[T], AlignedAllocator> by @JordanMaples in #965
  • Remove synthetic/structured data generation from diskann-providers by @JordanMaples in #963
  • added tests and some baselines for range_search by @JordanMaples in #961

New Contributors

Full Changelog: v0.50.0...v0.50.1

DiskANN-Garnet V1.0.26

09 Apr 22:10
ea37491

Choose a tag to compare

Tagging new release for Garnet.