faiss 0.2.0 → 0.2.1

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/faiss/version.rb +1 -1
  4. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  5. data/vendor/faiss/faiss/AutoTune.h +55 -56
  6. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  7. data/vendor/faiss/faiss/Clustering.h +88 -35
  8. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  9. data/vendor/faiss/faiss/IVFlib.h +48 -51
  10. data/vendor/faiss/faiss/Index.cpp +85 -103
  11. data/vendor/faiss/faiss/Index.h +54 -48
  12. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  13. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  14. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  15. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  16. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  17. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  18. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  19. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  20. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  21. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  22. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  23. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  24. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  25. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  26. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  27. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  28. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  29. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  30. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  31. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  32. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  33. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  34. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  35. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  36. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  37. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  38. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  39. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  40. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +125 -133
  41. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  42. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  43. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  44. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  45. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  46. data/vendor/faiss/faiss/IndexNNDescent.cpp +231 -0
  47. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  48. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  49. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  50. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  51. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  52. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  53. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  54. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  55. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  56. data/vendor/faiss/faiss/IndexRefine.cpp +115 -131
  57. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  58. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  59. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  60. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  61. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  62. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  63. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  64. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  65. data/vendor/faiss/faiss/IndexShards.h +85 -73
  66. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  67. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  68. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  69. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  70. data/vendor/faiss/faiss/MetricType.h +7 -7
  71. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  72. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  73. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  74. data/vendor/faiss/faiss/clone_index.h +4 -9
  75. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  76. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  77. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  78. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  79. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  80. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  81. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  82. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  83. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  84. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  85. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  86. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  87. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  88. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  89. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  90. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  91. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  92. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  93. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  94. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  95. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  96. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  97. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  98. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  99. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  100. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  101. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  102. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  103. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  104. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  105. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  109. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  110. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  111. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  112. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  113. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  114. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  115. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  116. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  117. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  118. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  119. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  120. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  121. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  122. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  123. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  124. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  125. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  126. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  127. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  128. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  129. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  130. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  131. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  132. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  133. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  134. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  135. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  136. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  137. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  138. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  139. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  140. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  141. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  142. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  143. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  144. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  145. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  146. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  147. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  148. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  149. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  150. data/vendor/faiss/faiss/impl/io.h +31 -41
  151. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  152. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  153. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  154. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  155. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  156. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  157. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  158. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  159. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  160. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  161. data/vendor/faiss/faiss/index_factory.h +6 -7
  162. data/vendor/faiss/faiss/index_io.h +23 -26
  163. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  164. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  165. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  166. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  167. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  168. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  169. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  170. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  171. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  172. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  173. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  174. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  175. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  176. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  177. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  178. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  179. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  180. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  181. data/vendor/faiss/faiss/utils/distances.h +133 -118
  182. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  183. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  184. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  185. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  186. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  187. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  188. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  189. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  190. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  191. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  192. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  193. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  194. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  195. data/vendor/faiss/faiss/utils/random.h +13 -16
  196. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  197. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  198. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  199. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  200. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  201. data/vendor/faiss/faiss/utils/utils.h +53 -48
  202. metadata +20 -2
@@ -9,11 +9,12 @@
9
9
 
10
10
  #include <faiss/Index2Layer.h>
11
11
 
12
+ #include <faiss/impl/platform_macros.h>
13
+ #include <stdint.h>
14
+ #include <cassert>
12
15
  #include <cinttypes>
13
16
  #include <cmath>
14
17
  #include <cstdio>
15
- #include <cassert>
16
- #include <stdint.h>
17
18
 
18
19
  #ifdef __SSE3__
19
20
  #include <immintrin.h>
@@ -23,12 +24,11 @@
23
24
 
24
25
  #include <faiss/IndexIVFPQ.h>
25
26
 
26
- #include <faiss/impl/FaissAssert.h>
27
- #include <faiss/utils/utils.h>
28
- #include <faiss/impl/AuxIndexStructures.h>
29
27
  #include <faiss/IndexFlat.h>
