forked from facebookresearch/faiss
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIndex_c.h
282 lines (247 loc) · 8.46 KB
/
Index_c.h
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
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// Copyright 2004-present Facebook. All Rights Reserved
// -*- c -*-
#ifndef FAISS_INDEX_C_H
#define FAISS_INDEX_C_H
#include <stddef.h>
#include "faiss_c.h"
#ifdef __cplusplus
extern "C" {
#endif
// forward declaration required here
FAISS_DECLARE_CLASS(RangeSearchResult)
// typedef struct FaissRangeSearchResult_H FaissRangeSearchResult;
typedef struct FaissIDSelector_H FaissIDSelector;
/// Some algorithms support both an inner product version and a L2 search
/// version.
typedef enum FaissMetricType {
METRIC_INNER_PRODUCT = 0, ///< maximum inner product search
METRIC_L2 = 1, ///< squared L2 search
METRIC_L1, ///< L1 (aka cityblock)
METRIC_Linf, ///< infinity distance
METRIC_Lp, ///< L_p distance, p is given by metric_arg
/// some additional metrics defined in scipy.spatial.distance
METRIC_Canberra = 20,
METRIC_BrayCurtis,
METRIC_JensenShannon,
} FaissMetricType;
FAISS_DECLARE_CLASS(SearchParameters)
FAISS_DECLARE_DESTRUCTOR(SearchParameters)
int faiss_SearchParameters_new(
FaissSearchParameters** p_sp,
FaissIDSelector* sel);
/// Opaque type for referencing to an index object
FAISS_DECLARE_CLASS(Index)
FAISS_DECLARE_DESTRUCTOR(Index)
/// Getter for d
FAISS_DECLARE_GETTER(Index, int, d)
/// Getter for is_trained
FAISS_DECLARE_GETTER(Index, int, is_trained)
/// Getter for ntotal
FAISS_DECLARE_GETTER(Index, idx_t, ntotal)
/// Getter for metric_type
FAISS_DECLARE_GETTER(Index, FaissMetricType, metric_type)
FAISS_DECLARE_GETTER_SETTER(Index, int, verbose)
/** Perform training on a representative set of vectors
*
* @param index opaque pointer to index object
* @param n nb of training vectors
* @param x training vectors, size n * d
*/
int faiss_Index_train(FaissIndex* index, idx_t n, const float* x);
/** Add n vectors of dimension d to the index.
*
* Vectors are implicitly assigned labels ntotal .. ntotal + n - 1
* This function slices the input vectors in chunks smaller than
* blocksize_add and calls add_core.
* @param index opaque pointer to index object
* @param x input matrix, size n * d
*/
int faiss_Index_add(FaissIndex* index, idx_t n, const float* x);
/** Same as add, but stores xids instead of sequential ids.
*
* The default implementation fails with an assertion, as it is
* not supported by all indexes.
*
* @param index opaque pointer to index object
* @param xids if non-null, ids to store for the vectors (size n)
*/
int faiss_Index_add_with_ids(
FaissIndex* index,
idx_t n,
const float* x,
const idx_t* xids);
/** query n vectors of dimension d to the index.
*
* return at most k vectors. If there are not enough results for a
* query, the result array is padded with -1s.
*
* @param index opaque pointer to index object
* @param x input vectors to search, size n * d
* @param labels output labels of the NNs, size n*k
* @param distances output pairwise distances, size n*k
*/
int faiss_Index_search(
const FaissIndex* index,
idx_t n,
const float* x,
idx_t k,
float* distances,
idx_t* labels);
/**
* query n vectors of dimension d with search parameters to the index.
*
* return at most k vectors. If there are not enough results for a query,
* the result is padded with -1s.
*
* @param index opaque pointer to index object
* @param x input vectors to search, size n * d
* @param params input params to modify how search is done
* @param labels output labels of the NNs, size n*k
* @param distances output pairwise distances, size n*k
*/
int faiss_Index_search_with_params(
const FaissIndex* index,
idx_t n,
const float* x,
idx_t k,
const FaissSearchParameters* params,
float* distances,
idx_t* labels);
/** query n vectors of dimension d to the index.
*
* return all vectors with distance < radius. Note that many
* indexes do not implement the range_search (only the k-NN search
* is mandatory).
*
* @param index opaque pointer to index object
* @param x input vectors to search, size n * d
* @param radius search radius
* @param result result table
*/
int faiss_Index_range_search(
const FaissIndex* index,
idx_t n,
const float* x,
float radius,
FaissRangeSearchResult* result);
/** return the indexes of the k vectors closest to the query x.
*
* This function is identical as search but only return labels of neighbors.
* @param index opaque pointer to index object
* @param x input vectors to search, size n * d
* @param labels output labels of the NNs, size n*k
*/
int faiss_Index_assign(
FaissIndex* index,
idx_t n,
const float* x,
idx_t* labels,
idx_t k);
/** removes all elements from the database.
* @param index opaque pointer to index object
*/
int faiss_Index_reset(FaissIndex* index);
/** removes IDs from the index. Not supported by all indexes
* @param index opaque pointer to index object
* @param nremove output for the number of IDs removed
*/
int faiss_Index_remove_ids(
FaissIndex* index,
const FaissIDSelector* sel,
size_t* n_removed);
/** Reconstruct a stored vector (or an approximation if lossy coding)
*
* this function may not be defined for some indexes
* @param index opaque pointer to index object
* @param key id of the vector to reconstruct
* @param recons reconstructed vector (size d)
*/
int faiss_Index_reconstruct(const FaissIndex* index, idx_t key, float* recons);
/** Reconstruct vectors i0 to i0 + ni - 1
*
* this function may not be defined for some indexes
* @param index opaque pointer to index object
* @param recons reconstructed vector (size ni * d)
*/
int faiss_Index_reconstruct_n(
const FaissIndex* index,
idx_t i0,
idx_t ni,
float* recons);
/** Computes a residual vector after indexing encoding.
*
* The residual vector is the difference between a vector and the
* reconstruction that can be decoded from its representation in
* the index. The residual can be used for multiple-stage indexing
* methods, like IndexIVF's methods.
*
* @param index opaque pointer to index object
* @param x input vector, size d
* @param residual output residual vector, size d
* @param key encoded index, as returned by search and assign
*/
int faiss_Index_compute_residual(
const FaissIndex* index,
const float* x,
float* residual,
idx_t key);
/** Computes a residual vector after indexing encoding.
*
* The residual vector is the difference between a vector and the
* reconstruction that can be decoded from its representation in
* the index. The residual can be used for multiple-stage indexing
* methods, like IndexIVF's methods.
*
* @param index opaque pointer to index object
* @param n number of vectors
* @param x input vector, size (n x d)
* @param residuals output residual vectors, size (n x d)
* @param keys encoded index, as returned by search and assign
*/
int faiss_Index_compute_residual_n(
const FaissIndex* index,
idx_t n,
const float* x,
float* residuals,
const idx_t* keys);
/* The standalone codec interface */
/** The size of the produced codes in bytes.
*
* @param index opaque pointer to index object
* @param size the returned size in bytes
*/
int faiss_Index_sa_code_size(const FaissIndex* index, size_t* size);
/** encode a set of vectors
*
* @param index opaque pointer to index object
* @param n number of vectors
* @param x input vectors, size n * d
* @param bytes output encoded vectors, size n * sa_code_size()
*/
int faiss_Index_sa_encode(
const FaissIndex* index,
idx_t n,
const float* x,
uint8_t* bytes);
/** decode a set of vectors
*
* @param index opaque pointer to index object
* @param n number of vectors
* @param bytes input encoded vectors, size n * sa_code_size()
* @param x output vectors, size n * d
*/
int faiss_Index_sa_decode(
const FaissIndex* index,
idx_t n,
const uint8_t* bytes,
float* x);
#ifdef __cplusplus
}
#endif
#endif