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
@@ -24,22 +24,38 @@ namespace faiss {
24
24
 
25
25
  struct ResidualQuantizer : AdditiveQuantizer {
26
26
  /// initialization
27
- enum train_type_t {
28
- Train_default, ///< regular k-means
29
- Train_progressive_dim, ///< progressive dim clustering
30
- };
31
27
 
32
- // set this bit on train_type if beam is to be trained only on the
33
- // first element of the beam (faster but less accurate)
34
- static const int Train_top_beam = 1024;
28
+ // Was enum but that does not work so well with bitmasks
29
+ using train_type_t = int;
30
+
31
+ /// Binary or of the Train_* flags below
35
32
  train_type_t train_type;
36
33
 
34
+ /// regular k-means (minimal amount of computation)
35
+ static const int Train_default = 0;
36
+
37
+ /// progressive dim clustering (set by default)
38
+ static const int Train_progressive_dim = 1;
39
+
40
+ /// do a few iterations of codebook refinement after first level estimation
41
+ static const int Train_refine_codebook = 2;
42
+
43
+ /// number of iterations for codebook refinement.
44
+ int niter_codebook_refine;
45
+
46
+ /** set this bit on train_type if beam is to be trained only on the
47
+ * first element of the beam (faster but less accurate) */
48
+ static const int Train_top_beam = 1024;
49
+
50
+ /** set this bit to *not* autmatically compute the codebook tables
51
+ * after training */
52
+ static const int Skip_codebook_tables = 2048;
53
+
37
54
  /// beam size used for training and for encoding
38
55
  int max_beam_size;
39
56
 
40
- /// distance matrixes with beam search can get large, so use this
41
- /// to batch computations at encoding time.
42
- size_t max_mem_distances;
57
+ /// use LUT for beam search
58
+ int use_beam_LUT;
43
59
 
44
60
  /// clustering parameters
45
61
  ProgressiveDimClusteringParameters cp;
@@ -47,24 +63,46 @@ struct ResidualQuantizer : AdditiveQuantizer {
47
63
  /// if non-NULL, use this index for assignment
48
64
  ProgressiveDimIndexFactory* assign_index_factory;
49
65
 
50
- ResidualQuantizer(size_t d, const std::vector<size_t>& nbits);
66
+ ResidualQuantizer(
67
+ size_t d,
68
+ const std::vector<size_t>& nbits,
69
+ Search_type_t search_type = ST_decompress);
51
70
 
52
71
  ResidualQuantizer(
53
- size_t d, /* dimensionality of the input vectors */
54
- size_t M, /* number of subquantizers */
55
- size_t nbits); /* number of bit per subvector index */
72
+ size_t d, /* dimensionality of the input vectors */
73
+ size_t M, /* number of subquantizers */
74
+ size_t nbits, /* number of bit per subvector index */
75
+ Search_type_t search_type = ST_decompress);
56
76
 
57
77
  ResidualQuantizer();
58
78
 
59
- // Train the residual quantizer
79
+ /// Train the residual quantizer
60
80
  void train(size_t n, const float* x) override;
61
81
 
82
+ /// Copy the M codebook levels from other, starting from skip_M
83
+ void initialize_from(const ResidualQuantizer& other, int skip_M = 0);
84
+
85
+ /** Encode the vectors and compute codebook that minimizes the quantization
86
+ * error on these codes
87
+ *
88
+ * @param x training vectors, size n * d
89
+ * @param n nb of training vectors, n >= total_codebook_size
90
+ * @return returns quantization error for the new codebook with old
91
+ * codes
92
+ */
93
+ float retrain_AQ_codebook(size_t n, const float* x);
94
+
62
95
  /** Encode a set of vectors
63
96
  *
64
97
  * @param x vectors to encode, size n * d
65
98
  * @param codes output codes, size n * code_size
99
+ * @param centroids centroids to be added to x, size n * d
66
100
  */
67
- void compute_codes(const float* x, uint8_t* codes, size_t n) const override;
101
+ void compute_codes_add_centroids(
102
+ const float* x,
103
+ uint8_t* codes,
104
+ size_t n,
105
+ const float* centroids = nullptr) const override;
68
106
 
69
107
  /** lower-level encode function
70
108
  *
@@ -85,12 +123,32 @@ struct ResidualQuantizer : AdditiveQuantizer {
85
123
  float* new_residuals = nullptr,
86
124
  float* new_distances = nullptr) const;
87
125
 
126
+ void refine_beam_LUT(
127
+ size_t n,
128
+ const float* query_norms,
129
+ const float* query_cp,
130
+ int new_beam_size,
131
+ int32_t* new_codes,
132
+ float* new_distances = nullptr) const;
133
+
88
134
  /** Beam search can consume a lot of memory. This function estimates the
89
135
  * amount of mem used by refine_beam to adjust the batch size
90
136
  *
91
137
  * @param beam_size if != -1, override the beam size
92
138
  */
93
139
  size_t memory_per_point(int beam_size = -1) const;
140
+
141
+ /** Cross products used in codebook tables
142
+ *
143
+ * These are used to keep trak of norms of centroids.
144
+ */
145
+ void compute_codebook_tables();
146
+
147
+ /// dot products of all codebook vectors with each other
148
+ /// size total_codebook_size * total_codebook_size
149
+ std::vector<float> codebook_cross_products;
150
+ /// norms of all vectors
151
+ std::vector<float> cent_norms;
94
152
  };
95
153
 
96
154
  /** Encode a residual by sampling from a centroid table.
@@ -127,4 +185,24 @@ void beam_search_encode_step(
127
185
  float* new_distances,
128
186
  Index* assign_index = nullptr);
129
187
 
188
+ /** Encode a set of vectors using their dot products with the codebooks
189
+ *
190
+ */
191
+ void beam_search_encode_step_tab(
192
+ size_t K,
193
+ size_t n,
194
+ size_t beam_size, // input sizes
195
+ const float* codebook_cross_norms, // size K * ldc
196
+ size_t ldc, // >= K
197
+ const uint64_t* codebook_offsets, // m
198
+ const float* query_cp, // size n * ldqc
199
+ size_t ldqc, // >= K
200
+ const float* cent_norms_i, // size K
201
+ size_t m,
202
+ const int32_t* codes, // n * beam_size * m
203
+ const float* distances, // n * beam_size
204
+ size_t new_beam_size,
205
+ int32_t* new_codes, // n * new_beam_size * (m + 1)
206
+ float* new_distances); // n * new_beam_size
207
+
130
208
  }; // namespace faiss