28
+ #include <faiss/impl/AuxIndexStructures.h>
29
+ #include <faiss/impl/FaissAssert.h>
30
30
  #include <faiss/utils/distances.h>
31
-
31
+ #include <faiss/utils/utils.h>
32
32
 
33
33
  /*
34
34
  #include <faiss/utils/Heap.h>
@@ -40,22 +40,21 @@
40
40
 
41
41
  */
42
42
 
43
-
44
43
  namespace faiss {
45
44
 
46
-
47
45
  /*************************************
48
46
  * Index2Layer implementation
49
47
  *************************************/
50
48
 
51
-
52
- Index2Layer::Index2Layer (Index * quantizer, size_t nlist,
53
- int M, int nbit,
54
- MetricType metric):
55
- Index (quantizer->d, metric),
56
- q1 (quantizer, nlist),
57
- pq (quantizer->d, M, nbit)
58
- {
49
+ Index2Layer::Index2Layer(
50
+ Index* quantizer,
51
+ size_t nlist,
52
+ int M,
53
+ int nbit,
54
+ MetricType metric)
55
+ : Index(quantizer->d, metric),
56
+ q1(quantizer, nlist),
57
+ pq(quantizer->d, M, nbit) {
59
58
  is_trained = false;
60
59
  for (int nbyte = 0; nbyte < 7; nbyte++) {
61
60
  if ((1L << (8 * nbyte)) >= nlist) {
@@ -67,122 +66,125 @@ Index2Layer::Index2Layer (Index * quantizer, size_t nlist,
67
66
  code_size = code_size_1 + code_size_2;
68
67
  }
69
68
 
70
- Index2Layer::Index2Layer ()
71
- {
69
+ Index2Layer::Index2Layer() {
72
70
  code_size = code_size_1 = code_size_2 = 0;
73
71
  }
74
72
 
75
- Index2Layer::~Index2Layer ()
76
- {}
73
+ Index2Layer::~Index2Layer() {}
77
74
 
78
- void Index2Layer::train(idx_t n, const float* x)
79
- {
75
+ void Index2Layer::train(idx_t n, const float* x) {
80
76
  if (verbose) {
81
- printf ("training level-1 quantizer %" PRId64 " vectors in %dD\n",
82
- n, d);
77
+ printf("training level-1 quantizer %" PRId64 " vectors in %dD\n", n, d);
83
78
  }
84
79
 
85
- q1.train_q1 (n, x, verbose, metric_type);
80
+ q1.train_q1(n, x, verbose, metric_type);
86
81
 
87
82
  if (verbose) {
88
83
  printf("computing residuals\n");
89
84
  }
90
85
 
91
- const float * x_in = x;
86
+ const float* x_in = x;
92
87
 
93
- x = fvecs_maybe_subsample (
94
- d, (size_t*)&n, pq.cp.max_points_per_centroid * pq.ksub,
95
- x, verbose, pq.cp.seed);
88
+ x = fvecs_maybe_subsample(
89
+ d,
90
+ (size_t*)&n,
91
+ pq.cp.max_points_per_centroid * pq.ksub,
92
+ x,
93
+ verbose,
94
+ pq.cp.seed);
96
95
 
97
- ScopeDeleter<float> del_x (x_in == x ? nullptr : x);
96
+ ScopeDeleter<float> del_x(x_in == x ? nullptr : x);
98
97
 
99
98
  std::vector<idx_t> assign(n); // assignement to coarse centroids
100
- q1.quantizer->assign (n, x, assign.data());
99
+ q1.quantizer->assign(n, x, assign.data());
101
100
  std::vector<float> residuals(n * d);
102
101
  for (idx_t i = 0; i < n; i++) {
103
- q1.quantizer->compute_residual (
104
- x + i * d, residuals.data() + i * d, assign[i]);
102
+ q1.quantizer->compute_residual(
103
+ x + i * d, residuals.data() + i * d, assign[i]);
105
104
  }
106
105
 
107
106
  if (verbose)
108
- printf ("training %zdx%zd product quantizer on %" PRId64 " vectors in %dD\n",
109
- pq.M, pq.ksub, n, d);
107
+ printf("training %zdx%zd product quantizer on %" PRId64
108
+ " vectors in %dD\n",
109
+ pq.M,
110
+ pq.ksub,
111
+ n,
112
+ d);
110
113
  pq.verbose = verbose;
111
- pq.train (n, residuals.data());
114
+ pq.train(n, residuals.data());
112
115
 
113
116
  is_trained = true;
114
117
  }
115
118
 
116
- void Index2Layer::add(idx_t n, const float* x)
117
- {
119
+ void Index2Layer::add(idx_t n, const float* x) {
118
120
  idx_t bs = 32768;
119
121
  if (n > bs) {
120
122
  for (idx_t i0 = 0; i0 < n; i0 += bs) {
121
123
  idx_t i1 = std::min(i0 + bs, n);
122
124
  if (verbose) {
123
- printf("Index2Layer::add: adding %" PRId64 ":%" PRId64 " / %" PRId64 "\n",
124
- i0, i1, n);
125
+ printf("Index2Layer::add: adding %" PRId64 ":%" PRId64
126
+ " / %" PRId64 "\n",
127
+ i0,
128
+ i1,
129
+ n);
125
130
  }
126
- add (i1 - i0, x + i0 * d);
131
+ add(i1 - i0, x + i0 * d);
127
132
  }
128
133
  return;
129
134
  }
130
135
 
131
- std::vector<idx_t> codes1 (n);
132
- q1.quantizer->assign (n, x, codes1.data());
136
+ std::vector<idx_t> codes1(n);
137
+ q1.quantizer->assign(n, x, codes1.data());
133
138
  std::vector<float> residuals(n * d);
134
139
  for (idx_t i = 0; i < n; i++) {
135
- q1.quantizer->compute_residual (
136
- x + i * d, residuals.data() + i * d, codes1[i]);
140
+ q1.quantizer->compute_residual(
141
+ x + i * d, residuals.data() + i * d, codes1[i]);
137
142
  }
138
- std::vector<uint8_t> codes2 (n * code_size_2);
143
+ std::vector<uint8_t> codes2(n * code_size_2);
139
144
 
140
- pq.compute_codes (residuals.data(), codes2.data(), n);
145
+ pq.compute_codes(residuals.data(), codes2.data(), n);
141
146
 
142
- codes.resize ((ntotal + n) * code_size);
143
- uint8_t *wp = &codes[ntotal * code_size];
147
+ codes.resize((ntotal + n) * code_size);
148
+ uint8_t* wp = &codes[ntotal * code_size];
144
149
 
145
150
  {
146
151
  int i = 0x11223344;
147
- const char *ip = (char*)&i;
148
- FAISS_THROW_IF_NOT_MSG (ip[0] == 0x44,
149
- "works only on a little-endian CPU");
152
+ const char* ip = (char*)&i;
153
+ FAISS_THROW_IF_NOT_MSG(
154
+ ip[0] == 0x44, "works only on a little-endian CPU");
150
155
  }
151
156
 
152
157
  // copy to output table
153
158
  for (idx_t i = 0; i < n; i++) {
154
- memcpy (wp, &codes1[i], code_size_1);
159
+ memcpy(wp, &codes1[i], code_size_1);
155
160
  wp += code_size_1;
156
- memcpy (wp, &codes2[i * code_size_2], code_size_2);
161
+ memcpy(wp, &codes2[i * code_size_2], code_size_2);
157
162
  wp += code_size_2;
158
163
  }
159
164
 
160
165
  ntotal += n;
161
-
162
166
  }
163
167
 
164
168
  void Index2Layer::search(
165
- idx_t /*n*/,
166
- const float* /*x*/,
167
- idx_t /*k*/,
168
- float* /*distances*/,
169
- idx_t* /*labels*/) const {
170
- FAISS_THROW_MSG("not implemented");
169
+ idx_t /*n*/,
170
+ const float* /*x*/,
171
+ idx_t /*k*/,
172
+ float* /*distances*/,
173
+ idx_t* /*labels*/) const {
174
+ FAISS_THROW_MSG("not implemented");
171
175
  }
172
176
 
173
-
174
- void Index2Layer::reconstruct_n(idx_t i0, idx_t ni, float* recons) const
175
- {
177
+ void Index2Layer::reconstruct_n(idx_t i0, idx_t ni, float* recons) const {
176
178
  std::vector<float> recons1(d);
177
- FAISS_THROW_IF_NOT (i0 >= 0 && i0 + ni <= ntotal);
178
- const uint8_t *rp = &codes[i0 * code_size];
179
+ FAISS_THROW_IF_NOT(i0 >= 0 && i0 + ni <= ntotal);
180
+ const uint8_t* rp = &codes[i0 * code_size];
179
181
 
180
182
  for (idx_t i = 0; i < ni; i++) {
181
183
  idx_t key = 0;
182
- memcpy (&key, rp, code_size_1);
183
- q1.quantizer->reconstruct (key, recons1.data());
184
+ memcpy(&key, rp, code_size_1);
185
+ q1.quantizer->reconstruct(key, recons1.data());
184
186
  rp += code_size_1;
185
- pq.decode (rp, recons);
187
+ pq.decode(rp, recons);
186
188
  for (idx_t j = 0; j < d; j++) {
187
189
  recons[j] += recons1[j];
188
190
  }
@@ -191,53 +193,44 @@ void Index2Layer::reconstruct_n(idx_t i0, idx_t ni, float* recons) const
191
193
  }
192
194
  }
193
195
 
194
- void Index2Layer::transfer_to_IVFPQ (IndexIVFPQ & other) const
195
- {
196
- FAISS_THROW_IF_NOT (other.nlist == q1.nlist);
197
- FAISS_THROW_IF_NOT (other.code_size == code_size_2);
198
- FAISS_THROW_IF_NOT (other.ntotal == 0);
196
+ void Index2Layer::transfer_to_IVFPQ(IndexIVFPQ& other) const {
197
+ FAISS_THROW_IF_NOT(other.nlist == q1.nlist);
198
+ FAISS_THROW_IF_NOT(other.code_size == code_size_2);
199
+ FAISS_THROW_IF_NOT(other.ntotal == 0);
199
200
 
200
- const uint8_t *rp = codes.data();
201
+ const uint8_t* rp = codes.data();
201
202
 
202
203
  for (idx_t i = 0; i < ntotal; i++) {
203
204
  idx_t key = 0;
204
- memcpy (&key, rp, code_size_1);
205
+ memcpy(&key, rp, code_size_1);
205
206
  rp += code_size_1;
206
- other.invlists->add_entry (key, i, rp);
207
+ other.invlists->add_entry(key, i, rp);
207
208
  rp += code_size_2;
208
209
  }
209
210
 
210
211
  other.ntotal = ntotal;
211
-
212
212
  }
213
213
 
214
-
215
-
216
- void Index2Layer::reconstruct(idx_t key, float* recons) const
217
- {
218
- reconstruct_n (key, 1, recons);
214
+ void Index2Layer::reconstruct(idx_t key, float* recons) const {
215
+ reconstruct_n(key, 1, recons);
219
216
  }
220
217
 
221
- void Index2Layer::reset()
222
- {
218
+ void Index2Layer::reset() {
223
219
  ntotal = 0;
224
- codes.clear ();
220
+ codes.clear();
225
221
  }
226
222
 
227
-
228
223
  namespace {
229
224
 
230
-
231
225
  struct Distance2Level : DistanceComputer {
232
226
  size_t d;
233
227
  const Index2Layer& storage;
234
228
  std::vector<float> buf;
235
- const float *q;
229
+ const float* q;
236
230
 
237
231
  const float *pq_l1_tab, *pq_l2_tab;
238
232
 
239
- explicit Distance2Level(const Index2Layer& storage)
240
- : storage(storage) {
233
+ explicit Distance2Level(const Index2Layer& storage) : storage(storage) {
241
234
  d = storage.d;
242
235
  FAISS_ASSERT(storage.pq.dsub == 4);
243
236
  pq_l2_tab = storage.pq.centroids.data();
@@ -250,67 +243,64 @@ struct Distance2Level : DistanceComputer {
250
243
  return fvec_L2sqr(buf.data() + d, buf.data(), d);
251
244
  }
252
245
 
253
- void set_query(const float *x) override {
246
+ void set_query(const float* x) override {
254
247
  q = x;
255
248
  }
256
249
  };
257
250
 
258
251
  // well optimized for xNN+PQNN
259
252
  struct DistanceXPQ4 : Distance2Level {
260
-
261
253
  int M, k;
262
254
 
263
255
  explicit DistanceXPQ4(const Index2Layer& storage)
264
- : Distance2Level (storage) {
265
- const IndexFlat *quantizer =
266
- dynamic_cast<IndexFlat*> (storage.q1.quantizer);
256
+ : Distance2Level(storage) {
257
+ const IndexFlat* quantizer =
258
+ dynamic_cast<IndexFlat*>(storage.q1.quantizer);
267
259
 
268
260
  FAISS_ASSERT(quantizer);
269
261
  M = storage.pq.M;
270
262
  pq_l1_tab = quantizer->xb.data();
271
263
  }
272
264
 
273
- float operator () (idx_t i) override {
265
+ float operator()(idx_t i) override {
274
266
  #ifdef __SSE3__
275
- const uint8_t *code = storage.codes.data() + i * storage.code_size;
267
+ const uint8_t* code = storage.codes.data() + i * storage.code_size;
276
268
  long key = 0;
277
- memcpy (&key, code, storage.code_size_1);
269
+ memcpy(&key, code, storage.code_size_1);
278
270
  code += storage.code_size_1;
279
271
 
280
272
  // walking pointers
281
- const float *qa = q;
282
- const __m128 *l1_t = (const __m128 *)(pq_l1_tab + d * key);
283
- const __m128 *pq_l2_t = (const __m128 *)pq_l2_tab;
273
+ const float* qa = q;
274
+ const __m128* l1_t = (const __m128*)(pq_l1_tab + d * key);
275
+ const __m128* pq_l2_t = (const __m128*)pq_l2_tab;
284
276
  __m128 accu = _mm_setzero_ps();
285
277
 
286
278
  for (int m = 0; m < M; m++) {
287
279
  __m128 qi = _mm_loadu_ps(qa);
288
- __m128 recons = l1_t[m] + pq_l2_t[*code++];
289
- __m128 diff = qi - recons;
290
- accu += diff * diff;
280
+ __m128 recons = _mm_add_ps(l1_t[m], pq_l2_t[*code++]);
281
+ __m128 diff = _mm_sub_ps(qi, recons);
282
+ accu = _mm_add_ps(accu, _mm_mul_ps(diff, diff));
291
283
  pq_l2_t += 256;
292
284
  qa += 4;
293
285
  }
294
286
 
295
- accu = _mm_hadd_ps (accu, accu);
296
- accu = _mm_hadd_ps (accu, accu);
297
- return _mm_cvtss_f32 (accu);
287
+ accu = _mm_hadd_ps(accu, accu);
288
+ accu = _mm_hadd_ps(accu, accu);
289
+ return _mm_cvtss_f32(accu);
298
290
  #else
299
291
  FAISS_THROW_MSG("not implemented for non-x64 platforms");
300
292
  #endif
301
293
  }
302
-
303
294
  };
304
295
 
305
296
  // well optimized for 2xNN+PQNN
306
297
  struct Distance2xXPQ4 : Distance2Level {
307
-
308
298
  int M_2, mi_nbits;
309
299
 
310
300
  explicit Distance2xXPQ4(const Index2Layer& storage)
311
- : Distance2Level(storage) {
312
- const MultiIndexQuantizer *mi =
313
- dynamic_cast<MultiIndexQuantizer*> (storage.q1.quantizer);
301
+ : Distance2Level(storage) {
302
+ const MultiIndexQuantizer* mi =
303
+ dynamic_cast<MultiIndexQuantizer*>(storage.q1.quantizer);
314
304
 
315
305
  FAISS_ASSERT(mi);
316
306
  FAISS_ASSERT(storage.pq.M % 2 == 0);
@@ -319,59 +309,55 @@ struct Distance2xXPQ4 : Distance2Level {
319
309
  pq_l1_tab = mi->pq.centroids.data();
320
310
  }
321
311
 
322
- float operator () (idx_t i) override {
323
- const uint8_t *code = storage.codes.data() + i * storage.code_size;
312
+ float operator()(idx_t i) override {
313
+ const uint8_t* code = storage.codes.data() + i * storage.code_size;
324
314
  long key01 = 0;
325
- memcpy (&key01, code, storage.code_size_1);
315
+ memcpy(&key01, code, storage.code_size_1);
326
316
  code += storage.code_size_1;
327
317
  #ifdef __SSE3__
328
318
 
329
319
  // walking pointers
330
- const float *qa = q;
331
- const __m128 *pq_l1_t = (const __m128 *)pq_l1_tab;
332
- const __m128 *pq_l2_t = (const __m128 *)pq_l2_tab;
320
+ const float* qa = q;
321
+ const __m128* pq_l1_t = (const __m128*)pq_l1_tab;
322
+ const __m128* pq_l2_t = (const __m128*)pq_l2_tab;
333
323
  __m128 accu = _mm_setzero_ps();
334
324
 
335
325
  for (int mi_m = 0; mi_m < 2; mi_m++) {
336
326
  long l1_idx = key01 & ((1L << mi_nbits) - 1);
337
- const __m128 * pq_l1 = pq_l1_t + M_2 * l1_idx;
327
+ const __m128* pq_l1 = pq_l1_t + M_2 * l1_idx;
338
328
 
339
329
  for (int m = 0; m < M_2; m++) {
340
330
  __m128 qi = _mm_loadu_ps(qa);
341
- __m128 recons = pq_l1[m] + pq_l2_t[*code++];
342
- __m128 diff = qi - recons;
343
- accu += diff * diff;
331
+ __m128 recons = _mm_add_ps(pq_l1[m], pq_l2_t[*code++]);
332
+ __m128 diff = _mm_sub_ps(qi, recons);
333
+ accu = _mm_add_ps(accu, _mm_mul_ps(diff, diff));
344
334
  pq_l2_t += 256;
345
335
  qa += 4;
346
336
  }
347
337
  pq_l1_t += M_2 << mi_nbits;
348
338
  key01 >>= mi_nbits;
349
339
  }
350
- accu = _mm_hadd_ps (accu, accu);
351
- accu = _mm_hadd_ps (accu, accu);
352
- return _mm_cvtss_f32 (accu);
340
+ accu = _mm_hadd_ps(accu, accu);
341
+ accu = _mm_hadd_ps(accu, accu);
342
+ return _mm_cvtss_f32(accu);
353
343
  #else
354
344
  FAISS_THROW_MSG("not implemented for non-x64 platforms");
355
345
  #endif
356
346
  }
357
-
358
347
  };
359
348
 
349
+ } // namespace
360
350
 
361
- } // namespace
362
-
363
-
364
- DistanceComputer * Index2Layer::get_distance_computer() const {
351
+ DistanceComputer* Index2Layer::get_distance_computer() const {
365
352
  #ifdef __SSE3__
366
- const MultiIndexQuantizer *mi =
367
- dynamic_cast<MultiIndexQuantizer*> (q1.quantizer);
353
+ const MultiIndexQuantizer* mi =
354
+ dynamic_cast<MultiIndexQuantizer*>(q1.quantizer);
368
355
 
369
356
  if (mi && pq.M % 2 == 0 && pq.dsub == 4) {
370
357
  return new Distance2xXPQ4(*this);
371
358
  }
372
359
 
373
- const IndexFlat *fl =
374
- dynamic_cast<IndexFlat*> (q1.quantizer);
360
+ const IndexFlat* fl = dynamic_cast<IndexFlat*>(q1.quantizer);
375
361
 
376
362
  if (fl && pq.dsub == 4) {
377
363
  return new DistanceXPQ4(*this);
@@ -381,57 +367,46 @@ DistanceComputer * Index2Layer::get_distance_computer() const {
381
367
  return Index::get_distance_computer();
382
368
  }
383
369
 
384
-
385
370
  /* The standalone codec interface */
386
- size_t Index2Layer::sa_code_size () const
387
- {
371
+ size_t Index2Layer::sa_code_size() const {
388
372
  return code_size;
389
373
  }
390
374
 
391
- void Index2Layer::sa_encode (idx_t n, const float *x, uint8_t *bytes) const
392
- {
393
- FAISS_THROW_IF_NOT (is_trained);
394
- std::unique_ptr<int64_t []> list_nos (new int64_t [n]);
395
- q1.quantizer->assign (n, x, list_nos.get());
375
+ void Index2Layer::sa_encode(idx_t n, const float* x, uint8_t* bytes) const {
376
+ FAISS_THROW_IF_NOT(is_trained);
377
+ std::unique_ptr<int64_t[]> list_nos(new int64_t[n]);
378
+ q1.quantizer->assign(n, x, list_nos.get());
396
379
  std::vector<float> residuals(n * d);
397
380
  for (idx_t i = 0; i < n; i++) {
398
- q1.quantizer->compute_residual (
399
- x + i * d, residuals.data() + i * d, list_nos[i]);
381
+ q1.quantizer->compute_residual(
382
+ x + i * d, residuals.data() + i * d, list_nos[i]);
400
383
  }
401
- pq.compute_codes (residuals.data(), bytes, n);
384
+ pq.compute_codes(residuals.data(), bytes, n);
402
385
 
403
386
  for (idx_t i = n - 1; i >= 0; i--) {
404
- uint8_t * code = bytes + i * code_size;
405
- memmove (code + code_size_1,
406
- bytes + i * code_size_2, code_size_2);
407
- q1.encode_listno (list_nos[i], code);
387
+ uint8_t* code = bytes + i * code_size;
388
+ memmove(code + code_size_1, bytes + i * code_size_2, code_size_2);
389
+ q1.encode_listno(list_nos[i], code);
408
390
  }
409
-
410
391
  }
411
392
 
412
- void Index2Layer::sa_decode (idx_t n, const uint8_t *bytes, float *x) const
413
- {
414
-
393
+ void Index2Layer::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
415
394
  #pragma omp parallel
416
395
  {
417
- std::vector<float> residual (d);
396
+ std::vector<float> residual(d);
418
397
 
419
398
  #pragma omp for
420
399
  for (idx_t i = 0; i < n; i++) {
421
- const uint8_t *code = bytes + i * code_size;
422
- int64_t list_no = q1.decode_listno (code);
423
- float *xi = x + i * d;
424
- pq.decode (code + code_size_1, xi);
425
- q1.quantizer->reconstruct (list_no, residual.data());
400
+ const uint8_t* code = bytes + i * code_size;
401
+ int64_t list_no = q1.decode_listno(code);
402
+ float* xi = x + i * d;
403
+ pq.decode(code + code_size_1, xi);
404
+ q1.quantizer->reconstruct(list_no, residual.data());
426
405
  for (int j = 0; j < d; j++) {
427
406
  xi[j] += residual[j];
428
407
  }
429
408
  }
430
409
  }
431
-
432
410
  }
433
411
 
434
-
435
-
436
-
437
412
  } // namespace faiss