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
@@ -15,10 +15,17 @@
15
15
  #include <vector>
16
16
 
17
17
  #include <faiss/impl/AdditiveQuantizer.h>
18
+ #include <faiss/impl/platform_macros.h>
18
19
  #include <faiss/utils/utils.h>
19
20
 
20
21
  namespace faiss {
21
22
 
23
+ namespace lsq {
24
+
25
+ struct IcmEncoderFactory;
26
+
27
+ } // namespace lsq
28
+
22
29
  /** Implementation of LSQ/LSQ++ described in the following two papers:
23
30
  *
24
31
  * Revisiting additive quantization
@@ -35,7 +42,6 @@ namespace faiss {
35
42
  * The trained codes are stored in `codebooks` which is called
36
43
  * `centroids` in PQ and RQ.
37
44
  */
38
-
39
45
  struct LocalSearchQuantizer : AdditiveQuantizer {
40
46
  size_t K; ///< number of codes per codebook
41
47
 
@@ -53,10 +59,21 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
53
59
  int random_seed; ///< seed for random generator
54
60
  size_t nperts; ///< number of perturbation in each code
55
61
 
62
+ ///< if non-NULL, use this encoder to encode
63
+ lsq::IcmEncoderFactory* icm_encoder_factory;
64
+
65
+ bool update_codebooks_with_double = true;
66
+
56
67
  LocalSearchQuantizer(
57
- size_t d, /* dimensionality of the input vectors */
58
- size_t M, /* number of subquantizers */
59
- size_t nbits); /* number of bit per subvector index */
68
+ size_t d, /* dimensionality of the input vectors */
69
+ size_t M, /* number of subquantizers */
70
+ size_t nbits, /* number of bit per subvector index */
71
+ Search_type_t search_type =
72
+ ST_decompress); /* determines the storage type */
73
+
74
+ LocalSearchQuantizer();
75
+
76
+ ~LocalSearchQuantizer() override;
60
77
 
61
78
  // Train the local search quantizer
62
79
  void train(size_t n, const float* x) override;
@@ -65,43 +82,59 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
65
82
  *
66
83
  * @param x vectors to encode, size n * d
67
84
  * @param codes output codes, size n * code_size
85
+ * @param n number of vectors
86
+ * @param centroids centroids to be added to x, size n * d
68
87
  */
69
- void compute_codes(const float* x, uint8_t* codes, size_t n) const override;
88
+ void compute_codes_add_centroids(
89
+ const float* x,
90
+ uint8_t* codes,
91
+ size_t n,
92
+ const float* centroids = nullptr) const override;
70
93
 
71
94
  /** Update codebooks given encodings
72
95
  *
73
96
  * @param x training vectors, size n * d
74
97
  * @param codes encoded training vectors, size n * M
98
+ * @param n number of vectors
75
99
  */
76
100
  void update_codebooks(const float* x, const int32_t* codes, size_t n);
77
101
 
78
102
  /** Encode vectors given codebooks using iterative conditional mode (icm).
79
103
  *
80
- * @param x vectors to encode, size n * d
81
- * @param codes output codes, size n * M
104
+ * @param codes output codes, size n * M
105
+ * @param x vectors to encode, size n * d
106
+ * @param n number of vectors
82
107
  * @param ils_iters number of iterations of iterative local search
83
108
  */
84
109
  void icm_encode(
85
- const float* x,
86
110
  int32_t* codes,
111
+ const float* x,
87
112
  size_t n,
88
113
  size_t ils_iters,
89
114
  std::mt19937& gen) const;
90
115
 
91
- void icm_encode_partial(
92
- size_t index,
93
- const float* x,
116
+ void icm_encode_impl(
94
117
  int32_t* codes,
118
+ const float* x,
119
+ const float* unaries,
120
+ std::mt19937& gen,
95
121
  size_t n,
96
- const float* binaries,
97
122
  size_t ils_iters,
98
- std::mt19937& gen) const;
123
+ bool verbose) const;
99
124
 
100
125
  void icm_encode_step(
126
+ int32_t* codes,
101
127
  const float* unaries,
102
128
  const float* binaries,
103
- int32_t* codes,
104
- size_t n) const;
129
+ size_t n,
130
+ size_t n_iters) const;
131
+
132
+ /** Add some perturbation to codes
133
+ *
134
+ * @param codes codes to be perturbed, size n * M
135
+ * @param n number of vectors
136
+ */
137
+ void perturb_codes(int32_t* codes, size_t n, std::mt19937& gen) const;
105
138
 
