faiss 0.2.0 → 0.2.4

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +7 -7
  5. data/ext/faiss/extconf.rb +6 -3
  6. data/ext/faiss/numo.hpp +4 -4
  7. data/ext/faiss/utils.cpp +1 -1
  8. data/ext/faiss/utils.h +1 -1
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  11. data/vendor/faiss/faiss/AutoTune.h +55 -56
  12. data/vendor/faiss/faiss/Clustering.cpp +365 -194
  13. data/vendor/faiss/faiss/Clustering.h +102 -35
  14. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  15. data/vendor/faiss/faiss/IVFlib.h +48 -51
  16. data/vendor/faiss/faiss/Index.cpp +85 -103
  17. data/vendor/faiss/faiss/Index.h +54 -48
  18. data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
  19. data/vendor/faiss/faiss/Index2Layer.h +22 -36
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
  22. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  23. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  24. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  25. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  26. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  28. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  30. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  31. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  32. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  33. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  34. data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
  35. data/vendor/faiss/faiss/IndexFlat.h +42 -59
  36. data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
  37. data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
  38. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  39. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  40. data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
  41. data/vendor/faiss/faiss/IndexIVF.h +169 -118
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
  48. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  49. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  50. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  51. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  52. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +163 -150
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
  54. data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
  55. data/vendor/faiss/faiss/IndexLSH.h +20 -38
  56. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  57. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  58. data/vendor/faiss/faiss/IndexNNDescent.cpp +229 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -82
  64. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  65. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  66. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  67. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  68. data/vendor/faiss/faiss/IndexRefine.cpp +139 -127
  69. data/vendor/faiss/faiss/IndexRefine.h +32 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
  73. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
  74. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  75. data/vendor/faiss/faiss/IndexShards.h +85 -73
  76. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  77. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  78. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  79. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  80. data/vendor/faiss/faiss/MetricType.h +7 -7
  81. data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
  82. data/vendor/faiss/faiss/VectorTransform.h +64 -89
  83. data/vendor/faiss/faiss/clone_index.cpp +78 -73
  84. data/vendor/faiss/faiss/clone_index.h +4 -9
  85. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  86. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  87. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
  88. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  89. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  90. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  91. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  92. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  93. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
  94. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  95. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  96. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  97. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  101. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  102. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  106. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  108. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  110. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  112. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  113. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  114. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  115. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  116. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  121. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  122. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  124. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  125. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  126. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  128. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  129. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  130. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  135. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  136. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  137. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  138. data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
  139. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
  142. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  144. data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
  145. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  146. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  148. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  149. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  151. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
  153. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  154. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  156. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  157. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  158. data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
  159. data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
  160. data/vendor/faiss/faiss/impl/io.cpp +76 -95
  161. data/vendor/faiss/faiss/impl/io.h +31 -41
  162. data/vendor/faiss/faiss/impl/io_macros.h +60 -29
  163. data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
  164. data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
  165. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  166. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  167. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  171. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  172. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  173. data/vendor/faiss/faiss/index_factory.cpp +619 -397
  174. data/vendor/faiss/faiss/index_factory.h +8 -6
  175. data/vendor/faiss/faiss/index_io.h +23 -26
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  177. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  178. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  179. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  180. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  181. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  183. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  185. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  186. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  187. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  188. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  189. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  190. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  191. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  192. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  193. data/vendor/faiss/faiss/utils/distances.cpp +305 -312
  194. data/vendor/faiss/faiss/utils/distances.h +170 -122
  195. data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
  196. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  197. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  198. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  199. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  200. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  201. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  202. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  203. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  204. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  205. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  206. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  207. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  208. data/vendor/faiss/faiss/utils/random.h +13 -16
  209. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  210. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  211. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  212. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  213. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  214. data/vendor/faiss/faiss/utils/utils.h +54 -49
  215. metadata +29 -4
@@ -20,10 +20,8 @@
20
20
  * parallel compile times. Templates are instanciated explicitly.
21
21
  */
22
22
 
23
-
24
23
  namespace faiss {
25
24
 
26
-
27
25
  /** Pack codes for consumption by the SIMD kernels.
28
26
  * The unused bytes are set to 0.
29
27
  *
@@ -36,11 +34,13 @@ namespace faiss {
36
34
  * @param blocks output array, size nb * nsq / 2.
37
35
  */
38
36
  void pq4_pack_codes(
39
- const uint8_t *codes,
40
- size_t ntotal, size_t M,
41
- size_t nb, size_t bbs, size_t M2,
42
- uint8_t * blocks
43
- );
37
+ const uint8_t* codes,
38
+ size_t ntotal,
39
+ size_t M,
40
+ size_t nb,
41
+ size_t bbs,
42
+ size_t M2,
43
+ uint8_t* blocks);
44
44
 
