faiss 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +23 -21
  5. data/ext/faiss/extconf.rb +11 -0
  6. data/ext/faiss/index.cpp +4 -4
  7. data/ext/faiss/index_binary.cpp +6 -6
  8. data/ext/faiss/product_quantizer.cpp +4 -4
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +13 -0
  11. data/vendor/faiss/faiss/Clustering.cpp +32 -0
  12. data/vendor/faiss/faiss/Clustering.h +14 -0
  13. data/vendor/faiss/faiss/IVFlib.cpp +101 -2
  14. data/vendor/faiss/faiss/IVFlib.h +26 -2
  15. data/vendor/faiss/faiss/Index.cpp +36 -3
  16. data/vendor/faiss/faiss/Index.h +43 -6
  17. data/vendor/faiss/faiss/Index2Layer.cpp +24 -93
  18. data/vendor/faiss/faiss/Index2Layer.h +8 -17
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +610 -0
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +253 -0
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +299 -0
  22. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +199 -0
  23. data/vendor/faiss/faiss/IndexBinary.cpp +20 -4
  24. data/vendor/faiss/faiss/IndexBinary.h +18 -3
  25. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +9 -2
  26. data/vendor/faiss/faiss/IndexBinaryFlat.h +4 -2
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -1
  28. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -1
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +5 -1
  30. data/vendor/faiss/faiss/IndexBinaryHNSW.h +2 -1
  31. data/vendor/faiss/faiss/IndexBinaryHash.cpp +17 -4
  32. data/vendor/faiss/faiss/IndexBinaryHash.h +8 -4
  33. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +28 -13
  34. data/vendor/faiss/faiss/IndexBinaryIVF.h +10 -7
  35. data/vendor/faiss/faiss/IndexFastScan.cpp +626 -0
  36. data/vendor/faiss/faiss/IndexFastScan.h +145 -0
  37. data/vendor/faiss/faiss/IndexFlat.cpp +52 -69
  38. data/vendor/faiss/faiss/IndexFlat.h +16 -19
  39. data/vendor/faiss/faiss/IndexFlatCodes.cpp +101 -0
  40. data/vendor/faiss/faiss/IndexFlatCodes.h +59 -0
  41. data/vendor/faiss/faiss/IndexHNSW.cpp +66 -138
  42. data/vendor/faiss/faiss/IndexHNSW.h +4 -2
  43. data/vendor/faiss/faiss/IndexIDMap.cpp +247 -0
  44. data/vendor/faiss/faiss/IndexIDMap.h +107 -0
  45. data/vendor/faiss/faiss/IndexIVF.cpp +200 -40
  46. data/vendor/faiss/faiss/IndexIVF.h +59 -22
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +393 -0
  48. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +183 -0
  49. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +590 -0
  50. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +171 -0
  51. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +1290 -0
  52. data/vendor/faiss/faiss/IndexIVFFastScan.h +213 -0
  53. data/vendor/faiss/faiss/IndexIVFFlat.cpp +43 -26
  54. data/vendor/faiss/faiss/IndexIVFFlat.h +4 -2
  55. data/vendor/faiss/faiss/IndexIVFPQ.cpp +238 -53
  56. data/vendor/faiss/faiss/IndexIVFPQ.h +6 -2
  57. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +23 -852
  58. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +7 -112
  59. data/vendor/faiss/faiss/IndexIVFPQR.cpp +3 -3
  60. data/vendor/faiss/faiss/IndexIVFPQR.h +1 -1
  61. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +63 -40
  62. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +23 -7
  63. data/vendor/faiss/faiss/IndexLSH.cpp +8 -32
  64. data/vendor/faiss/faiss/IndexLSH.h +4 -16
  65. data/vendor/faiss/faiss/IndexLattice.cpp +7 -1
  66. data/vendor/faiss/faiss/IndexLattice.h +3 -1
  67. data/vendor/faiss/faiss/IndexNNDescent.cpp +4 -5
  68. data/vendor/faiss/faiss/IndexNNDescent.h +2 -1
  69. data/vendor/faiss/faiss/IndexNSG.cpp +37 -5
  70. data/vendor/faiss/faiss/IndexNSG.h +25 -1
  71. data/vendor/faiss/faiss/IndexPQ.cpp +108 -120
  72. data/vendor/faiss/faiss/IndexPQ.h +21 -22
  73. data/vendor/faiss/faiss/IndexPQFastScan.cpp +15 -450
  74. data/vendor/faiss/faiss/IndexPQFastScan.h +15 -78
  75. data/vendor/faiss/faiss/IndexPreTransform.cpp +47 -8
  76. data/vendor/faiss/faiss/IndexPreTransform.h +15 -3
  77. data/vendor/faiss/faiss/IndexRefine.cpp +36 -4
  78. data/vendor/faiss/faiss/IndexRefine.h +14 -2
  79. data/vendor/faiss/faiss/IndexReplicas.cpp +4 -2
  80. data/vendor/faiss/faiss/IndexReplicas.h +2 -1
  81. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +438 -0
  82. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +92 -0
  83. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +28 -43
  84. data/vendor/faiss/faiss/IndexScalarQuantizer.h +8 -23
  85. data/vendor/faiss/faiss/IndexShards.cpp +4 -1
  86. data/vendor/faiss/faiss/IndexShards.h +2 -1
  87. data/vendor/faiss/faiss/MetaIndexes.cpp +5 -178
  88. data/vendor/faiss/faiss/MetaIndexes.h +3 -81
  89. data/vendor/faiss/faiss/VectorTransform.cpp +45 -1
  90. data/vendor/faiss/faiss/VectorTransform.h +25 -4
  91. data/vendor/faiss/faiss/clone_index.cpp +26 -3
  92. data/vendor/faiss/faiss/clone_index.h +3 -0
  93. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +300 -0
  94. data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +24 -0
  95. data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +195 -0
  96. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2058 -0
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +408 -0
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2147 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +460 -0
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +465 -0
  101. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +1618 -0
  102. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +251 -0
  103. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +1452 -0
  104. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +1 -0
  105. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +2 -6
  106. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
  107. data/vendor/faiss/faiss/gpu/GpuIndex.h +28 -4
  108. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -1
  109. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +10 -8
  110. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +75 -14
  111. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +19 -32
  112. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +22 -31
  113. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +22 -28
  114. data/vendor/faiss/faiss/gpu/GpuResources.cpp +14 -0
  115. data/vendor/faiss/faiss/gpu/GpuResources.h +16 -3
  116. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +3 -3
  117. data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +32 -0
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +1 -0
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +311 -75
  120. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +10 -0
  121. data/vendor/faiss/faiss/gpu/test/TestUtils.h +3 -0
  122. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +2 -2
  123. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +5 -4
  124. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +331 -29
  125. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +110 -19
  126. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +0 -54
  127. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +0 -76
  128. data/vendor/faiss/faiss/impl/DistanceComputer.h +64 -0
  129. data/vendor/faiss/faiss/impl/HNSW.cpp +133 -32
  130. data/vendor/faiss/faiss/impl/HNSW.h +19 -16
  131. data/vendor/faiss/faiss/impl/IDSelector.cpp +125 -0
  132. data/vendor/faiss/faiss/impl/IDSelector.h +135 -0
  133. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +378 -217
  134. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +106 -29
  135. data/vendor/faiss/faiss/impl/LookupTableScaler.h +77 -0
  136. data/vendor/faiss/faiss/impl/NNDescent.cpp +1 -0
  137. data/vendor/faiss/faiss/impl/NSG.cpp +1 -4
  138. data/vendor/faiss/faiss/impl/NSG.h +1 -1
  139. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +383 -0
  140. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +154 -0
  141. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +225 -145
  142. data/vendor/faiss/faiss/impl/ProductQuantizer.h +29 -10
  143. data/vendor/faiss/faiss/impl/Quantizer.h +43 -0
  144. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +521 -55
  145. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +94 -16
  146. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -0
  147. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +108 -191
  148. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +18 -18
  149. data/vendor/faiss/faiss/impl/index_read.cpp +338 -24
  150. data/vendor/faiss/faiss/impl/index_write.cpp +300 -18
  151. data/vendor/faiss/faiss/impl/io.cpp +1 -1
  152. data/vendor/faiss/faiss/impl/io_macros.h +20 -0
  153. data/vendor/faiss/faiss/impl/kmeans1d.cpp +303 -0
  154. data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
  155. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +56 -16
  156. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +25 -8
  157. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +66 -25
  158. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +75 -27
  159. data/vendor/faiss/faiss/index_factory.cpp +772 -412
  160. data/vendor/faiss/faiss/index_factory.h +3 -0
  161. data/vendor/faiss/faiss/index_io.h +5 -0
  162. data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -0
  163. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +4 -1
  164. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +2 -1
  165. data/vendor/faiss/faiss/python/python_callbacks.cpp +27 -0
  166. data/vendor/faiss/faiss/python/python_callbacks.h +15 -0
  167. data/vendor/faiss/faiss/utils/Heap.h +31 -15
  168. data/vendor/faiss/faiss/utils/distances.cpp +384 -58
  169. data/vendor/faiss/faiss/utils/distances.h +149 -18
  170. data/vendor/faiss/faiss/utils/distances_simd.cpp +776 -6
  171. data/vendor/faiss/faiss/utils/extra_distances.cpp +12 -7
  172. data/vendor/faiss/faiss/utils/extra_distances.h +3 -1
  173. data/vendor/faiss/faiss/utils/fp16-fp16c.h +21 -0
  174. data/vendor/faiss/faiss/utils/fp16-inl.h +101 -0
  175. data/vendor/faiss/faiss/utils/fp16.h +11 -0
  176. data/vendor/faiss/faiss/utils/hamming-inl.h +54 -0
  177. data/vendor/faiss/faiss/utils/hamming.cpp +0 -48
  178. data/vendor/faiss/faiss/utils/ordered_key_value.h +10 -0
  179. data/vendor/faiss/faiss/utils/quantize_lut.cpp +62 -0
  180. data/vendor/faiss/faiss/utils/quantize_lut.h +20 -0
  181. data/vendor/faiss/faiss/utils/random.cpp +53 -0
  182. data/vendor/faiss/faiss/utils/random.h +5 -0
  183. data/vendor/faiss/faiss/utils/simdlib_avx2.h +4 -0
  184. data/vendor/faiss/faiss/utils/simdlib_emulated.h +6 -1
  185. data/vendor/faiss/faiss/utils/simdlib_neon.h +7 -2
  186. data/vendor/faiss/faiss/utils/utils.h +1 -1
  187. metadata +46 -5
  188. data/vendor/faiss/faiss/IndexResidual.cpp +0 -291
  189. data/vendor/faiss/faiss/IndexResidual.h +0 -152