106
139
  /** Add some perturbation to codebooks
107
140
  *
@@ -113,12 +146,6 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
113
146
  const std::vector<float>& stddev,
114
147
  std::mt19937& gen);
115
148
 
116
- /** Add some perturbation to codes
117
- *
118
- * @param codes codes to be perturbed, size n * M
119
- */
120
- void perturb_codes(int32_t* codes, size_t n, std::mt19937& gen) const;
121
-
122
149
  /** Compute binary terms
123
150
  *
124
151
  * @param binaries binary terms, size M * M * K * K
@@ -127,6 +154,7 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
127
154
 
128
155
  /** Compute unary terms
129
156
  *
157
+ * @param n number of vectors
130
158
  * @param x vectors to encode, size n * d
131
159
  * @param unaries unary terms, size n * M * K
132
160
  */
@@ -134,8 +162,9 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
134
162
 
135
163
  /** Helper function to compute reconstruction error
136
164
  *
137
- * @param x vectors to encode, size n * d
138
165
  * @param codes encoded codes, size n * M
166
+ * @param x vectors to encode, size n * d
167
+ * @param n number of vectors
139
168
  * @param objs if it is not null, store reconstruction
140
169
  error of each vector into it, size n
141
170
  */
@@ -146,13 +175,50 @@ struct LocalSearchQuantizer : AdditiveQuantizer {
146
175
  float* objs = nullptr) const;
147
176
  };
148
177
 
