Skip to content

Commit 4af7186

Browse files
author
zourunxin.zrx
committed
new
1 parent cc071bb commit 4af7186

File tree

3 files changed

+96
-12
lines changed

3 files changed

+96
-12
lines changed

example/hnsw_example.cpp

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,12 +670,92 @@ int64_t hnsw_iter_filter_example()
670670
return 0;
671671
}
672672

673+
int64_t hnswbq_example() {
674+
std::cout<<"test hns_bq_example: "<<std::endl;
675+
bool is_init = obvectorlib::is_init();
676+
obvectorlib::VectorIndexPtr index_handler = NULL;
677+
int dim = 128;
678+
int max_degree = 16;
679+
int ef_search = 200;
680+
int ef_construction = 100;
681+
DefaultAllocator default_allocator;
682+
const char* const METRIC_L2 = "l2";
683+
684+
const char* const DATATYPE_FLOAT32 = "float32";
685+
void * test_ptr = default_allocator.Allocate(10);
686+
int ret_create_index = obvectorlib::create_index(index_handler,
687+
obvectorlib::HNSW_BQ_TYPE,
688+
DATATYPE_FLOAT32,
689+
METRIC_L2,
690+
dim,
691+
max_degree,
692+
ef_construction,
693+
ef_search,
694+
&default_allocator);
695+
696+
if (ret_create_index!=0) return 333;
697+
int num_vectors = 10000;
698+
auto ids = new int64_t[num_vectors];
699+
auto vectors = new float[dim * num_vectors];
700+
std::mt19937 rng;
701+
rng.seed(47);
702+
std::uniform_real_distribution<> distrib_real;
703+
for (int64_t i = 0; i < num_vectors; ++i) {
704+
ids[i] = i + num_vectors*10;
705+
}
706+
for (int64_t i = 0; i < dim * num_vectors; ++i) {
707+
vectors[i] = distrib_real(rng);
708+
}
709+
int ret_build_index = obvectorlib::build_index(index_handler, vectors, ids, dim, num_vectors);
710+
711+
int64_t num_size = 0;
712+
int ret_get_element = obvectorlib::get_index_number(index_handler, num_size);
713+
std::cout<<"after add index, size is "<<num_size<<" " <<ret_get_element<<std::endl;
714+
715+
const float* result_dist;
716+
const int64_t* result_ids;
717+
int64_t result_size = 0;
718+
auto query_vector = new float[dim];
719+
for (int64_t i = 0; i < dim; ++i) {
720+
query_vector[i] = distrib_real(rng);
721+
}
722+
723+
roaring::api::roaring64_bitmap_t* r1 = roaring::api::roaring64_bitmap_create();
724+
725+
roaring::api::roaring64_bitmap_add(r1, 18);
726+
roaring::api::roaring64_bitmap_add(r1, 1169);
727+
roaring::api::roaring64_bitmap_add(r1, 1285);
728+
std::cout << "before search" << std::endl;
729+
TestFilter testfilter(r1);
730+
const char *extra_info = nullptr;
731+
int ret_knn_search = obvectorlib::knn_search(index_handler, query_vector, dim, 10,
732+
result_dist,result_ids,result_size,
733+
100, false/*need_extra_info*/, extra_info, &testfilter);
734+
735+
for (int i = 0; i < result_size; i++) {
736+
std::cout << "result: " << result_ids[i] << " " << result_dist[i] << std::endl;
737+
}
738+
int inc_num = 1000;
739+
auto inc = new float[dim * inc_num];
740+
for (int64_t i = 0; i < dim * inc_num; ++i) {
741+
inc[i] = distrib_real(rng);
742+
}
743+
auto ids2 = new int64_t[inc_num];
744+
for (int64_t i = 0; i < inc_num; ++i) {
745+
ids2[i] = i + num_vectors*100;
746+
}
747+
obvectorlib::delete_index(index_handler);
748+
free(test_ptr);
749+
return 0;
750+
}
751+
673752
int
674753
main() {
675754
hnswsq_example();
676755
example();
677-
example_extra_info();
756+
//example_extra_info();
678757
hnsw_iter_filter_example();
679758
hgraph_iter_filter_example();
759+
hnswbq_example();
680760
return 0;
681761
}

extern/vsag.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ include (FetchContent)
44
#set(vsag_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/vsag-src/)
55
FetchContent_Declare(
66
vsag
7-
URL https://github.com/Carrot-77/vsag/archive/refs/tags/vsag_435bp2.tar.gz
8-
URL_HASH MD5=614625006756f9679502226d00d26788
7+
URL https://github.com/antgroup/vsag/archive/refs/tags/v0.14.0.tar.gz
8+
URL_HASH MD5=e54c4fbe8a3a08dddac14370ab0d12f5
99
DOWNLOAD_NO_PROGRESS 0
1010
INACTIVITY_TIMEOUT 20
1111
TIMEOUT 120

ob_vsag_lib.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,18 @@ int HnswIndexHandler::get_extra_info_by_ids(const int64_t* ids,
201201
int HnswIndexHandler::get_vid_bound(int64_t &min_vid, int64_t &max_vid)
202202
{
203203
vsag::ErrorType error = vsag::ErrorType::UNKNOWN_ERROR;
204-
auto result = index_->GetMinAndMaxId();
205-
if (result.has_value()) {
206-
min_vid = result.value().first;
207-
max_vid = result.value().second;
204+
int64_t element_cnt = index_->GetNumElements();
205+
if (element_cnt == 0) {
206+
return 0;
208207
} else {
209-
error = result.error().type;
208+
auto result = index_->GetMinAndMaxId();
209+
if (result.has_value()) {
210+
min_vid = result.value().first;
211+
max_vid = result.value().second;
212+
return 0;
213+
} else {
214+
error = result.error().type;
215+
}
210216
}
211217
return static_cast<int>(error);
212218
}
@@ -229,9 +235,7 @@ int HnswIndexHandler::knn_search(const vsag::DatasetPtr& query, int64_t topk,
229235
};
230236
tl::expected<std::shared_ptr<vsag::Dataset>, vsag::Error> result;
231237
auto vsag_filter = std::make_shared<ObVasgFilter>(valid_ratio, filter);
232-
result = (index_type == HNSW_TYPE || index_type == HGRAPH_TYPE) ?
233-
index_->KnnSearch(query, topk, parameters, bitmap == nullptr ? nullptr : vsag_filter) :
234-
index_->KnnSearch(query, topk, parameters, filter);
238+
result = index_->KnnSearch(query, topk, parameters, bitmap == nullptr ? nullptr : vsag_filter);
235239
if (result.has_value()) {
236240
//result的生命周期
237241
result.value()->Owner(false);
@@ -542,7 +546,7 @@ extern int get_vid_bound(VectorIndexPtr& index_handler, int64_t &min_vid, int64_
542546
HnswIndexHandler* hnsw = static_cast<HnswIndexHandler*>(index_handler);
543547
int ret = hnsw->get_vid_bound(min_vid, max_vid);
544548
if (ret != 0) {
545-
vsag::logger::error(" knn search error happend, ret={}", ret);
549+
vsag::logger::error(" get vid bound error happend, ret={}", ret);
546550
}
547551
return ret;
548552
}

0 commit comments

Comments
 (0)