From 7a3eb65e60845b2d4440130141a30cc9c7d9fb74 Mon Sep 17 00:00:00 2001 From: sunhailinLeo <379978424@qq.com> Date: Mon, 27 Feb 2023 15:35:18 +0800 Subject: [PATCH] :hammer: version 1.0.2 - Update hnswlib compatible version to 0.7.0 and Add some APIs --- README.md | 15 +- example/demo.go | 76 +++- go.mod | 2 +- hnsw.go | 92 +++++ hnsw_wrapper.cc | 88 +++- hnsw_wrapper.h | 31 +- hnsw_wrapper.o | Bin 143336 -> 101016 bytes hnswlib/bruteforce.h | 118 +++--- hnswlib/hnswalg.h | 796 +++++++++++++++++++++--------------- hnswlib/hnswlib.h | 126 +++++- hnswlib/space_ip.h | 156 +++++-- hnswlib/space_l2.h | 90 ++-- hnswlib/visited_list_pool.h | 12 +- libhnsw.a | Bin 149896 -> 109080 bytes 14 files changed, 1106 insertions(+), 496 deletions(-) diff --git a/README.md b/README.md index 67434a9..28d118f 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,29 @@ # hnswlib-to-go Hnswlib to go. Golang interface to hnswlib(https://github.com/nmslib/hnswlib). This is a golang interface of [hnswlib](https://github.com/nmslib/hnswlib). For more information, please follow [hnswlib](https://github.com/nmslib/hnswlib) and [Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs.](https://arxiv.org/abs/1603.09320). -**But in this project, we make compatible hnswlib to 0.5.2.** + +**But in this project, we make compatible hnswlib to 0.7.0.** ### Version +* version 1.0.2 + * Update hnswlib compatible version to 0.7.0 + * Add `AddBatchPoints`, `SearchBatchKNN`, `SetNormalize`, `ResizeIndex`, `MarkDelete`, `UnmarkDelete`, `GetLabelIsMarkedDeleted` API + * version 1.0.1 * Code format * Add an api support unload the graph(Experimental) * version 1.0.0 - * hnswlib compatible version 0.5.2. + * hnswlib compatible version 0.5.2. ### Build * Linux/MacOS - * Build Golang Env - * `go mod init` - * `make` + * Build Golang Env + * `go mod init` + * `make` ### Usage diff --git a/example/demo.go b/example/demo.go index b93387a..89c86ec 100644 --- a/example/demo.go +++ b/example/demo.go @@ -42,13 +42,14 @@ func randVector(dim int) []float32 { return vec } -func main() { - var dim, M, ef int = 128, 32, 300 +// 单个写入 +func exampleAddPoint(indexFileName string) { + var dim, M, ef = 128, 32, 300 // 最大的 elements 数 - var maxElements uint32 = 50000 + var maxElements uint32 = 10000 // 定义距离 cosine - var spaceType, indexLocation string = "cosine", "hnsw_demo_index.bin" - var randomSeed int = 100 + var spaceType = "cosine" + var randomSeed = 100 fmt.Println("Before Create HNSW") traceMemStats() // Init new index @@ -61,8 +62,43 @@ func main() { } h.AddPoint(randVector(dim), i) } - h.Save(indexLocation) - h = hnswgo.Load(indexLocation, dim, spaceType) + h.Save(indexFileName) +} + +// 批量写入 +func exampleBatchAddPoint(indexFileName string) { + var dim, M, ef = 128, 32, 300 + + // 最大的 elements 数 + var maxElements uint32 = 20000 + + // 定义距离 cosine + var spaceType = "cosine" + var randomSeed = 100 + fmt.Println("Before Create HNSW") + + // 初始化 Init new index + h := hnswgo.New(dim, M, ef, randomSeed, maxElements, spaceType) + + vectorList := make([][]float32, maxElements) + ids := make([]uint32, maxElements) + var i uint32 + for ; i < maxElements; i++ { + if i%1000 == 0 { + fmt.Println(i) + } + vectorList[i] = randVector(dim) + ids[i] = i + } + h.AddBatchPoints(vectorList, ids, 10) + + // 保存索引 Save Index + h.Save(indexFileName) +} + +// 读取 +func exampleLoadIndex(indexFileName, spaceType string, dim int) { + h := hnswgo.Load(indexFileName, dim, spaceType) // Search vector with maximum 5 NN h.SetEf(15) searchVector := randVector(dim) @@ -73,10 +109,36 @@ func main() { fmt.Println(endTime - startTime) fmt.Println(labels, vectors) + // Test ResizeIndex API + isResize := h.ResizeIndex(12000) + fmt.Println("Size flag: ", isResize) + + // Test Mark API + isMarkDelete := h.MarkDelete(10) + fmt.Println("isMarkDelete: ", isMarkDelete) + + labelIsDelete := h.GetLabelIsMarkedDeleted(10) + fmt.Println("labelIsDelete: ", labelIsDelete) + + isUnmarkDelete := h.UnmarkDelete(10) + fmt.Println("isUnmarkDelete: ", isUnmarkDelete) + + // Test Unload API fmt.Println("Before Unload") traceMemStats() h.Unload() fmt.Println("After Unload") traceMemStats() +} + +func main() { + // 单条写入 add index point by point + exampleAddPoint("hnsw_demo_single.bin") + // 测试读取 test loading + exampleLoadIndex("hnsw_demo_single.bin", "cosine", 128) + // 批量写入 add index with batch mode + //exampleBatchAddPoint("hnsw_demo_multiple.bin") + // 测试读取 test loading + //exampleLoadIndex("hnsw_demo_multiple.bin", "cosine", 128) } diff --git a/go.mod b/go.mod index eda0b84..4699923 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/sunhailin-Leo/hnswlib-to-go -go 1.15 +go 1.18 diff --git a/hnsw.go b/hnsw.go index e0ed142..b763dba 100644 --- a/hnsw.go +++ b/hnsw.go @@ -2,16 +2,23 @@ package hnswgo // #cgo LDFLAGS: -L${SRCDIR} -lhnsw -lm // #include +// #include // #include "hnsw_wrapper.h" // HNSW initHNSW(int dim, unsigned long int max_elements, int M, int ef_construction, int rand_seed, char stype); // HNSW loadHNSW(char *location, int dim, char stype); // void addPoint(HNSW index, float *vec, unsigned long int label); // int searchKnn(HNSW index, float *vec, int N, unsigned long int *label, float *dist); // void setEf(HNSW index, int ef); +// bool resizeIndex(HNSW index, unsigned long int new_max_elements); +// bool markDelete(HNSW index, unsigned long int label); +// bool unmarkDelete(HNSW index, unsigned long int label); +// bool isMarkedDeleted(HNSW index, unsigned long int label); +// bool updatePoint(HNSW index, float *vec, unsigned long int label); import "C" import ( "math" "runtime" + "sync" "unsafe" ) @@ -105,6 +112,33 @@ func (h *HNSW) AddPoint(vector []float32, label uint32) bool { return true } +// AddBatchPoints add some points on graph with goroutine +func (h *HNSW) AddBatchPoints(vectors [][]float32, labels []uint32, coroutines int) bool { + if len(vectors) != len(labels) { + return false + } + + b := len(vectors) / coroutines + var wg sync.WaitGroup + for i := 0; i < coroutines; i++ { + wg.Add(1) + + end := (i + 1) * b + if i == coroutines-1 && len(vectors) > end { + end = len(vectors) + } + go func(thisVectors [][]float32, thisLabels []uint32) { + defer wg.Done() + for j := 0; j < len(thisVectors); j++ { + h.AddPoint(thisVectors[j], thisLabels[j]) + } + }(vectors[i*b:end], labels[i*b:end]) + } + + wg.Wait() + return true +} + // SearchKNN search points on graph with knn-algorithm func (h *HNSW) SearchKNN(vector []float32, N int) ([]uint32, []float32) { if h.index == nil { @@ -125,6 +159,35 @@ func (h *HNSW) SearchKNN(vector []float32, N int) ([]uint32, []float32) { return labels[:numResult], dists[:numResult] } +func (h *HNSW) SearchBatchKNN(vectors [][]float32, N, coroutines int) ([][]uint32, [][]float32) { + var lock sync.Mutex + labelList := make([][]uint32, len(vectors)) + distList := make([][]float32, len(vectors)) + + b := len(vectors) / coroutines + var wg sync.WaitGroup + for i := 0; i < coroutines; i++ { + wg.Add(1) + + end := (i + 1) * b + if i == coroutines-1 && len(vectors) > end { + end = len(vectors) + } + go func(i int) { + defer wg.Done() + for j := i * b; j < end; j++ { + labels, dist := h.SearchKNN(vectors[j], N) + lock.Lock() + labelList[j] = labels + distList[j] = dist + lock.Unlock() + } + }(i) + } + wg.Wait() + return labelList, distList +} + // SetEf set ef argument on graph func (h *HNSW) SetEf(ef int) { if h.index == nil { @@ -132,3 +195,32 @@ func (h *HNSW) SetEf(ef int) { } C.setEf(h.index, C.int(ef)) } + +// SetNormalize set normalize on graph +func (h *HNSW) SetNormalize(isNeedNormalize bool) { + h.normalize = isNeedNormalize +} + +// ResizeIndex set new elements count to resize index +func (h *HNSW) ResizeIndex(newMaxElements uint32) bool { + isResize := bool(C.resizeIndex(h.index, C.ulong(newMaxElements))) + return isResize +} + +// MarkDelete mark a label to delete mode +func (h *HNSW) MarkDelete(label uint32) bool { + isMark := bool(C.markDelete(h.index, C.ulong(label))) + return isMark +} + +// UnmarkDelete unmark a label to delete mode +func (h *HNSW) UnmarkDelete(label uint32) bool { + isUnmark := bool(C.unmarkDelete(h.index, C.ulong(label))) + return isUnmark +} + +// GetLabelIsMarkedDeleted get label isDelete +func (h *HNSW) GetLabelIsMarkedDeleted(label uint32) bool { + isDelete := bool(C.isMarkedDeleted(h.index, C.ulong(label))) + return isDelete +} diff --git a/hnsw_wrapper.cc b/hnsw_wrapper.cc index acee92d..3527e18 100644 --- a/hnsw_wrapper.cc +++ b/hnsw_wrapper.cc @@ -1,4 +1,5 @@ //hnsw_wrapper.cpp +#include #include #include "hnswlib/hnswlib.h" #include "hnsw_wrapper.h" @@ -12,8 +13,9 @@ HNSW initHNSW(int dim, unsigned long int max_elements, int M, int ef_constructio } else { space = new hnswlib::L2Space(dim); } - hnswlib::HierarchicalNSW *appr_alg = new hnswlib::HierarchicalNSW(space, max_elements, M, ef_construction, rand_seed); - return (void*)appr_alg; + hnswlib::HierarchicalNSW *appr_alg = new hnswlib::HierarchicalNSW(space, max_elements, M, + ef_construction, rand_seed); + return (void *) appr_alg; } HNSW loadHNSW(char *location, int dim, char stype) { @@ -23,24 +25,25 @@ HNSW loadHNSW(char *location, int dim, char stype) { } else { space = new hnswlib::L2Space(dim); } - hnswlib::HierarchicalNSW *appr_alg = new hnswlib::HierarchicalNSW(space, std::string(location), false, 0); - return (void*)appr_alg; + hnswlib::HierarchicalNSW *appr_alg = new hnswlib::HierarchicalNSW(space, std::string(location), false, + 0); + return (void *) appr_alg; } HNSW saveHNSW(HNSW index, char *location) { - ((hnswlib::HierarchicalNSW*)index)->saveIndex(location); + ((hnswlib::HierarchicalNSW *) index)->saveIndex(location); return 0; } void addPoint(HNSW index, float *vec, unsigned long int label) { - ((hnswlib::HierarchicalNSW*)index)->addPoint(vec, label); + ((hnswlib::HierarchicalNSW *) index)->addPoint(vec, label); } int searchKnn(HNSW index, float *vec, int N, unsigned long int *label, float *dist) { - std::priority_queue> gt; + std::priority_queue > gt; try { - gt = ((hnswlib::HierarchicalNSW*)index)->searchKnn(vec, N); - } catch (const std::exception& e) { + gt = ((hnswlib::HierarchicalNSW *) index)->searchKnn(vec, N); + } catch (const std::exception &e) { return 0; } @@ -48,13 +51,74 @@ int searchKnn(HNSW index, float *vec, int N, unsigned long int *label, float *di std::pair pair; for (int i = n - 1; i >= 0; i--) { pair = gt.top(); - *(dist+i) = pair.first; - *(label+i) = pair.second; + *(dist + i) = pair.first; + *(label + i) = pair.second; gt.pop(); } return n; } void setEf(HNSW index, int ef) { - ((hnswlib::HierarchicalNSW*)index)->ef_ = ef; + ((hnswlib::HierarchicalNSW *) index)->ef_ = ef; } + +bool resizeIndex(HNSW index, unsigned long int new_max_elements) { + if (new_max_elements < ((hnswlib::HierarchicalNSW *) index)->getCurrentElementCount()) { + return false; + } + try { + ((hnswlib::HierarchicalNSW *) index)->resizeIndex(new_max_elements); + } catch (const std::exception &e) { + return false; + } + return true; +} + +bool markDelete(HNSW index, unsigned long int label) { + try { + ((hnswlib::HierarchicalNSW *) index)->markDelete(label); + return true; + } catch (const std::exception &e) { + return false; + } +} + +bool unmarkDelete(HNSW index, unsigned long int label) { + try { + ((hnswlib::HierarchicalNSW *) index)->unmarkDelete(label); + return true; + } catch (const std::exception &e) { + return false; + } +} + +bool isMarkedDeleted(HNSW index, unsigned long int label) { + std::unique_lock lock_table(((hnswlib::HierarchicalNSW *) index)->label_lookup_lock); + auto search = ((hnswlib::HierarchicalNSW *) index)->label_lookup_.find(label); + + if (search != ((hnswlib::HierarchicalNSW *) index)->label_lookup_.end()) { + bool res = ((hnswlib::HierarchicalNSW *) index)->isMarkedDeleted(search->second); + lock_table.unlock(); + return res; + } + return false; +} + +bool updatePoint(HNSW index, float *vec, unsigned long int label) { + std::unique_lock lock_table(((hnswlib::HierarchicalNSW *) index)->label_lookup_lock); + auto search = ((hnswlib::HierarchicalNSW *) index)->label_lookup_.find(label); + + if (search != ((hnswlib::HierarchicalNSW *) index)->label_lookup_.end()) { + hnswlib::tableint existingInternalId = search->second; + lock_table.unlock(); + // const void *dataPoint, tableint internalId, float updateNeighborProbability + ((hnswlib::HierarchicalNSW *) index)->updatePoint(vec, existingInternalId, 1.0); + return true; + } + return false; +} + +// TODO +//std::vector getDataByLabel(HNSW index, unsigned long int label) { +// return ((hnswlib::HierarchicalNSW*)index)->getDataByLabel(label); +//} diff --git a/hnsw_wrapper.h b/hnsw_wrapper.h index 4cca0d0..8279cd8 100644 --- a/hnsw_wrapper.h +++ b/hnsw_wrapper.h @@ -2,13 +2,30 @@ #ifdef __cplusplus extern "C" { #endif - typedef void* HNSW; - HNSW initHNSW(int dim, unsigned long int max_elements, int M, int ef_construction, int rand_seed, char stype); - HNSW loadHNSW(char *location, int dim, char stype); - HNSW saveHNSW(HNSW index, char *location); - void addPoint(HNSW index, float *vec, unsigned long int label); - int searchKnn(HNSW index, float *vec, int N, unsigned long int *label, float *dist); - void setEf(HNSW index, int ef); +typedef void *HNSW; + +HNSW initHNSW(int dim, unsigned long int max_elements, int M, int ef_construction, int rand_seed, char stype); + +HNSW loadHNSW(char *location, int dim, char stype); + +HNSW saveHNSW(HNSW index, char *location); + +void addPoint(HNSW index, float *vec, unsigned long int label); + +int searchKnn(HNSW index, float *vec, int N, unsigned long int *label, float *dist); + +void setEf(HNSW index, int ef); + +bool resizeIndex(HNSW index, unsigned long int new_max_elements); + +bool markDelete(HNSW index, unsigned long int label); + +bool unmarkDelete(HNSW index, unsigned long int label); + +bool isMarkedDeleted(HNSW index, unsigned long int label); + +bool updatePoint(HNSW index, float *vec, unsigned long int label); + #ifdef __cplusplus } #endif diff --git a/hnsw_wrapper.o b/hnsw_wrapper.o index 04ec7714012a4275c798de8fecf3b2247169d28d..8b483316ce101a47a55d44a88892667d7479f563 100644 GIT binary patch literal 101016 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 literal 143336 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 jd-{qJK2_7UPbvHoqXSmCRXLm #include #include #include +#include namespace hnswlib { template class BruteforceSearch : public AlgorithmInterface { public: - BruteforceSearch(SpaceInterface *s) { + char *data_; + size_t maxelements_; + size_t cur_element_count; + size_t size_per_element_; + + size_t data_size_; + DISTFUNC fstdistfunc_; + void *dist_func_param_; + std::mutex index_lock; + + std::unordered_map dict_external_to_internal; + + BruteforceSearch(SpaceInterface *s) + : data_(nullptr), + maxelements_(0), + cur_element_count(0), + size_per_element_(0), + data_size_(0), + dist_func_param_(nullptr) { } - BruteforceSearch(SpaceInterface *s, const std::string &location) { + + + BruteforceSearch(SpaceInterface *s, const std::string &location) + : data_(nullptr), + maxelements_(0), + cur_element_count(0), + size_per_element_(0), + data_size_(0), + dist_func_param_(nullptr) { loadIndex(location, s); } + BruteforceSearch(SpaceInterface *s, size_t maxElements) { maxelements_ = maxElements; data_size_ = s->get_data_size(); @@ -23,93 +52,83 @@ namespace hnswlib { size_per_element_ = data_size_ + sizeof(labeltype); data_ = (char *) malloc(maxElements * size_per_element_); if (data_ == nullptr) - std::runtime_error("Not enough memory: BruteforceSearch failed to allocate data"); + throw std::runtime_error("Not enough memory: BruteforceSearch failed to allocate data"); cur_element_count = 0; } + ~BruteforceSearch() { free(data_); } - char *data_; - size_t maxelements_; - size_t cur_element_count; - size_t size_per_element_; - - size_t data_size_; - DISTFUNC fstdistfunc_; - void *dist_func_param_; - std::mutex index_lock; - - std::unordered_map dict_external_to_internal; - - void addPoint(const void *datapoint, labeltype label) { + void addPoint(const void *datapoint, labeltype label, bool replace_deleted = false) { int idx; { - std::unique_lock lock(index_lock); - - + std::unique_lock lock(index_lock); - auto search=dict_external_to_internal.find(label); + auto search = dict_external_to_internal.find(label); if (search != dict_external_to_internal.end()) { - idx=search->second; - } - else{ + idx = search->second; + } else { if (cur_element_count >= maxelements_) { throw std::runtime_error("The number of elements exceeds the specified limit\n"); } - idx=cur_element_count; + idx = cur_element_count; dict_external_to_internal[label] = idx; cur_element_count++; } } memcpy(data_ + size_per_element_ * idx + data_size_, &label, sizeof(labeltype)); memcpy(data_ + size_per_element_ * idx, datapoint, data_size_); + } - - - }; - void removePoint(labeltype cur_external) { - size_t cur_c=dict_external_to_internal[cur_external]; + size_t cur_c = dict_external_to_internal[cur_external]; dict_external_to_internal.erase(cur_external); - labeltype label=*((labeltype*)(data_ + size_per_element_ * (cur_element_count-1) + data_size_)); - dict_external_to_internal[label]=cur_c; + labeltype label = *((labeltype * )(data_ + size_per_element_ * (cur_element_count - 1) + data_size_)); + dict_external_to_internal[label] = cur_c; memcpy(data_ + size_per_element_ * cur_c, - data_ + size_per_element_ * (cur_element_count-1), - data_size_+sizeof(labeltype)); + data_ + size_per_element_ * (cur_element_count - 1), + data_size_ + sizeof(labeltype)); cur_element_count--; - } - std::priority_queue> - searchKnn(const void *query_data, size_t k) const { - std::priority_queue> topResults; + std::priority_queue > + searchKnn(const void *query_data, size_t k, BaseFilterFunctor *isIdAllowed = nullptr) const { + assert(k <= cur_element_count); + std::priority_queue > topResults; if (cur_element_count == 0) return topResults; for (int i = 0; i < k; i++) { dist_t dist = fstdistfunc_(query_data, data_ + size_per_element_ * i, dist_func_param_); - topResults.push(std::pair(dist, *((labeltype *) (data_ + size_per_element_ * i + - data_size_)))); + labeltype label = *((labeltype * )(data_ + size_per_element_ * i + data_size_)); + if ((!isIdAllowed) || (*isIdAllowed)(label)) { + topResults.push(std::pair(dist, label)); + } } - dist_t lastdist = topResults.top().first; + dist_t lastdist = topResults.empty() ? std::numeric_limits::max() : topResults.top().first; for (int i = k; i < cur_element_count; i++) { dist_t dist = fstdistfunc_(query_data, data_ + size_per_element_ * i, dist_func_param_); if (dist <= lastdist) { - topResults.push(std::pair(dist, *((labeltype *) (data_ + size_per_element_ * i + - data_size_)))); + labeltype label = *((labeltype * )(data_ + size_per_element_ * i + data_size_)); + if ((!isIdAllowed) || (*isIdAllowed)(label)) { + topResults.push(std::pair(dist, label)); + } if (topResults.size() > k) topResults.pop(); - lastdist = topResults.top().first; - } + if (!topResults.empty()) { + lastdist = topResults.top().first; + } + } } return topResults; - }; + } + void saveIndex(const std::string &location) { std::ofstream output(location, std::ios::binary); @@ -124,9 +143,8 @@ namespace hnswlib { output.close(); } - void loadIndex(const std::string &location, SpaceInterface *s) { - + void loadIndex(const std::string &location, SpaceInterface *s) { std::ifstream input(location, std::ios::binary); std::streampos position; @@ -140,13 +158,11 @@ namespace hnswlib { size_per_element_ = data_size_ + sizeof(labeltype); data_ = (char *) malloc(maxelements_ * size_per_element_); if (data_ == nullptr) - std::runtime_error("Not enough memory: loadIndex failed to allocate data"); + throw std::runtime_error("Not enough memory: loadIndex failed to allocate data"); input.read(data_, maxelements_ * size_per_element_); input.close(); - } - }; -} +} // namespace hnswlib diff --git a/hnswlib/hnswalg.h b/hnswlib/hnswalg.h index f23c17d..2623fac 100644 --- a/hnswlib/hnswalg.h +++ b/hnswlib/hnswalg.h @@ -16,27 +16,95 @@ namespace hnswlib { template class HierarchicalNSW : public AlgorithmInterface { public: - static const tableint max_update_element_locks = 65536; - HierarchicalNSW(SpaceInterface *s) { + static const tableint MAX_LABEL_OPERATION_LOCKS = 65536; + static const unsigned char DELETE_MARK = 0x01; + + size_t max_elements_{0}; + mutable std::atomic cur_element_count{0}; // current number of elements + size_t size_data_per_element_{0}; + size_t size_links_per_element_{0}; + mutable std::atomic num_deleted_{0}; // number of deleted elements + size_t M_{0}; + size_t maxM_{0}; + size_t maxM0_{0}; + size_t ef_construction_{0}; + size_t ef_{0}; + + double mult_{0.0}, revSize_{0.0}; + int maxlevel_{0}; + + VisitedListPool *visited_list_pool_{nullptr}; + + // Locks operations with element by label value + mutable std::vector label_op_locks_; + + std::mutex global; + std::vector link_list_locks_; + + tableint enterpoint_node_{0}; + + size_t size_links_level0_{0}; + size_t offsetData_{0}, offsetLevel0_{0}, label_offset_{0}; + + char *data_level0_memory_{nullptr}; + char **linkLists_{nullptr}; + std::vector element_levels_; // keeps level of each element + + size_t data_size_{0}; + + DISTFUNC fstdistfunc_; + void *dist_func_param_{nullptr}; + mutable std::mutex label_lookup_lock; // lock for label_lookup_ + std::unordered_map label_lookup_; + + std::default_random_engine level_generator_; + std::default_random_engine update_probability_generator_; + + mutable std::atomic metric_distance_computations{0}; + mutable std::atomic metric_hops{0}; + + bool allow_replace_deleted_ = false; // flag to replace deleted elements (marked as deleted) during insertions + + std::mutex deleted_elements_lock; // lock for deleted_elements + std::unordered_set deleted_elements; // contains internal ids of deleted elements + + + HierarchicalNSW(SpaceInterface *s) { } - HierarchicalNSW(SpaceInterface *s, const std::string &location, bool nmslib = false, size_t max_elements=0) { + + HierarchicalNSW( + SpaceInterface *s, + const std::string &location, + bool nmslib = false, + size_t max_elements = 0, + bool allow_replace_deleted = false) + : allow_replace_deleted_(allow_replace_deleted) { loadIndex(location, s, max_elements); } - HierarchicalNSW(SpaceInterface *s, size_t max_elements, size_t M = 16, size_t ef_construction = 200, size_t random_seed = 100) : - link_list_locks_(max_elements), link_list_update_locks_(max_update_element_locks), element_levels_(max_elements) { - max_elements_ = max_elements; - has_deletions_=false; + HierarchicalNSW( + SpaceInterface *s, + size_t max_elements, + size_t M = 16, + size_t ef_construction = 200, + size_t random_seed = 100, + bool allow_replace_deleted = false) + : link_list_locks_(max_elements), + label_op_locks_(MAX_LABEL_OPERATION_LOCKS), + element_levels_(max_elements), + allow_replace_deleted_(allow_replace_deleted) { + max_elements_ = max_elements; + num_deleted_ = 0; data_size_ = s->get_data_size(); fstdistfunc_ = s->get_dist_func(); dist_func_param_ = s->get_dist_func_param(); M_ = M; maxM_ = M_; maxM0_ = M_ * 2; - ef_construction_ = std::max(ef_construction,M_); + ef_construction_ = std::max(ef_construction, M_); ef_ = 10; level_generator_.seed(random_seed); @@ -56,9 +124,7 @@ namespace hnswlib { visited_list_pool_ = new VisitedListPool(1, max_elements); - - - //initializations for special treatment of the first node + // initializations for special treatment of the first node enterpoint_node_ = -1; maxlevel_ = -1; @@ -70,15 +136,8 @@ namespace hnswlib { revSize_ = 1.0 / mult_; } - struct CompareByFirst { - constexpr bool operator()(std::pair const &a, - std::pair const &b) const noexcept { - return a.first < b.first; - } - }; ~HierarchicalNSW() { - free(data_level0_memory_); for (tableint i = 0; i < cur_element_count; i++) { if (element_levels_[i] > 0) @@ -88,85 +147,85 @@ namespace hnswlib { delete visited_list_pool_; } - size_t max_elements_; - size_t cur_element_count; - size_t size_data_per_element_; - size_t size_links_per_element_; - - size_t M_; - size_t maxM_; - size_t maxM0_; - size_t ef_construction_; - - double mult_, revSize_; - int maxlevel_; - - - VisitedListPool *visited_list_pool_; - std::mutex cur_element_count_guard_; - - std::vector link_list_locks_; - - // Locks to prevent race condition during update/insert of an element at same time. - // Note: Locks for additions can also be used to prevent this race condition if the querying of KNN is not exposed along with update/inserts i.e multithread insert/update/query in parallel. - std::vector link_list_update_locks_; - tableint enterpoint_node_; - - - size_t size_links_level0_; - size_t offsetData_, offsetLevel0_; + struct CompareByFirst { + constexpr bool operator()(std::pair const &a, + std::pair const &b) const - char *data_level0_memory_; - char **linkLists_; - std::vector element_levels_; + noexcept { + return a.first < b.first; + } + }; - size_t data_size_; - bool has_deletions_; + void setEf(size_t ef) { + ef_ = ef; + } - size_t label_offset_; - DISTFUNC fstdistfunc_; - void *dist_func_param_; - std::unordered_map label_lookup_; + inline std::mutex &getLabelOpMutex(labeltype label) const { + // calculate hash + size_t lock_id = label & (MAX_LABEL_OPERATION_LOCKS - 1); + return label_op_locks_[lock_id]; + } - std::default_random_engine level_generator_; - std::default_random_engine update_probability_generator_; inline labeltype getExternalLabel(tableint internal_id) const { labeltype return_label; - memcpy(&return_label,(data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_), sizeof(labeltype)); + memcpy(&return_label, (data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_), + sizeof(labeltype)); return return_label; } + inline void setExternalLabel(tableint internal_id, labeltype label) const { - memcpy((data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_), &label, sizeof(labeltype)); + memcpy((data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_), &label, + sizeof(labeltype)); } + inline labeltype *getExternalLabeLp(tableint internal_id) const { return (labeltype *) (data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_); } + inline char *getDataByInternalId(tableint internal_id) const { return (data_level0_memory_ + internal_id * size_data_per_element_ + offsetData_); } + int getRandomLevel(double reverse_size) { std::uniform_real_distribution distribution(0.0, 1.0); double r = -log(distribution(level_generator_)) * reverse_size; return (int) r; } + size_t getMaxElements() { + return max_elements_; + } + + size_t getCurrentElementCount() { + return cur_element_count; + } + + size_t getDeletedCount() { + return num_deleted_; + } - std::priority_queue, std::vector>, CompareByFirst> - searchBaseLayer(tableint ep_id, const void *data_point, int layer) { + std::priority_queue , std::vector>, CompareByFirst> + searchBaseLayer(tableint + ep_id, + const void *data_point, + int layer + ) { VisitedList *vl = visited_list_pool_->getFreeVisitedList(); vl_type *visited_array = vl->mass; vl_type visited_array_tag = vl->curV; - std::priority_queue, std::vector>, CompareByFirst> top_candidates; - std::priority_queue, std::vector>, CompareByFirst> candidateSet; + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > top_candidates; + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > candidateSet; dist_t lowerBound; if (!isMarkedDeleted(ep_id)) { @@ -181,8 +240,8 @@ namespace hnswlib { visited_array[ep_id] = visited_array_tag; while (!candidateSet.empty()) { - std::pair curr_el_pair = candidateSet.top(); - if ((-curr_el_pair.first) > lowerBound) { + std::pair curr_el_pair = candidateSet.top(); + if ((-curr_el_pair.first) > lowerBound && top_candidates.size() == ef_construction_) { break; } candidateSet.pop(); @@ -191,15 +250,15 @@ namespace hnswlib { std::unique_lock lock(link_list_locks_[curNodeNum]); - int *data;// = (int *)(linkList0_ + curNodeNum * size_links_per_element0_); + int *data; // = (int *)(linkList0_ + curNodeNum * size_links_per_element0_); if (layer == 0) { - data = (int*)get_linklist0(curNodeNum); + data = (int *) get_linklist0(curNodeNum); } else { - data = (int*)get_linklist(curNodeNum, layer); + data = (int *) get_linklist(curNodeNum, layer); // data = (int *) (linkLists_[curNodeNum] + (layer - 1) * size_links_per_element_); } - size_t size = getListCount((linklistsizeint*)data); - tableint *datal = (tableint *) (data + 1); + size_t size = getListCount((linklistsizeint *) data); + tableint *datal = (tableint * )(data + 1); #ifdef USE_SSE _mm_prefetch((char *) (visited_array + *(data + 1)), _MM_HINT_T0); _mm_prefetch((char *) (visited_array + *(data + 1) + 64), _MM_HINT_T0); @@ -241,21 +300,27 @@ namespace hnswlib { return top_candidates; } - mutable std::atomic metric_distance_computations; - mutable std::atomic metric_hops; - template - std::priority_queue, std::vector>, CompareByFirst> - searchBaseLayerST(tableint ep_id, const void *data_point, size_t ef) const { + template + std::priority_queue , std::vector>, CompareByFirst> + searchBaseLayerST(tableint + ep_id, + const void *data_point, size_t + ef, + BaseFilterFunctor *isIdAllowed = nullptr + ) const { VisitedList *vl = visited_list_pool_->getFreeVisitedList(); vl_type *visited_array = vl->mass; vl_type visited_array_tag = vl->curV; - std::priority_queue, std::vector>, CompareByFirst> top_candidates; - std::priority_queue, std::vector>, CompareByFirst> candidate_set; + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > top_candidates; + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > candidate_set; dist_t lowerBound; - if (!has_deletions || !isMarkedDeleted(ep_id)) { + if ((!has_deletions || !isMarkedDeleted(ep_id)) && + ((!isIdAllowed) || (*isIdAllowed)(getExternalLabel(ep_id)))) { dist_t dist = fstdistfunc_(data_point, getDataByInternalId(ep_id), dist_func_param_); lowerBound = dist; top_candidates.emplace(dist, ep_id); @@ -268,21 +333,21 @@ namespace hnswlib { visited_array[ep_id] = visited_array_tag; while (!candidate_set.empty()) { + std::pair current_node_pair = candidate_set.top(); - std::pair current_node_pair = candidate_set.top(); - - if ((-current_node_pair.first) > lowerBound) { + if ((-current_node_pair.first) > lowerBound && + (top_candidates.size() == ef || (!isIdAllowed && !has_deletions))) { break; } candidate_set.pop(); tableint current_node_id = current_node_pair.second; int *data = (int *) get_linklist0(current_node_id); - size_t size = getListCount((linklistsizeint*)data); + size_t size = getListCount((linklistsizeint *) data); // bool cur_node_deleted = isMarkedDeleted(current_node_id); - if(collect_metrics){ + if (collect_metrics) { metric_hops++; - metric_distance_computations+=size; + metric_distance_computations += size; } #ifdef USE_SSE @@ -298,10 +363,9 @@ namespace hnswlib { #ifdef USE_SSE _mm_prefetch((char *) (visited_array + *(data + j + 1)), _MM_HINT_T0); _mm_prefetch(data_level0_memory_ + (*(data + j + 1)) * size_data_per_element_ + offsetData_, - _MM_HINT_T0);//////////// + _MM_HINT_T0); //////////// #endif if (!(visited_array[candidate_id] == visited_array_tag)) { - visited_array[candidate_id] = visited_array_tag; char *currObj1 = (getDataByInternalId(candidate_id)); @@ -311,11 +375,12 @@ namespace hnswlib { candidate_set.emplace(-dist, candidate_id); #ifdef USE_SSE _mm_prefetch(data_level0_memory_ + candidate_set.top().second * size_data_per_element_ + - offsetLevel0_,/////////// - _MM_HINT_T0);//////////////////////// + offsetLevel0_, /////////// + _MM_HINT_T0); //////////////////////// #endif - if (!has_deletions || !isMarkedDeleted(candidate_id)) + if ((!has_deletions || !isMarkedDeleted(candidate_id)) && + ((!isIdAllowed) || (*isIdAllowed)(getExternalLabel(candidate_id)))) top_candidates.emplace(dist, candidate_id); if (top_candidates.size() > ef) @@ -332,15 +397,20 @@ namespace hnswlib { return top_candidates; } + void getNeighborsByHeuristic2( - std::priority_queue, std::vector>, CompareByFirst> &top_candidates, - const size_t M) { + std::priority_queue , std::vector>, + CompareByFirst + + > &top_candidates, + const size_t M + ) { if (top_candidates.size() < M) { return; } - std::priority_queue> queue_closest; - std::vector> return_list; + std::priority_queue > queue_closest; + std::vector > return_list; while (top_candidates.size() > 0) { queue_closest.emplace(-top_candidates.top().first, top_candidates.top().second); top_candidates.pop(); @@ -349,16 +419,16 @@ namespace hnswlib { while (queue_closest.size()) { if (return_list.size() >= M) break; - std::pair curent_pair = queue_closest.top(); + std::pair curent_pair = queue_closest.top(); dist_t dist_to_query = -curent_pair.first; queue_closest.pop(); bool good = true; - for (std::pair second_pair : return_list) { + for (std::pair second_pair: return_list) { dist_t curdist = fstdistfunc_(getDataByInternalId(second_pair.second), getDataByInternalId(curent_pair.second), - dist_func_param_);; + dist_func_param_); if (curdist < dist_to_query) { good = false; break; @@ -369,7 +439,7 @@ namespace hnswlib { } } - for (std::pair curent_pair : return_list) { + for (std::pair curent_pair: return_list) { top_candidates.emplace(-curent_pair.first, curent_pair.second); } } @@ -377,29 +447,40 @@ namespace hnswlib { linklistsizeint *get_linklist0(tableint internal_id) const { return (linklistsizeint *) (data_level0_memory_ + internal_id * size_data_per_element_ + offsetLevel0_); - }; + } + linklistsizeint *get_linklist0(tableint internal_id, char *data_level0_memory_) const { return (linklistsizeint *) (data_level0_memory_ + internal_id * size_data_per_element_ + offsetLevel0_); - }; + } + linklistsizeint *get_linklist(tableint internal_id, int level) const { return (linklistsizeint *) (linkLists_[internal_id] + (level - 1) * size_links_per_element_); - }; + } + linklistsizeint *get_linklist_at_level(tableint internal_id, int level) const { return level == 0 ? get_linklist0(internal_id) : get_linklist(internal_id, level); - }; + } + - tableint mutuallyConnectNewElement(const void *data_point, tableint cur_c, - std::priority_queue, std::vector>, CompareByFirst> &top_candidates, - int level, bool isUpdate) { + tableint mutuallyConnectNewElement( + const void *data_point, + tableint cur_c, + std::priority_queue , std::vector>, + CompareByFirst + + > &top_candidates, + int level, + bool isUpdate + ) { size_t Mcurmax = level ? maxM_ : maxM0_; getNeighborsByHeuristic2(top_candidates, M_); if (top_candidates.size() > M_) throw std::runtime_error("Should be not be more than M_ candidates returned by the heuristic"); - std::vector selectedNeighbors; + std::vector selectedNeighbors; selectedNeighbors.reserve(M_); while (top_candidates.size() > 0) { selectedNeighbors.push_back(top_candidates.top().second); @@ -409,6 +490,12 @@ namespace hnswlib { tableint next_closest_entry_point = selectedNeighbors.back(); { + // lock only during the update + // because during the addition the lock for cur_c is already acquired + std::unique_lock lock(link_list_locks_[cur_c], std::defer_lock); + if (isUpdate) { + lock.lock(); + } linklistsizeint *ll_cur; if (level == 0) ll_cur = get_linklist0(cur_c); @@ -418,8 +505,8 @@ namespace hnswlib { if (*ll_cur && !isUpdate) { throw std::runtime_error("The newly inserted element should have blank link list"); } - setListCount(ll_cur,selectedNeighbors.size()); - tableint *data = (tableint *) (ll_cur + 1); + setListCount(ll_cur, selectedNeighbors.size()); + tableint *data = (tableint * )(ll_cur + 1); for (size_t idx = 0; idx < selectedNeighbors.size(); idx++) { if (data[idx] && !isUpdate) throw std::runtime_error("Possible memory corruption"); @@ -427,12 +514,10 @@ namespace hnswlib { throw std::runtime_error("Trying to make a link on a non-existent level"); data[idx] = selectedNeighbors[idx]; - } } for (size_t idx = 0; idx < selectedNeighbors.size(); idx++) { - std::unique_lock lock(link_list_locks_[selectedNeighbors[idx]]); linklistsizeint *ll_other; @@ -450,7 +535,7 @@ namespace hnswlib { if (level > element_levels_[selectedNeighbors[idx]]) throw std::runtime_error("Trying to make a link on a non-existent level"); - tableint *data = (tableint *) (ll_other + 1); + tableint *data = (tableint * )(ll_other + 1); bool is_cur_c_present = false; if (isUpdate) { @@ -469,15 +554,18 @@ namespace hnswlib { setListCount(ll_other, sz_link_list_other + 1); } else { // finding the "weakest" element to replace it with the new one - dist_t d_max = fstdistfunc_(getDataByInternalId(cur_c), getDataByInternalId(selectedNeighbors[idx]), + dist_t d_max = fstdistfunc_(getDataByInternalId(cur_c), + getDataByInternalId(selectedNeighbors[idx]), dist_func_param_); // Heuristic: - std::priority_queue, std::vector>, CompareByFirst> candidates; + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint + >>, CompareByFirst > candidates; candidates.emplace(d_max, cur_c); for (size_t j = 0; j < sz_link_list_other; j++) { candidates.emplace( - fstdistfunc_(getDataByInternalId(data[j]), getDataByInternalId(selectedNeighbors[idx]), + fstdistfunc_(getDataByInternalId(data[j]), + getDataByInternalId(selectedNeighbors[idx]), dist_func_param_), data[j]); } @@ -510,81 +598,27 @@ namespace hnswlib { return next_closest_entry_point; } - std::mutex global; - size_t ef_; - - void setEf(size_t ef) { - ef_ = ef; - } - - - std::priority_queue> searchKnnInternal(void *query_data, int k) { - std::priority_queue> top_candidates; - if (cur_element_count == 0) return top_candidates; - tableint currObj = enterpoint_node_; - dist_t curdist = fstdistfunc_(query_data, getDataByInternalId(enterpoint_node_), dist_func_param_); - - for (size_t level = maxlevel_; level > 0; level--) { - bool changed = true; - while (changed) { - changed = false; - int *data; - data = (int *) get_linklist(currObj,level); - int size = getListCount(data); - tableint *datal = (tableint *) (data + 1); - for (int i = 0; i < size; i++) { - tableint cand = datal[i]; - if (cand < 0 || cand > max_elements_) - throw std::runtime_error("cand error"); - dist_t d = fstdistfunc_(query_data, getDataByInternalId(cand), dist_func_param_); - if (d < curdist) { - curdist = d; - currObj = cand; - changed = true; - } - } - } - } - - if (has_deletions_) { - std::priority_queue> top_candidates1=searchBaseLayerST(currObj, query_data, - ef_); - top_candidates.swap(top_candidates1); - } - else{ - std::priority_queue> top_candidates1=searchBaseLayerST(currObj, query_data, - ef_); - top_candidates.swap(top_candidates1); - } - - while (top_candidates.size() > k) { - top_candidates.pop(); - } - return top_candidates; - }; - - void resizeIndex(size_t new_max_elements){ - if (new_max_elements(new_max_elements).swap(link_list_locks_); // Reallocate base layer - char * data_level0_memory_new = (char *) realloc(data_level0_memory_, new_max_elements * size_data_per_element_); + char *data_level0_memory_new = (char *) realloc(data_level0_memory_, + new_max_elements * size_data_per_element_); if (data_level0_memory_new == nullptr) throw std::runtime_error("Not enough memory: resizeIndex failed to allocate base layer"); data_level0_memory_ = data_level0_memory_new; // Reallocate all other layers - char ** linkLists_new = (char **) realloc(linkLists_, sizeof(void *) * new_max_elements); + char **linkLists_new = (char **) realloc(linkLists_, sizeof(void *) * new_max_elements); if (linkLists_new == nullptr) throw std::runtime_error("Not enough memory: resizeIndex failed to allocate other layers"); linkLists_ = linkLists_new; @@ -592,6 +626,7 @@ namespace hnswlib { max_elements_ = new_max_elements; } + void saveIndex(const std::string &location) { std::ofstream output(location, std::ios::binary); std::streampos position; @@ -622,25 +657,24 @@ namespace hnswlib { output.close(); } - void loadIndex(const std::string &location, SpaceInterface *s, size_t max_elements_i=0) { - + void loadIndex(const std::string &location, SpaceInterface *s, size_t max_elements_i = 0) { std::ifstream input(location, std::ios::binary); if (!input.is_open()) throw std::runtime_error("Cannot open file"); // get file size: - input.seekg(0,input.end); - std::streampos total_filesize=input.tellg(); - input.seekg(0,input.beg); + input.seekg(0, input.end); + std::streampos total_filesize = input.tellg(); + input.seekg(0, input.beg); readBinaryPOD(input, offsetLevel0_); readBinaryPOD(input, max_elements_); readBinaryPOD(input, cur_element_count); - size_t max_elements=max_elements_i; - if(max_elements < cur_element_count) + size_t max_elements = max_elements_i; + if (max_elements < cur_element_count) max_elements = max_elements_; max_elements_ = max_elements; readBinaryPOD(input, size_data_per_element_); @@ -655,59 +689,48 @@ namespace hnswlib { readBinaryPOD(input, mult_); readBinaryPOD(input, ef_construction_); - data_size_ = s->get_data_size(); fstdistfunc_ = s->get_dist_func(); dist_func_param_ = s->get_dist_func_param(); - auto pos=input.tellg(); - + auto pos = input.tellg(); /// Optional - check if index is ok: - - input.seekg(cur_element_count * size_data_per_element_,input.cur); + input.seekg(cur_element_count * size_data_per_element_, input.cur); for (size_t i = 0; i < cur_element_count; i++) { - if(input.tellg() < 0 || input.tellg()>=total_filesize){ + if (input.tellg() < 0 || input.tellg() >= total_filesize) { throw std::runtime_error("Index seems to be corrupted or unsupported"); } unsigned int linkListSize; readBinaryPOD(input, linkListSize); if (linkListSize != 0) { - input.seekg(linkListSize,input.cur); + input.seekg(linkListSize, input.cur); } } // throw exception if it either corrupted or old index - if(input.tellg()!=total_filesize) + if (input.tellg() != total_filesize) throw std::runtime_error("Index seems to be corrupted or unsupported"); input.clear(); - /// Optional check end - input.seekg(pos,input.beg); - + input.seekg(pos, input.beg); data_level0_memory_ = (char *) malloc(max_elements * size_data_per_element_); if (data_level0_memory_ == nullptr) throw std::runtime_error("Not enough memory: loadIndex failed to allocate level0"); input.read(data_level0_memory_, cur_element_count * size_data_per_element_); - - - size_links_per_element_ = maxM_ * sizeof(tableint) + sizeof(linklistsizeint); - size_links_level0_ = maxM0_ * sizeof(tableint) + sizeof(linklistsizeint); std::vector(max_elements).swap(link_list_locks_); - std::vector(max_update_element_locks).swap(link_list_update_locks_); - + std::vector(MAX_LABEL_OPERATION_LOCKS).swap(label_op_locks_); visited_list_pool_ = new VisitedListPool(1, max_elements); - linkLists_ = (char **) malloc(sizeof(void *) * max_elements); if (linkLists_ == nullptr) throw std::runtime_error("Not enough memory: loadIndex failed to allocate linklists"); @@ -715,12 +738,11 @@ namespace hnswlib { revSize_ = 1.0 / mult_; ef_ = 10; for (size_t i = 0; i < cur_element_count; i++) { - label_lookup_[getExternalLabel(i)]=i; + label_lookup_[getExternalLabel(i)] = i; unsigned int linkListSize; readBinaryPOD(input, linkListSize); if (linkListSize == 0) { element_levels_[i] = 0; - linkLists_[i] = nullptr; } else { element_levels_[i] = linkListSize / size_links_per_element_; @@ -731,11 +753,11 @@ namespace hnswlib { } } - has_deletions_=false; - for (size_t i = 0; i < cur_element_count; i++) { - if(isMarkedDeleted(i)) - has_deletions_=true; + if (isMarkedDeleted(i)) { + num_deleted_ += 1; + if (allow_replace_deleted_) deleted_elements.insert(i); + } } input.close(); @@ -743,20 +765,26 @@ namespace hnswlib { return; } + template - std::vector getDataByLabel(labeltype label) - { - tableint label_c; + std::vector getDataByLabel(labeltype label) const { + // lock all operations with element by label + std::unique_lock lock_label(getLabelOpMutex(label)); + + std::unique_lock lock_table(label_lookup_lock); auto search = label_lookup_.find(label); if (search == label_lookup_.end() || isMarkedDeleted(search->second)) { throw std::runtime_error("Label not found"); } - label_c = search->second; - - char* data_ptrv = getDataByInternalId(label_c); - size_t dim = *((size_t *) dist_func_param_); - std::vector data; - data_t* data_ptr = (data_t*) data_ptrv; + tableint internalId = search->second; + lock_table.unlock(); + + char *data_ptrv = getDataByInternalId(internalId); + size_t + dim = *((size_t * ) + dist_func_param_); + std::vector data; + data_t *data_ptr = (data_t *) data_ptrv; for (int i = 0; i < dim; i++) { data.push_back(*data_ptr); data_ptr += 1; @@ -764,63 +792,151 @@ namespace hnswlib { return data; } - static const unsigned char DELETE_MARK = 0x01; -// static const unsigned char REUSE_MARK = 0x10; - /** - * Marks an element with the given label deleted, does NOT really change the current graph. - * @param label - */ - void markDelete(labeltype label) - { - has_deletions_=true; + + /* + * Marks an element with the given label deleted, does NOT really change the current graph. + */ + void markDelete(labeltype label) { + // lock all operations with element by label + std::unique_lock lock_label(getLabelOpMutex(label)); + + std::unique_lock lock_table(label_lookup_lock); auto search = label_lookup_.find(label); if (search == label_lookup_.end()) { throw std::runtime_error("Label not found"); } - markDeletedInternal(search->second); + tableint internalId = search->second; + lock_table.unlock(); + + markDeletedInternal(internalId); } - /** - * Uses the first 8 bits of the memory for the linked list to store the mark, - * whereas maxM0_ has to be limited to the lower 24 bits, however, still large enough in almost all cases. - * @param internalId - */ + + /* + * Uses the last 16 bits of the memory for the linked list size to store the mark, + * whereas maxM0_ has to be limited to the lower 16 bits, however, still large enough in almost all cases. + */ void markDeletedInternal(tableint internalId) { - unsigned char *ll_cur = ((unsigned char *)get_linklist0(internalId))+2; - *ll_cur |= DELETE_MARK; + assert(internalId < cur_element_count); + if (!isMarkedDeleted(internalId)) { + unsigned char *ll_cur = ((unsigned char *) get_linklist0(internalId)) + 2; + *ll_cur |= DELETE_MARK; + num_deleted_ += 1; + if (allow_replace_deleted_) { + std::unique_lock lock_deleted_elements(deleted_elements_lock); + deleted_elements.insert(internalId); + } + } else { + throw std::runtime_error("The requested to delete element is already deleted"); + } } - /** - * Remove the deleted mark of the node. - * @param internalId - */ + + /* + * Removes the deleted mark of the node, does NOT really change the current graph. + * + * Note: the method is not safe to use when replacement of deleted elements is enabled, + * because elements marked as deleted can be completely removed by addPoint + */ + void unmarkDelete(labeltype label) { + // lock all operations with element by label + std::unique_lock lock_label(getLabelOpMutex(label)); + + std::unique_lock lock_table(label_lookup_lock); + auto search = label_lookup_.find(label); + if (search == label_lookup_.end()) { + throw std::runtime_error("Label not found"); + } + tableint internalId = search->second; + lock_table.unlock(); + + unmarkDeletedInternal(internalId); + } + + + /* + * Remove the deleted mark of the node. + */ void unmarkDeletedInternal(tableint internalId) { - unsigned char *ll_cur = ((unsigned char *)get_linklist0(internalId))+2; - *ll_cur &= ~DELETE_MARK; + assert(internalId < cur_element_count); + if (isMarkedDeleted(internalId)) { + unsigned char *ll_cur = ((unsigned char *) get_linklist0(internalId)) + 2; + *ll_cur &= ~DELETE_MARK; + num_deleted_ -= 1; + if (allow_replace_deleted_) { + std::unique_lock lock_deleted_elements(deleted_elements_lock); + deleted_elements.erase(internalId); + } + } else { + throw std::runtime_error("The requested to undelete element is not deleted"); + } } - /** - * Checks the first 8 bits of the memory to see if the element is marked deleted. - * @param internalId - * @return - */ + + /* + * Checks the first 16 bits of the memory to see if the element is marked deleted. + */ bool isMarkedDeleted(tableint internalId) const { - unsigned char *ll_cur = ((unsigned char*)get_linklist0(internalId))+2; + unsigned char *ll_cur = ((unsigned char *) get_linklist0(internalId)) + 2; return *ll_cur & DELETE_MARK; } - unsigned short int getListCount(linklistsizeint * ptr) const { - return *((unsigned short int *)ptr); + + unsigned short int getListCount(linklistsizeint *ptr) const { + return *((unsigned short int *) ptr); } - void setListCount(linklistsizeint * ptr, unsigned short int size) const { - *((unsigned short int*)(ptr))=*((unsigned short int *)&size); + + void setListCount(linklistsizeint *ptr, unsigned short int size) const { + *((unsigned short int *) (ptr)) = *((unsigned short int *) &size); } - void addPoint(const void *data_point, labeltype label) { - addPoint(data_point, label,-1); + + /* + * Adds point. Updates the point if it is already in the index. + * If replacement of deleted elements is enabled: replaces previously deleted point if any, updating it with new point + */ + void addPoint(const void *data_point, labeltype label, bool replace_deleted = false) { + if ((allow_replace_deleted_ == false) && (replace_deleted == true)) { + throw std::runtime_error("Replacement of deleted elements is disabled in constructor"); + } + + // lock all operations with element by label + std::unique_lock lock_label(getLabelOpMutex(label)); + if (!replace_deleted) { + addPoint(data_point, label, -1); + return; + } + // check if there is vacant place + tableint internal_id_replaced; + std::unique_lock lock_deleted_elements(deleted_elements_lock); + bool is_vacant_place = !deleted_elements.empty(); + if (is_vacant_place) { + internal_id_replaced = *deleted_elements.begin(); + deleted_elements.erase(internal_id_replaced); + } + lock_deleted_elements.unlock(); + + // if there is no vacant place then add or update point + // else add point to vacant place + if (!is_vacant_place) { + addPoint(data_point, label, -1); + } else { + // we assume that there are no concurrent operations on deleted element + labeltype label_replaced = getExternalLabel(internal_id_replaced); + setExternalLabel(internal_id_replaced, label); + + std::unique_lock lock_table(label_lookup_lock); + label_lookup_.erase(label_replaced); + label_lookup_[label] = internal_id_replaced; + lock_table.unlock(); + + unmarkDeletedInternal(internal_id_replaced); + updatePoint(data_point, internal_id_replaced, 1.0); + } } + void updatePoint(const void *dataPoint, tableint internalId, float updateNeighborProbability) { // update the feature vector associated with existing point with new vector memcpy(getDataByInternalId(internalId), dataPoint, data_size_); @@ -834,15 +950,15 @@ namespace hnswlib { int elemLevel = element_levels_[internalId]; std::uniform_real_distribution distribution(0.0, 1.0); for (int layer = 0; layer <= elemLevel; layer++) { - std::unordered_set sCand; - std::unordered_set sNeigh; - std::vector listOneHop = getConnectionsWithLock(internalId, layer); + std::unordered_set sCand; + std::unordered_set sNeigh; + std::vector listOneHop = getConnectionsWithLock(internalId, layer); if (listOneHop.size() == 0) continue; sCand.insert(internalId); - for (auto&& elOneHop : listOneHop) { + for (auto &&elOneHop: listOneHop) { sCand.insert(elOneHop); if (distribution(update_probability_generator_) > updateNeighborProbability) @@ -850,24 +966,27 @@ namespace hnswlib { sNeigh.insert(elOneHop); - std::vector listTwoHop = getConnectionsWithLock(elOneHop, layer); - for (auto&& elTwoHop : listTwoHop) { + std::vector listTwoHop = getConnectionsWithLock(elOneHop, layer); + for (auto &&elTwoHop: listTwoHop) { sCand.insert(elTwoHop); } } - for (auto&& neigh : sNeigh) { -// if (neigh == internalId) -// continue; + for (auto &&neigh: sNeigh) { + // if (neigh == internalId) + // continue; - std::priority_queue, std::vector>, CompareByFirst> candidates; - size_t size = sCand.find(neigh) == sCand.end() ? sCand.size() : sCand.size() - 1; // sCand guaranteed to have size >= 1 + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > candidates; + size_t size = sCand.find(neigh) == sCand.end() ? sCand.size() : sCand.size() - + 1; // sCand guaranteed to have size >= 1 size_t elementsToKeep = std::min(ef_construction_, size); - for (auto&& cand : sCand) { + for (auto &&cand: sCand) { if (cand == neigh) continue; - dist_t distance = fstdistfunc_(getDataByInternalId(neigh), getDataByInternalId(cand), dist_func_param_); + dist_t distance = fstdistfunc_(getDataByInternalId(neigh), getDataByInternalId(cand), + dist_func_param_); if (candidates.size() < elementsToKeep) { candidates.emplace(distance, cand); } else { @@ -887,7 +1006,7 @@ namespace hnswlib { ll_cur = get_linklist_at_level(neigh, layer); size_t candSize = candidates.size(); setListCount(ll_cur, candSize); - tableint *data = (tableint *) (ll_cur + 1); + tableint *data = (tableint * )(ll_cur + 1); for (size_t idx = 0; idx < candSize; idx++) { data[idx] = candidates.top().second; candidates.pop(); @@ -897,9 +1016,15 @@ namespace hnswlib { } repairConnectionsForUpdate(dataPoint, entryPointCopy, internalId, elemLevel, maxLevelCopy); - }; + } + - void repairConnectionsForUpdate(const void *dataPoint, tableint entryPointInternalId, tableint dataPointInternalId, int dataPointLevel, int maxLevel) { + void repairConnectionsForUpdate( + const void *dataPoint, + tableint entryPointInternalId, + tableint dataPointInternalId, + int dataPointLevel, + int maxLevel) { tableint currObj = entryPointInternalId; if (dataPointLevel < maxLevel) { dist_t curdist = fstdistfunc_(dataPoint, getDataByInternalId(currObj), dist_func_param_); @@ -909,9 +1034,9 @@ namespace hnswlib { changed = false; unsigned int *data; std::unique_lock lock(link_list_locks_[currObj]); - data = get_linklist_at_level(currObj,level); + data = get_linklist_at_level(currObj, level); int size = getListCount(data); - tableint *datal = (tableint *) (data + 1); + tableint *datal = (tableint * )(data + 1); #ifdef USE_SSE _mm_prefetch(getDataByInternalId(*datal), _MM_HINT_T0); #endif @@ -935,10 +1060,12 @@ namespace hnswlib { throw std::runtime_error("Level of item to be updated cannot be bigger than max level"); for (int level = dataPointLevel; level >= 0; level--) { - std::priority_queue, std::vector>, CompareByFirst> topCandidates = searchBaseLayer( - currObj, dataPoint, level); + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > topCandidates = searchBaseLayer( + currObj, dataPoint, level); - std::priority_queue, std::vector>, CompareByFirst> filteredTopCandidates; + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > filteredTopCandidates; while (topCandidates.size() > 0) { if (topCandidates.top().second != dataPointInternalId) filteredTopCandidates.push(topCandidates.top()); @@ -951,59 +1078,65 @@ namespace hnswlib { if (filteredTopCandidates.size() > 0) { bool epDeleted = isMarkedDeleted(entryPointInternalId); if (epDeleted) { - filteredTopCandidates.emplace(fstdistfunc_(dataPoint, getDataByInternalId(entryPointInternalId), dist_func_param_), entryPointInternalId); + filteredTopCandidates.emplace( + fstdistfunc_(dataPoint, getDataByInternalId(entryPointInternalId), dist_func_param_), + entryPointInternalId); if (filteredTopCandidates.size() > ef_construction_) filteredTopCandidates.pop(); } - currObj = mutuallyConnectNewElement(dataPoint, dataPointInternalId, filteredTopCandidates, level, true); + currObj = mutuallyConnectNewElement(dataPoint, dataPointInternalId, filteredTopCandidates, level, + true); } } } - std::vector getConnectionsWithLock(tableint internalId, int level) { + + std::vector getConnectionsWithLock(tableint internalId, int level) { std::unique_lock lock(link_list_locks_[internalId]); unsigned int *data = get_linklist_at_level(internalId, level); int size = getListCount(data); - std::vector result(size); - tableint *ll = (tableint *) (data + 1); - memcpy(result.data(), ll,size * sizeof(tableint)); + std::vector result(size); + tableint *ll = (tableint * )(data + 1); + memcpy(result.data(), ll, size * sizeof(tableint)); return result; - }; + } - tableint addPoint(const void *data_point, labeltype label, int level) { + tableint addPoint(const void *data_point, labeltype label, int level) { tableint cur_c = 0; { // Checking if the element with the same label already exists // if so, updating it *instead* of creating a new element. - std::unique_lock templock_curr(cur_element_count_guard_); + std::unique_lock lock_table(label_lookup_lock); auto search = label_lookup_.find(label); if (search != label_lookup_.end()) { tableint existingInternalId = search->second; - templock_curr.unlock(); - - std::unique_lock lock_el_update(link_list_update_locks_[(existingInternalId & (max_update_element_locks - 1))]); + if (allow_replace_deleted_) { + if (isMarkedDeleted(existingInternalId)) { + throw std::runtime_error( + "Can't use addPoint to update deleted elements if replacement of deleted elements is enabled."); + } + } + lock_table.unlock(); if (isMarkedDeleted(existingInternalId)) { unmarkDeletedInternal(existingInternalId); } updatePoint(data_point, existingInternalId, 1.0); - + return existingInternalId; } if (cur_element_count >= max_elements_) { throw std::runtime_error("The number of elements exceeds the specified limit"); - }; + } cur_c = cur_element_count; cur_element_count++; label_lookup_[label] = cur_c; } - // Take update lock to prevent race conditions on an element with insertion/update at the same time. - std::unique_lock lock_el_update(link_list_update_locks_[(cur_c & (max_update_element_locks - 1))]); std::unique_lock lock_el(link_list_locks_[cur_c]); int curlevel = getRandomLevel(mult_); if (level > 0) @@ -1011,7 +1144,6 @@ namespace hnswlib { element_levels_[cur_c] = curlevel; - std::unique_lock templock(global); int maxlevelcopy = maxlevel_; if (curlevel <= maxlevelcopy) @@ -1019,14 +1151,12 @@ namespace hnswlib { tableint currObj = enterpoint_node_; tableint enterpoint_copy = enterpoint_node_; - memset(data_level0_memory_ + cur_c * size_data_per_element_ + offsetLevel0_, 0, size_data_per_element_); // Initialisation of the data and label memcpy(getExternalLabeLp(cur_c), &label, sizeof(labeltype)); memcpy(getDataByInternalId(cur_c), data_point, data_size_); - if (curlevel) { linkLists_[cur_c] = (char *) malloc(size_links_per_element_ * curlevel + 1); if (linkLists_[cur_c] == nullptr) @@ -1034,23 +1164,19 @@ namespace hnswlib { memset(linkLists_[cur_c], 0, size_links_per_element_ * curlevel + 1); } - if ((signed)currObj != -1) { - + if ((signed) currObj != -1) { if (curlevel < maxlevelcopy) { - dist_t curdist = fstdistfunc_(data_point, getDataByInternalId(currObj), dist_func_param_); for (int level = maxlevelcopy; level > curlevel; level--) { - - bool changed = true; while (changed) { changed = false; unsigned int *data; std::unique_lock lock(link_list_locks_[currObj]); - data = get_linklist(currObj,level); + data = get_linklist(currObj, level); int size = getListCount(data); - tableint *datal = (tableint *) (data + 1); + tableint *datal = (tableint * )(data + 1); for (int i = 0; i < size; i++) { tableint cand = datal[i]; if (cand < 0 || cand > max_elements_) @@ -1071,35 +1197,36 @@ namespace hnswlib { if (level > maxlevelcopy || level < 0) // possible? throw std::runtime_error("Level error"); - std::priority_queue, std::vector>, CompareByFirst> top_candidates = searchBaseLayer( - currObj, data_point, level); + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > top_candidates = searchBaseLayer( + currObj, data_point, level); if (epDeleted) { - top_candidates.emplace(fstdistfunc_(data_point, getDataByInternalId(enterpoint_copy), dist_func_param_), enterpoint_copy); + top_candidates.emplace( + fstdistfunc_(data_point, getDataByInternalId(enterpoint_copy), dist_func_param_), + enterpoint_copy); if (top_candidates.size() > ef_construction_) top_candidates.pop(); } currObj = mutuallyConnectNewElement(data_point, cur_c, top_candidates, level, false); } - - } else { // Do nothing for the first element enterpoint_node_ = 0; maxlevel_ = curlevel; - } - //Releasing lock for the maximum level + // Releasing lock for the maximum level if (curlevel > maxlevelcopy) { enterpoint_node_ = cur_c; maxlevel_ = curlevel; } return cur_c; - }; + } + - std::priority_queue> - searchKnn(const void *query_data, size_t k) const { - std::priority_queue> result; + std::priority_queue > + searchKnn(const void *query_data, size_t k, BaseFilterFunctor *isIdAllowed = nullptr) const { + std::priority_queue > result; if (cur_element_count == 0) return result; tableint currObj = enterpoint_node_; @@ -1114,9 +1241,9 @@ namespace hnswlib { data = (unsigned int *) get_linklist(currObj, level); int size = getListCount(data); metric_hops++; - metric_distance_computations+=size; + metric_distance_computations += size; - tableint *datal = (tableint *) (data + 1); + tableint *datal = (tableint * )(data + 1); for (int i = 0; i < size; i++) { tableint cand = datal[i]; if (cand < 0 || cand > max_elements_) @@ -1132,61 +1259,58 @@ namespace hnswlib { } } - std::priority_queue, std::vector>, CompareByFirst> top_candidates; - if (has_deletions_) { - top_candidates=searchBaseLayerST( - currObj, query_data, std::max(ef_, k)); - } - else{ - top_candidates=searchBaseLayerST( - currObj, query_data, std::max(ef_, k)); + std::priority_queue < std::pair < dist_t, tableint >, std::vector < std::pair < dist_t, tableint >>, + CompareByFirst > top_candidates; + if (num_deleted_) { + top_candidates = searchBaseLayerST( + currObj, query_data, std::max(ef_, k), isIdAllowed); + } else { + top_candidates = searchBaseLayerST( + currObj, query_data, std::max(ef_, k), isIdAllowed); } while (top_candidates.size() > k) { top_candidates.pop(); } while (top_candidates.size() > 0) { - std::pair rez = top_candidates.top(); + std::pair rez = top_candidates.top(); result.push(std::pair(rez.first, getExternalLabel(rez.second))); top_candidates.pop(); } return result; - }; + } + - void checkIntegrity(){ - int connections_checked=0; - std::vector inbound_connections_num(cur_element_count,0); - for(int i = 0;i < cur_element_count; i++){ - for(int l = 0;l <= element_levels_[i]; l++){ - linklistsizeint *ll_cur = get_linklist_at_level(i,l); + void checkIntegrity() { + int connections_checked = 0; + std::vector inbound_connections_num(cur_element_count, 0); + for (int i = 0; i < cur_element_count; i++) { + for (int l = 0; l <= element_levels_[i]; l++) { + linklistsizeint *ll_cur = get_linklist_at_level(i, l); int size = getListCount(ll_cur); - tableint *data = (tableint *) (ll_cur + 1); - std::unordered_set s; - for (int j=0; j s; + for (int j = 0; j < size; j++) { assert(data[j] > 0); assert(data[j] < cur_element_count); - assert (data[j] != i); + assert(data[j] != i); inbound_connections_num[data[j]]++; s.insert(data[j]); connections_checked++; - } assert(s.size() == size); } } - if(cur_element_count > 1){ - int min1=inbound_connections_num[0], max1=inbound_connections_num[0]; - for(int i=0; i < cur_element_count; i++){ + if (cur_element_count > 1) { + int min1 = inbound_connections_num[0], max1 = inbound_connections_num[0]; + for (int i = 0; i < cur_element_count; i++) { assert(inbound_connections_num[i] > 0); - min1=std::min(inbound_connections_num[i],min1); - max1=std::max(inbound_connections_num[i],max1); + min1 = std::min(inbound_connections_num[i], min1); + max1 = std::max(inbound_connections_num[i], max1); } std::cout << "Min inbound: " << min1 << ", Max inbound:" << max1 << "\n"; } std::cout << "integrity ok, checked " << connections_checked << " connections\n"; - } - }; - -} +} // namespace hnswlib diff --git a/hnswlib/hnswlib.h b/hnswlib/hnswlib.h index 9409c38..167acde 100644 --- a/hnswlib/hnswlib.h +++ b/hnswlib/hnswlib.h @@ -1,9 +1,12 @@ #pragma once #ifndef NO_MANUAL_VECTORIZATION -#ifdef __SSE__ +#if (defined(__SSE__) || _M_IX86_FP > 0 || defined(_M_AMD64) || defined(_M_X64)) #define USE_SSE #ifdef __AVX__ #define USE_AVX +#ifdef __AVX512F__ +#define USE_AVX512 +#endif #endif #endif #endif @@ -12,15 +15,96 @@ #ifdef _MSC_VER #include #include +void cpuid(int32_t out[4], int32_t eax, int32_t ecx) { + __cpuidex(out, eax, ecx); +} +static __int64 xgetbv(unsigned int x) { + return _xgetbv(x); +} #else #include +#include +#include +static void cpuid(int32_t cpuInfo[4], int32_t eax, int32_t ecx) { + __cpuid_count(eax, ecx, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]); +} +static uint64_t xgetbv(unsigned int index) { + uint32_t eax, edx; + __asm__ __volatile__("xgetbv" : "=a"(eax), "=d"(edx) : "c"(index)); + return ((uint64_t)edx << 32) | eax; +} +#endif + +#if defined(USE_AVX512) +#include #endif #if defined(__GNUC__) #define PORTABLE_ALIGN32 __attribute__((aligned(32))) +#define PORTABLE_ALIGN64 __attribute__((aligned(64))) #else #define PORTABLE_ALIGN32 __declspec(align(32)) +#define PORTABLE_ALIGN64 __declspec(align(64)) #endif + +// Adapted from https://github.com/Mysticial/FeatureDetector +#define _XCR_XFEATURE_ENABLED_MASK 0 + +static bool AVXCapable() { + int cpuInfo[4]; + + // CPU support + cpuid(cpuInfo, 0, 0); + int nIds = cpuInfo[0]; + + bool HW_AVX = false; + if (nIds >= 0x00000001) { + cpuid(cpuInfo, 0x00000001, 0); + HW_AVX = (cpuInfo[2] & ((int)1 << 28)) != 0; + } + + // OS support + cpuid(cpuInfo, 1, 0); + + bool osUsesXSAVE_XRSTORE = (cpuInfo[2] & (1 << 27)) != 0; + bool cpuAVXSuport = (cpuInfo[2] & (1 << 28)) != 0; + + bool avxSupported = false; + if (osUsesXSAVE_XRSTORE && cpuAVXSuport) { + uint64_t xcrFeatureMask = xgetbv(_XCR_XFEATURE_ENABLED_MASK); + avxSupported = (xcrFeatureMask & 0x6) == 0x6; + } + return HW_AVX && avxSupported; +} + +static bool AVX512Capable() { + if (!AVXCapable()) return false; + + int cpuInfo[4]; + + // CPU support + cpuid(cpuInfo, 0, 0); + int nIds = cpuInfo[0]; + + bool HW_AVX512F = false; + if (nIds >= 0x00000007) { // AVX512 Foundation + cpuid(cpuInfo, 0x00000007, 0); + HW_AVX512F = (cpuInfo[1] & ((int)1 << 16)) != 0; + } + + // OS support + cpuid(cpuInfo, 1, 0); + + bool osUsesXSAVE_XRSTORE = (cpuInfo[2] & (1 << 27)) != 0; + bool cpuAVXSuport = (cpuInfo[2] & (1 << 28)) != 0; + + bool avx512Supported = false; + if (osUsesXSAVE_XRSTORE && cpuAVXSuport) { + uint64_t xcrFeatureMask = xgetbv(_XCR_XFEATURE_ENABLED_MASK); + avx512Supported = (xcrFeatureMask & 0xe6) == 0xe6; + } + return HW_AVX512F && avx512Supported; +} #endif #include @@ -31,10 +115,16 @@ namespace hnswlib { typedef size_t labeltype; - template +// This can be extended to store state for filtering (e.g. from a std::set) + class BaseFilterFunctor { + public: + virtual bool operator()(hnswlib::labeltype id) { return true; } + }; + + template class pairGreater { public: - bool operator()(const T& p1, const T& p2) { + bool operator()(const T &p1, const T &p2) { return p1.first > p2.first; } }; @@ -52,11 +142,10 @@ namespace hnswlib { template using DISTFUNC = MTYPE(*)(const void *, const void *, const void *); - template class SpaceInterface { public: - //virtual void search(void *); + // virtual void search(void *); virtual size_t get_data_size() = 0; virtual DISTFUNC get_dist_func() = 0; @@ -69,25 +158,29 @@ namespace hnswlib { template class AlgorithmInterface { public: - virtual void addPoint(const void *datapoint, labeltype label)=0; - virtual std::priority_queue> searchKnn(const void *, size_t) const = 0; + virtual void addPoint(const void *datapoint, labeltype label, bool replace_deleted = false) = 0; + + virtual std::priority_queue > + searchKnn(const void *, size_t, BaseFilterFunctor *isIdAllowed = nullptr) const = 0; // Return k nearest neighbor in the order of closer fist - virtual std::vector> - searchKnnCloserFirst(const void* query_data, size_t k) const; + virtual std::vector > + searchKnnCloserFirst(const void *query_data, size_t k, BaseFilterFunctor *isIdAllowed = nullptr) const; + + virtual void saveIndex(const std::string &location) = 0; - virtual void saveIndex(const std::string &location)=0; - virtual ~AlgorithmInterface(){ + virtual ~AlgorithmInterface() { } }; template - std::vector> - AlgorithmInterface::searchKnnCloserFirst(const void* query_data, size_t k) const { - std::vector> result; + std::vector > + AlgorithmInterface::searchKnnCloserFirst(const void *query_data, size_t k, + BaseFilterFunctor *isIdAllowed) const { + std::vector > result; // here searchKnn returns the result in the order of further first - auto ret = searchKnn(query_data, k); + auto ret = searchKnn(query_data, k, isIdAllowed); { size_t sz = ret.size(); result.resize(sz); @@ -99,8 +192,7 @@ namespace hnswlib { return result; } - -} +} // namespace hnswlib #include "space_l2.h" #include "space_ip.h" diff --git a/hnswlib/space_ip.h b/hnswlib/space_ip.h index d0497ff..3207a59 100644 --- a/hnswlib/space_ip.h +++ b/hnswlib/space_ip.h @@ -1,4 +1,5 @@ #pragma once + #include "hnswlib.h" namespace hnswlib { @@ -10,15 +11,19 @@ namespace hnswlib { for (unsigned i = 0; i < qty; i++) { res += ((float *) pVect1)[i] * ((float *) pVect2)[i]; } - return (1.0f - res); + return res; + } + static float + InnerProductDistance(const void *pVect1, const void *pVect2, const void *qty_ptr) { + return 1.0f - InnerProduct(pVect1, pVect2, qty_ptr); } #if defined(USE_AVX) -// Favor using AVX if available. + // Favor using AVX if available. static float - InnerProductSIMD4Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + InnerProductSIMD4ExtAVX(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float PORTABLE_ALIGN32 TmpRes[8]; float *pVect1 = (float *) pVect1v; float *pVect2 = (float *) pVect2v; @@ -60,14 +65,21 @@ namespace hnswlib { } _mm_store_ps(TmpRes, sum_prod); - float sum = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3];; - return 1.0f - sum; -} + float sum = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3]; + return sum; + } -#elif defined(USE_SSE) + static float + InnerProductDistanceSIMD4ExtAVX(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + return 1.0f - InnerProductSIMD4ExtAVX(pVect1v, pVect2v, qty_ptr); + } + +#endif + +#if defined(USE_SSE) static float - InnerProductSIMD4Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + InnerProductSIMD4ExtSSE(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float PORTABLE_ALIGN32 TmpRes[8]; float *pVect1 = (float *) pVect1v; float *pVect2 = (float *) pVect2v; @@ -119,7 +131,52 @@ namespace hnswlib { _mm_store_ps(TmpRes, sum_prod); float sum = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3]; - return 1.0f - sum; + return sum; + } + + static float + InnerProductDistanceSIMD4ExtSSE(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + return 1.0f - InnerProductSIMD4ExtSSE(pVect1v, pVect2v, qty_ptr); + } + +#endif + + +#if defined(USE_AVX512) + + static float + InnerProductSIMD16ExtAVX512(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + float PORTABLE_ALIGN64 TmpRes[16]; + float *pVect1 = (float *) pVect1v; + float *pVect2 = (float *) pVect2v; + size_t qty = *((size_t *) qty_ptr); + + size_t qty16 = qty / 16; + + + const float *pEnd1 = pVect1 + 16 * qty16; + + __m512 sum512 = _mm512_set1_ps(0); + + while (pVect1 < pEnd1) { + //_mm_prefetch((char*)(pVect2 + 16), _MM_HINT_T0); + + __m512 v1 = _mm512_loadu_ps(pVect1); + pVect1 += 16; + __m512 v2 = _mm512_loadu_ps(pVect2); + pVect2 += 16; + sum512 = _mm512_add_ps(sum512, _mm512_mul_ps(v1, v2)); + } + + _mm512_store_ps(TmpRes, sum512); + float sum = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3] + TmpRes[4] + TmpRes[5] + TmpRes[6] + TmpRes[7] + TmpRes[8] + TmpRes[9] + TmpRes[10] + TmpRes[11] + TmpRes[12] + TmpRes[13] + TmpRes[14] + TmpRes[15]; + + return sum; + } + + static float + InnerProductDistanceSIMD16ExtAVX512(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + return 1.0f - InnerProductSIMD16ExtAVX512(pVect1v, pVect2v, qty_ptr); } #endif @@ -127,7 +184,7 @@ namespace hnswlib { #if defined(USE_AVX) static float - InnerProductSIMD16Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + InnerProductSIMD16ExtAVX(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float PORTABLE_ALIGN32 TmpRes[8]; float *pVect1 = (float *) pVect1v; float *pVect2 = (float *) pVect2v; @@ -159,13 +216,20 @@ namespace hnswlib { _mm256_store_ps(TmpRes, sum256); float sum = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3] + TmpRes[4] + TmpRes[5] + TmpRes[6] + TmpRes[7]; - return 1.0f - sum; + return sum; } -#elif defined(USE_SSE) + static float + InnerProductDistanceSIMD16ExtAVX(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + return 1.0f - InnerProductSIMD16ExtAVX(pVect1v, pVect2v, qty_ptr); + } + +#endif + +#if defined(USE_SSE) - static float - InnerProductSIMD16Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + static float + InnerProductSIMD16ExtSSE(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float PORTABLE_ALIGN32 TmpRes[8]; float *pVect1 = (float *) pVect1v; float *pVect2 = (float *) pVect2v; @@ -206,14 +270,24 @@ namespace hnswlib { _mm_store_ps(TmpRes, sum_prod); float sum = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3]; - return 1.0f - sum; + return sum; + } + + static float + InnerProductDistanceSIMD16ExtSSE(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + return 1.0f - InnerProductSIMD16ExtSSE(pVect1v, pVect2v, qty_ptr); } #endif -#if defined(USE_SSE) || defined(USE_AVX) +#if defined(USE_SSE) || defined(USE_AVX) || defined(USE_AVX512) + static DISTFUNC InnerProductSIMD16Ext = InnerProductSIMD16ExtSSE; + static DISTFUNC InnerProductSIMD4Ext = InnerProductSIMD4ExtSSE; + static DISTFUNC InnerProductDistanceSIMD16Ext = InnerProductDistanceSIMD16ExtSSE; + static DISTFUNC InnerProductDistanceSIMD4Ext = InnerProductDistanceSIMD4ExtSSE; + static float - InnerProductSIMD16ExtResiduals(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + InnerProductDistanceSIMD16ExtResiduals(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { size_t qty = *((size_t *) qty_ptr); size_t qty16 = qty >> 4 << 4; float res = InnerProductSIMD16Ext(pVect1v, pVect2v, &qty16); @@ -222,11 +296,11 @@ namespace hnswlib { size_t qty_left = qty - qty16; float res_tail = InnerProduct(pVect1, pVect2, &qty_left); - return res + res_tail - 1.0f; + return 1.0f - (res + res_tail); } static float - InnerProductSIMD4ExtResiduals(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + InnerProductDistanceSIMD4ExtResiduals(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { size_t qty = *((size_t *) qty_ptr); size_t qty4 = qty >> 2 << 2; @@ -237,28 +311,49 @@ namespace hnswlib { float *pVect2 = (float *) pVect2v + qty4; float res_tail = InnerProduct(pVect1, pVect2, &qty_left); - return res + res_tail - 1.0f; + return 1.0f - (res + res_tail); } #endif class InnerProductSpace : public SpaceInterface { - DISTFUNC fstdistfunc_; size_t data_size_; size_t dim_; + public: InnerProductSpace(size_t dim) { - fstdistfunc_ = InnerProduct; - #if defined(USE_AVX) || defined(USE_SSE) + fstdistfunc_ = InnerProductDistance; +#if defined(USE_AVX) || defined(USE_SSE) || defined(USE_AVX512) +#if defined(USE_AVX512) + if (AVX512Capable()) { + InnerProductSIMD16Ext = InnerProductSIMD16ExtAVX512; + InnerProductDistanceSIMD16Ext = InnerProductDistanceSIMD16ExtAVX512; + } else if (AVXCapable()) { + InnerProductSIMD16Ext = InnerProductSIMD16ExtAVX; + InnerProductDistanceSIMD16Ext = InnerProductDistanceSIMD16ExtAVX; + } +#elif defined(USE_AVX) + if (AVXCapable()) { + InnerProductSIMD16Ext = InnerProductSIMD16ExtAVX; + InnerProductDistanceSIMD16Ext = InnerProductDistanceSIMD16ExtAVX; + } +#endif +#if defined(USE_AVX) + if (AVXCapable()) { + InnerProductSIMD4Ext = InnerProductSIMD4ExtAVX; + InnerProductDistanceSIMD4Ext = InnerProductDistanceSIMD4ExtAVX; + } +#endif + if (dim % 16 == 0) - fstdistfunc_ = InnerProductSIMD16Ext; + fstdistfunc_ = InnerProductDistanceSIMD16Ext; else if (dim % 4 == 0) - fstdistfunc_ = InnerProductSIMD4Ext; + fstdistfunc_ = InnerProductDistanceSIMD4Ext; else if (dim > 16) - fstdistfunc_ = InnerProductSIMD16ExtResiduals; + fstdistfunc_ = InnerProductDistanceSIMD16ExtResiduals; else if (dim > 4) - fstdistfunc_ = InnerProductSIMD4ExtResiduals; - #endif + fstdistfunc_ = InnerProductDistanceSIMD4ExtResiduals; +#endif dim_ = dim; data_size_ = dim * sizeof(float); } @@ -275,8 +370,7 @@ namespace hnswlib { return &dim_; } - ~InnerProductSpace() {} + ~InnerProductSpace() {} }; - -} +} // namespace hnswlib diff --git a/hnswlib/space_l2.h b/hnswlib/space_l2.h index e86e13b..6b31d93 100644 --- a/hnswlib/space_l2.h +++ b/hnswlib/space_l2.h @@ -1,4 +1,5 @@ #pragma once + #include "hnswlib.h" namespace hnswlib { @@ -19,11 +20,46 @@ namespace hnswlib { return (res); } +#if defined(USE_AVX512) + + // Favor using AVX512 if available. + static float + L2SqrSIMD16ExtAVX512(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + float *pVect1 = (float *) pVect1v; + float *pVect2 = (float *) pVect2v; + size_t qty = *((size_t *) qty_ptr); + float PORTABLE_ALIGN64 TmpRes[16]; + size_t qty16 = qty >> 4; + + const float *pEnd1 = pVect1 + (qty16 << 4); + + __m512 diff, v1, v2; + __m512 sum = _mm512_set1_ps(0); + + while (pVect1 < pEnd1) { + v1 = _mm512_loadu_ps(pVect1); + pVect1 += 16; + v2 = _mm512_loadu_ps(pVect2); + pVect2 += 16; + diff = _mm512_sub_ps(v1, v2); + // sum = _mm512_fmadd_ps(diff, diff, sum); + sum = _mm512_add_ps(sum, _mm512_mul_ps(diff, diff)); + } + + _mm512_store_ps(TmpRes, sum); + float res = TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3] + TmpRes[4] + TmpRes[5] + TmpRes[6] + + TmpRes[7] + TmpRes[8] + TmpRes[9] + TmpRes[10] + TmpRes[11] + TmpRes[12] + + TmpRes[13] + TmpRes[14] + TmpRes[15]; + + return (res); + } +#endif + #if defined(USE_AVX) // Favor using AVX if available. static float - L2SqrSIMD16Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + L2SqrSIMD16ExtAVX(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float *pVect1 = (float *) pVect1v; float *pVect2 = (float *) pVect2v; size_t qty = *((size_t *) qty_ptr); @@ -55,10 +91,12 @@ namespace hnswlib { return TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3] + TmpRes[4] + TmpRes[5] + TmpRes[6] + TmpRes[7]; } -#elif defined(USE_SSE) +#endif + +#if defined(USE_SSE) static float - L2SqrSIMD16Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { + L2SqrSIMD16ExtSSE(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float *pVect1 = (float *) pVect1v; float *pVect2 = (float *) pVect2v; size_t qty = *((size_t *) qty_ptr); @@ -106,7 +144,9 @@ namespace hnswlib { } #endif -#if defined(USE_SSE) || defined(USE_AVX) +#if defined(USE_SSE) || defined(USE_AVX) || defined(USE_AVX512) + static DISTFUNC L2SqrSIMD16Ext = L2SqrSIMD16ExtSSE; + static float L2SqrSIMD16ExtResiduals(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { size_t qty = *((size_t *) qty_ptr); @@ -122,7 +162,7 @@ namespace hnswlib { #endif -#ifdef USE_SSE +#if defined(USE_SSE) static float L2SqrSIMD4Ext(const void *pVect1v, const void *pVect2v, const void *qty_ptr) { float PORTABLE_ALIGN32 TmpRes[8]; @@ -167,14 +207,24 @@ namespace hnswlib { #endif class L2Space : public SpaceInterface { - DISTFUNC fstdistfunc_; size_t data_size_; size_t dim_; + public: L2Space(size_t dim) { fstdistfunc_ = L2Sqr; - #if defined(USE_SSE) || defined(USE_AVX) +#if defined(USE_SSE) || defined(USE_AVX) || defined(USE_AVX512) +#if defined(USE_AVX512) + if (AVX512Capable()) + L2SqrSIMD16Ext = L2SqrSIMD16ExtAVX512; + else if (AVXCapable()) + L2SqrSIMD16Ext = L2SqrSIMD16ExtAVX; +#elif defined(USE_AVX) + if (AVXCapable()) + L2SqrSIMD16Ext = L2SqrSIMD16ExtAVX; +#endif + if (dim % 16 == 0) fstdistfunc_ = L2SqrSIMD16Ext; else if (dim % 4 == 0) @@ -183,7 +233,7 @@ namespace hnswlib { fstdistfunc_ = L2SqrSIMD16ExtResiduals; else if (dim > 4) fstdistfunc_ = L2SqrSIMD4ExtResiduals; - #endif +#endif dim_ = dim; data_size_ = dim * sizeof(float); } @@ -205,7 +255,6 @@ namespace hnswlib { static int L2SqrI4x(const void *__restrict pVect1, const void *__restrict pVect2, const void *__restrict qty_ptr) { - size_t qty = *((size_t *) qty_ptr); int res = 0; unsigned char *a = (unsigned char *) pVect1; @@ -213,7 +262,6 @@ namespace hnswlib { qty = qty >> 2; for (size_t i = 0; i < qty; i++) { - res += ((*a) - (*b)) * ((*a) - (*b)); a++; b++; @@ -230,14 +278,13 @@ namespace hnswlib { return (res); } - static int L2SqrI(const void* __restrict pVect1, const void* __restrict pVect2, const void* __restrict qty_ptr) { - size_t qty = *((size_t*)qty_ptr); + static int L2SqrI(const void *__restrict pVect1, const void *__restrict pVect2, const void *__restrict qty_ptr) { + size_t qty = *((size_t *) qty_ptr); int res = 0; - unsigned char* a = (unsigned char*)pVect1; - unsigned char* b = (unsigned char*)pVect2; + unsigned char *a = (unsigned char *) pVect1; + unsigned char *b = (unsigned char *) pVect2; - for(size_t i = 0; i < qty; i++) - { + for (size_t i = 0; i < qty; i++) { res += ((*a) - (*b)) * ((*a) - (*b)); a++; b++; @@ -246,16 +293,15 @@ namespace hnswlib { } class L2SpaceI : public SpaceInterface { - DISTFUNC fstdistfunc_; size_t data_size_; size_t dim_; + public: L2SpaceI(size_t dim) { - if(dim % 4 == 0) { + if (dim % 4 == 0) { fstdistfunc_ = L2SqrI4x; - } - else { + } else { fstdistfunc_ = L2SqrI; } dim_ = dim; @@ -276,6 +322,4 @@ namespace hnswlib { ~L2SpaceI() {} }; - - -} \ No newline at end of file +} // namespace hnswlib diff --git a/hnswlib/visited_list_pool.h b/hnswlib/visited_list_pool.h index 6b0f445..c8308bc 100644 --- a/hnswlib/visited_list_pool.h +++ b/hnswlib/visited_list_pool.h @@ -2,6 +2,7 @@ #include #include +#include namespace hnswlib { typedef unsigned short int vl_type; @@ -24,7 +25,7 @@ namespace hnswlib { memset(mass, 0, sizeof(vl_type) * numelements); curV++; } - }; + } ~VisitedList() { delete[] mass; } }; @@ -59,12 +60,12 @@ namespace hnswlib { } rez->reset(); return rez; - }; + } void releaseVisitedList(VisitedList *vl) { std::unique_lock lock(poolguard); pool.push_front(vl); - }; + } ~VisitedListPool() { while (pool.size()) { @@ -72,7 +73,6 @@ namespace hnswlib { pool.pop_front(); delete rez; } - }; + } }; -} - +} // namespace hnswlib diff --git a/libhnsw.a b/libhnsw.a index 3470a34b29383741bb3e44d8d338e425e0b41860..af78b8856558dc896e23ace04612a1c6e6cd97d3 100644 GIT binary patch literal 109080 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