45
45
  /** Same as pack_codes but write in a given range of the output,
46
46
  * leaving the rest untouched. Assumes allocated entries are 0 on input.
@@ -51,12 +51,13 @@ void pq4_pack_codes(
51
51
  * @param blocks output array, size at least ceil(i1 / bbs) * bbs * nsq / 2
52
52
  */
53
53
  void pq4_pack_codes_range(
54
- const uint8_t *codes,
54
+ const uint8_t* codes,
55
55
  size_t M,
56
- size_t i0, size_t i1,
57
- size_t bbs, size_t M2,
58
- uint8_t * blocks
59
- );
56
+ size_t i0,
57
+ size_t i1,
58
+ size_t bbs,
59
+ size_t M2,
60
+ uint8_t* blocks);
60
61
 
61
62
  /** get a single element from a packed codes table
62
63
  *
@@ -64,9 +65,11 @@ void pq4_pack_codes_range(
64
65
  * @param sq subquantizer (< nsq)
65
66
  */
66
67
  uint8_t pq4_get_packed_element(
67
- const uint8_t *data, size_t bbs, size_t nsq,
68
- size_t i, size_t sq
69
- );
68
+ const uint8_t* data,
69
+ size_t bbs,
70
+ size_t nsq,
71
+ size_t i,
72
+ size_t sq);
70
73
 
71
74
  /** Pack Look-up table for consumption by the kernel.
72
75
  *
@@ -75,13 +78,7 @@ uint8_t pq4_get_packed_element(
75
78
  * @param src input array, size (nq, 16)
76
79
  * @param dest output array, size (nq, 16)
77
80
  */
78
- void pq4_pack_LUT(
79
- int nq, int nsq,
80
- const uint8_t *src,
81
- uint8_t *dest
82
- );
83
-
84
-
81
+ void pq4_pack_LUT(int nq, int nsq, const uint8_t* src, uint8_t* dest);
85
82
 
86
83
  /** Loop over database elements and accumulate results into result handler
87
84
  *
@@ -92,16 +89,15 @@ void pq4_pack_LUT(
92
89
  * @param codes packed codes array
93
90
  * @param LUT packed look-up table
94
91
  */
95
- template<class ResultHandler>
92
+ template <class ResultHandler>
96
93
  void pq4_accumulate_loop(
97
94
  int nq,
98
- size_t nb, int bbs,
95
+ size_t nb,
96
+ int bbs,
99
97
  int nsq,
100
- const uint8_t *codes,
101
- const uint8_t *LUT,
102
- ResultHandler & res);
103
-
104
-
98
+ const uint8_t* codes,
99
+ const uint8_t* LUT,
100
+ ResultHandler& res);
105
101
 
106
102
  /* qbs versions, supported only for bbs=32.
107
103
  *
@@ -115,8 +111,7 @@ void pq4_accumulate_loop(
115
111
  * nq = 3 + 2 + 2 + 1 = 6 queries. For a given total block size, the optimal
116
112
  * decomposition into sub-blocks (measured empirically) is given by
117
113
  * preferred_qbs().
118
- */
119
-
114
+ */
120
115
 
121
116
  /* compute the number of queries from a base-16 decomposition */
122
117
  int pq4_qbs_to_nq(int qbs);
@@ -133,18 +128,16 @@ int pq4_preferred_qbs(int nq);
133
128
  * @param dest output array, size (nq, 16)
134
129
  * @return nq
135
130
  */
136
- int pq4_pack_LUT_qbs(
137
- int fqbs, int nsq,
138
- const uint8_t *src,
139
- uint8_t *dest
140
- );
131
+ int pq4_pack_LUT_qbs(int fqbs, int nsq, const uint8_t* src, uint8_t* dest);
141
132
 
142
- /** Same as pq4_pack_LUT_qbs, except the source vectors are remapped with q_map */
133
+ /** Same as pq4_pack_LUT_qbs, except the source vectors are remapped with q_map
134
+ */
143
135
  int pq4_pack_LUT_qbs_q_map(
144
- int qbs, int nsq,
145
- const uint8_t *src,
146
- const int * q_map,
147
- uint8_t *dest);
136
+ int qbs,
137
+ int nsq,
138
+ const uint8_t* src,
139
+ const int* q_map,
140
+ uint8_t* dest);
148
141
 
