faiss 0.1.7 → 0.2.3

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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +7 -7
  4. data/ext/faiss/ext.cpp +1 -1
  5. data/ext/faiss/extconf.rb +8 -2
  6. data/ext/faiss/index.cpp +102 -69
  7. data/ext/faiss/index_binary.cpp +24 -30
  8. data/ext/faiss/kmeans.cpp +20 -16
  9. data/ext/faiss/numo.hpp +867 -0
  10. data/ext/faiss/pca_matrix.cpp +13 -14
  11. data/ext/faiss/product_quantizer.cpp +23 -24
  12. data/ext/faiss/utils.cpp +10 -37
  13. data/ext/faiss/utils.h +2 -13
  14. data/lib/faiss/version.rb +1 -1
  15. data/lib/faiss.rb +0 -5
  16. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  17. data/vendor/faiss/faiss/AutoTune.h +55 -56
  18. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  19. data/vendor/faiss/faiss/Clustering.h +88 -35
  20. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  21. data/vendor/faiss/faiss/IVFlib.h +48 -51
  22. data/vendor/faiss/faiss/Index.cpp +85 -103
  23. data/vendor/faiss/faiss/Index.h +54 -48
  24. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  25. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  26. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  27. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  28. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  29. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  30. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  31. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  32. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  33. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  34. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  35. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  36. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  37. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  38. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  39. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  40. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  41. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  42. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  43. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  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 +125 -133
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  54. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  55. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  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 +231 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  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 +115 -131
  69. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  73. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  74. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  75. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  76. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  77. data/vendor/faiss/faiss/IndexShards.h +85 -73
  78. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  79. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  80. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  81. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  82. data/vendor/faiss/faiss/MetricType.h +7 -7
  83. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  84. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  85. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  86. data/vendor/faiss/faiss/clone_index.h +4 -9
  87. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  88. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  89. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  90. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  91. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  92. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  93. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  94. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  95. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  96. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  97. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  101. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  102. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  103. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  104. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  106. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  108. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  110. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  112. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  113. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  114. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  115. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  116. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  121. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  122. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  124. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  125. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  126. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  128. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  129. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  130. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  131. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  133. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  135. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  136. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  137. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  138. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  139. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  140. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  142. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  144. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  145. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  146. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  148. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  149. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  151. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  153. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  154. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  156. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  157. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  158. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  159. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  160. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  161. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  162. data/vendor/faiss/faiss/impl/io.h +31 -41
  163. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  164. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  165. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  166. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  167. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  171. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  172. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  173. data/vendor/faiss/faiss/index_factory.h +6 -7
  174. data/vendor/faiss/faiss/index_io.h +23 -26
  175. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  177. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  178. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  179. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  180. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  181. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  183. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  185. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  186. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  187. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  188. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  189. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  190. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  191. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  192. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  193. data/vendor/faiss/faiss/utils/distances.h +133 -118
  194. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  195. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  196. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  197. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  198. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  199. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  200. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  201. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  202. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  203. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  204. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  205. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  206. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  207. data/vendor/faiss/faiss/utils/random.h +13 -16
  208. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  209. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  210. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  211. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  212. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  213. data/vendor/faiss/faiss/utils/utils.h +53 -48
  214. metadata +26 -12
  215. data/lib/faiss/index.rb +0 -20
  216. data/lib/faiss/index_binary.rb +0 -20
  217. data/lib/faiss/kmeans.rb +0 -15
  218. data/lib/faiss/pca_matrix.rb +0 -15
  219. data/lib/faiss/product_quantizer.rb +0 -22
@@ -7,7 +7,6 @@
7
7
 
8
8
  #pragma once
9
9
 
10
-
11
10
  #include <stdint.h>
12
11
  #include <stdio.h>
13
12
 
@@ -15,23 +14,27 @@
15
14
 
