Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Bumps the Rust workspace and all in-repo crate dependency versions to 0.50.0, aligning the workspace manifest and lockfile with the 0.50.0 release.
Changes:
- Update
[workspace.package]version to0.50.0. - Update
[workspace.dependencies]entries for all internal crates to0.50.0. - Regenerate/update
Cargo.lockso internal packages reflect0.50.0.
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| Cargo.toml | Bumps workspace package version and internal workspace dependency versions to 0.50.0. |
| Cargo.lock | Updates locked internal crate versions to 0.50.0 to match the workspace bump. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #870 +/- ##
=======================================
Coverage 89.32% 89.32%
=======================================
Files 445 445
Lines 84424 84424
=======================================
+ Hits 75410 75414 +4
+ Misses 9014 9010 -4
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
arkrishn94
approved these changes
Mar 31, 2026
harsha-simhadri
approved these changes
Mar 31, 2026
metajack
approved these changes
Mar 31, 2026
suri-kumkaran
approved these changes
Mar 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Version 0.50.0
Release notes generated with the help of Copilot.
API Breaking Changes
This release contains several large API changes that should be mechanical to apply to existing code but that will enable forward evolution of our integrations.
WorkingSet/Fillset/Strategy API Changes (#859)
Removals
The following items have been removed:
Filldiskann::graph::workingset::Fill<WorkingSet>anddiskann::graph::workingset::MapAsElement<T>diskann::graph::glue::MultiInsertStrategy::finishanddiskann::graph::workingset::AsWorkingSetAccessor::ExtendedVectorIdBoxSlicediskann::graph::glue::Batch(andMatrix<T>)reborrow::Lower/AsyncLowerStrategy Type Parameters (no longer
?Sized)The
Tparameter onSearchStrategy,InsertStrategy, andSetElementis no longer?Sized.HRTB syntax is now generally needed, but makes contraints far more uniform.
Similarly,
InplaceDeleteStrategy::DeleteElement<'a>has been tightened fromSend + Sync + ?Sizedto
Copy + Send + Sync(sized). If your delete element was an unsized type like[f32], changeit to a reference like
&'a [f32].Guardmoved fromSetElementtoDataProviderMove your
Guardassociated type from yourSetElementimpl to yourDataProviderimpl.PruneStrategygainsWorkingSetWhat to do:
WorkingSetassociated type. Useworkingset::Map<Id, Box<[T]>>as the default.Users of multi-insert will want to use
workingset::Map<Id, Box<[T]>, workingset::map::Ref<[T]>>.create_working_setreturning aMapviaBuilder::new(Capacity::Default).build(capacity).FillSetbound onPruneAccessorwithworkingset::Fill<Self::WorkingSet>.FillSettoFill<WorkingSet>Shortcut: If your
WorkingSetisworkingset::Map<K, V, P>and your accessor'sElementRefconvertsInto<V>, the blanketFillimpl works automatically, then you don'tneed to implement
Fillat all.New
MultiInsertStrategy(replaces multi-insert portion ofInsertStrategy)If you use
multi_insert, you now need aMultiInsertStrategyimplementation:What to do:
finishis called once after the batch is inserted. Use it to pre-populate working setstate (e.g., fetch quantized representations). Return a
Seedthat implementsAsWorkingSet.workingset::map::Builderas yourSeedtype.multi_insertnow takesArc<B>whereB: Batchinstead ofVectorIdBoxSlice.Matrix<T>implementsBatchout of the box.Using
diskann::graph::workingset::Mapand its associated infrastructure should largely work.multi_insertcall siteThe turbofish
<S, B>is often needed because HRTB bounds make inference conservative.Search Post Processing (#828)
The
Searchtrait now requiresS: SearchStrategy<DP, T>at the trait level, and introduces two new generic parameters on thesearchmethod:O- the output type written to the buffer (used to be a parameter ofSearchStrategy)PP— the post-processor, bounded byfor<'a> SearchPostProcess<S::SearchAccessor<'a>, T, O> + Send + SyncOB— the output buffer, bounded bySearchOutputBuffer<O> + Send + ?SizedPreviously,
OBwas a trait-level generic and the post-processor was obtained internally from the strategy. Now both are method-level generics, giving callers control over each independently.The output "id" type
Ohas been removed fromSearchStrategyentirely, which greatly simplifies things.At the
DiskANNIndexlevel, two entry points are provided:search()— requiresS: DefaultPostProcessor, creates the strategy's default processor automatically, then delegates tosearch_with(). This is the common path.search_with()— requires onlyS: SearchStrategy, accepts any compatiblePP. This is the extension point for custom post-processing.DefaultPostProcessor
Strategies opt in to default post-processing by implementing
DefaultPostProcessor:The
default_post_processor!macro covers the common case where the processor isDefault-constructible.DefaultSearchStrategyis a convenience trait (with a blanket impl…) forSearchStrategy + DefaultPostProcessor.Start-point filtering
The in-mem code used to rely on a special
Internaltype to customize post-processing for the inplace delete pipeline.Now that post-processing is customizable, this workaround is no longer needed.
Start-point filtering is composed at the type level using the existing
Pipelinemechanism:HasDefaultProcessor::Processor = Pipeline<FilterStartPoints, RemoveDeletedIdsAndCopy>— filters start points during regular searchInplaceDeleteStrategy::SearchPostProcessor = RemoveDeletedIdsAndCopy— no start-point filtering during delete re-pruningRange search
To respond to moving the output buffer to a method level geneirc, range search now writes results directly through a
DistanceFilteredoutput buffer wrapper that applies radius and inner-radius filtering inline during post-processing. This replaces the previous approach of allocating intermediateVecs and copying results through anIdDistancebuffer.SearchOutputBufferis now implemented forVec<Neighbor<I>>, providing an unbounded growable buffer suitable for range search and other cases where the result count is not known in advance.The
RangeSearchResultstype has been removed now that aSearchOutputBufferis properly used.Migration guide
If you implement
SearchStrategy— minimal changes required. Remove theOparameter (if needed). ImplementDefaultPostProcessorwith your current post-processor if you want your strategy to work withindex.search(). Use thedefault_post_processor!macro for simple cases:If you call
index.search()— no API change for strategies that implementDefaultPostProcessor(all built-in strategies do).If you need custom post-processing — use
index.search_with()and pass your post-processor directly:If you implement
Search— the method signature has changed.PPandOBare now method-level generics, andprocessoris an explicit parameter:If you use range search results —
RangeSearchOutputno longer carriesidsanddistancesfields. Results are written to the output buffer passed tosearch(). UseVec<Neighbor<u32>>(or anySearchOutputBufferimpl) to collect them.If you implement
InplaceDeleteStrategy: Add theDeleteSearchAccessorassociated type, ensuring it is the same as the accessor selected by theSearchStrategy. This is redundant information, but needed to help constrain downstream trait bounds.V4 Backend Raised to Ice Lake / Zen4+ (#861)
The
V4SIMD backend indiskann-widenow requires additional AVX-512 extensions beyond thebaseline
x86-64-v4feature set:avx512vnniavx512bitalgavx512vpopcntdqavx512vbmiThis effectively raises the minimum CPU for the
V4tier from Cascade Lake to Ice Lake Server(Intel) or Zen4+ (AMD).
Impact: On CPUs with baseline AVX-512 but without these extensions (e.g., Skylake-X,
Cascade Lake), runtime dispatch will select the
V3backend instead. No codechanges are required.
What's Changed
V4backend to IceLake/Zen4+ by @hildebrandmw in Bump theV4backend to IceLake/Zen4+ #861ConcurrentQueuefromdiskann-providersby @hildebrandmw in RemoveConcurrentQueuefromdiskann-providers#862load_withconstructors andrunescape hatch towrapped_asyncby @suri-kumkaran in Add synchronousload_withconstructors andrunescape hatch towrapped_async#864New Contributors
Full Changelog: v0.49.1...v0.50.0