178
+ namespace lsq {
179
+
180
+ struct IcmEncoder {
181
+ std::vector<float> binaries;
182
+
183
+ bool verbose;
184
+
185
+ const LocalSearchQuantizer* lsq;
186
+
187
+ explicit IcmEncoder(const LocalSearchQuantizer* lsq);
188
+
189
+ virtual ~IcmEncoder() {}
190
+
191
+ ///< compute binary terms
192
+ virtual void set_binary_term();
193
+
194
+ /** Encode vectors given codebooks
195
+ *
196
+ * @param codes output codes, size n * M
197
+ * @param x vectors to encode, size n * d
198
+ * @param gen random generator
199
+ * @param n number of vectors
200
+ * @param ils_iters number of iterations of iterative local search
201
+ */
202
+ virtual void encode(
203
+ int32_t* codes,
204
+ const float* x,
205
+ std::mt19937& gen,
206
+ size_t n,
207
+ size_t ils_iters) const;
208
+ };
209
+
210
+ struct IcmEncoderFactory {
211
+ virtual IcmEncoder* get(const LocalSearchQuantizer* lsq) {
212
+ return new IcmEncoder(lsq);
213
+ }
214
+ virtual ~IcmEncoderFactory() {}
215
+ };
216
+
149
217
  /** A helper struct to count consuming time during training.
150
218
  * It is NOT thread-safe.
151
219
  */
152
220
  struct LSQTimer {
153
- std::unordered_map<std::string, double> duration;
154
- std::unordered_map<std::string, double> t0;
155
- std::unordered_map<std::string, bool> started;
221
+ std::unordered_map<std::string, double> t;
156
222
 
157
223
  LSQTimer() {
158
224
  reset();
@@ -160,13 +226,24 @@ struct LSQTimer {
160
226
 
161
227
  double get(const std::string& name);
162
228
 
163
- void start(const std::string& name);
164
-
165
- void end(const std::string& name);
229
+ void add(const std::string& name, double delta);
166
230
 
167
231
  void reset();
168
232
  };
169
233
 
170
- FAISS_API extern LSQTimer lsq_timer; ///< timer to count consuming time
234
+ struct LSQTimerScope {
235
+ double t0;
236
+ LSQTimer* timer;
237
+ std::string name;
238
+ bool finished;
239
+
240
+ LSQTimerScope(LSQTimer* timer, std::string name);
241
+
242
+ void finish();
243
+
244
+ ~LSQTimerScope();
245
+ };
246
+
247
+ } // namespace lsq
171
248
 
172
249
  } // namespace faiss
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <cstdint>
11
+ #include <cstdlib>
12
+
13
+ #include <faiss/utils/simdlib.h>
14
+
15
+ /*******************************************
16
+ * The Scaler objects are used to specialize the handling of the
17
+ * norm components in Additive quantizer fast-scan.
18
+ ********************************************/
19
+
20
+ namespace faiss {
21
+
22
+ /// no-op handler
23
+ struct DummyScaler {
24
+ static constexpr int nscale = 0;
25
+
26
+ inline simd32uint8 lookup(const simd32uint8&, const simd32uint8&) const {
27
+ FAISS_THROW_MSG("DummyScaler::lookup should not be called.");
28
+ return simd32uint8(0);
29
+ }
30
+
31
+ inline simd16uint16 scale_lo(const simd32uint8&) const {
32
+ FAISS_THROW_MSG("DummyScaler::scale_lo should not be called.");
33
+ return simd16uint16(0);
34
+ }
35
+
36
+ inline simd16uint16 scale_hi(const simd32uint8&) const {
37
+ FAISS_THROW_MSG("DummyScaler::scale_hi should not be called.");
38
+ return simd16uint16(0);
39
+ }
40
+
41
+ template <class dist_t>
42
+ inline dist_t scale_one(const dist_t&) const {
43
+ FAISS_THROW_MSG("DummyScaler::scale_one should not be called.");
44
+ return 0;
45
+ }
46
+ };
47
+
48
+ /// consumes 2x4 bits to encode a norm as a scalar additive quantizer
49
+ /// the norm is scaled because its range if larger than other components
50
+ struct NormTableScaler {
51
+ static constexpr int nscale = 2;
52
+ int scale_int;
53
+ simd16uint16 scale_simd;
54
+
55
+ explicit NormTableScaler(int scale) : scale_int(scale), scale_simd(scale) {}
56
+
57
+ inline simd32uint8 lookup(const simd32uint8& lut, const simd32uint8& c)
58
+ const {
59
+ return lut.lookup_2_lanes(c);
60
+ }
61
+
62
+ inline simd16uint16 scale_lo(const simd32uint8& res) const {
63
+ return simd16uint16(res) * scale_simd;
64
+ }
65
+
66
+ inline simd16uint16 scale_hi(const simd32uint8& res) const {
67
+ return (simd16uint16(res) >> 8) * scale_simd;
68
+ }
69
+
70
+ // for non-SIMD implem 2, 3, 4
71
+ template <class dist_t>
72
+ inline dist_t scale_one(const dist_t& x) const {
73
+ return x * scale_int;
74
+ }
75
+ };
76
+
77
+ } // namespace faiss
@@ -13,6 +13,7 @@
13
13
  #include <string>
14
14
 
15
15
  #include <faiss/impl/AuxIndexStructures.h>
16
+ #include <faiss/impl/DistanceComputer.h>
16
17
 
17
18
  namespace faiss {
18
19
 
@@ -14,7 +14,7 @@
14
14
  #include <mutex>
15
15
  #include <stack>
16
16
 
17
- #include <faiss/impl/AuxIndexStructures.h>
17
+ #include <faiss/impl/DistanceComputer.h>
18
18
 
19
19
  namespace faiss {
20
20
 
@@ -161,9 +161,6 @@ void NSG::search(
161
161
  search_on_graph<false>(
162
162
  *final_graph, dis, vt, enterpoint, pool_size, retset, tmp);
163
163
 
164
- std::partial_sort(
165
- retset.begin(), retset.begin() + k, retset.begin() + pool_size);
166
-
167
164
  for (size_t i = 0; i < k; i++) {
168
165
  I[i] = retset[i].id;
169
166
  D[i] = retset[i].distance;
@@ -105,7 +105,7 @@ struct NSG {
105
105
 
106
106
  int ntotal; ///< nb of nodes
107
107
 
108
- /// construction-time parameters
108
+ // construction-time parameters
109
109
  int R; ///< nb of neighbors per node
110
110
  int L; ///< length of the search path at construction time
111
111
  int C; ///< candidate pool size at construction time