16
15
  namespace faiss {
17
16
 
18
-
19
17
  /** partitions the table into 0:q and q:n where all elements above q are >= all
20
18
  * elements below q (for C = CMax, for CMin comparisons are reversed)
21
19
  *
22
20
  * Returns the partition threshold. The elements q:n are destroyed on output.
23
21
  */
24
- template<class C>
22
+ template <class C>
25
23
  typename C::T partition_fuzzy(
26
- typename C::T *vals, typename C::TI * ids, size_t n,
27
- size_t q_min, size_t q_max, size_t * q_out);
24
+ typename C::T* vals,
25
+ typename C::TI* ids,
26
+ size_t n,
27
+ size_t q_min,
28
+ size_t q_max,
29
+ size_t* q_out);
28
30
 
29
31
  /** simplified interface for when the parition is not fuzzy */
30
- template<class C>
32
+ template <class C>
31
33
  inline typename C::T partition(
32
- typename C::T *vals, typename C::TI * ids, size_t n,
33
- size_t q)
34
- {
34
+ typename C::T* vals,
35
+ typename C::TI* ids,
36
+ size_t n,
37
+ size_t q) {
35
38
  return partition_fuzzy<C>(vals, ids, n, q, q, nullptr);
36
39
  }
37
40
 
@@ -41,29 +44,31 @@ inline typename C::T partition(
41
44
  * values outside the range are ignored.
42
45
  * the data table should be aligned on 32 bytes */
43
46
  void simd_histogram_8(
44
- const uint16_t *data, int n,
45
- uint16_t min, int shift,
46
- int *hist);
47
+ const uint16_t* data,
48
+ int n,
49
+ uint16_t min,
50
+ int shift,
51
+ int* hist);
47
52
 
48
53
  /** same for 16-bin histogram */
49
54
  void simd_histogram_16(
50
- const uint16_t *data, int n,
51
- uint16_t min, int shift,
52
- int *hist);
53
-
55
+ const uint16_t* data,
56
+ int n,
57
+ uint16_t min,
58
+ int shift,
59
+ int* hist);
54
60
 
55
61
  struct PartitionStats {
56
62
  uint64_t bissect_cycles;
57
63
  uint64_t compress_cycles;
58
64
 
59
- PartitionStats () {reset (); }
60
- void reset ();
65
+ PartitionStats() {
66
+ reset();
67
+ }
68
+ void reset();
61
69
  };
62
70
 
63
71
  // global var that collects them all
64
72
  FAISS_API extern PartitionStats partition_stats;
65
73
 
66
-
67
-
68
74
  } // namespace faiss
69
-
@@ -5,150 +5,157 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
8
  #include <faiss/utils/quantize_lut.h>
10
9
 
10
+ #include <algorithm>
11
11
  #include <cmath>
12
12
  #include <cstring>
13
13
  #include <vector>
14
- #include <algorithm>
15
14
 
16
15
  #include <faiss/impl/FaissAssert.h>
17
16
 
