Skip to content

Commit 5588e06

Browse files
authored
feat(runtime): add leanvec ood (#264)
Add LeanVec OOD API to runtime. Supersedes #262 as it achieves the same thing with only a minor version bump.
1 parent 228c892 commit 5588e06

5 files changed

Lines changed: 75 additions & 4 deletions

File tree

‎bindings/cpp/CMakeLists.txt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,14 @@ if (SVS_RUNTIME_ENABLE_LVQ_LEANVEC)
9898
else()
9999
# Links to LTO-enabled static library, requires GCC/G++ 11.2
100100
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11.2" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "11.3")
101-
set(SVS_URL "https://github.com/intel/ScalableVectorSearch/releases/download/v1.0.0-dev/svs-shared-library-1.0.0-NIGHTLY-20251119-807-lto.tar.gz"
101+
set(SVS_URL "https://github.com/intel/ScalableVectorSearch/releases/download/nightly/svs-shared-library-lto-nightly-2026-02-05-1017.tar.gz"
102102
CACHE STRING "URL to download SVS shared library")
103103
else()
104104
message(WARNING
105105
"Pre-built LVQ/LeanVec SVS library requires GCC/G++ v.11.2 to apply LTO optimizations."
106106
"Current compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}"
107107
)
108-
set(SVS_URL "https://github.com/intel/ScalableVectorSearch/releases/download/v0.0.11/svs-shared-library-0.0.11.tar.gz"
108+
set(SVS_URL "https://github.com/intel/ScalableVectorSearch/releases/download/nightly/svs-shared-library-nightly-2026-02-05-1017.tar.gz"
109109
CACHE STRING "URL to download SVS shared library")
110110
endif()
111111
include(FetchContent)

‎bindings/cpp/include/svs/runtime/training.h‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,41 @@ namespace v0 {
2727

2828
struct SVS_RUNTIME_API LeanVecTrainingData {
2929
virtual ~LeanVecTrainingData();
30+
31+
/* Build LeanVec training data (compression matrices) from the provided
32+
* data.
33+
* @param training_data Output parameter to the created training data object
34+
* @param dim Dimensionality of the input data and queries
35+
* @param n Number of data points and queries
36+
* @param x Pointer to the input data
37+
* @param leanvec_dims Number of dimensions in the resulting LeanVec data
38+
*/
39+
static Status build(
40+
LeanVecTrainingData** training_data,
41+
size_t dim,
42+
size_t n,
43+
const float* x,
44+
size_t leanvec_dims
45+
) noexcept;
46+
47+
/* Build LeanVec training data (compression matrices) from the provided
48+
* data.
49+
* Accepts optional training queries for out-of-distribution training.
50+
* @param training_data Output parameter to the created training data object
51+
* @param dim Dimensionality of the input data and queries
52+
* @param n Number of data points and queries
53+
* @param x Pointer to the input data
54+
* @param n_q Number of training queries (can be 0)
55+
* @param x_q Pointer to the training queries (can be nullptr)
56+
* @param leanvec_dims Number of dimensions in the resulting LeanVec data
57+
*/
3058
static Status build(
3159
LeanVecTrainingData** training_data,
3260
size_t dim,
3361
size_t n,
3462
const float* x,
63+
size_t n_q,
64+
const float* x_q,
3565
size_t leanvec_dims
3666
) noexcept;
3767

‎bindings/cpp/include/svs/runtime/version.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141

4242
#ifndef SVS_RUNTIME_VERSION_MINOR
4343
/// Minor version number - incremented for backward-compatible feature additions
44-
#define SVS_RUNTIME_VERSION_MINOR 1
44+
#define SVS_RUNTIME_VERSION_MINOR 2
4545
#endif
4646

4747
#ifndef SVS_RUNTIME_VERSION_PATCH
@@ -51,7 +51,7 @@
5151

5252
#ifndef SVS_RUNTIME_VERSION_STRING
5353
/// Complete version string
54-
#define SVS_RUNTIME_VERSION_STRING "0.1.0"
54+
#define SVS_RUNTIME_VERSION_STRING "0.2.0"
5555
#endif
5656

5757
#ifndef SVS_RUNTIME_API_VERSION

‎bindings/cpp/src/training.cpp‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,27 @@ Status LeanVecTrainingData::build(
4040
});
4141
}
4242

43+
Status LeanVecTrainingData::build(
44+
LeanVecTrainingData** training_data,
45+
size_t dim,
46+
size_t n,
47+
const float* x,
48+
size_t n_q,
49+
const float* x_q,
50+
size_t leanvec_dims
51+
) noexcept {
52+
if (n_q == 0 || !x_q) {
53+
return build(training_data, dim, n, x, leanvec_dims);
54+
}
55+
56+
return runtime_error_wrapper([&] {
57+
const auto data = svs::data::ConstSimpleDataView<float>(x, n, dim);
58+
const auto queries = svs::data::ConstSimpleDataView<float>(x_q, n_q, dim);
59+
*training_data = new LeanVecTrainingDataManager{
60+
LeanVecTrainingDataImpl{data, queries, leanvec_dims}};
61+
});
62+
}
63+
4364
Status LeanVecTrainingData::destroy(LeanVecTrainingData* training_data) noexcept {
4465
return runtime_error_wrapper([&] { delete training_data; });
4566
}

‎bindings/cpp/src/training_impl.h‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ struct LeanVecTrainingDataImpl {
4545
: leanvec_dims_{leanvec_dims}
4646
, leanvec_matrices_{compute_leanvec_matrices(data, leanvec_dims)} {}
4747

48+
LeanVecTrainingDataImpl(
49+
const svs::data::ConstSimpleDataView<float>& data,
50+
const svs::data::ConstSimpleDataView<float>& queries,
51+
size_t leanvec_dims
52+
)
53+
: leanvec_dims_{leanvec_dims}
54+
, leanvec_matrices_{compute_leanvec_matrices_ood(data, queries, leanvec_dims)} {}
55+
4856
size_t get_leanvec_dims() const { return leanvec_dims_; }
4957
const LeanVecMatricesType& get_leanvec_matrices() const { return leanvec_matrices_; }
5058

@@ -83,6 +91,18 @@ struct LeanVecTrainingDataImpl {
8391
// leading explicit creation of a copy of the matrix "to avoid double free".
8492
return LeanVecMatricesType{std::move(matrix), std::move(query_matrix)};
8593
}
94+
95+
static LeanVecMatricesType compute_leanvec_matrices_ood(
96+
const svs::data::ConstSimpleDataView<float>& data,
97+
const svs::data::ConstSimpleDataView<float>& queries,
98+
size_t leanvec_dims
99+
) {
100+
auto threadpool = default_threadpool();
101+
102+
return svs::leanvec::compute_leanvec_matrices_ood<svs::Dynamic>(
103+
data, queries, threadpool, svs::lib::MaybeStatic{leanvec_dims}
104+
);
105+
}
86106
};
87107

88108
struct LeanVecTrainingDataManager : public svs::runtime::LeanVecTrainingData {

0 commit comments

Comments
 (0)