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,251 @@
1
+ // (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
2
+ #ifndef PQ_INL_H
3
+ #define PQ_INL_H
4
+
5
+ #include <cstddef>
6
+ #include <cstdint>
7
+
8
+ namespace faiss {
9
+ namespace cppcontrib {
10
+
11
+ ////////////////////////////////////////////////////////////////////////////////////
12
+ /// IndexPQDecoder
13
+ ////////////////////////////////////////////////////////////////////////////////////
14
+
15
+ // Suitable for PQ[1]x8
16
+ template <intptr_t DIM, intptr_t FINE_SIZE, intptr_t FINE_BITS = 8>
17
+ struct IndexPQDecoder {
18
+ static_assert(
19
+ FINE_BITS == 8,
20
+ "Only 8 bits is currently supported for FINE_BITS");
21
+
22
+ static constexpr intptr_t dim = DIM;
23
+ static constexpr intptr_t fineSize = FINE_SIZE;
24
+ static constexpr intptr_t fineBits = FINE_BITS;
25
+
26
+ static constexpr intptr_t FINE_TABLE_BYTES = (1 << FINE_BITS);
27
+
28
+ // Process 1 sample.
29
+ // Performs outputStore = decoded(code)
30
+ static void store(
31
+ const float* const __restrict pqFineCentroids,
32
+ const uint8_t* const __restrict code,
33
+ float* const __restrict outputStore) {
34
+ // fine quantizer
35
+ const uint8_t* const __restrict fine = code;
36
+
37
+ #pragma unroll
38
+ for (intptr_t i = 0; i < DIM; i++) {
39
+ const intptr_t fineCentroidIdx = i / FINE_SIZE;
40
+ const intptr_t fineCentroidOffset = i % FINE_SIZE;
41
+
42
+ const intptr_t fineCode = fine[fineCentroidIdx];
43
+
44
+ const float* const __restrict finePtr = pqFineCentroids +
45
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode) *
46
+ FINE_SIZE +
47
+ fineCentroidOffset;
48
+
49
+ outputStore[i] = *finePtr;
50
+ }
51
+ }
52
+
53
+ // Process 1 sample.
54
+ // Performs outputAccum += weight * decoded(code)
55
+ static void accum(
56
+ const float* const __restrict pqFineCentroids,
57
+ const uint8_t* const __restrict code,
58
+ const float weight,
59
+ float* const __restrict outputAccum) {
60
+ // fine quantizer
61
+ const uint8_t* const __restrict fine = code;
62
+
63
+ #pragma unroll
64
+ for (intptr_t i = 0; i < DIM; i++) {
65
+ const intptr_t fineCentroidIdx = i / FINE_SIZE;
66
+ const intptr_t fineCentroidOffset = i % FINE_SIZE;
67
+
68
+ const intptr_t fineCode = fine[fineCentroidIdx];
69
+
70
+ const float* const __restrict finePtr = pqFineCentroids +
71
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode) *
72
+ FINE_SIZE +
73
+ fineCentroidOffset;
74
+
75
+ outputAccum[i] += weight * (*finePtr);
76
+ }
77
+ }
78
+
79
+ // Process 2 samples.
80
+ // Each code uses its own fine pq centroids table.
81
+ //
82
+ // Performs
83
+ // outputAccum += weight0 * decoded(code0) + weight1 * decoded(code1)
84
+ static void accum(
85
+ const float* const __restrict pqFineCentroids0,
86
+ const uint8_t* const __restrict code0,
87
+ const float weight0,
88
+ const float* const __restrict pqFineCentroids1,
89
+ const uint8_t* const __restrict code1,
90
+ const float weight1,
91
+ float* const __restrict outputAccum) {
92
+ // fine quantizer
93
+ const uint8_t* const __restrict fine0 = code0;
94
+ const uint8_t* const __restrict fine1 = code1;
95
+
96
+ #pragma unroll
97
+ for (intptr_t i = 0; i < DIM; i++) {
98
+ const intptr_t fineCentroidIdx = i / FINE_SIZE;
99
+ const intptr_t fineCentroidOffset = i % FINE_SIZE;
100
+
101
+ const intptr_t fineCode0 = fine0[fineCentroidIdx];
102
+ const intptr_t fineCode1 = fine1[fineCentroidIdx];
103
+
104
+ const float* const __restrict finePtr0 = pqFineCentroids0 +
105
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode0) *
106
+ FINE_SIZE +
107
+ fineCentroidOffset;
108
+ const float* const __restrict finePtr1 = pqFineCentroids1 +
109
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode1) *
110
+ FINE_SIZE +
111
+ fineCentroidOffset;
112
+
113
+ outputAccum[i] += weight0 * (*finePtr0) + weight1 * (*finePtr1);
114
+ }
115
+ }
116
+
117
+ // Process 2 samples.
118
+ // Fine pq centroids table is shared among codes.
119
+ //
120
+ // Performs
121
+ // outputAccum += weight0 * decoded(code0) + weight1 * decoded(code1)
122
+ static void accum(
123
+ const float* const __restrict pqFineCentroids,
124
+ const uint8_t* const __restrict code0,
125
+ const float weight0,
126
+ const uint8_t* const __restrict code1,
127
+ const float weight1,
128
+ float* const __restrict outputAccum) {
129
+ // fine quantizer
130
+ const uint8_t* const __restrict fine0 = code0;
131
+ const uint8_t* const __restrict fine1 = code1;
132
+
133
+ #pragma unroll
134
+ for (intptr_t i = 0; i < DIM; i++) {
135
+ const intptr_t fineCentroidIdx = i / FINE_SIZE;
136
+ const intptr_t fineCentroidOffset = i % FINE_SIZE;
137
+
138
+ const intptr_t fineCode0 = fine0[fineCentroidIdx];
139
+ const intptr_t fineCode1 = fine1[fineCentroidIdx];
140
+
141
+ const float* const __restrict finePtr0 = pqFineCentroids +
142
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode0) *
143
+ FINE_SIZE +
144
+ fineCentroidOffset;
145
+ const float* const __restrict finePtr1 = pqFineCentroids +
146
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode1) *
147
+ FINE_SIZE +
148
+ fineCentroidOffset;
149
+
150
+ outputAccum[i] += weight0 * (*finePtr0) + weight1 * (*finePtr1);
151
+ }
152
+ }
153
+
154
+ // Process 3 samples.
155
+ // Each code uses its own fine pq centroids table.
156
+ //
157
+ // Performs outputAccum += weight0 * decoded(code0) + weight1 *
158
+ // decoded(code1) + weight2 * decoded(code2)
159
+ static void accum(
160
+ const float* const __restrict pqFineCentroids0,
161
+ const uint8_t* const __restrict code0,
162
+ const float weight0,
163
+ const float* const __restrict pqFineCentroids1,
164
+ const uint8_t* const __restrict code1,
165
+ const float weight1,
166
+ const float* const __restrict pqFineCentroids2,
167
+ const uint8_t* const __restrict code2,
168
+ const float weight2,
169
+ float* const __restrict outputAccum) {
170
+ // fine quantizer
171
+ const uint8_t* const __restrict fine0 = code0;
172
+ const uint8_t* const __restrict fine1 = code1;
173
+ const uint8_t* const __restrict fine2 = code2;
174
+
175
+ #pragma unroll
176
+ for (intptr_t i = 0; i < DIM; i++) {
177
+ const intptr_t fineCentroidIdx = i / FINE_SIZE;
178
+ const intptr_t fineCentroidOffset = i % FINE_SIZE;
179
+
180
+ const intptr_t fineCode0 = fine0[fineCentroidIdx];
181
+ const intptr_t fineCode1 = fine1[fineCentroidIdx];
182
+ const intptr_t fineCode2 = fine2[fineCentroidIdx];
183
+
184
+ const float* const __restrict finePtr0 = pqFineCentroids0 +
185
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode0) *
186
+ FINE_SIZE +
187
+ fineCentroidOffset;
188
+ const float* const __restrict finePtr1 = pqFineCentroids1 +
189
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode1) *
190
+ FINE_SIZE +
191
+ fineCentroidOffset;
192
+ const float* const __restrict finePtr2 = pqFineCentroids2 +
193
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode2) *
194
+ FINE_SIZE +
195
+ fineCentroidOffset;
196
+
197
+ outputAccum[i] += weight0 * (*finePtr0) + weight1 * (*finePtr1) +
198
+ weight2 * (*finePtr2);
199
+ }
200
+ }
201
+
202
+ // Process 3 samples.
203
+ // Fine pq centroids table is shared among codes.
204
+ //
205
+ // Performs outputAccum += weight0 * decoded(code0) + weight1 *
206
+ // decoded(code1) + weight2 * decoded(code2)
207
+ static void accum(
208
+ const float* const __restrict pqFineCentroids,
209
+ const uint8_t* const __restrict code0,
210
+ const float weight0,
211
+ const uint8_t* const __restrict code1,
212
+ const float weight1,
213
+ const uint8_t* const __restrict code2,
214
+ const float weight2,
215
+ float* const __restrict outputAccum) {
216
+ // fine quantizer
217
+ const uint8_t* const __restrict fine0 = code0;
218
+ const uint8_t* const __restrict fine1 = code1;
219
+ const uint8_t* const __restrict fine2 = code2;
220
+
221
+ #pragma unroll
222
+ for (intptr_t i = 0; i < DIM; i++) {
223
+ const intptr_t fineCentroidIdx = i / FINE_SIZE;
224
+ const intptr_t fineCentroidOffset = i % FINE_SIZE;
225
+
226
+ const intptr_t fineCode0 = fine0[fineCentroidIdx];
227
+ const intptr_t fineCode1 = fine1[fineCentroidIdx];
228
+ const intptr_t fineCode2 = fine2[fineCentroidIdx];
229
+
230
+ const float* const __restrict finePtr0 = pqFineCentroids +
231
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode0) *
232
+ FINE_SIZE +
233
+ fineCentroidOffset;
234
+ const float* const __restrict finePtr1 = pqFineCentroids +
235
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode1) *
236
+ FINE_SIZE +
237
+ fineCentroidOffset;
238
+ const float* const __restrict finePtr2 = pqFineCentroids +
239
+ (fineCentroidIdx * FINE_TABLE_BYTES + fineCode2) *
240
+ FINE_SIZE +
241
+ fineCentroidOffset;
242
+
243
+ outputAccum[i] += weight0 * (*finePtr0) + weight1 * (*finePtr1) +
244
+ weight2 * (*finePtr2);
245
+ }
246
+ }
247
+ };
248
+
249
+ } // namespace cppcontrib
250
+ } // namespace faiss
251
+ #endif // PQ_INL_H