faiss 0.2.4 → 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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +23 -21
  4. data/ext/faiss/extconf.rb +11 -0
  5. data/ext/faiss/index.cpp +4 -4
  6. data/ext/faiss/index_binary.cpp +6 -6
  7. data/ext/faiss/product_quantizer.cpp +4 -4
  8. data/lib/faiss/version.rb +1 -1
  9. data/vendor/faiss/faiss/AutoTune.cpp +13 -0
  10. data/vendor/faiss/faiss/IVFlib.cpp +101 -2
  11. data/vendor/faiss/faiss/IVFlib.h +26 -2
  12. data/vendor/faiss/faiss/Index.cpp +36 -3
  13. data/vendor/faiss/faiss/Index.h +43 -6
  14. data/vendor/faiss/faiss/Index2Layer.cpp +6 -2
  15. data/vendor/faiss/faiss/Index2Layer.h +6 -1
  16. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +219 -16
  17. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +63 -5
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +299 -0
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +199 -0
  20. data/vendor/faiss/faiss/IndexBinary.cpp +20 -4
  21. data/vendor/faiss/faiss/IndexBinary.h +18 -3
  22. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +9 -2
  23. data/vendor/faiss/faiss/IndexBinaryFlat.h +4 -2
  24. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -1
  25. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -1
  26. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +5 -1
  27. data/vendor/faiss/faiss/IndexBinaryHNSW.h +2 -1
  28. data/vendor/faiss/faiss/IndexBinaryHash.cpp +17 -4
  29. data/vendor/faiss/faiss/IndexBinaryHash.h +8 -4
  30. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +28 -13
  31. data/vendor/faiss/faiss/IndexBinaryIVF.h +10 -7
  32. data/vendor/faiss/faiss/IndexFastScan.cpp +626 -0
  33. data/vendor/faiss/faiss/IndexFastScan.h +145 -0
  34. data/vendor/faiss/faiss/IndexFlat.cpp +34 -21
  35. data/vendor/faiss/faiss/IndexFlat.h +7 -4
  36. data/vendor/faiss/faiss/IndexFlatCodes.cpp +35 -1
  37. data/vendor/faiss/faiss/IndexFlatCodes.h +12 -0
  38. data/vendor/faiss/faiss/IndexHNSW.cpp +66 -138
  39. data/vendor/faiss/faiss/IndexHNSW.h +4 -2
  40. data/vendor/faiss/faiss/IndexIDMap.cpp +247 -0
  41. data/vendor/faiss/faiss/IndexIDMap.h +107 -0
  42. data/vendor/faiss/faiss/IndexIVF.cpp +121 -33
  43. data/vendor/faiss/faiss/IndexIVF.h +35 -16
  44. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +84 -7
  45. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +63 -1
  46. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +590 -0
  47. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +171 -0
  48. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +1290 -0
  49. data/vendor/faiss/faiss/IndexIVFFastScan.h +213 -0
  50. data/vendor/faiss/faiss/IndexIVFFlat.cpp +37 -17
  51. data/vendor/faiss/faiss/IndexIVFFlat.h +4 -2
  52. data/vendor/faiss/faiss/IndexIVFPQ.cpp +234 -50
  53. data/vendor/faiss/faiss/IndexIVFPQ.h +5 -1
  54. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +23 -852
  55. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +7 -112
  56. data/vendor/faiss/faiss/IndexIVFPQR.cpp +3 -3
  57. data/vendor/faiss/faiss/IndexIVFPQR.h +1 -1
  58. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +3 -1
  59. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +2 -1
  60. data/vendor/faiss/faiss/IndexLSH.cpp +4 -2
  61. data/vendor/faiss/faiss/IndexLSH.h +2 -1
  62. data/vendor/faiss/faiss/IndexLattice.cpp +7 -1
  63. data/vendor/faiss/faiss/IndexLattice.h +3 -1
  64. data/vendor/faiss/faiss/IndexNNDescent.cpp +4 -3
  65. data/vendor/faiss/faiss/IndexNNDescent.h +2 -1
  66. data/vendor/faiss/faiss/IndexNSG.cpp +37 -3
  67. data/vendor/faiss/faiss/IndexNSG.h +25 -1
  68. data/vendor/faiss/faiss/IndexPQ.cpp +106 -69
  69. data/vendor/faiss/faiss/IndexPQ.h +19 -5
  70. data/vendor/faiss/faiss/IndexPQFastScan.cpp +15 -450
  71. data/vendor/faiss/faiss/IndexPQFastScan.h +15 -78
  72. data/vendor/faiss/faiss/IndexPreTransform.cpp +47 -8
  73. data/vendor/faiss/faiss/IndexPreTransform.h +15 -3
  74. data/vendor/faiss/faiss/IndexRefine.cpp +8 -4
  75. data/vendor/faiss/faiss/IndexRefine.h +4 -2
  76. data/vendor/faiss/faiss/IndexReplicas.cpp +4 -2
  77. data/vendor/faiss/faiss/IndexReplicas.h +2 -1
  78. data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +438 -0
  79. data/vendor/faiss/faiss/IndexRowwiseMinMax.h +92 -0
  80. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +26 -15
  81. data/vendor/faiss/faiss/IndexScalarQuantizer.h +6 -7
  82. data/vendor/faiss/faiss/IndexShards.cpp +4 -1
  83. data/vendor/faiss/faiss/IndexShards.h +2 -1
  84. data/vendor/faiss/faiss/MetaIndexes.cpp +5 -178
  85. data/vendor/faiss/faiss/MetaIndexes.h +3 -81
  86. data/vendor/faiss/faiss/VectorTransform.cpp +43 -0
  87. data/vendor/faiss/faiss/VectorTransform.h +22 -4
  88. data/vendor/faiss/faiss/clone_index.cpp +23 -1
  89. data/vendor/faiss/faiss/clone_index.h +3 -0
  90. data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +300 -0
  91. data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +24 -0
  92. data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +195 -0
  93. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2058 -0
  94. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +408 -0
  95. data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2147 -0
  96. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +460 -0
  97. data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +465 -0
  98. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +1618 -0
  99. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +251 -0
  100. data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +1452 -0
  101. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +1 -0
  102. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +0 -4
  103. data/vendor/faiss/faiss/gpu/GpuIndex.h +28 -4
  104. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -1
  105. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +10 -8
  106. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +75 -14
  107. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +19 -32
  108. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +22 -31
  109. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +22 -28
  110. data/vendor/faiss/faiss/gpu/GpuResources.cpp +14 -0
  111. data/vendor/faiss/faiss/gpu/GpuResources.h +16 -3
  112. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +3 -3
  113. data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +32 -0
  114. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +1 -0
  115. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +311 -75
  116. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +10 -0
  117. data/vendor/faiss/faiss/gpu/test/TestUtils.h +3 -0
  118. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +2 -2
  119. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +5 -4
  120. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +116 -47
  121. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +44 -13
  122. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +0 -54
  123. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +0 -76
  124. data/vendor/faiss/faiss/impl/DistanceComputer.h +64 -0
  125. data/vendor/faiss/faiss/impl/HNSW.cpp +123 -27
  126. data/vendor/faiss/faiss/impl/HNSW.h +19 -16
  127. data/vendor/faiss/faiss/impl/IDSelector.cpp +125 -0
  128. data/vendor/faiss/faiss/impl/IDSelector.h +135 -0
  129. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +6 -28
  130. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +6 -1
  131. data/vendor/faiss/faiss/impl/LookupTableScaler.h +77 -0
  132. data/vendor/faiss/faiss/impl/NNDescent.cpp +1 -0
  133. data/vendor/faiss/faiss/impl/NSG.cpp +1 -1
  134. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +383 -0
  135. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +154 -0
  136. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +225 -145
  137. data/vendor/faiss/faiss/impl/ProductQuantizer.h +29 -10
  138. data/vendor/faiss/faiss/impl/Quantizer.h +43 -0
  139. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +192 -36
  140. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +40 -20
  141. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -0
  142. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +97 -173
  143. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +18 -18
  144. data/vendor/faiss/faiss/impl/index_read.cpp +240 -9
  145. data/vendor/faiss/faiss/impl/index_write.cpp +237 -5
  146. data/vendor/faiss/faiss/impl/kmeans1d.cpp +6 -4
  147. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +56 -16
  148. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +25 -8
  149. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +66 -25
  150. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +75 -27
  151. data/vendor/faiss/faiss/index_factory.cpp +196 -7
  152. data/vendor/faiss/faiss/index_io.h +5 -0
  153. data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -0
  154. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +4 -1
  155. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +2 -1
  156. data/vendor/faiss/faiss/python/python_callbacks.cpp +27 -0
  157. data/vendor/faiss/faiss/python/python_callbacks.h +15 -0
  158. data/vendor/faiss/faiss/utils/Heap.h +31 -15
  159. data/vendor/faiss/faiss/utils/distances.cpp +380 -56
  160. data/vendor/faiss/faiss/utils/distances.h +113 -15
  161. data/vendor/faiss/faiss/utils/distances_simd.cpp +726 -6
  162. data/vendor/faiss/faiss/utils/extra_distances.cpp +12 -7
  163. data/vendor/faiss/faiss/utils/extra_distances.h +3 -1
  164. data/vendor/faiss/faiss/utils/fp16-fp16c.h +21 -0
  165. data/vendor/faiss/faiss/utils/fp16-inl.h +101 -0
  166. data/vendor/faiss/faiss/utils/fp16.h +11 -0
  167. data/vendor/faiss/faiss/utils/hamming-inl.h +54 -0
  168. data/vendor/faiss/faiss/utils/hamming.cpp +0 -48
  169. data/vendor/faiss/faiss/utils/ordered_key_value.h +10 -0
  170. data/vendor/faiss/faiss/utils/quantize_lut.cpp +62 -0
  171. data/vendor/faiss/faiss/utils/quantize_lut.h +20 -0
  172. data/vendor/faiss/faiss/utils/random.cpp +53 -0
  173. data/vendor/faiss/faiss/utils/random.h +5 -0
  174. data/vendor/faiss/faiss/utils/simdlib_avx2.h +4 -0
  175. data/vendor/faiss/faiss/utils/simdlib_emulated.h +6 -1
  176. data/vendor/faiss/faiss/utils/simdlib_neon.h +7 -2
  177. metadata +37 -3
