1919#include "dynamic_vamana_index_impl.h"
2020#include "svs_runtime_utils.h"
2121
22+ #ifdef SVS_LEANVEC_HEADER
23+ #include "dynamic_vamana_index_leanvec_impl.h"
24+ #endif
25+
2226#include <algorithm>
2327#include <memory>
2428#include <variant>
2731#include <svs/core/data.h>
2832#include <svs/core/distance.h>
2933#include <svs/core/query_result.h>
30- #include <svs/cpuid.h>
3134#include <svs/extensions/vamana/scalar.h>
3235#include <svs/lib/float16.h>
3336#include <svs/orchestrators/dynamic_vamana.h>
3437#include <svs/quantization/scalar/scalar.h>
3538
36- #include SVS_LVQ_HEADER
37- #include SVS_LEANVEC_HEADER
38-
3939namespace svs {
4040namespace runtime {
4141
@@ -117,11 +117,6 @@ struct DynamicVamanaIndexManagerBase : public DynamicVamanaIndex {
117117 return runtime_error_wrapper([&] { impl_->save(out); });
118118 }
119119};
120-
121- using DynamicVamanaIndexManager = DynamicVamanaIndexManagerBase<DynamicVamanaIndexImpl>;
122- using DynamicVamanaIndexLeanVecImplManager =
123- DynamicVamanaIndexManagerBase<DynamicVamanaIndexLeanVecImpl>;
124-
125120} // namespace
126121
127122// DynamicVamanaIndex interface implementation
@@ -149,12 +144,13 @@ Status DynamicVamanaIndex::build(
149144 const DynamicVamanaIndex::BuildParams& params,
150145 const DynamicVamanaIndex::SearchParams& default_search_params
151146) noexcept {
147+ using Impl = DynamicVamanaIndexImpl;
152148 *index = nullptr;
153149 return runtime_error_wrapper([&] {
154- auto impl = std::make_unique<DynamicVamanaIndexImpl >(
150+ auto impl = std::make_unique<Impl >(
155151 dim, metric, storage_kind, params, default_search_params
156152 );
157- *index = new DynamicVamanaIndexManager {std::move(impl)};
153+ *index = new DynamicVamanaIndexManagerBase<Impl> {std::move(impl)};
158154 });
159155}
160156
@@ -168,14 +164,15 @@ Status DynamicVamanaIndex::load(
168164 MetricType metric,
169165 StorageKind storage_kind
170166) noexcept {
167+ using Impl = DynamicVamanaIndexImpl;
171168 *index = nullptr;
172169 return runtime_error_wrapper([&] {
173- std::unique_ptr<DynamicVamanaIndexImpl> impl{
174- DynamicVamanaIndexImpl::load(in, metric, storage_kind)};
175- *index = new DynamicVamanaIndexManager{std::move(impl)};
170+ std::unique_ptr<Impl> impl{Impl::load(in, metric, storage_kind)};
171+ *index = new DynamicVamanaIndexManagerBase<Impl>{std::move(impl)};
176172 });
177173}
178174
175+ #ifdef SVS_LEANVEC_HEADER
179176// Specialization to build LeanVec-based Vamana index with specified leanvec dims
180177Status DynamicVamanaIndexLeanVec::build(
181178 DynamicVamanaIndex** index,
@@ -186,12 +183,13 @@ Status DynamicVamanaIndexLeanVec::build(
186183 const DynamicVamanaIndex::BuildParams& params,
187184 const DynamicVamanaIndex::SearchParams& default_search_params
188185) noexcept {
186+ using Impl = DynamicVamanaIndexLeanVecImpl;
189187 *index = nullptr;
190188 return runtime_error_wrapper([&] {
191- auto impl = std::make_unique<DynamicVamanaIndexLeanVecImpl >(
189+ auto impl = std::make_unique<Impl >(
192190 dim, metric, storage_kind, leanvec_dims, params, default_search_params
193191 );
194- *index = new DynamicVamanaIndexLeanVecImplManager {std::move(impl)};
192+ *index = new DynamicVamanaIndexManagerBase<Impl> {std::move(impl)};
195193 });
196194}
197195
@@ -205,16 +203,35 @@ Status DynamicVamanaIndexLeanVec::build(
205203 const DynamicVamanaIndex::BuildParams& params,
206204 const DynamicVamanaIndex::SearchParams& default_search_params
207205) noexcept {
206+ using Impl = DynamicVamanaIndexLeanVecImpl;
208207 *index = nullptr;
209208 return runtime_error_wrapper([&] {
210209 auto training_data_impl =
211210 static_cast<const LeanVecTrainingDataManager*>(training_data)->impl_;
212- auto impl = std::make_unique<DynamicVamanaIndexLeanVecImpl >(
211+ auto impl = std::make_unique<Impl >(
213212 dim, metric, storage_kind, training_data_impl, params, default_search_params
214213 );
215- *index = new DynamicVamanaIndexLeanVecImplManager {std::move(impl)};
214+ *index = new DynamicVamanaIndexManagerBase<Impl> {std::move(impl)};
216215 });
217216}
218217
218+ #else // SVS_LEANVEC_HEADER
219+ // LeanVec storage kind is not supported in this build configuration
220+ Status DynamicVamanaIndexLeanVec::
221+ build(DynamicVamanaIndex**, size_t, MetricType, StorageKind, size_t, const DynamicVamanaIndex::BuildParams&, const DynamicVamanaIndex::SearchParams&) noexcept {
222+ return Status(
223+ ErrorCode::NOT_IMPLEMENTED,
224+ "DynamicVamanaIndexLeanVec is not supported in this build configuration."
225+ );
226+ }
227+
228+ Status DynamicVamanaIndexLeanVec::
229+ build(DynamicVamanaIndex**, size_t, MetricType, StorageKind, const LeanVecTrainingData*, const DynamicVamanaIndex::BuildParams&, const DynamicVamanaIndex::SearchParams&) noexcept {
230+ return Status(
231+ ErrorCode::NOT_IMPLEMENTED,
232+ "DynamicVamanaIndexLeanVec is not supported in this build configuration."
233+ );
234+ }
235+ #endif // SVS_LEANVEC_HEADER
219236} // namespace runtime
220237} // namespace svs
0 commit comments