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
@@ -9,142 +9,130 @@
9
9
 
10
10
  #include <faiss/invlists/DirectMap.h>
11
11
 
12
- #include <cstdio>
13
12
  #include <cassert>
13
+ #include <cstdio>
14
14
 
15
- #include <faiss/impl/FaissAssert.h>
16
15
  #include <faiss/impl/AuxIndexStructures.h>
16
+ #include <faiss/impl/FaissAssert.h>
17
17
 
18
18
  namespace faiss {
19
19
 
20
- DirectMap::DirectMap(): type(NoMap)
21
- {}
20
+ DirectMap::DirectMap() : type(NoMap) {}
22
21
 
23
- void DirectMap::set_type (Type new_type, const InvertedLists *invlists, size_t ntotal) {
24
-
25
- FAISS_THROW_IF_NOT (new_type == NoMap || new_type == Array ||
26
- new_type == Hashtable);
22
+ void DirectMap::set_type(
23
+ Type new_type,
24
+ const InvertedLists* invlists,
25
+ size_t ntotal) {
26
+ FAISS_THROW_IF_NOT(
27
+ new_type == NoMap || new_type == Array || new_type == Hashtable);
27
28
 
28
29
  if (new_type == type) {
29
30
  // nothing to do
30
31
  return;
31
32
  }
32
33
 
33
- array.clear ();
34
- hashtable.clear ();
34
+ array.clear();
35
+ hashtable.clear();
35
36
  type = new_type;
36
37
 
37
38
  if (new_type == NoMap) {
38
39
  return;
39
40
  } else if (new_type == Array) {
40
- array.resize (ntotal, -1);
41
+ array.resize(ntotal, -1);
41
42
  } else if (new_type == Hashtable) {
42
- hashtable.reserve (ntotal);
43
+ hashtable.reserve(ntotal);
43
44
  }
44
45
 
45
46
  for (size_t key = 0; key < invlists->nlist; key++) {
46
- size_t list_size = invlists->list_size (key);
47
- InvertedLists::ScopedIds idlist (invlists, key);
47
+ size_t list_size = invlists->list_size(key);
48
+ InvertedLists::ScopedIds idlist(invlists, key);
48
49
 
49
50
  if (new_type == Array) {
50
51
  for (long ofs = 0; ofs < list_size; ofs++) {
51
- FAISS_THROW_IF_NOT_MSG (
52
- 0 <= idlist [ofs] && idlist[ofs] < ntotal,
53
- "direct map supported only for seuquential ids");
54
- array [idlist [ofs]] = lo_build(key, ofs);
52
+ FAISS_THROW_IF_NOT_MSG(
53
+ 0 <= idlist[ofs] && idlist[ofs] < ntotal,
54
+ "direct map supported only for seuquential ids");
55
+ array[idlist[ofs]] = lo_build(key, ofs);
55
56
  }
56
57
  } else if (new_type == Hashtable) {
57
58
  for (long ofs = 0; ofs < list_size; ofs++) {
58
- hashtable [idlist [ofs]] = lo_build(key, ofs);
59
+ hashtable[idlist[ofs]] = lo_build(key, ofs);
59
60
  }
60
61
  }
61
62
  }
62
63
  }
63
64
 
64
- void DirectMap::clear()
65
- {
66
- array.clear ();
67
- hashtable.clear ();
65
+ void DirectMap::clear() {
66
+ array.clear();
67
+ hashtable.clear();
68
68
  }
69
69
 
70
-
71
- DirectMap::idx_t DirectMap::get (idx_t key) const
72
- {
70
+ DirectMap::idx_t DirectMap::get(idx_t key) const {
73
71
  if (type == Array) {
74
- FAISS_THROW_IF_NOT_MSG (
75
- key >= 0 && key < array.size(), "invalid key"
76
- );
72
+ FAISS_THROW_IF_NOT_MSG(key >= 0 && key < array.size(), "invalid key");
77
73
  idx_t lo = array[key];
78
74
  FAISS_THROW_IF_NOT_MSG(lo >= 0, "-1 entry in direct_map");
79
75
  return lo;
80
76
  } else if (type == Hashtable) {
81
- auto res = hashtable.find (key);
82
- FAISS_THROW_IF_NOT_MSG (res != hashtable.end(), "key not found");
77
+ auto res = hashtable.find(key);
78
+ FAISS_THROW_IF_NOT_MSG(res != hashtable.end(), "key not found");
83
79
  return res->second;
84
80
  } else {
85
- FAISS_THROW_MSG ("direct map not initialized");
81
+ FAISS_THROW_MSG("direct map not initialized");
86
82
  }
87
83
  }
88
84
 
89
-
90
-
91
- void DirectMap::add_single_id (idx_t id, idx_t list_no, size_t offset)
92
- {
93
- if (type == NoMap) return;
85
+ void DirectMap::add_single_id(idx_t id, idx_t list_no, size_t offset) {
86
+ if (type == NoMap)
87
+ return;
94
88
 
95
89
  if (type == Array) {
96
- assert (id == array.size());
90
+ assert(id == array.size());
97
91
  if (list_no >= 0) {
98
- array.push_back (lo_build (list_no, offset));
92
+ array.push_back(lo_build(list_no, offset));
99
93
  } else {
100
- array.push_back (-1);
94
+ array.push_back(-1);
101
95
  }
102
96
  } else if (type == Hashtable) {
103
97
  if (list_no >= 0) {
104
- hashtable[id] = lo_build (list_no, offset);
98
+ hashtable[id] = lo_build(list_no, offset);
105
99
  }
106
100
  }
107
-
108
101
  }
109
102
 
110
- void DirectMap::check_can_add (const idx_t *ids) {
103
+ void DirectMap::check_can_add(const idx_t* ids) {
111
104
  if (type == Array && ids) {
112
- FAISS_THROW_MSG ("cannot have array direct map and add with ids");
105
+ FAISS_THROW_MSG("cannot have array direct map and add with ids");
113
106
  }
114
107
  }
115
108
 
116
109
  /********************* DirectMapAdd implementation */
117
110
 
118
-
119
- DirectMapAdd::DirectMapAdd (DirectMap &direct_map, size_t n, const idx_t *xids):
120
- direct_map(direct_map), type(direct_map.type), n(n), xids(xids)
121
- {
122
- if (type == DirectMap::Array) {
123
- FAISS_THROW_IF_NOT (xids == nullptr);
111
+ DirectMapAdd::DirectMapAdd(DirectMap& direct_map, size_t n, const idx_t* xids)
112
+ : direct_map(direct_map), type(direct_map.type), n(n), xids(xids) {
113
+ if (type == DirectMap::Array) {
114
+ FAISS_THROW_IF_NOT(xids == nullptr);
124
115
  ntotal = direct_map.array.size();
125
- direct_map.array.resize (ntotal + n, -1);
116
+ direct_map.array.resize(ntotal + n, -1);
126
117
  } else if (type == DirectMap::Hashtable) {
127
118
  // can't parallel update hashtable so use temp array
128
- all_ofs.resize (n, -1);
119
+ all_ofs.resize(n, -1);
129
120
  }
130
121
  }
131
122
 
132
-
133
- void DirectMapAdd::add (size_t i, idx_t list_no, size_t ofs)
134
- {
123
+ void DirectMapAdd::add(size_t i, idx_t list_no, size_t ofs) {
135
124
  if (type == DirectMap::Array) {
136
- direct_map.array [ntotal + i] = lo_build (list_no, ofs);
125
+ direct_map.array[ntotal + i] = lo_build(list_no, ofs);
137
126
  } else if (type == DirectMap::Hashtable) {
138
- all_ofs [i] = lo_build (list_no, ofs);
127
+ all_ofs[i] = lo_build(list_no, ofs);
139
128
  }
140
129
  }
141
130
 
142
- DirectMapAdd::~DirectMapAdd ()
143
- {
131
+ DirectMapAdd::~DirectMapAdd() {
144
132
  if (type == DirectMap::Hashtable) {
145
133
  for (int i = 0; i < n; i++) {
146
134
  idx_t id = xids ? xids[i] : ntotal + i;
147
- direct_map.hashtable [id] = all_ofs [i];
135
+ direct_map.hashtable[id] = all_ofs[i];
148
136
  }
149
137
  }
150
138
  }
@@ -154,9 +142,7 @@ DirectMapAdd::~DirectMapAdd ()
154
142
  using ScopedCodes = InvertedLists::ScopedCodes;
155
143
  using ScopedIds = InvertedLists::ScopedIds;
156
144
 
157
-
158
- size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
159
- {
145
+ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists* invlists) {
160
146
  size_t nlist = invlists->nlist;
161
147
  std::vector<idx_t> toremove(nlist);
162
148
 
@@ -166,16 +152,16 @@ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
166
152
  // exhaustive scan of IVF
167
153
  #pragma omp parallel for
168
154
  for (idx_t i = 0; i < nlist; i++) {
169
- idx_t l0 = invlists->list_size (i), l = l0, j = 0;
170
- ScopedIds idsi (invlists, i);
155
+ idx_t l0 = invlists->list_size(i), l = l0, j = 0;
156
+ ScopedIds idsi(invlists, i);
171
157
  while (j < l) {
172
- if (sel.is_member (idsi[j])) {
158
+ if (sel.is_member(idsi[j])) {
173
159
  l--;
174
- invlists->update_entry (
175
- i, j,
176
- invlists->get_single_id (i, l),
177
- ScopedCodes (invlists, i, l).get()
178
- );
160
+ invlists->update_entry(
161
+ i,
162
+ j,
163
+ invlists->get_single_id(i, l),
164
+ ScopedCodes(invlists, i, l).get());
179
165
  } else {
180
166
  j++;
181
167
  }
@@ -191,30 +177,28 @@ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
191
177
  }
192
178
  }
193
179
  } else if (type == Hashtable) {
194
- const IDSelectorArray *sela =
195
- dynamic_cast<const IDSelectorArray*>(&sel);
196
- FAISS_THROW_IF_NOT_MSG (
197
- sela,
198
- "remove with hashtable works only with IDSelectorArray"
199
- );
180
+ const IDSelectorArray* sela =
181
+ dynamic_cast<const IDSelectorArray*>(&sel);
182
+ FAISS_THROW_IF_NOT_MSG(
183
+ sela, "remove with hashtable works only with IDSelectorArray");
200
184
 
201
185
  for (idx_t i = 0; i < sela->n; i++) {
202
186
  idx_t id = sela->ids[i];
203
- auto res = hashtable.find (id);
187
+ auto res = hashtable.find(id);
204
188
  if (res != hashtable.end()) {
205
- size_t list_no = lo_listno (res->second);
206
- size_t offset = lo_offset (res->second);
207
- idx_t last = invlists->list_size (list_no) - 1;
208
- hashtable.erase (res);
189
+ size_t list_no = lo_listno(res->second);
190
+ size_t offset = lo_offset(res->second);
191
+ idx_t last = invlists->list_size(list_no) - 1;
192
+ hashtable.erase(res);
209
193
  if (offset < last) {
210
- idx_t last_id = invlists->get_single_id (list_no, last);
211
- invlists->update_entry (
212
- list_no, offset,
213
- last_id,
214
- ScopedCodes (invlists, list_no, last).get()
215
- );
194
+ idx_t last_id = invlists->get_single_id(list_no, last);
195
+ invlists->update_entry(
196
+ list_no,
197
+ offset,
198
+ last_id,
199
+ ScopedCodes(invlists, list_no, last).get());
216
200
  // update hash entry for last element
217
- hashtable [last_id] = list_no << 32 | offset;
201
+ hashtable[last_id] = list_no << 32 | offset;
218
202
  }
219
203
  invlists->resize(list_no, last);
220
204
  nremove++;
@@ -227,41 +211,41 @@ size_t DirectMap::remove_ids(const IDSelector& sel, InvertedLists *invlists)
227
211
  return nremove;
228
212
  }
229
213
 
230
- void DirectMap::update_codes (InvertedLists *invlists,
231
- int n, const idx_t *ids,
232
- const idx_t *assign,
233
- const uint8_t *codes)
234
- {
235
- FAISS_THROW_IF_NOT (type == Array);
214
+ void DirectMap::update_codes(
215
+ InvertedLists* invlists,
216
+ int n,
217
+ const idx_t* ids,
218
+ const idx_t* assign,
219
+ const uint8_t* codes) {
220
+ FAISS_THROW_IF_NOT(type == Array);
236
221
 
237
222
  size_t code_size = invlists->code_size;
238
223
 
239
224
  for (size_t i = 0; i < n; i++) {
240
225
  idx_t id = ids[i];
241
- FAISS_THROW_IF_NOT_MSG (0 <= id && id < array.size(),
242
- "id to update out of range");
226
+ FAISS_THROW_IF_NOT_MSG(
227
+ 0 <= id && id < array.size(), "id to update out of range");
243
228
  { // remove old one
244
- idx_t dm = array [id];
245
- int64_t ofs = lo_offset (dm);
246
- int64_t il = lo_listno (dm);
247
- size_t l = invlists->list_size (il);
229
+ idx_t dm = array[id];
230
+ int64_t ofs = lo_offset(dm);
231
+ int64_t il = lo_listno(dm);
232
+ size_t l = invlists->list_size(il);
248
233
  if (ofs != l - 1) { // move l - 1 to ofs
249
- int64_t id2 = invlists->get_single_id (il, l - 1);
250
- array[id2] = lo_build (il, ofs);
251
- invlists->update_entry (il, ofs, id2,
252
- invlists->get_single_code (il, l - 1));
234
+ int64_t id2 = invlists->get_single_id(il, l - 1);
235
+ array[id2] = lo_build(il, ofs);
236
+ invlists->update_entry(
237
+ il, ofs, id2, invlists->get_single_code(il, l - 1));
253
238
  }
254
- invlists->resize (il, l - 1);
239
+ invlists->resize(il, l - 1);
255
240
  }
256
241
  { // insert new one
257
242
  int64_t il = assign[i];
258
- size_t l = invlists->list_size (il);
259
- idx_t dm = lo_build (il, l);
260
- array [id] = dm;
261
- invlists->add_entry (il, id, codes + i * code_size);
243
+ size_t l = invlists->list_size(il);
244
+ idx_t dm = lo_build(il, l);
245
+ array[id] = dm;
246
+ invlists->add_entry(il, id, codes + i * code_size);
262
247
  }
263
248
  }
264
249
  }
265
250
 
266
-
267
- }
251
+ } // namespace faiss
@@ -13,21 +13,20 @@
13
13
  #include <faiss/invlists/InvertedLists.h>
14
14
  #include <unordered_map>
15
15
 
16
-
17
16
  namespace faiss {
18
17
 
19
18
  // When offsets list id + offset are encoded in an uint64
20
19
  // we call this LO = list-offset
21
20
 
22
- inline uint64_t lo_build (uint64_t list_id, uint64_t offset) {
23
- return list_id << 32 | offset;
21
+ inline uint64_t lo_build(uint64_t list_id, uint64_t offset) {
22
+ return list_id << 32 | offset;
24
23
  }
25
24
 
26
- inline uint64_t lo_listno (uint64_t lo) {
25
+ inline uint64_t lo_listno(uint64_t lo) {
27
26
  return lo >> 32;
28
27
  }
29
28
 
30
- inline uint64_t lo_offset (uint64_t lo) {
29
+ inline uint64_t lo_offset(uint64_t lo) {
31
30
  return lo & 0xffffffff;
32
31
  }
33
32
 
@@ -38,36 +37,38 @@ struct DirectMap {
38
37
  typedef Index::idx_t idx_t;
39
38
 
40
39
  enum Type {
41
- NoMap = 0, // default
42
- Array = 1, // sequential ids (only for add, no add_with_ids)
43
- Hashtable = 2 // arbitrary ids
40
+ NoMap = 0, // default
41
+ Array = 1, // sequential ids (only for add, no add_with_ids)
42
+ Hashtable = 2 // arbitrary ids
44
43
  };
45
44
  Type type;
46
45
 
47
46
  /// map for direct access to the elements. Map ids to LO-encoded entries.
48
- std::vector <idx_t> array;
49
- std::unordered_map <idx_t, idx_t> hashtable;
47
+ std::vector<idx_t> array;
48
+ std::unordered_map<idx_t, idx_t> hashtable;
50
49
 
51
50
  DirectMap();
52
51
 
53
52
  /// set type and initialize
54
- void set_type (Type new_type, const InvertedLists *invlists, size_t ntotal);
53
+ void set_type(Type new_type, const InvertedLists* invlists, size_t ntotal);
55
54
 
56
55
  /// get an entry
57
- idx_t get (idx_t id) const;
56
+ idx_t get(idx_t id) const;
58
57
 
59
58
  /// for quick checks
60
- bool no () const {return type == NoMap; }
59
+ bool no() const {
60
+ return type == NoMap;
61
+ }
61
62
 
62
63
  /**
63
64
  * update the direct_map
64
65
  */
65
66
 
66
67
  /// throw if Array and ids is not NULL
67
- void check_can_add (const idx_t *ids);
68
+ void check_can_add(const idx_t* ids);
68
69
 
69
70
  /// non thread-safe version
70
- void add_single_id (idx_t id, idx_t list_no, size_t offset);
71
+ void add_single_id(idx_t id, idx_t list_no, size_t offset);
71
72
 
72
73
  /// remove all entries
73
74
  void clear();
@@ -77,44 +78,39 @@ struct DirectMap {
77
78
  */
78
79
 
79
80
  /// remove ids from the InvertedLists, possibly using the direct map
80
- size_t remove_ids(const IDSelector& sel, InvertedLists *invlists);
81
+ size_t remove_ids(const IDSelector& sel, InvertedLists* invlists);
81
82
 
82
83
  /// update entries, using the direct map
83
- void update_codes (InvertedLists *invlists,
84
- int n, const idx_t *ids,
85
- const idx_t *list_nos,
86
- const uint8_t *codes);
87
-
88
-
89
-
84
+ void update_codes(
85
+ InvertedLists* invlists,
86
+ int n,
87
+ const idx_t* ids,
88
+ const idx_t* list_nos,
89
+ const uint8_t* codes);
90
90
  };
91
91
 
92
92
  /// Thread-safe way of updating the direct_map
93
93
  struct DirectMapAdd {
94
-
95
94
  typedef Index::idx_t idx_t;
96
95
 
97
96
  using Type = DirectMap::Type;
98
97
 
99
- DirectMap &direct_map;
98
+ DirectMap& direct_map;
100
99
  DirectMap::Type type;
101
100
  size_t ntotal;
102
101
  size_t n;
103
- const idx_t *xids;
102
+ const idx_t* xids;
104
103
 
105
104
  std::vector<idx_t> all_ofs;
106
105
 
107
- DirectMapAdd (DirectMap &direct_map, size_t n, const idx_t *xids);
106
+ DirectMapAdd(DirectMap& direct_map, size_t n, const idx_t* xids);
108
107
 
109
108
  /// add vector i (with id xids[i]) at list_no and offset
110
- void add (size_t i, idx_t list_no, size_t offset);
109
+ void add(size_t i, idx_t list_no, size_t offset);
111
110
 
112
- ~DirectMapAdd ();
111
+ ~DirectMapAdd();
113
112
  };
114
113
 
115
-
116
-
117
- }
118
-
114
+ } // namespace faiss
119
115
 
120
116
  #endif