@@ -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
  *********************************************************/
@@ -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
 
@@ -198,11 +223,11 @@ FAISS_API extern int distance_compute_blas_database_bs;
198
223
  FAISS_API extern int distance_compute_min_k_reservoir;
199
224
 
200
225
  /** Return the k nearest neighors of each of the nx vectors x among the ny
201
- * vector y, w.r.t to max inner product
226
+ * vector y, w.r.t to max inner product.
202
227
  *
203
228
  * @param x query vectors, size nx * d
204
229
  * @param y database vectors, size ny * d
205
- * @param res result array, which also provides k. Sorted on output
230
+ * @param res result heap structure, which also provides k. Sorted on output
206
231
  */
207
232
  void knn_inner_product(
208
233
  const float* x,
@@ -210,10 +235,35 @@ void knn_inner_product(
210
235
  size_t d,
211
236
  size_t nx,
212
237
  size_t ny,
213
- float_minheap_array_t* res);
238
+ float_minheap_array_t* res,
239
+ const IDSelector* sel = nullptr);
214
240
 
215
- /** Same as knn_inner_product, for the L2 distance
216
- * @param y_norm2 norms for the y vectors (nullptr or size ny)
241
+ /** Return the k nearest neighors of each of the nx vectors x among the ny
242
+ * vector y, for the inner product metric.
243
+ *
244
+ * @param x query vectors, size nx * d
245
+ * @param y database vectors, size ny * d
246
+ * @param distances output distances, size nq * k
247
+ * @param indexes output vector ids, size nq * k
248
+ */
249
+ void knn_inner_product(
250
+ const float* x,
251
+ const float* y,
252
+ size_t d,
253
+ size_t nx,
254
+ size_t ny,
255
+ size_t k,
256
+ float* distances,
257
+ int64_t* indexes,
258
+ const IDSelector* sel = nullptr);
259
+
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
217
267
  */
