-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathvec_utils.cpp
More file actions
289 lines (266 loc) · 11.1 KB
/
vec_utils.cpp
File metadata and controls
289 lines (266 loc) · 11.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
/*
* Copyright (c) 2006-Present, Redis Ltd.
* All rights reserved.
*
* Licensed under your choice of the Redis Source Available License 2.0
* (RSALv2); or (b) the Server Side Public License v1 (SSPLv1); or (c) the
* GNU Affero General Public License v3 (AGPLv3).
*/
#include "vec_utils.h"
#include "VecSim/query_result_definitions.h"
#include "VecSim/types/bfloat16.h"
#include "VecSim/types/float16.h"
#include <cmath>
#include <cerrno>
#include <climits>
#include <float.h>
#include <algorithm>
using bfloat16 = vecsim_types::bfloat16;
using float16 = vecsim_types::float16;
const char *VecSimCommonStrings::ALGORITHM_STRING = "ALGORITHM";
const char *VecSimCommonStrings::FLAT_STRING = "FLAT";
const char *VecSimCommonStrings::HNSW_STRING = "HNSW";
const char *VecSimCommonStrings::TIERED_STRING = "TIERED";
const char *VecSimCommonStrings::SVS_STRING = "SVS";
const char *VecSimCommonStrings::TYPE_STRING = "TYPE";
const char *VecSimCommonStrings::FLOAT32_STRING = "FLOAT32";
const char *VecSimCommonStrings::FLOAT64_STRING = "FLOAT64";
const char *VecSimCommonStrings::BFLOAT16_STRING = "BFLOAT16";
const char *VecSimCommonStrings::FLOAT16_STRING = "FLOAT16";
const char *VecSimCommonStrings::INT8_STRING = "INT8";
const char *VecSimCommonStrings::UINT8_STRING = "UINT8";
const char *VecSimCommonStrings::INT32_STRING = "INT32";
const char *VecSimCommonStrings::INT64_STRING = "INT64";
const char *VecSimCommonStrings::METRIC_STRING = "METRIC";
const char *VecSimCommonStrings::COSINE_STRING = "COSINE";
const char *VecSimCommonStrings::IP_STRING = "IP";
const char *VecSimCommonStrings::L2_STRING = "L2";
const char *VecSimCommonStrings::DIMENSION_STRING = "DIMENSION";
const char *VecSimCommonStrings::INDEX_SIZE_STRING = "INDEX_SIZE";
const char *VecSimCommonStrings::INDEX_LABEL_COUNT_STRING = "INDEX_LABEL_COUNT";
const char *VecSimCommonStrings::IS_MULTI_STRING = "IS_MULTI_VALUE";
const char *VecSimCommonStrings::MEMORY_STRING = "MEMORY";
const char *VecSimCommonStrings::HNSW_EF_RUNTIME_STRING = "EF_RUNTIME";
const char *VecSimCommonStrings::HNSW_M_STRING = "M";
const char *VecSimCommonStrings::HNSW_EF_CONSTRUCTION_STRING = "EF_CONSTRUCTION";
const char *VecSimCommonStrings::EPSILON_STRING = "EPSILON";
const char *VecSimCommonStrings::HNSW_MAX_LEVEL = "MAX_LEVEL";
const char *VecSimCommonStrings::HNSW_ENTRYPOINT = "ENTRYPOINT";
const char *VecSimCommonStrings::NUM_MARKED_DELETED = "NUMBER_OF_MARKED_DELETED";
const char *VecSimCommonStrings::NUM_SEARCHES = "NUM_SEARCHES";
const char *VecSimCommonStrings::NUM_VISITED_NODES = "NUM_VISITED_NODES";
const char *VecSimCommonStrings::NUM_VISITED_NODES_HIGHER_LEVELS =
"NUM_VISITED_NODES_HIGHER_LEVELS";
const char *VecSimCommonStrings::SVS_SEARCH_WS_STRING = "SEARCH_WINDOW_SIZE";
const char *VecSimCommonStrings::SVS_CONSTRUCTION_WS_STRING = "CONSTRUCTION_WINDOW_SIZE";
const char *VecSimCommonStrings::SVS_SEARCH_BC_STRING = "SEARCH_BUFFER_CAPACITY";
const char *VecSimCommonStrings::SVS_USE_SEARCH_HISTORY_STRING = "USE_SEARCH_HISTORY";
const char *VecSimCommonStrings::SVS_ALPHA_STRING = "ALPHA";
const char *VecSimCommonStrings::SVS_QUANT_BITS_STRING = "QUANT_BITS";
const char *VecSimCommonStrings::SVS_GRAPH_MAX_DEGREE_STRING = "GRAPH_MAX_DEGREE";
const char *VecSimCommonStrings::SVS_MAX_CANDIDATE_POOL_SIZE_STRING = "MAX_CANDIDATE_POOL_SIZE";
const char *VecSimCommonStrings::SVS_PRUNE_TO_STRING = "PRUNE_TO";
const char *VecSimCommonStrings::SVS_NUM_THREADS_STRING = "NUM_THREADS";
const char *VecSimCommonStrings::SVS_LAST_RESERVED_THREADS_STRING = "LAST_RESERVED_NUM_THREADS";
const char *VecSimCommonStrings::SVS_LEANVEC_DIM_STRING = "LEANVEC_DIMENSION";
const char *VecSimCommonStrings::BLOCK_SIZE_STRING = "BLOCK_SIZE";
const char *VecSimCommonStrings::SEARCH_MODE_STRING = "LAST_SEARCH_MODE";
const char *VecSimCommonStrings::HYBRID_POLICY_STRING = "HYBRID_POLICY";
const char *VecSimCommonStrings::BATCH_SIZE_STRING = "BATCH_SIZE";
const char *VecSimCommonStrings::TIERED_MANAGEMENT_MEMORY_STRING = "MANAGEMENT_LAYER_MEMORY";
const char *VecSimCommonStrings::TIERED_BACKGROUND_INDEXING_STRING = "BACKGROUND_INDEXING";
const char *VecSimCommonStrings::TIERED_BUFFER_LIMIT_STRING = "TIERED_BUFFER_LIMIT";
const char *VecSimCommonStrings::FRONTEND_INDEX_STRING = "FRONTEND_INDEX";
const char *VecSimCommonStrings::BACKEND_INDEX_STRING = "BACKEND_INDEX";
// Tiered HNSW specific
const char *VecSimCommonStrings::TIERED_HNSW_SWAP_JOBS_THRESHOLD_STRING =
"TIERED_HNSW_SWAP_JOBS_THRESHOLD";
// Tiered SVS specific
const char *VecSimCommonStrings::TIERED_SVS_TRAINING_THRESHOLD_STRING =
"TIERED_SVS_TRAINING_THRESHOLD";
const char *VecSimCommonStrings::TIERED_SVS_UPDATE_THRESHOLD_STRING = "TIERED_SVS_UPDATE_THRESHOLD";
const char *VecSimCommonStrings::TIERED_SVS_THREADS_RESERVE_TIMEOUT_STRING =
"TIERED_SVS_THREADS_RESERVE_TIMEOUT";
// Log levels
const char *VecSimCommonStrings::LOG_DEBUG_STRING = "debug";
const char *VecSimCommonStrings::LOG_VERBOSE_STRING = "verbose";
const char *VecSimCommonStrings::LOG_NOTICE_STRING = "notice";
const char *VecSimCommonStrings::LOG_WARNING_STRING = "warning";
void sort_results_by_id(VecSimQueryReply *rep) {
std::sort(rep->results.begin(), rep->results.end(),
[](const VecSimQueryResult &a, const VecSimQueryResult &b) { return a.id < b.id; });
}
void sort_results_by_score(VecSimQueryReply *rep) {
std::sort(
rep->results.begin(), rep->results.end(),
[](const VecSimQueryResult &a, const VecSimQueryResult &b) { return a.score < b.score; });
}
void sort_results_by_score_then_id(VecSimQueryReply *rep) {
std::sort(rep->results.begin(), rep->results.end(),
[](const VecSimQueryResult &a, const VecSimQueryResult &b) {
if (a.score == b.score) {
return a.id < b.id;
}
return a.score < b.score;
});
}
void sort_results(VecSimQueryReply *rep, VecSimQueryReply_Order order) {
switch (order) {
case BY_ID:
return sort_results_by_id(rep);
case BY_SCORE:
return sort_results_by_score(rep);
case BY_SCORE_THEN_ID:
return sort_results_by_score_then_id(rep);
}
}
VecSimResolveCode validate_positive_integer_param(VecSimRawParam rawParam, long long *val) {
char *ep; // For checking that strtoll used all rawParam.valLen chars.
errno = 0;
*val = strtoll(rawParam.value, &ep, 0);
// Here we verify that val is positive and strtoll was successful.
// The last test checks that the entire rawParam.value was used.
// We catch here inputs like "3.14", "123text" and so on.
if (*val <= 0 || *val == LLONG_MAX || errno != 0 || (rawParam.value + rawParam.valLen) != ep) {
return VecSimParamResolverErr_BadValue;
}
return VecSimParamResolver_OK;
}
VecSimResolveCode validate_positive_double_param(VecSimRawParam rawParam, double *val) {
char *ep; // For checking that strtold used all rawParam.valLen chars.
errno = 0;
*val = strtod(rawParam.value, &ep);
// Here we verify that val is positive and strtod was successful.
// The last test checks that the entire rawParam.value was used.
// We catch here inputs like "-3.14", "123text" and so on.
if (*val <= 0 || *val == DBL_MAX || errno != 0 || (rawParam.value + rawParam.valLen) != ep) {
return VecSimParamResolverErr_BadValue;
}
return VecSimParamResolver_OK;
}
VecSimResolveCode validate_vecsim_bool_param(VecSimRawParam rawParam, VecSimOptionMode *val) {
// Here we verify that given value is strictly ON or OFF
std::string value(rawParam.value, rawParam.valLen);
std::transform(value.begin(), value.end(), value.begin(), ::toupper);
if (value == "ON") {
*val = VecSimOption_ENABLE;
} else if (value == "OFF") {
*val = VecSimOption_DISABLE;
} else if (value == "AUTO") {
*val = VecSimOption_AUTO;
} else {
return VecSimParamResolverErr_BadValue;
}
return VecSimParamResolver_OK;
}
const char *VecSimAlgo_ToString(VecSimAlgo vecsimAlgo) {
switch (vecsimAlgo) {
case VecSimAlgo_BF:
return VecSimCommonStrings::FLAT_STRING;
case VecSimAlgo_HNSWLIB:
return VecSimCommonStrings::HNSW_STRING;
case VecSimAlgo_TIERED:
return VecSimCommonStrings::TIERED_STRING;
case VecSimAlgo_SVS:
return VecSimCommonStrings::SVS_STRING;
}
return NULL;
}
const char *VecSimType_ToString(VecSimType vecsimType) {
switch (vecsimType) {
case VecSimType_FLOAT32:
return VecSimCommonStrings::FLOAT32_STRING;
case VecSimType_FLOAT64:
return VecSimCommonStrings::FLOAT64_STRING;
case VecSimType_BFLOAT16:
return VecSimCommonStrings::BFLOAT16_STRING;
case VecSimType_FLOAT16:
return VecSimCommonStrings::FLOAT16_STRING;
case VecSimType_INT8:
return VecSimCommonStrings::INT8_STRING;
case VecSimType_UINT8:
return VecSimCommonStrings::UINT8_STRING;
case VecSimType_INT32:
return VecSimCommonStrings::INT32_STRING;
case VecSimType_INT64:
return VecSimCommonStrings::INT64_STRING;
}
return NULL;
}
const char *VecSimMetric_ToString(VecSimMetric vecsimMetric) {
switch (vecsimMetric) {
case VecSimMetric_Cosine:
return "COSINE";
case VecSimMetric_IP:
return "IP";
case VecSimMetric_L2:
return "L2";
}
return NULL;
}
const char *VecSimSearchMode_ToString(VecSearchMode vecsimSearchMode) {
switch (vecsimSearchMode) {
case EMPTY_MODE:
return "EMPTY_MODE";
case STANDARD_KNN:
return "STANDARD_KNN";
case HYBRID_ADHOC_BF:
return "HYBRID_ADHOC_BF";
case HYBRID_BATCHES:
return "HYBRID_BATCHES";
case HYBRID_BATCHES_TO_ADHOC_BF:
return "HYBRID_BATCHES_TO_ADHOC_BF";
case RANGE_QUERY:
return "RANGE_QUERY";
}
return NULL;
}
const char *VecSimQuantBits_ToString(VecSimSvsQuantBits quantBits) {
switch (quantBits) {
case VecSimSvsQuant_NONE:
return "NONE";
case VecSimSvsQuant_Scalar:
return "Scalar";
case VecSimSvsQuant_4:
return "4";
case VecSimSvsQuant_8:
return "8";
case VecSimSvsQuant_4x4:
return "4x4";
case VecSimSvsQuant_4x8:
return "4x8";
case VecSimSvsQuant_4x8_LeanVec:
return "4x8_LeanVec";
case VecSimSvsQuant_8x8_LeanVec:
return "8x8_LeanVec";
}
return NULL;
}
size_t VecSimType_sizeof(VecSimType type) {
switch (type) {
case VecSimType_FLOAT32:
return sizeof(float);
case VecSimType_FLOAT64:
return sizeof(double);
case VecSimType_BFLOAT16:
return sizeof(bfloat16);
case VecSimType_FLOAT16:
return sizeof(float16);
case VecSimType_INT8:
return sizeof(int8_t);
case VecSimType_UINT8:
return sizeof(uint8_t);
case VecSimType_INT32:
return sizeof(int32_t);
case VecSimType_INT64:
return sizeof(int64_t);
}
return 0;
}
size_t VecSimParams_GetStoredDataSize(VecSimType type, size_t dim, VecSimMetric metric) {
size_t storedDataSize = VecSimType_sizeof(type) * dim;
if (metric == VecSimMetric_Cosine && (type == VecSimType_INT8 || type == VecSimType_UINT8)) {
storedDataSize += sizeof(float); // For the norm
}
return storedDataSize;
}