@@ -413,4 +413,100 @@ struct RangeSearchResultHandler {
413
413
  }
414
414
  };
415
415
 
416
+ /*****************************************************************
417
+ * Single best result handler.
418
+ * Tracks the only best result, thus avoiding storing
419
+ * some temporary data in memory.
420
+ *****************************************************************/
421
+
422
+ template <class C>
423
+ struct SingleBestResultHandler {
424
+ using T = typename C::T;
425
+ using TI = typename C::TI;
426
+
427
+ int nq;
428
+ // contains exactly nq elements
429
+ T* dis_tab;
430
+ // contains exactly nq elements
431
+ TI* ids_tab;
432
+
433
+ SingleBestResultHandler(size_t nq, T* dis_tab, TI* ids_tab)
434
+ : nq(nq), dis_tab(dis_tab), ids_tab(ids_tab) {}
435
+
436
+ struct SingleResultHandler {
437
+ SingleBestResultHandler& hr;
438
+
439
+ T min_dis;
440
+ TI min_idx;
441
+ size_t current_idx = 0;
442
+
443
+ SingleResultHandler(SingleBestResultHandler& hr) : hr(hr) {}
444
+
445
+ /// begin results for query # i
446
+ void begin(const size_t current_idx) {
447
+ this->current_idx = current_idx;
448
+ min_dis = HUGE_VALF;
449
+ min_idx = 0;
450
+ }
451
+
452
+ /// add one result for query i
453
+ void add_result(T dis, TI idx) {
454
+ if (C::cmp(min_dis, dis)) {
455
+ min_dis = dis;
456
+ min_idx = idx;
457
+ }
458
+ }
459
+
460
+ /// series of results for query i is done
461
+ void end() {
462
+ hr.dis_tab[current_idx] = min_dis;
463
+ hr.ids_tab[current_idx] = min_idx;
464
+ }
465
+ };
466
+
467
+ size_t i0, i1;
468
+
469
+ /// begin
470
+ void begin_multiple(size_t i0, size_t i1) {
471
+ this->i0 = i0;
472
+ this->i1 = i1;
473
+
474
+ for (size_t i = i0; i < i1; i++) {
475
+ this->dis_tab[i] = HUGE_VALF;
476
+ }
477
+ }
478
+
479
+ /// add results for query i0..i1 and j0..j1
480
+ void add_results(size_t j0, size_t j1, const T* dis_tab) {
481
+ for (int64_t i = i0; i < i1; i++) {
482
+ const T* dis_tab_i = dis_tab + (j1 - j0) * (i - i0) - j0;
483
+
484
+ auto& min_distance = this->dis_tab[i];
485
+ auto& min_index = this->ids_tab[i];
486
+
487
+ for (size_t j = j0; j < j1; j++) {
488
+ const T distance = dis_tab_i[j];
489
+
490
+ if (C::cmp(min_distance, distance)) {
491
+ min_distance = distance;
492
+ min_index = j;
493
+ }
494
+ }
495
+ }
496
+ }
497
+
498
+ void add_result(const size_t i, const T dis, const TI idx) {
499
+ auto& min_distance = this->dis_tab[i];
500
+ auto& min_index = this->ids_tab[i];
501
+
502
+ if (C::cmp(min_distance, dis)) {
503
+ min_distance = dis;
504
+ min_index = idx;
505
+ }
506
+ }
507
+
508
+ /// series of results for queries i0..i1 is done
509
+ void end_multiple() {}
510
+ };
511
+
416
512
  } // namespace faiss