diff --git a/hnswlib/bruteforce.h b/hnswlib/bruteforce.h index 8727cc8a9..f10f6a35f 100644 --- a/hnswlib/bruteforce.h +++ b/hnswlib/bruteforce.h @@ -4,6 +4,7 @@ #include #include #include +#include "hnswlib.h" namespace hnswlib { template @@ -60,6 +61,11 @@ class BruteforceSearch : public AlgorithmInterface { free(data_); } + inline labeltype getExternalLabel(size_t internal_id) const { + labeltype return_label; + memcpy(&return_label, data_ + internal_id * size_per_element_ + data_size_, sizeof(labeltype)); + return return_label; + } void addPoint(const void *datapoint, labeltype label, bool replace_deleted = false) { int idx; @@ -94,7 +100,7 @@ class BruteforceSearch : public AlgorithmInterface { dict_external_to_internal.erase(found); size_t cur_c = found->second; - labeltype label = *((labeltype*)(data_ + size_per_element_ * (cur_element_count-1) + data_size_)); + labeltype label = getExternalLabel(cur_element_count - 1); dict_external_to_internal[label] = cur_c; memcpy(data_ + size_per_element_ * cur_c, data_ + size_per_element_ * (cur_element_count-1), @@ -110,7 +116,7 @@ class BruteforceSearch : public AlgorithmInterface { 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_); - labeltype label = *((labeltype*) (data_ + size_per_element_ * i + data_size_)); + labeltype label = getExternalLabel(i); if ((!isIdAllowed) || (*isIdAllowed)(label)) { topResults.emplace(dist, label); } @@ -119,7 +125,7 @@ class BruteforceSearch : public AlgorithmInterface { 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) { - labeltype label = *((labeltype *) (data_ + size_per_element_ * i + data_size_)); + labeltype label = getExternalLabel(i); if ((!isIdAllowed) || (*isIdAllowed)(label)) { topResults.emplace(dist, label); } diff --git a/hnswlib/hnswalg.h b/hnswlib/hnswalg.h index e269ae69e..7c2c01c46 100644 --- a/hnswlib/hnswalg.h +++ b/hnswlib/hnswalg.h @@ -194,8 +194,8 @@ class HierarchicalNSW : public AlgorithmInterface { } - inline labeltype *getExternalLabeLp(tableint internal_id) const { - return (labeltype *) (data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_); + inline char *getExternalLabeLp(tableint internal_id) const { + return data_level0_memory_ + internal_id * size_data_per_element_ + label_offset_; }