218
268
  void knn_L2sqr(
219
269
  const float* x,
@@ -222,28 +272,74 @@ void knn_L2sqr(
222
272
  size_t nx,
223
273
  size_t ny,
224
274
  float_maxheap_array_t* res,
225
- const float* y_norm2 = nullptr);
275
+ const float* y_norm2 = nullptr,
276
+ const IDSelector* sel = nullptr);
226
277
 
227
- /* 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
228
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
229
309
  */
230
310
  void knn_inner_products_by_idx(
231
311
  const float* x,
232
312
  const float* y,
233
- const int64_t* ids,
313
+ const int64_t* subset,
234
314
  size_t d,
235
315
  size_t nx,
236
- size_t ny,
237
- 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);
238
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
+ */
239
332
  void knn_L2sqr_by_idx(
240
333
  const float* x,
241
334
  const float* y,
242
- const int64_t* ids,
335
+ const int64_t* subset,
243
336
  size_t d,
244
337
  size_t nx,
245
- size_t ny,
246
- 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);
247
343
 
248
344
  /***************************************************************************
249
345
  * Range search
@@ -267,7 +363,8 @@ void range_search_L2sqr(
267
363
  size_t nx,
268
364
  size_t ny,
269
365
  float radius,
270
- RangeSearchResult* result);
366
+ RangeSearchResult* result,
367
+ const IDSelector* sel = nullptr);
271
368
 
272
369
  /// same as range_search_L2sqr for the inner product similarity
273
370
  void range_search_inner_product(
@@ -277,7 +374,8 @@ void range_search_inner_product(
277
374
  size_t nx,
278
375
  size_t ny,
279
376
  float radius,
280
- RangeSearchResult* result);
377
+ RangeSearchResult* result,
378
+ const IDSelector* sel = nullptr);
281
379
 
282
380
  /***************************************************************************
283
381
  * PQ tables computations