@@ -59,15 +59,6 @@ class DynamicVamanaIndexImpl {
5959 " The specified storage kind is not compatible with the "
6060 " DynamicVamanaIndex" };
6161 }
62-
63- if (build_params_.prune_to == 0 ) {
64- build_params_.prune_to = build_params_.graph_max_degree < 4
65- ? build_params_.graph_max_degree
66- : build_params_.graph_max_degree - 4 ;
67- }
68- if (build_params_.alpha == 0 ) {
69- build_params_.alpha = metric == MetricType::L2 ? 1 .2f : 0 .95f ;
70- }
7162 }
7263
7364 size_t size () const { return impl_ ? impl_->size () : 0 ; }
@@ -337,13 +328,19 @@ class DynamicVamanaIndexImpl {
337328 protected:
338329 // Utility functions
339330 svs::index::vamana::VamanaBuildParameters vamana_build_parameters () const {
340- return svs::index::vamana::VamanaBuildParameters{
341- build_params_.alpha ,
342- build_params_.graph_max_degree ,
343- build_params_.construction_window_size ,
344- build_params_.max_candidate_pool_size ,
345- build_params_.prune_to ,
346- build_params_.use_full_search_history };
331+ svs::index::vamana::VamanaBuildParameters result;
332+ set_if_specified (result.alpha , build_params_.alpha );
333+ set_if_specified (result.graph_max_degree , build_params_.graph_max_degree );
334+ set_if_specified (result.window_size , build_params_.construction_window_size );
335+ set_if_specified (
336+ result.max_candidate_pool_size , build_params_.max_candidate_pool_size
337+ );
338+ set_if_specified (result.prune_to , build_params_.prune_to );
339+ if (is_specified (build_params_.use_full_search_history )) {
340+ result.use_full_search_history =
341+ build_params_.use_full_search_history .is_enabled ();
342+ }
343+ return result;
347344 }
348345
349346 svs::index::vamana::VamanaSearchParameters
@@ -352,33 +349,37 @@ class DynamicVamanaIndexImpl {
352349 throw StatusException{ErrorCode::NOT_INITIALIZED, " Index not initialized" };
353350 }
354351
355- auto sp = impl_->get_search_parameters ();
356-
357- auto search_window_size = default_search_params_.search_window_size ;
358- auto search_buffer_capacity = default_search_params_.search_buffer_capacity ;
359- if (default_search_params_.prefetch_lookahead > 0 ) {
360- sp = sp.prefetch_lookahead (default_search_params_.prefetch_lookahead );
361- }
362- if (default_search_params_.prefetch_step > 0 ) {
363- sp = sp.prefetch_step (default_search_params_.prefetch_step );
352+ // Copy default search parameters
353+ auto search_params = default_search_params_;
354+ // Update with user-specified parameters
355+ if (params) {
356+ set_if_specified (search_params.search_window_size , params->search_window_size );
357+ set_if_specified (
358+ search_params.search_buffer_capacity , params->search_buffer_capacity
359+ );
360+ set_if_specified (search_params.prefetch_lookahead , params->prefetch_lookahead );
361+ set_if_specified (search_params.prefetch_step , params->prefetch_step );
364362 }
365363
366- if (params != nullptr ) {
367- if (params-> search_window_size > 0 )
368- search_window_size = params-> search_window_size ;
369- if (params-> search_buffer_capacity > 0 )
370- search_buffer_capacity = params-> search_buffer_capacity ;
371- if (params-> prefetch_lookahead > 0 ) {
372- sp = sp. prefetch_lookahead (params-> prefetch_lookahead );
373- }
374- if (params-> prefetch_step > 0 ) {
375- sp = sp. prefetch_step (params-> prefetch_step );
364+ // Get current search parameters from the index
365+ auto result = impl_-> get_search_parameters ();
366+ // Update with specified parameters
367+ if (is_specified (search_params. search_window_size )) {
368+ if ( is_specified (search_params. search_buffer_capacity )) {
369+ result. buffer_config (
370+ {search_params. search_window_size , search_params. search_buffer_capacity }
371+ );
372+ } else {
373+ result. buffer_config (search_params. search_window_size );
376374 }
375+ } else if (is_specified (search_params.search_buffer_capacity )) {
376+ result.buffer_config (search_params.search_buffer_capacity );
377377 }
378378
379- return impl_->get_search_parameters ().buffer_config (
380- {search_window_size, search_buffer_capacity}
381- );
379+ set_if_specified (result.prefetch_lookahead_ , search_params.prefetch_lookahead );
380+ set_if_specified (result.prefetch_step_ , search_params.prefetch_step );
381+
382+ return result;
382383 }
383384
384385 template <typename Tag, typename ... StorageArgs>
@@ -447,7 +448,7 @@ class DynamicVamanaIndexImpl {
447448 buffer_config.get_search_window_size (), buffer_config.get_total_capacity ()};
448449 metric_type_ = metric;
449450 storage_kind_ = storage_kind;
450- build_params_ = {
451+ build_params_ = VamanaIndex::BuildParams {
451452 impl_->get_graph_max_degree (),
452453 impl_->get_prune_to (),
453454 impl_->get_alpha (),
0 commit comments