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
@@ -0,0 +1,465 @@
1
+ #pragma once
2
+
3
+ #include <cstddef>
4
+ #include <cstdint>
5
+
6
+ #include <faiss/utils/fp16.h>
7
+
8
+ namespace faiss {
9
+ namespace cppcontrib {
10
+
11
+ template <typename SubIndexT>
12
+ struct IndexMinMaxFP16Decoder {
13
+ static constexpr intptr_t dim = SubIndexT::dim;
14
+
15
+ // Process 1 sample.
16
+ // Performs outputStore = scaler * decoded(code) + minv
17
+ static void store(
18
+ const float* const __restrict pqCoarseCentroids,
19
+ const float* const __restrict pqFineCentroids,
20
+ const uint8_t* const __restrict code,
21
+ float* const __restrict outputStore) {
22
+ const uint16_t* const __restrict codeFP16 =
23
+ reinterpret_cast<const uint16_t*>(code);
24
+ const float scaler = faiss::decode_fp16(codeFP16[0]);
25
+ const float minv = faiss::decode_fp16(codeFP16[1]);
26
+
27
+ SubIndexT::store(
28
+ pqCoarseCentroids,
29
+ pqFineCentroids,
30
+ code + 2 * sizeof(uint16_t),
31
+ outputStore);
32
+ for (intptr_t i = 0; i < SubIndexT::dim; i++) {
33
+ outputStore[i] = outputStore[i] * scaler + minv;
34
+ }
35
+ }
36
+
37
+ // Process 1 sample.
38
+ // Performs outputStore = scaler * decoded(code) + minv
39
+ static void store(
40
+ const float* const __restrict pqFineCentroids,
41
+ const uint8_t* const __restrict code,
42
+ float* const __restrict outputStore) {
43
+ const uint16_t* const __restrict codeFP16 =
44
+ reinterpret_cast<const uint16_t*>(code);
45
+ const float scaler = faiss::decode_fp16(codeFP16[0]);
46
+ const float minv = faiss::decode_fp16(codeFP16[1]);
47
+
48
+ SubIndexT::store(
49
+ pqFineCentroids, code + 2 * sizeof(uint16_t), outputStore);
50
+ for (intptr_t i = 0; i < SubIndexT::dim; i++) {
51
+ outputStore[i] = outputStore[i] * scaler + minv;
52
+ }
53
+ }
54
+
55
+ // Process 1 sample.
56
+ // Performs
57
+ // * outputAccum += weight * scaler * decoded(code)
58
+ // * minvAccum += weight * minv
59
+ static void accum(
60
+ const float* const __restrict pqCoarseCentroids,
61
+ const float* const __restrict pqFineCentroids,
62
+ const uint8_t* const __restrict code,
63
+ const float weight,
64
+ float* const __restrict outputAccum,
65
+ float& minvAccum) {
66
+ const uint16_t* const __restrict codeFP16 =
67
+ reinterpret_cast<const uint16_t*>(code);
68
+ const float scaler = faiss::decode_fp16(codeFP16[0]) * weight;
69
+ const float minv = faiss::decode_fp16(codeFP16[1]) * weight;
70
+
71
+ SubIndexT::accum(
72
+ pqCoarseCentroids,
73
+ pqFineCentroids,
74
+ code + 2 * sizeof(uint16_t),
75
+ scaler,
76
+ outputAccum);
77
+
78
+ minvAccum += minv;
79
+ }
80
+
81
+ // Process 1 sample.
82
+ // Performs
83
+ // * outputAccum += weight * scaler * decoded(code)
84
+ // * minvAccum += weight * minv
85
+ static void accum(
86
+ const float* const __restrict pqFineCentroids,
87
+ const uint8_t* const __restrict code,
88
+ const float weight,
89
+ float* const __restrict outputAccum,
90
+ float& minvAccum) {
91
+ const uint16_t* const __restrict codeFP16 =
92
+ reinterpret_cast<const uint16_t*>(code);
93
+ const float scaler = faiss::decode_fp16(codeFP16[0]) * weight;
94
+ const float minv = faiss::decode_fp16(codeFP16[1]) * weight;
95
+
96
+ SubIndexT::accum(
97
+ pqFineCentroids,
98
+ code + 2 * sizeof(uint16_t),
99
+ scaler,
100
+ outputAccum);
101
+
102
+ minvAccum += minv;
103
+ }
104
+
105
+ // Process 2 samples.
106
+ // Each code uses its own coarse pq centroids table and fine pq centroids
107
+ // table.
108
+ //
109
+ // Performs
110
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
111
+ // + weight1 * scaler1 * decoded(code1)
112
+ // * minvAccum += weight0 * minv0 + weight1 * minv1
113
+ static void accum(
114
+ const float* const __restrict pqCoarseCentroids0,
115
+ const float* const __restrict pqFineCentroids0,
116
+ const uint8_t* const __restrict code0,
117
+ const float weight0,
118
+ const float* const __restrict pqCoarseCentroids1,
119
+ const float* const __restrict pqFineCentroids1,
120
+ const uint8_t* const __restrict code1,
121
+ const float weight1,
122
+ float* const __restrict outputAccum,
123
+ float& minvAccum) {
124
+ const uint16_t* const __restrict code0FP16 =
125
+ reinterpret_cast<const uint16_t*>(code0);
126
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
127
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
128
+
129
+ const uint16_t* const __restrict code1FP16 =
130
+ reinterpret_cast<const uint16_t*>(code1);
131
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
132
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
133
+
134
+ SubIndexT::accum(
135
+ pqCoarseCentroids0,
136
+ pqFineCentroids0,
137
+ code0 + 2 * sizeof(uint16_t),
138
+ scaler0,
139
+ pqCoarseCentroids1,
140
+ pqFineCentroids1,
141
+ code1 + 2 * sizeof(uint16_t),
142
+ scaler1,
143
+ outputAccum);
144
+
145
+ minvAccum += minv0 + minv1;
146
+ }
147
+
148
+ // Process 2 samples.
149
+ // Coarse pq centroids table and fine pq centroids table are shared among
150
+ // codes.
151
+ //
152
+ // Performs
153
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
154
+ // + weight1 * scaler1 * decoded(code1)
155
+ // * minvAccum += weight0 * minv0 + weight1 * minv1
156
+ static void accum(
157
+ const float* const __restrict pqCoarseCentroids,
158
+ const float* const __restrict pqFineCentroids,
159
+ const uint8_t* const __restrict code0,
160
+ const float weight0,
161
+ const uint8_t* const __restrict code1,
162
+ const float weight1,
163
+ float* const __restrict outputAccum,
164
+ float& minvAccum) {
165
+ const uint16_t* const __restrict code0FP16 =
166
+ reinterpret_cast<const uint16_t*>(code0);
167
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
168
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
169
+
170
+ const uint16_t* const __restrict code1FP16 =
171
+ reinterpret_cast<const uint16_t*>(code1);
172
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
173
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
174
+
175
+ SubIndexT::accum(
176
+ pqCoarseCentroids,
177
+ pqFineCentroids,
178
+ code0 + 2 * sizeof(uint16_t),
179
+ scaler0,
180
+ code1 + 2 * sizeof(uint16_t),
181
+ scaler1,
182
+ outputAccum);
183
+
184
+ minvAccum += minv0 + minv1;
185
+ }
186
+
187
+ // Process 2 samples.
188
+ // Each code uses its own fine pq centroids table.
189
+ //
190
+ // Performs
191
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
192
+ // + weight1 * scaler1 * decoded(code1)
193
+ // * minvAccum += weight0 * minv0 + weight1 * minv1
194
+ static void accum(
195
+ const float* const __restrict pqFineCentroids0,
196
+ const uint8_t* const __restrict code0,
197
+ const float weight0,
198
+ const float* const __restrict pqFineCentroids1,
199
+ const uint8_t* const __restrict code1,
200
+ const float weight1,
201
+ float* const __restrict outputAccum,
202
+ float& minvAccum) {
203
+ const uint16_t* const __restrict code0FP16 =
204
+ reinterpret_cast<const uint16_t*>(code0);
205
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
206
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
207
+
208
+ const uint16_t* const __restrict code1FP16 =
209
+ reinterpret_cast<const uint16_t*>(code1);
210
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
211
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
212
+
213
+ SubIndexT::accum(
214
+ pqFineCentroids0,
215
+ code0 + 2 * sizeof(uint16_t),
216
+ scaler0,
217
+ pqFineCentroids1,
218
+ code1 + 2 * sizeof(uint16_t),
219
+ scaler1,
220
+ outputAccum);
221
+
222
+ minvAccum += minv0 + minv1;
223
+ }
224
+
225
+ // Process 2 samples.
226
+ // Fine pq centroids table is shared among codes.
227
+ //
228
+ // Performs
229
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
230
+ // + weight1 * scaler1 * decoded(code1)
231
+ // * minvAccum += weight0 * minv0 + weight1 * minv1
232
+ static void accum(
233
+ const float* const __restrict pqFineCentroids,
234
+ const uint8_t* const __restrict code0,
235
+ const float weight0,
236
+ const uint8_t* const __restrict code1,
237
+ const float weight1,
238
+ float* const __restrict outputAccum,
239
+ float& minvAccum) {
240
+ const uint16_t* const __restrict code0FP16 =
241
+ reinterpret_cast<const uint16_t*>(code0);
242
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
243
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
244
+
245
+ const uint16_t* const __restrict code1FP16 =
246
+ reinterpret_cast<const uint16_t*>(code1);
247
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
248
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
249
+
250
+ SubIndexT::accum(
251
+ pqFineCentroids,
252
+ code0 + 2 * sizeof(uint16_t),
253
+ scaler0,
254
+ code1 + 2 * sizeof(uint16_t),
255
+ scaler1,
256
+ outputAccum);
257
+
258
+ minvAccum += minv0 + minv1;
259
+ }
260
+
261
+ // Process 3 samples.
262
+ // Each code uses its own coarse pq centroids table and fine pq centroids
263
+ // table.
264
+ //
265
+ // Performs
266
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
267
+ // + weight1 * scaler1 * decoded(code1)
268
+ // + weight2 * scaler2 * decoded(code2)
269
+ // * minvAccum += weight0 * minv0 + weight1 * minv1 + weight2 * minv2
270
+ static void accum(
271
+ const float* const __restrict pqCoarseCentroids0,
272
+ const float* const __restrict pqFineCentroids0,
273
+ const uint8_t* const __restrict code0,
274
+ const float weight0,
275
+ const float* const __restrict pqCoarseCentroids1,
276
+ const float* const __restrict pqFineCentroids1,
277
+ const uint8_t* const __restrict code1,
278
+ const float weight1,
279
+ const float* const __restrict pqCoarseCentroids2,
280
+ const float* const __restrict pqFineCentroids2,
281
+ const uint8_t* const __restrict code2,
282
+ const float weight2,
283
+ float* const __restrict outputAccum,
284
+ float& minvAccum) {
285
+ const uint16_t* const __restrict code0FP16 =
286
+ reinterpret_cast<const uint16_t*>(code0);
287
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
288
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
289
+
290
+ const uint16_t* const __restrict code1FP16 =
291
+ reinterpret_cast<const uint16_t*>(code1);
292
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
293
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
294
+
295
+ const uint16_t* const __restrict code2FP16 =
296
+ reinterpret_cast<const uint16_t*>(code2);
297
+ const float scaler2 = faiss::decode_fp16(code2FP16[0]) * weight2;
298
+ const float minv2 = faiss::decode_fp16(code2FP16[1]) * weight2;
299
+
300
+ SubIndexT::accum(
301
+ pqCoarseCentroids0,
302
+ pqFineCentroids0,
303
+ code0 + 2 * sizeof(uint16_t),
304
+ scaler0,
305
+ pqCoarseCentroids1,
306
+ pqFineCentroids1,
307
+ code1 + 2 * sizeof(uint16_t),
308
+ scaler1,
309
+ pqCoarseCentroids2,
310
+ pqFineCentroids2,
311
+ code2 + 2 * sizeof(uint16_t),
312
+ scaler2,
313
+ outputAccum);
314
+
315
+ minvAccum += minv0 + minv1 + minv2;
316
+ }
317
+
318
+ // Process 3 samples.
319
+ // Coarse pq centroids table and fine pq centroids table are shared among
320
+ // codes.
321
+ //
322
+ // Performs
323
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
324
+ // + weight1 * scaler1 * decoded(code1)
325
+ // + weight2 * scaler2 * decoded(code2)
326
+ // * minvAccum += weight0 * minv0 + weight1 * minv1 + weight2 * minv2
327
+ static void accum(
328
+ const float* const __restrict pqCoarseCentroids,
329
+ const float* const __restrict pqFineCentroids,
330
+ const uint8_t* const __restrict code0,
331
+ const float weight0,
332
+ const uint8_t* const __restrict code1,
333
+ const float weight1,
334
+ const uint8_t* const __restrict code2,
335
+ const float weight2,
336
+ float* const __restrict outputAccum,
337
+ float& minvAccum) {
338
+ const uint16_t* const __restrict code0FP16 =
339
+ reinterpret_cast<const uint16_t*>(code0);
340
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
341
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
342
+
343
+ const uint16_t* const __restrict code1FP16 =
344
+ reinterpret_cast<const uint16_t*>(code1);
345
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
346
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
347
+
348
+ const uint16_t* const __restrict code2FP16 =
349
+ reinterpret_cast<const uint16_t*>(code2);
350
+ const float scaler2 = faiss::decode_fp16(code2FP16[0]) * weight2;
351
+ const float minv2 = faiss::decode_fp16(code2FP16[1]) * weight2;
352
+
353
+ SubIndexT::accum(
354
+ pqCoarseCentroids,
355
+ pqFineCentroids,
356
+ code0 + 2 * sizeof(uint16_t),
357
+ scaler0,
358
+ code1 + 2 * sizeof(uint16_t),
359
+ scaler1,
360
+ code2 + 2 * sizeof(uint16_t),
361
+ scaler2,
362
+ outputAccum);
363
+
364
+ minvAccum += minv0 + minv1 + minv2;
365
+ }
366
+
367
+ // Process 3 samples.
368
+ // Each code uses its own fine pq centroids table.
369
+ //
370
+ // Performs
371
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
372
+ // + weight1 * scaler1 * decoded(code1)
373
+ // + weight2 * scaler2 * decoded(code2)
374
+ // * minvAccum += weight0 * minv0 + weight1 * minv1 + weight2 * minv2
375
+ static void accum(
376
+ const float* const __restrict pqFineCentroids0,
377
+ const uint8_t* const __restrict code0,
378
+ const float weight0,
379
+ const float* const __restrict pqFineCentroids1,
380
+ const uint8_t* const __restrict code1,
381
+ const float weight1,
382
+ const float* const __restrict pqFineCentroids2,
383
+ const uint8_t* const __restrict code2,
384
+ const float weight2,
385
+ float* const __restrict outputAccum,
386
+ float& minvAccum) {
387
+ const uint16_t* const __restrict code0FP16 =
388
+ reinterpret_cast<const uint16_t*>(code0);
389
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
390
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
391
+
392
+ const uint16_t* const __restrict code1FP16 =
393
+ reinterpret_cast<const uint16_t*>(code1);
394
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
395
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
396
+
397
+ const uint16_t* const __restrict code2FP16 =
398
+ reinterpret_cast<const uint16_t*>(code2);
399
+ const float scaler2 = faiss::decode_fp16(code2FP16[0]) * weight2;
400
+ const float minv2 = faiss::decode_fp16(code2FP16[1]) * weight2;
401
+
402
+ SubIndexT::accum(
403
+ pqFineCentroids0,
404
+ code0 + 2 * sizeof(uint16_t),
405
+ scaler0,
406
+ pqFineCentroids1,
407
+ code1 + 2 * sizeof(uint16_t),
408
+ scaler1,
409
+ pqFineCentroids2,
410
+ code2 + 2 * sizeof(uint16_t),
411
+ scaler2,
412
+ outputAccum);
413
+
414
+ minvAccum += minv0 + minv1 + minv2;
415
+ }
416
+
417
+ // Process 3 samples.
418
+ // Fine pq centroids table is shared among codes.
419
+ //
420
+ // Performs
421
+ // * outputAccum += weight0 * scaler0 * decoded(code0)
422
+ // + weight1 * scaler1 * decoded(code1)
423
+ // + weight2 * scaler2 * decoded(code2)
424
+ // * minvAccum += weight0 * minv0 + weight1 * minv1 + weight2 * minv2
425
+ static void accum(
426
+ const float* const __restrict pqFineCentroids,
427
+ const uint8_t* const __restrict code0,
428
+ const float weight0,
429
+ const uint8_t* const __restrict code1,
430
+ const float weight1,
431
+ const uint8_t* const __restrict code2,
432
+ const float weight2,
433
+ float* const __restrict outputAccum,
434
+ float& minvAccum) {
435
+ const uint16_t* const __restrict code0FP16 =
436
+ reinterpret_cast<const uint16_t*>(code0);
437
+ const float scaler0 = faiss::decode_fp16(code0FP16[0]) * weight0;
438
+ const float minv0 = faiss::decode_fp16(code0FP16[1]) * weight0;
439
+
440
+ const uint16_t* const __restrict code1FP16 =
441
+ reinterpret_cast<const uint16_t*>(code1);
442
+ const float scaler1 = faiss::decode_fp16(code1FP16[0]) * weight1;
443
+ const float minv1 = faiss::decode_fp16(code1FP16[1]) * weight1;
444
+
445
+ const uint16_t* const __restrict code2FP16 =
446
+ reinterpret_cast<const uint16_t*>(code2);
447
+ const float scaler2 = faiss::decode_fp16(code2FP16[0]) * weight2;
448
+ const float minv2 = faiss::decode_fp16(code2FP16[1]) * weight2;
449
+
450
+ SubIndexT::accum(
451
+ pqFineCentroids,
452
+ code0 + 2 * sizeof(uint16_t),
453
+ scaler0,
454
+ code1 + 2 * sizeof(uint16_t),
455
+ scaler1,
456
+ code2 + 2 * sizeof(uint16_t),
457
+ scaler2,
458
+ outputAccum);
459
+
460
+ minvAccum += minv0 + minv1 + minv2;
461
+ }
462
+ };
463
+
464
+ } // namespace cppcontrib
465
+ } // namespace faiss