149
142
  /** Run accumulation loop.
150
143
  *
@@ -155,15 +148,13 @@ int pq4_pack_LUT_qbs_q_map(
155
148
  * @param LUT look-up table (packed)
156
149
  * @param res call-back for the resutls
157
150
  */
158
- template<class ResultHandler>
151
+ template <class ResultHandler>
159
152
  void pq4_accumulate_loop_qbs(
160
153
  int qbs,
161
154
  size_t nb,
162
155
  int nsq,
163
- const uint8_t *codes,
164
- const uint8_t *LUT,
165
- ResultHandler & res);
166
-
167
-
156
+ const uint8_t* codes,
157
+ const uint8_t* LUT,
158
+ ResultHandler& res);
168
159
 
169
- } // namespace faiss
160
+ } // namespace faiss
@@ -5,16 +5,13 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
8
  #include <faiss/impl/pq4_fast_scan.h>
10
9
 
11
10
  #include <faiss/impl/FaissAssert.h>
12
11
  #include <faiss/impl/simd_result_handlers.h>
13
12
 
14
-
15
13
  namespace faiss {
16
14
 
17
-
18
15
  using namespace simd_result_handlers;
19
16
 
20
17
  /***************************************************************
@@ -29,18 +26,17 @@ namespace {
29
26
  * writes results in a ResultHandler
30
27
  */
31
28
 
32
- template<int NQ, int BB, class ResultHandler>
29
+ template <int NQ, int BB, class ResultHandler>
33
30
  void kernel_accumulate_block(
34
31
  int nsq,
35
- const uint8_t *codes,
36
- const uint8_t *LUT,
37
- ResultHandler & res)
38
- {
32
+ const uint8_t* codes,
33
+ const uint8_t* LUT,
34
+ ResultHandler& res) {
39
35
  // distance accumulators
40
36
  simd16uint16 accu[NQ][BB][4];
41
37
 
42
- for(int q = 0; q < NQ; q++) {
43
- for(int b = 0; b < BB; b++) {
38
+ for (int q = 0; q < NQ; q++) {
39
+ for (int b = 0; b < BB; b++) {
44
40
  accu[q][b][0].clear();
45
41
  accu[q][b][1].clear();
46
42
  accu[q][b][2].clear();
@@ -48,9 +44,9 @@ void kernel_accumulate_block(
48
44
  }
49
45
  }
50
46
 
51
- for(int sq = 0; sq < nsq; sq += 2) {
47
+ for (int sq = 0; sq < nsq; sq += 2) {
52
48
  simd32uint8 lut_cache[NQ];
53
- for(int q = 0; q < NQ; q++) {
49
+ for (int q = 0; q < NQ; q++) {
54
50
  lut_cache[q] = simd32uint8(LUT);
55
51
  LUT += 32;
56
52
  }
@@ -62,7 +58,7 @@ void kernel_accumulate_block(
62
58
  simd32uint8 chi = simd32uint8(simd16uint16(c) >> 4) & mask;
63
59
  simd32uint8 clo = c & mask;
64
60
 
65
- for(int q = 0; q < NQ; q++) {
61
+ for (int q = 0; q < NQ; q++) {
66
62
  simd32uint8 lut = lut_cache[q];
67
63
  simd32uint8 res0 = lut.lookup_2_lanes(clo);
68
64
  simd32uint8 res1 = lut.lookup_2_lanes(chi);
@@ -76,9 +72,8 @@ void kernel_accumulate_block(
76
72
  }
77
73
  }
78
74
 
79
- for(int q = 0; q < NQ; q++) {
75
+ for (int q = 0; q < NQ; q++) {
80
76
  for (int b = 0; b < BB; b++) {
81
-
82
77
  accu[q][b][0] -= accu[q][b][1] << 8;
83
78
  simd16uint16 dis0 = combine2x2(accu[q][b][0], accu[q][b][1]);
84
79
 
@@ -88,19 +83,15 @@ void kernel_accumulate_block(
88
83
  res.handle(q, b, dis0, dis1);
89
84
  }
90
85
  }
91
-
92
-
93
86
  }
94
87
 
95
-
96
- template<int NQ, int BB, class ResultHandler>
88
+ template <int NQ, int BB, class ResultHandler>
97
89
  void accumulate_fixed_blocks(
98
90
  size_t nb,
99
91
  int nsq,
100
- const uint8_t *codes,
101
- const uint8_t *LUT,
102
- ResultHandler & res)
103
- {
92
+ const uint8_t* codes,
93
+ const uint8_t* LUT,
94
+ ResultHandler& res) {
104
95
  constexpr int bbs = 32 * BB;
105
96
  for (int64_t j0 = 0; j0 < nb; j0 += bbs) {
106
97
  FixedStorageHandler<NQ, 2 * BB> res2;
@@ -111,29 +102,28 @@ void accumulate_fixed_blocks(
111
102
  }
112
103
  }
113
104
 
114
-
115
105
  } // anonymous namespace
116
106
 
117
- template<class ResultHandler>
107
+ template <class ResultHandler>
118
108
  void pq4_accumulate_loop(
119
109
  int nq,
120
- size_t nb, int bbs,
110
+ size_t nb,
111
+ int bbs,
121
112
  int nsq,
122
- const uint8_t *codes,
123
- const uint8_t *LUT,
124
- ResultHandler & res)
125
- {
113
+ const uint8_t* codes,
114
+ const uint8_t* LUT,
115
+ ResultHandler& res) {
126
116
  FAISS_THROW_IF_NOT(is_aligned_pointer(codes));
127
117
  FAISS_THROW_IF_NOT(is_aligned_pointer(LUT));
128
118
  FAISS_THROW_IF_NOT(bbs % 32 == 0);
129
119
  FAISS_THROW_IF_NOT(nb % bbs == 0);
130
120
 
131
- #define DISPATCH(NQ, BB) \
132
- case NQ * 1000 + BB: \
133
- accumulate_fixed_blocks<NQ, BB>(nb, nsq, codes, LUT, res); \
134
- break
121
+ #define DISPATCH(NQ, BB) \
122
+ case NQ * 1000 + BB: \
123
+ accumulate_fixed_blocks<NQ, BB>(nb, nsq, codes, LUT, res); \
124
+ break
135
125
 
136
- switch(nq * 1000 + bbs / 32) {
126
+ switch (nq * 1000 + bbs / 32) {
137
127
  DISPATCH(1, 1);
138
128
  DISPATCH(1, 2);
139
129
  DISPATCH(1, 3);
@@ -143,26 +133,28 @@ void pq4_accumulate_loop(
143
133
  DISPATCH(2, 2);
144
134
  DISPATCH(3, 1);
145
135
  DISPATCH(4, 1);
146
- default:
147
- FAISS_THROW_FMT("nq=%d bbs=%d not instantiated", nq, bbs);
136
+ default:
137
+ FAISS_THROW_FMT("nq=%d bbs=%d not instantiated", nq, bbs);
148
138
  }
149
139
  #undef DISPATCH
150
-
151
140
  }
152
141
 
153
142
  // explicit template instantiations
154
143
 
155
-
156
-
157
-
158
- #define INSTANTIATE_ACCUMULATE(TH, C, with_id_map) \
159
- template void pq4_accumulate_loop<TH<C, with_id_map>> \
160
- (int, size_t, int, int, const uint8_t *, const uint8_t *, TH<C, with_id_map> &);
161
-
162
- #define INSTANTIATE_3(C, with_id_map) \
163
- INSTANTIATE_ACCUMULATE(SingleResultHandler, C, with_id_map) \
164
- INSTANTIATE_ACCUMULATE(HeapHandler, C, with_id_map) \
165
- INSTANTIATE_ACCUMULATE(ReservoirHandler, C, with_id_map) \
144
+ #define INSTANTIATE_ACCUMULATE(TH, C, with_id_map) \
145
+ template void pq4_accumulate_loop<TH<C, with_id_map>>( \
146
+ int, \
147
+ size_t, \
148
+ int, \
149
+ int, \
150
+ const uint8_t*, \
151
+ const uint8_t*, \
152
+ TH<C, with_id_map>&);
153
+
154
+ #define INSTANTIATE_3(C, with_id_map) \
155
+ INSTANTIATE_ACCUMULATE(SingleResultHandler, C, with_id_map) \
156
+ INSTANTIATE_ACCUMULATE(HeapHandler, C, with_id_map) \
157
+ INSTANTIATE_ACCUMULATE(ReservoirHandler, C, with_id_map)
166
158
 
167
159
  using Csi = CMax<uint16_t, int>;
168
160
  INSTANTIATE_3(Csi, false);
@@ -174,7 +166,4 @@ INSTANTIATE_3(Csl, true);
174
166
  using CslMin = CMin<uint16_t, int64_t>;
175
167
  INSTANTIATE_3(CslMin, true);
176
168
 
177
-
178
-
179
169
  } // namespace faiss
180
-