- Deprecated
num_threads
keyword argument frompysvs.VamanaBuildParameters
and addednum_threads
keyword topysvs.Vamana.build
. - Exposed the
prune_to
parameter forpysvs.VamanaBuildParameters
(see description below for an explanation of this change). - Added preliminary support for building
pysvs.Flat
andpysvs.Vamana
directly fromnp.float16
arrays.
- Removed
nthreads
member ofVamanaBuildParameters
and added the number of threads as an argument tosvs::Vamana::build
/svs::Vamana::build
. - Added a
prune_to
argument toVamanaBuildParameters
. This can be set to a value less than graph_max_degree (heuristically, setting this to be 4 less is a good trade-off between accuracy and speed). When pruning is performed, this parameter is used to determine the number of candidates to generate after pruning. Setting this less thangraph_max_degree
greatly reduces the time spent when managing backedges. - Improved pruning rules for Euclidean and InnerProduct. Vamana index construction should be faster and yield slightly improved indexes.
- Added an experimental external-threading interface to
svs::index::VamanaIndex
. - Overhauled extension mechanisms using a
tag_invoke
style approach. This decouples thesvs::index::VamanaIndex
implementation from extensions like LVQ, reducing header dependence and improving precision of algorithm customization.
- Enabled context-free saving and loading of simple data structures. This allows simple data structures to be saved and reloaded from TOML files without requiring access to the saving/loading directory. Classes implementing this saving and loading allow for more flexible storage.
- Overhauled the implementation of saving and loading to enable more scalable implementation.
svs::data::SimpleData
family of data structures are now directly saveable and loadable and no longer require proxy-classes.
Breaking Serialization Changes
- Changed LVQ-style datasets from
v0.0.1
tov0.0.2
: Removed centroids from being stored with the ScaledBiasedCompressedDataset. Centroids are now stored in the higher level LVQ dataset.
Changes to library internals that do not necessarily affect the top level API but could affect performance or users relying on internal APIs.
- Improved the performance of the LVQ inner-product implementation.
- Moved dynamic uispatcher from the Python bindings into
libsvs
. - Data structure loading has been augmented with the
svs::lib::Lazy
class, allowing for arbitrary deferred work to be executed when loading data structures. - Removed the old "access mode" style API for multi-level datasets, instead using
tag_invoke
for customization. - Reduced binary footprint by removing
std::function
use for general multi-threaded functions. - Updated
ANNException
to usefmtlib
style message directly rather thanstd::ostream
style overloading. The new syntax turnstoANNEXCEPTION("Expected ", a, ", got ", b, "!");
ANNEXCEPTION("Expected {}, got {}!", a, b);
- Added a benchmarking framework in
/benchmark
to automatically run and aggregate index construction and search for large scale benchmarks. Documentation is currently sparse but planned.
- Bump fmtlib from 9.1.0 to 10.1.1.