@@ -18,6 +18,8 @@
18
18
 
19
19
  namespace faiss {
20
20
 
21
+ struct IDSelector;
22
+
21
23
  /*********************************************************
22
24
  * Optimized distance/norm/inner prod computations
23
25
  *********************************************************/
@@ -40,7 +42,7 @@ float fvec_Linf(const float* x, const float* y, size_t d);
40
42
  * @param nq nb of query vectors
41
43
  * @param nb nb of database vectors
42
44
  * @param xq query vectors (size nq * d)
43
- * @param xb database vectros (size nb * d)
45
+ * @param xb database vectors (size nb * d)
44
46
  * @param dis output distances (size nq * nb)
45
47
  * @param ldq,ldb, ldd strides for the matrices
46
48
  */
@@ -63,7 +65,7 @@ void fvec_inner_products_ny(
63
65
  size_t d,
64
66
  size_t ny);
65
67
 
66
- /* compute ny square L2 distance bewteen x and a set of contiguous y vectors */
68
+ /* compute ny square L2 distance between x and a set of contiguous y vectors */
67
69
  void fvec_L2sqr_ny(
68
70
  float* dis,
69
71
  const float* x,
@@ -71,6 +73,29 @@ void fvec_L2sqr_ny(
71
73
  size_t d,
72
74
  size_t ny);
73
75
 
76
+ /* compute ny square L2 distance between x and a set of contiguous y vectors
77
+ and return the index of the nearest vector.
78
+ return 0 if ny == 0. */
79
+ size_t fvec_L2sqr_ny_nearest(
80
+ float* distances_tmp_buffer,
81
+ const float* x,
82
+ const float* y,
83
+ size_t d,
84
+ size_t ny);
85
+
86
+ /* compute ny square L2 distance between x and a set of transposed contiguous
87
+ y vectors and return the index of the nearest vector.
88
+ squared lengths of y should be provided as well
89
+ return 0 if ny == 0. */
90
+ size_t fvec_L2sqr_ny_nearest_y_transposed(
91
+ float* distances_tmp_buffer,
92
+ const float* x,
93
+ const float* y,
94
+ const float* y_sqlen,
95
+ size_t d,
96
+ size_t d_offset,
97
+ size_t ny);
98
+
74
99
  /** squared norm of a vector */
75
100
  float fvec_norm_L2sqr(const float* x, size_t d);
76
101
 
@@ -87,7 +112,7 @@ void fvec_norms_L2sqr(float* norms, const float* x, size_t d, size_t nx);
87
112
  /* L2-renormalize a set of vector. Nothing done if the vector is 0-normed */
88
113
  void fvec_renorm_L2(size_t d, size_t nx, float* x);
89
114
 
90
- /* This function exists because the Torch counterpart is extremly slow
115
+ /* This function exists because the Torch counterpart is extremely slow
91
116
  (not multi-threaded + unexpected overhead even in single thread).
92
117
  It is here to implement the usual property |x-y|^2=|x|^2+|y|^2-2<x|y> */
93
118
  void inner_product_to_L2sqr(
@@ -97,6 +122,39 @@ void inner_product_to_L2sqr(
97
122
  size_t n1,
98
123
  size_t n2);
99
124
 
125
+ /*********************************************************
126
+ * Vector to vector functions
127
+ *********************************************************/
128
+
129
+ /** compute c := a + b for vectors
130
+ *
131
+ * c and a can overlap, c and b can overlap
132
+ *
133
+ * @param a size d
134
+ * @param b size d
135
+ * @param c size d
136
+ */
137
+ void fvec_add(size_t d, const float* a, const float* b, float* c);
138
+
139
+ /** compute c := a + b for a, c vectors and b a scalar
140
+ *
141
+ * c and a can overlap
142
+ *
143
+ * @param a size d
144
+ * @param c size d
145
+ */
146
+ void fvec_add(size_t d, const float* a, float b, float* c);
147
+
148
+ /** compute c := a - b for vectors
149
+ *
150
+ * c and a can overlap, c and b can overlap
151
+ *
152
+ * @param a size d
153
+ * @param b size d
154
+ * @param c size d
155
+ */
156
+ void fvec_sub(size_t d, const float* a, const float* b, float* c);
157
+
100
158
  /***************************************************************************
101
159
  * Compute a subset of distances
102
160
  ***************************************************************************/
@@ -165,11 +223,28 @@ FAISS_API extern int distance_compute_blas_database_bs;
165
223
  FAISS_API extern int distance_compute_min_k_reservoir;
166
224
 
167
225
  /** Return the k nearest neighors of each of the nx vectors x among the ny
168
- * vector y, w.r.t to max inner product
226
+ * vector y, w.r.t to max inner product.
227
+ *
228
+ * @param x query vectors, size nx * d
229
+ * @param y database vectors, size ny * d
230
+ * @param res result heap structure, which also provides k. Sorted on output
231
+ */
232
+ void knn_inner_product(
233
+ const float* x,
234
+ const float* y,
235
+ size_t d,
236
+ size_t nx,
237
+ size_t ny,
238
+ float_minheap_array_t* res,
239
+ const IDSelector* sel = nullptr);
240
+
241
+ /** Return the k nearest neighors of each of the nx vectors x among the ny
242
+ * vector y, for the inner product metric.
169
243
  *
170
244
  * @param x query vectors, size nx * d
171
245
  * @param y database vectors, size ny * d
172
- * @param res result array, which also provides k. Sorted on output
246
+ * @param distances output distances, size nq * k
247
+ * @param indexes output vector ids, size nq * k
173
248
  */
174
249
  void knn_inner_product(
175
250
  const float* x,
@@ -177,10 +252,18 @@ void knn_inner_product(
177
252
  size_t d,
178
253
  size_t nx,
179
254
  size_t ny,
180
- float_minheap_array_t* res);
255
+ size_t k,
256
+ float* distances,
257
+ int64_t* indexes,
258
+ const IDSelector* sel = nullptr);
181
259
 
182
- /** Same as knn_inner_product, for the L2 distance
183
- * @param y_norm2 norms for the y vectors (nullptr or size ny)
260
+ /** Return the k nearest neighors of each of the nx vectors x among the ny
261
+ * vector y, for the L2 distance
262
+ * @param x query vectors, size nx * d
263
+ * @param y database vectors, size ny * d
264
+ * @param res result heap strcture, which also provides k. Sorted on output
265
+ * @param y_norm2 (optional) norms for the y vectors (nullptr or size ny)
266
+ * @param sel search in this subset of vectors
184
267
  */
185
268
  void knn_L2sqr(
186
269
  const float* x,
@@ -189,28 +272,74 @@ void knn_L2sqr(
189
272
  size_t nx,
190
273
  size_t ny,
191
274
  float_maxheap_array_t* res,
192
- const float* y_norm2 = nullptr);
275
+ const float* y_norm2 = nullptr,
276
+ const IDSelector* sel = nullptr);
193
277
 
194
- /* Find the nearest neighbors for nx queries in a set of ny vectors
278
+ /** Return the k nearest neighors of each of the nx vectors x among the ny
279
+ * vector y, for the L2 distance
280
+ *
281
+ * @param x query vectors, size nx * d
282
+ * @param y database vectors, size ny * d
283
+ * @param distances output distances, size nq * k
284
+ * @param indexes output vector ids, size nq * k
285
+ * @param y_norm2 (optional) norms for the y vectors (nullptr or size ny)
286
+ * @param sel search in this subset of vectors
287
+ */
288
+ void knn_L2sqr(
289
+ const float* x,
290
+ const float* y,
291
+ size_t d,
292
+ size_t nx,
293
+ size_t ny,
294
+ size_t k,
295
+ float* distances,
296
+ int64_t* indexes,
297
+ const float* y_norm2 = nullptr,
298
+ const IDSelector* sel = nullptr);
299
+
300
+ /** Find the max inner product neighbors for nx queries in a set of ny vectors
195
301
  * indexed by ids. May be useful for re-ranking a pre-selected vector list
302
+ *
303
+ * @param x query vectors, size nx * d
304
+ * @param y database vectors, size (max(ids) + 1) * d
305
+ * @param ids subset of database vectors to consider, size (nx, nsubset)
306
+ * @param res result structure
307
+ * @param ld_ids stride for the ids array. -1: use nsubset, 0: all queries
308
+ * process the same subset
196
309
  */
197
310
  void knn_inner_products_by_idx(
198
311
  const float* x,
199
312
  const float* y,
200
- const int64_t* ids,
313
+ const int64_t* subset,
201
314
  size_t d,
202
315
  size_t nx,
203
- size_t ny,
204
- float_minheap_array_t* res);
316
+ size_t nsubset,
317
+ size_t k,
318
+ float* vals,
319
+ int64_t* ids,
320
+ int64_t ld_ids = -1);
205
321
 
322
+ /** Find the nearest neighbors for nx queries in a set of ny vectors
323
+ * indexed by ids. May be useful for re-ranking a pre-selected vector list
324
+ *
325
+ * @param x query vectors, size nx * d
326
+ * @param y database vectors, size (max(ids) + 1) * d
327
+ * @param subset subset of database vectors to consider, size (nx, nsubset)
328
+ * @param res rIDesult structure
329
+ * @param ld_subset stride for the subset array. -1: use nsubset, 0: all queries
330
+ * process the same subset
331
+ */
206
332
  void knn_L2sqr_by_idx(
207
333
  const float* x,
208
334
  const float* y,
209
- const int64_t* ids,
335
+ const int64_t* subset,
210
336
  size_t d,
211
337
  size_t nx,
212
- size_t ny,
213
- float_maxheap_array_t* res);
338
+ size_t nsubset,
339
+ size_t k,
340
+ float* vals,
341
+ int64_t* ids,
342
+ int64_t ld_subset = -1);
214
343
 
215
344
  /***************************************************************************
216
345
  * Range search
@@ -234,7 +363,8 @@ void range_search_L2sqr(
234
363
  size_t nx,
235
364
  size_t ny,
236
365
  float radius,
237
- RangeSearchResult* result);
366
+ RangeSearchResult* result,
367
+ const IDSelector* sel = nullptr);
238
368
 
239
369
  /// same as range_search_L2sqr for the inner product similarity
240
370
  void range_search_inner_product(
@@ -244,7 +374,8 @@ void range_search_inner_product(
244
374
  size_t nx,
245
375
  size_t ny,
246
376
  float radius,
247
- RangeSearchResult* result);
377
+ RangeSearchResult* result,
378
+ const IDSelector* sel = nullptr);
248
379
 
249
380
  /***************************************************************************
250
381
  * PQ tables computations