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
@@ -8,6 +8,7 @@
8
8
  #include <faiss/impl/pq4_fast_scan.h>
9
9
 
10
10
  #include <faiss/impl/FaissAssert.h>
11
+ #include <faiss/impl/LookupTableScaler.h>
11
12
  #include <faiss/impl/simd_result_handlers.h>
12
13
  #include <faiss/utils/simdlib.h>
13
14
 
@@ -27,15 +28,17 @@ namespace {
27
28
  * writes results in a ResultHandler
28
29
  */
29
30
 
30
- template <int NQ, class ResultHandler>
31
+ template <int NQ, class ResultHandler, class Scaler>
31
32
  void kernel_accumulate_block(
32
33
  int nsq,
33
34
  const uint8_t* codes,
34
35
  const uint8_t* LUT,
35
- ResultHandler& res) {
36
+ ResultHandler& res,
37
+ const Scaler& scaler) {
36
38
  // dummy alloc to keep the windows compiler happy
37
39
  constexpr int NQA = NQ > 0 ? NQ : 1;
38
40
  // distance accumulators
41
+ // layout: accu[q][b]: distance accumulator for vectors 8*b..8*b+7
39
42
  simd16uint16 accu[NQA][4];
40
43
 
41
44
  for (int q = 0; q < NQ; q++) {
@@ -45,7 +48,7 @@ void kernel_accumulate_block(
45
48
  }
46
49
 
47
50
  // _mm_prefetch(codes + 768, 0);
48
- for (int sq = 0; sq < nsq; sq += 2) {
51
+ for (int sq = 0; sq < nsq - scaler.nscale; sq += 2) {
49
52
  // prefetch
50
53
  simd32uint8 c(codes);
51
54
  codes += 32;
@@ -71,6 +74,31 @@ void kernel_accumulate_block(
71
74
  }
72
75
  }
73
76
 
77
+ for (int sq = 0; sq < scaler.nscale; sq += 2) {
78
+ // prefetch
79
+ simd32uint8 c(codes);
80
+ codes += 32;
81
+
82
+ simd32uint8 mask(0xf);
83
+ // shift op does not exist for int8...
84
+ simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
85
+ simd32uint8 clo = c & mask;
86
+
87
+ for (int q = 0; q < NQ; q++) {
88
+ // load LUTs for 2 quantizers
89
+ simd32uint8 lut(LUT);
90
+ LUT += 32;
91
+
92
+ simd32uint8 res0 = scaler.lookup(lut, clo);
93
+ accu[q][0] += scaler.scale_lo(res0); // handle vectors 0..7
94
+ accu[q][1] += scaler.scale_hi(res0); // handle vectors 8..15
95
+
96
+ simd32uint8 res1 = scaler.lookup(lut, chi);
97
+ accu[q][2] += scaler.scale_lo(res1); // handle vectors 16..23
98
+ accu[q][3] += scaler.scale_hi(res1); // handle vectors 24..31
99
+ }
100
+ }
101
+
74
102
  for (int q = 0; q < NQ; q++) {
75
103
  accu[q][0] -= accu[q][1] << 8;
76
104
  simd16uint16 dis0 = combine2x2(accu[q][0], accu[q][1]);
@@ -81,13 +109,14 @@ void kernel_accumulate_block(
81
109
  }
82
110
 
83
111
  // handle at most 4 blocks of queries
84
- template <int QBS, class ResultHandler>
112
+ template <int QBS, class ResultHandler, class Scaler>
85
113
  void accumulate_q_4step(
86
114
  size_t ntotal2,
87
115
  int nsq,
88
116
  const uint8_t* codes,
89
117
  const uint8_t* LUT0,
90
- ResultHandler& res) {
118
+ ResultHandler& res,
119
+ const Scaler& scaler) {
91
120
  constexpr int Q1 = QBS & 15;
92
121
  constexpr int Q2 = (QBS >> 4) & 15;
93
122
  constexpr int Q3 = (QBS >> 8) & 15;
@@ -97,21 +126,21 @@ void accumulate_q_4step(
97
126
  for (int64_t j0 = 0; j0 < ntotal2; j0 += 32) {
98
127
  FixedStorageHandler<SQ, 2> res2;
99
128
  const uint8_t* LUT = LUT0;
100
- kernel_accumulate_block<Q1>(nsq, codes, LUT, res2);
129
+ kernel_accumulate_block<Q1>(nsq, codes, LUT, res2, scaler);
101
130
  LUT += Q1 * nsq * 16;
102
131
  if (Q2 > 0) {
103
132
  res2.set_block_origin(Q1, 0);
104
- kernel_accumulate_block<Q2>(nsq, codes, LUT, res2);
133
+ kernel_accumulate_block<Q2>(nsq, codes, LUT, res2, scaler);
105
134
  LUT += Q2 * nsq * 16;
106
135
  }
107
136
  if (Q3 > 0) {
108
137
  res2.set_block_origin(Q1 + Q2, 0);
109
- kernel_accumulate_block<Q3>(nsq, codes, LUT, res2);
138
+ kernel_accumulate_block<Q3>(nsq, codes, LUT, res2, scaler);
110
139
  LUT += Q3 * nsq * 16;
111
140
  }
112
141
  if (Q4 > 0) {
113
142
  res2.set_block_origin(Q1 + Q2 + Q3, 0);
114
- kernel_accumulate_block<Q4>(nsq, codes, LUT, res2);
143
+ kernel_accumulate_block<Q4>(nsq, codes, LUT, res2, scaler);
115
144
  }
116
145
  res.set_block_origin(0, j0);
117
146
  res2.to_other_handler(res);
@@ -119,29 +148,31 @@ void accumulate_q_4step(
119
148
  }
120
149
  }
121
150
 
122
- template <int NQ, class ResultHandler>
151
+ template <int NQ, class ResultHandler, class Scaler>
123
152
  void kernel_accumulate_block_loop(
124
153
  size_t ntotal2,
125
154
  int nsq,
126
155
  const uint8_t* codes,
127
156
  const uint8_t* LUT,
128
- ResultHandler& res) {
157
+ ResultHandler& res,
158
+ const Scaler& scaler) {
129
159
  for (int64_t j0 = 0; j0 < ntotal2; j0 += 32) {
130
160
  res.set_block_origin(0, j0);
131
161
  kernel_accumulate_block<NQ, ResultHandler>(
132
- nsq, codes + j0 * nsq / 2, LUT, res);
162
+ nsq, codes + j0 * nsq / 2, LUT, res, scaler);
133
163
  }
134
164
  }
135
165
 
136
166
  // non-template version of accumulate kernel -- dispatches dynamically
137
- template <class ResultHandler>
167
+ template <class ResultHandler, class Scaler>
138
168
  void accumulate(
139
169
  int nq,
140
170
  size_t ntotal2,
141
171
  int nsq,
142
172
  const uint8_t* codes,
143
173
  const uint8_t* LUT,
144
- ResultHandler& res) {
174
+ ResultHandler& res,
175
+ const Scaler& scaler) {
145
176
  assert(nsq % 2 == 0);
146
177
  assert(is_aligned_pointer(codes));
147
178
  assert(is_aligned_pointer(LUT));
@@ -149,7 +180,7 @@ void accumulate(
149
180
  #define DISPATCH(NQ) \
150
181
  case NQ: \
151
182
  kernel_accumulate_block_loop<NQ, ResultHandler>( \
152
- ntotal2, nsq, codes, LUT, res); \
183
+ ntotal2, nsq, codes, LUT, res, scaler); \
153
184
  return
154
185
 
155
186
  switch (nq) {
@@ -165,23 +196,24 @@ void accumulate(
165
196
 
166
197
  } // namespace
167
198
 
168
- template <class ResultHandler>
199
+ template <class ResultHandler, class Scaler>
169
200
  void pq4_accumulate_loop_qbs(
170
201
  int qbs,
171
202
  size_t ntotal2,
172
203
  int nsq,
173
204
  const uint8_t* codes,
174
205
  const uint8_t* LUT0,
175
- ResultHandler& res) {
206
+ ResultHandler& res,
207
+ const Scaler& scaler) {
176
208
  assert(nsq % 2 == 0);
177
209
  assert(is_aligned_pointer(codes));
178
210
  assert(is_aligned_pointer(LUT0));
179
211
 
180
212
  // try out optimized versions
181
213
  switch (qbs) {
182
- #define DISPATCH(QBS) \
183
- case QBS: \
184
- accumulate_q_4step<QBS>(ntotal2, nsq, codes, LUT0, res); \
214
+ #define DISPATCH(QBS) \
215
+ case QBS: \
216
+ accumulate_q_4step<QBS>(ntotal2, nsq, codes, LUT0, res, scaler); \
185
217
  return;
186
218
  DISPATCH(0x3333); // 12
187
219
  DISPATCH(0x2333); // 11
@@ -219,9 +251,10 @@ void pq4_accumulate_loop_qbs(
219
251
  int nq = qi & 15;
220
252
  qi >>= 4;
221
253
  res.set_block_origin(i0, j0);
222
- #define DISPATCH(NQ) \
223
- case NQ: \
224
- kernel_accumulate_block<NQ, ResultHandler>(nsq, codes, LUT, res); \
254
+ #define DISPATCH(NQ) \
255
+ case NQ: \
256
+ kernel_accumulate_block<NQ, ResultHandler>( \
257
+ nsq, codes, LUT, res, scaler); \
225
258
  break
226
259
  switch (nq) {
227
260
  DISPATCH(1);
@@ -241,9 +274,23 @@ void pq4_accumulate_loop_qbs(
241
274
 
242
275
  // explicit template instantiations
243
276
 
244
- #define INSTANTIATE_ACCUMULATE_Q(RH) \
245
- template void pq4_accumulate_loop_qbs<RH>( \
246
- int, size_t, int, const uint8_t*, const uint8_t*, RH&);
277
+ #define INSTANTIATE_ACCUMULATE_Q(RH) \
278
+ template void pq4_accumulate_loop_qbs<RH, DummyScaler>( \
279
+ int, \
280
+ size_t, \
281
+ int, \
282
+ const uint8_t*, \
283
+ const uint8_t*, \
284
+ RH&, \
285
+ const DummyScaler&); \
286
+ template void pq4_accumulate_loop_qbs<RH, NormTableScaler>( \
287
+ int, \
288
+ size_t, \
289
+ int, \
290
+ const uint8_t*, \
291
+ const uint8_t*, \
292
+ RH&, \
293
+ const NormTableScaler&);
247
294
 
248
295
  using Csi = CMax<uint16_t, int>;
249
296
  INSTANTIATE_ACCUMULATE_Q(SingleResultHandler<Csi>)
@@ -293,7 +340,8 @@ void accumulate_to_mem(
293
340
  uint16_t* accu) {
294
341
  FAISS_THROW_IF_NOT(ntotal2 % 32 == 0);
295
342
  StoreResultHandler handler(accu, ntotal2);
296
- accumulate(nq, ntotal2, nsq, codes, LUT, handler);
343
+ DummyScaler scaler;
344
+ accumulate(nq, ntotal2, nsq, codes, LUT, handler, scaler);
297
345
  }
298
346
 
299
347
  int pq4_preferred_qbs(int n) {