18
-
19
17
  namespace faiss {
20
18
 
21
-
22
19
  namespace quantize_lut {
23
20
 
24
-
25
21
  /******************************************************
26
22
  * Quantize look-up tables
27
23
  ******************************************************/
28
24
 
29
25
  namespace {
30
26
 
31
- float round_uint8_and_mul(float *tab, size_t n) {
27
+ float round_uint8_and_mul(float* tab, size_t n) {
32
28
  float max = 0;
33
- for(int i = 0; i < n; i++) {
34
- if(fabs(tab[i]) > max) {
29
+ for (int i = 0; i < n; i++) {
30
+ if (fabs(tab[i]) > max) {
35
31
  max = fabs(tab[i]);
36
32
  }
37
33
  }
38
34
  float multiplier = 127 / max;
39
- for(int i = 0; i < n; i++) {
35
+ for (int i = 0; i < n; i++) {
40
36
  tab[i] = floorf(tab[i] * multiplier + 128);
41
37
  }
42
38
  return multiplier;
43
39
  }
44
40
 
45
41
  // there can be NaNs in tables, they should be ignored
46
- float tab_min(const float *tab, size_t n) {
42
+ float tab_min(const float* tab, size_t n) {
47
43
  float min = HUGE_VAL;
48
- for(int i = 0; i < n; i++) {
49
- if (tab[i] < min) min = tab[i];
44
+ for (int i = 0; i < n; i++) {
45
+ if (tab[i] < min)
46
+ min = tab[i];
50
47
  }
51
48
  return min;
52
49
  }
53
50
 
54
- float tab_max(const float *tab, size_t n) {
51
+ float tab_max(const float* tab, size_t n) {
55
52
  float max = -HUGE_VAL;
56
- for(int i = 0; i < n; i++) {
57
- if (tab[i] > max) max = tab[i];
53
+ for (int i = 0; i < n; i++) {
54
+ if (tab[i] > max)
55
+ max = tab[i];
58
56
  }
59
57
  return max;
60
58
  }
61
59
 
62
- void round_tab(float *tab, size_t n, float a, float bi) {
63
- for(int i = 0; i < n; i++) {
60
+ void round_tab(float* tab, size_t n, float a, float bi) {
61
+ for (int i = 0; i < n; i++) {
64
62
  tab[i] = floorf((tab[i] - bi) * a + 0.5);
65
63
  }
66
64
  }
67
65
 
68
- template<typename T>
69
- void round_tab(const float *tab, size_t n, float a, float bi, T *tab_out) {
70
- for(int i = 0; i < n; i++) {
66
+ template <typename T>
67
+ void round_tab(const float* tab, size_t n, float a, float bi, T* tab_out) {
68
+ for (int i = 0; i < n; i++) {
71
69
  tab_out[i] = (T)floorf((tab[i] - bi) * a + 0.5);
72
70
  }
73
71
  }
74
72
 
75
-
76
-
77
73
  } // anonymous namespace
78
74
 
79
75
  void round_uint8_per_column(
80
- float *tab, size_t n, size_t d,
81
- float *a_out, float *b_out)
82
- {
76
+ float* tab,
77
+ size_t n,
78
+ size_t d,
79
+ float* a_out,
80
+ float* b_out) {
83
81
  float max_span = 0;
84
82
  std::vector<float> mins(n);
85
- for(int i = 0; i < n; i++) {
83
+ for (int i = 0; i < n; i++) {
86
84
  mins[i] = tab_min(tab + i * d, d);
87
85
  float span = tab_max(tab + i * d, d) - mins[i];
88
- if(span > max_span) {
86
+ if (span > max_span) {
89
87
  max_span = span;
90
88
  }
91
89
  }
92
90
  float a = 255 / max_span;
93
91
  float b = 0;
94
- for(int i = 0; i < n; i++) {
92
+ for (int i = 0; i < n; i++) {
95
93
  b += mins[i];
96
94
  round_tab(tab + i * d, d, a, mins[i]);
97
95
  }
98
- if (a_out) *a_out = a;
99
- if (b_out) *b_out = b;
96
+ if (a_out)
97
+ *a_out = a;
98
+ if (b_out)
99
+ *b_out = b;
100
100
  }
101
101
 
102
102
  void round_uint8_per_column_multi(
103
- float *tab, size_t m, size_t n, size_t d,
104
- float *a_out, float *b_out)
105
- {
103
+ float* tab,
104
+ size_t m,
105
+ size_t n,
106
+ size_t d,
107
+ float* a_out,
108
+ float* b_out) {
106
109
  float max_span = 0;
107
110
  std::vector<float> mins(n);
108
- for(int i = 0; i < n; i++) {
111
+ for (int i = 0; i < n; i++) {
109
112
  float min_i = HUGE_VAL;
110
113
  float max_i = -HUGE_VAL;
111
- for(int j = 0; j < m; j++) {
114
+ for (int j = 0; j < m; j++) {
112
115
  min_i = std::min(min_i, tab_min(tab + (j * n + i) * d, d));
113
116
  max_i = std::max(max_i, tab_max(tab + (j * n + i) * d, d));
114
117
  }
115
118
  mins[i] = min_i;
116
119
  float span = max_i - min_i;
117
- if(span > max_span) {
120
+ if (span > max_span) {
118
121
  max_span = span;
119
122
  }
120
123
  }
121
124
  float a = 255 / max_span;
122
125
  float b = 0;
123
- for(int i = 0; i < n; i++) {
126
+ for (int i = 0; i < n; i++) {
124
127
  b += mins[i];
125
- for(int j = 0; j < m; j++) {
128
+ for (int j = 0; j < m; j++) {
126
129
  round_tab(tab + (j * n + i) * d, d, a, mins[i]);
127
130
  }
128
131
  }
129
- if (a_out) *a_out = a;
130
- if (b_out) *b_out = b;
132
+ if (a_out)
133
+ *a_out = a;
134
+ if (b_out)
135
+ *b_out = b;
131
136
  }
132
137
 
133
-
134
138
  // translation of
135
139
  // https://github.com/fairinternal/faiss_improvements/blob/7122c3cc6ddb0a371d8aa6f1309cd8bcf2335e61/LUT_quantization.ipynb
136
140
  void quantize_LUT_and_bias(
137
- size_t nprobe, size_t M, size_t ksub,
141
+ size_t nprobe,
142
+ size_t M,
143
+ size_t ksub,
138
144
  bool lut_is_3d,
139
- const float *LUT,
140
- const float *bias,
141
- uint8_t *LUTq, size_t M2,
142
- uint16_t *biasq,
143
- float *a_out, float *b_out)
144
- {
145
+ const float* LUT,
146
+ const float* bias,
147
+ uint8_t* LUTq,
148
+ size_t M2,
149
+ uint16_t* biasq,
150
+ float* a_out,
151
+ float* b_out) {
145
152
  float a, b;
146
153
  if (!bias) {
147
154
  FAISS_THROW_IF_NOT(!lut_is_3d);
148
155
  std::vector<float> mins(M);
149
156
  float max_span_LUT = -HUGE_VAL, max_span_dis = 0;
150
157
  b = 0;
151
- for(int i = 0; i < M; i++) {
158
+ for (int i = 0; i < M; i++) {
152
159
  mins[i] = tab_min(LUT + i * ksub, ksub);
153
160
  float span = tab_max(LUT + i * ksub, ksub) - mins[i];
154
161
  max_span_LUT = std::max(max_span_LUT, span);
@@ -157,7 +164,7 @@ void quantize_LUT_and_bias(
157
164
  }
158
165
  a = std::min(255 / max_span_LUT, 65535 / max_span_dis);
159
166
 
160
- for(int i = 0; i < M; i++) {
167
+ for (int i = 0; i < M; i++) {
161
168
  round_tab(LUT + i * ksub, ksub, a, mins[i], LUTq + i * ksub);
162
169
  }
163
170
  memset(LUTq + M * ksub, 0, ksub * (M2 - M));
@@ -168,7 +175,7 @@ void quantize_LUT_and_bias(
168
175
  float bias_max = tab_max(bias, nprobe);
169
176
  max_span_dis = bias_max - bias_min;
170
177
  b = 0;
171
- for(int i = 0; i < M; i++) {
178
+ for (int i = 0; i < M; i++) {
172
179
  mins[i] = tab_min(LUT + i * ksub, ksub);
173
180
  float span = tab_max(LUT + i * ksub, ksub) - mins[i];
174
181
  max_span_LUT = std::max(max_span_LUT, span);
@@ -178,7 +185,7 @@ void quantize_LUT_and_bias(
178
185
  a = std::min(255 / max_span_LUT, 65535 / max_span_dis);
179
186
  b += bias_min;
180
187
 
181
- for(int i = 0; i < M; i++) {
188
+ for (int i = 0; i < M; i++) {
182
189
  round_tab(LUT + i * ksub, ksub, a, mins[i], LUTq + i * ksub);
183
190
  }
184
191
  memset(LUTq + M * ksub, 0, ksub * (M2 - M));
@@ -196,7 +203,7 @@ void quantize_LUT_and_bias(
196
203
  for (int j = 0; j < nprobe; j++) {
197
204
  float max_span_dis_j = bias[j] - bias_min;
198
205
  float b2j = bias[j];
199
- for(int i = 0; i < M; i++) {
206
+ for (int i = 0; i < M; i++) {
200
207
  mins[ij] = tab_min(LUT + ij * ksub, ksub);
201
208
  float span = tab_max(LUT + ij * ksub, ksub) - mins[ij];
202
209
  max_span_LUT = std::max(max_span_LUT, span);
@@ -214,9 +221,11 @@ void quantize_LUT_and_bias(
214
221
  ij = 0;
215
222
  size_t ij_2 = 0;
216
223
  for (int j = 0; j < nprobe; j++) {
217
- for(int i = 0; i < M; i++) {
218
- round_tab(LUT + ij * ksub, ksub, a, mins[ij], LUTq + ij_2 * ksub);
219
- ij++; ij_2++;
224
+ for (int i = 0; i < M; i++) {
225
+ round_tab(
226
+ LUT + ij * ksub, ksub, a, mins[ij], LUTq + ij_2 * ksub);
227
+ ij++;
228
+ ij_2++;
220
229
  }
221
230
  memset(LUTq + ij_2 * ksub, 0, ksub * (M2 - M));
222
231
  ij_2 += M2 - M;
@@ -227,11 +236,11 @@ void quantize_LUT_and_bias(
227
236
  } else { // !biasq
228
237
  // then we integrate the bias into the LUTs
229
238
  std::vector<float> LUT2_storage(nprobe * M * ksub);
230
- float *LUT2 = LUT2_storage.data();
239
+ float* LUT2 = LUT2_storage.data();
231
240
  size_t ijc = 0;
232
241
  for (int j = 0; j < nprobe; j++) {
233
242
  float bias_j = bias[j] / M;
234
- for(int i = 0; i < M; i++) {
243
+ for (int i = 0; i < M; i++) {
235
244
  for (int c = 0; c < ksub; c++) {
236
245
  LUT2[ijc] = LUT[ijc] + bias_j;
237
246
  ijc++;
@@ -241,7 +250,7 @@ void quantize_LUT_and_bias(
241
250
  std::vector<float> mins(M, HUGE_VAL), maxs(M, -HUGE_VAL);
242
251
  size_t ij = 0;
243
252
  for (int j = 0; j < nprobe; j++) {
244
- for(int i = 0; i < M; i++) {
253
+ for (int i = 0; i < M; i++) {
245
254
  mins[i] = std::min(mins[i], tab_min(LUT2 + ij * ksub, ksub));
246
255
  maxs[i] = std::max(maxs[i], tab_max(LUT2 + ij * ksub, ksub));
247
256
  ij++;
@@ -250,7 +259,7 @@ void quantize_LUT_and_bias(
250
259
 
251
260
  float max_span = -HUGE_VAL;
252
261
  b = 0;
253
- for(int i = 0; i < M; i++) {
262
+ for (int i = 0; i < M; i++) {
254
263
  float span = maxs[i] - mins[i];
255
264
  max_span = std::max(max_span, span);
256
265
  b += mins[i];
@@ -259,19 +268,22 @@ void quantize_LUT_and_bias(
259
268
  ij = 0;
260
269
  size_t ij_2 = 0;
261
270
  for (int j = 0; j < nprobe; j++) {
262
- for(int i = 0; i < M; i++) {
263
- round_tab(LUT2 + ij * ksub, ksub, a, mins[i], LUTq + ij_2 * ksub);
264
- ij++; ij_2++;
271
+ for (int i = 0; i < M; i++) {
272
+ round_tab(
273
+ LUT2 + ij * ksub, ksub, a, mins[i], LUTq + ij_2 * ksub);
274
+ ij++;
275
+ ij_2++;
265
276
  }
266
277
  memset(LUTq + ij_2 * ksub, 0, ksub * (M2 - M));
267
278
  ij_2 += M2 - M;
268
279
  }
269
280
  }
270
- if (a_out) *a_out = a;
271
- if (b_out) *b_out = b;
281
+ if (a_out)
282
+ *a_out = a;
283
+ if (b_out)
284
+ *b_out = b;
272
285
  }
273
286
 
274
-
275
287
  } // namespace quantize_lut
276
288
 
277
289
  } // namespace faiss
@@ -5,12 +5,10 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
8
  #pragma once
10
9
 
11
-
12
- #include <cstdio>
13
10
  #include <cstdint>
11
+ #include <cstdio>
14
12
 
15
13
  namespace faiss {
16
14
 
@@ -32,19 +30,23 @@ namespace quantize_lut {
32
30
  * @param tab input/output, size (n, d)
33
31
  */
34
32
  void round_uint8_per_column(
35
- float *tab, size_t n, size_t d,
36
- float *a_out = nullptr,
37
- float *b_out = nullptr
38
- );
39
-
33
+ float* tab,
34
+ size_t n,
35
+ size_t d,
36
+ float* a_out = nullptr,
37
+ float* b_out = nullptr);
40
38
 
41
39
  /* affine quantizer, a and b are the affine coefficients
42
40
  *
43
41
  * @param tab input/output, size (m, n, d)
44
42
  */
45
43
  void round_uint8_per_column_multi(
46
- float *tab, size_t m, size_t n, size_t d,
47
- float *a_out = nullptr, float *b_out = nullptr);
44
+ float* tab,
45
+ size_t m,
46
+ size_t n,
47
+ size_t d,
48
+ float* a_out = nullptr,
49
+ float* b_out = nullptr);
48
50
 
49
51
  /** LUT quantization to uint8 and bias to uint16.
50
52
  *
@@ -63,18 +65,18 @@ void round_uint8_per_column_multi(
63
65
  */
64
66
 
65
67
  void quantize_LUT_and_bias(
66
- size_t nprobe, size_t M, size_t ksub,
68
+ size_t nprobe,
69
+ size_t M,
70
+ size_t ksub,
67
71
  bool lut_is_3d,
68
- const float *LUT,
69
- const float *bias,
70
- uint8_t *LUTq, size_t M2,
71
- uint16_t *biasq,
72
- float *a_out = nullptr, float *b_out = nullptr
73
- );
74
-
72
+ const float* LUT,
73
+ const float* bias,
74
+ uint8_t* LUTq,
75
+ size_t M2,
76
+ uint16_t* biasq,
77
+ float* a_out = nullptr,
78
+ float* b_out = nullptr);
75
79
 
76
80
  } // namespace quantize_lut
77
81
 
78
82
  } // namespace faiss
79
-
80
-
@@ -15,79 +15,67 @@ namespace faiss {
15
15
  * Random data generation functions
16
16
  **************************************************/
17
17
 
18
- RandomGenerator::RandomGenerator (int64_t seed)
19
- : mt((unsigned int)seed) {}
18
+ RandomGenerator::RandomGenerator(int64_t seed) : mt((unsigned int)seed) {}
20
19
 
21
- int RandomGenerator::rand_int ()
22
- {
20
+ int RandomGenerator::rand_int() {
23
21
  return mt() & 0x7fffffff;
24
22
  }
25
23
 
26
- int64_t RandomGenerator::rand_int64 ()
27
- {
24
+ int64_t RandomGenerator::rand_int64() {
28
25
  return int64_t(rand_int()) | int64_t(rand_int()) << 31;
29
26
  }
30
27
 
31
- int RandomGenerator::rand_int (int max)
32
- {
28
+ int RandomGenerator::rand_int(int max) {
33
29
  return mt() % max;
34
30
  }
35
31
 
36
- float RandomGenerator::rand_float ()
37
- {
32
+ float RandomGenerator::rand_float() {
38
33
  return mt() / float(mt.max());
39
34
  }
40
35
 
41
- double RandomGenerator::rand_double ()
42
- {
36
+ double RandomGenerator::rand_double() {
43
37
  return mt() / double(mt.max());
44
38
  }
45
39
 
46
-
47
40
  /***********************************************************************
48
41
  * Random functions in this C file only exist because Torch
49
42
  * counterparts are slow and not multi-threaded. Typical use is for
50
43
  * more than 1-100 billion values. */
51
44
 
52
-
53
45
  /* Generate a set of random floating point values such that x[i] in [0,1]
54
46
  multi-threading. For this reason, we rely on re-entreant functions. */
55
- void float_rand (float * x, size_t n, int64_t seed)
56
- {
47
+ void float_rand(float* x, size_t n, int64_t seed) {
57
48
  // only try to parallelize on large enough arrays
58
49
  const size_t nblock = n < 1024 ? 1 : 1024;
59
50
 
60
- RandomGenerator rng0 (seed);
61
- int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
51
+ RandomGenerator rng0(seed);
52
+ int a0 = rng0.rand_int(), b0 = rng0.rand_int();
62
53
 
63
54
  #pragma omp parallel for
64
55
  for (int64_t j = 0; j < nblock; j++) {
65
-
66
- RandomGenerator rng (a0 + j * b0);
56
+ RandomGenerator rng(a0 + j * b0);
67
57
 
68
58
  const size_t istart = j * n / nblock;
69
59
  const size_t iend = (j + 1) * n / nblock;
70
60
 
71
61
  for (size_t i = istart; i < iend; i++)
72
- x[i] = rng.rand_float ();
62
+ x[i] = rng.rand_float();
73
63
  }
74
64
  }
75
65
 
76
-
77
- void float_randn (float * x, size_t n, int64_t seed)
78
- {
66
+ void float_randn(float* x, size_t n, int64_t seed) {
79
67
  // only try to parallelize on large enough arrays
80
68
  const size_t nblock = n < 1024 ? 1 : 1024;
81
69
 
82
- RandomGenerator rng0 (seed);
83
- int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
70
+ RandomGenerator rng0(seed);
71
+ int a0 = rng0.rand_int(), b0 = rng0.rand_int();
84
72
 
85
73
  #pragma omp parallel for
86
74
  for (int64_t j = 0; j < nblock; j++) {
87
- RandomGenerator rng (a0 + j * b0);
75
+ RandomGenerator rng(a0 + j * b0);
88
76
 
89
77
  double a = 0, b = 0, s = 0;
90
- int state = 0; /* generate two number per "do-while" loop */
78
+ int state = 0; /* generate two number per "do-while" loop */
91
79
 
92
80
  const size_t istart = j * n / nblock;
93
81
  const size_t iend = (j + 1) * n / nblock;
@@ -96,96 +84,84 @@ void float_randn (float * x, size_t n, int64_t seed)
96
84
  /* Marsaglia's method (see Knuth) */
97
85
  if (state == 0) {
98
86
  do {
99
- a = 2.0 * rng.rand_double () - 1;
100
- b = 2.0 * rng.rand_double () - 1;
87
+ a = 2.0 * rng.rand_double() - 1;
88
+ b = 2.0 * rng.rand_double() - 1;
101
89
  s = a * a + b * b;
102
90
  } while (s >= 1.0);
103
91
  x[i] = a * sqrt(-2.0 * log(s) / s);
104
- }
105
- else
92
+ } else
106
93
  x[i] = b * sqrt(-2.0 * log(s) / s);
107
94
  state = 1 - state;
108
95
  }
109
96
  }
110
97
  }
111
98
 
112
-
113
99
  /* Integer versions */
114
- void int64_rand (int64_t * x, size_t n, int64_t seed)
115
- {
100
+ void int64_rand(int64_t* x, size_t n, int64_t seed) {
116
101
  // only try to parallelize on large enough arrays
117
102
  const size_t nblock = n < 1024 ? 1 : 1024;
118
103
 
119
- RandomGenerator rng0 (seed);
120
- int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
104
+ RandomGenerator rng0(seed);
105
+ int a0 = rng0.rand_int(), b0 = rng0.rand_int();
121
106
 
122
107
  #pragma omp parallel for
123
108
  for (int64_t j = 0; j < nblock; j++) {
124
-
125
- RandomGenerator rng (a0 + j * b0);
109
+ RandomGenerator rng(a0 + j * b0);
126
110
 
127
111
  const size_t istart = j * n / nblock;
128
112
  const size_t iend = (j + 1) * n / nblock;
129
113
  for (size_t i = istart; i < iend; i++)
130
- x[i] = rng.rand_int64 ();
114
+ x[i] = rng.rand_int64();
131
115
  }
132
116
  }
133
117
 
134
- void int64_rand_max (int64_t * x, size_t n, uint64_t max, int64_t seed)
135
- {
118
+ void int64_rand_max(int64_t* x, size_t n, uint64_t max, int64_t seed) {
136
119
  // only try to parallelize on large enough arrays
137
120
  const size_t nblock = n < 1024 ? 1 : 1024;
138
121
 
139
- RandomGenerator rng0 (seed);
140
- int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
122
+ RandomGenerator rng0(seed);
123
+ int a0 = rng0.rand_int(), b0 = rng0.rand_int();
141
124
 
142
125
  #pragma omp parallel for
143
126
  for (int64_t j = 0; j < nblock; j++) {
144
-
145
- RandomGenerator rng (a0 + j * b0);
127
+ RandomGenerator rng(a0 + j * b0);
146
128
 
147
129
  const size_t istart = j * n / nblock;
148
130
  const size_t iend = (j + 1) * n / nblock;
149
131
  for (size_t i = istart; i < iend; i++)
150
- x[i] = rng.rand_int64 () % max;
132
+ x[i] = rng.rand_int64() % max;
151
133
  }
152
134
  }
153
135
 
136
+ void rand_perm(int* perm, size_t n, int64_t seed) {
137
+ for (size_t i = 0; i < n; i++)
138
+ perm[i] = i;
154
139
 
155
- void rand_perm (int *perm, size_t n, int64_t seed)
156
- {
157
- for (size_t i = 0; i < n; i++) perm[i] = i;
158
-
159
- RandomGenerator rng (seed);
140
+ RandomGenerator rng(seed);
160
141
 
161
142
  for (size_t i = 0; i + 1 < n; i++) {
162
- int i2 = i + rng.rand_int (n - i);
143
+ int i2 = i + rng.rand_int(n - i);
163
144
  std::swap(perm[i], perm[i2]);
164
145
  }
165
146
  }
166
147
 
167
-
168
-
169
-
170
- void byte_rand (uint8_t * x, size_t n, int64_t seed)
171
- {
148
+ void byte_rand(uint8_t* x, size_t n, int64_t seed) {
172
149
  // only try to parallelize on large enough arrays
173
150
  const size_t nblock = n < 1024 ? 1 : 1024;
174
151
 
175
- RandomGenerator rng0 (seed);
176
- int a0 = rng0.rand_int (), b0 = rng0.rand_int ();
152
+ RandomGenerator rng0(seed);
153
+ int a0 = rng0.rand_int(), b0 = rng0.rand_int();
177
154
 
178
155
  #pragma omp parallel for
179
156
  for (int64_t j = 0; j < nblock; j++) {
180
-
181
- RandomGenerator rng (a0 + j * b0);
157
+ RandomGenerator rng(a0 + j * b0);
182
158
 
183
159
  const size_t istart = j * n / nblock;
184
160
  const size_t iend = (j + 1) * n / nblock;
185
161
 
186
162
  size_t i;
187
163
  for (i = istart; i < iend; i++)
188
- x[i] = rng.rand_int64 ();
164
+ x[i] = rng.rand_int64();
189
165
  }
190
166
  }
191
167