faiss 0.2.0 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +7 -7
  5. data/ext/faiss/extconf.rb +6 -3
  6. data/ext/faiss/numo.hpp +4 -4
  7. data/ext/faiss/utils.cpp +1 -1
  8. data/ext/faiss/utils.h +1 -1
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  11. data/vendor/faiss/faiss/AutoTune.h +55 -56
  12. data/vendor/faiss/faiss/Clustering.cpp +365 -194
  13. data/vendor/faiss/faiss/Clustering.h +102 -35
  14. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  15. data/vendor/faiss/faiss/IVFlib.h +48 -51
  16. data/vendor/faiss/faiss/Index.cpp +85 -103
  17. data/vendor/faiss/faiss/Index.h +54 -48
  18. data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
  19. data/vendor/faiss/faiss/Index2Layer.h +22 -36
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
  22. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  23. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  24. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  25. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  26. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  28. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  30. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  31. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  32. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  33. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  34. data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
  35. data/vendor/faiss/faiss/IndexFlat.h +42 -59
  36. data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
  37. data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
  38. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  39. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  40. data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
  41. data/vendor/faiss/faiss/IndexIVF.h +169 -118
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
  48. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  49. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  50. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  51. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  52. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +163 -150
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
  54. data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
  55. data/vendor/faiss/faiss/IndexLSH.h +20 -38
  56. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  57. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  58. data/vendor/faiss/faiss/IndexNNDescent.cpp +229 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -82
  64. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  65. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  66. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  67. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  68. data/vendor/faiss/faiss/IndexRefine.cpp +139 -127
  69. data/vendor/faiss/faiss/IndexRefine.h +32 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
  73. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
  74. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  75. data/vendor/faiss/faiss/IndexShards.h +85 -73
  76. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  77. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  78. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  79. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  80. data/vendor/faiss/faiss/MetricType.h +7 -7
  81. data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
  82. data/vendor/faiss/faiss/VectorTransform.h +64 -89
  83. data/vendor/faiss/faiss/clone_index.cpp +78 -73
  84. data/vendor/faiss/faiss/clone_index.h +4 -9
  85. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  86. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  87. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
  88. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  89. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  90. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  91. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  92. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  93. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
  94. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  95. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  96. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  97. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  101. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  102. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  106. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  108. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  110. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  112. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  113. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  114. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  115. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  116. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  121. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  122. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  124. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  125. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  126. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  128. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  129. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  130. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  135. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  136. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  137. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  138. data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
  139. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
  142. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  144. data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
  145. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  146. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  148. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  149. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  151. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
  153. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  154. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  156. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  157. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  158. data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
  159. data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
  160. data/vendor/faiss/faiss/impl/io.cpp +76 -95
  161. data/vendor/faiss/faiss/impl/io.h +31 -41
  162. data/vendor/faiss/faiss/impl/io_macros.h +60 -29
  163. data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
  164. data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
  165. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  166. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  167. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  171. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  172. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  173. data/vendor/faiss/faiss/index_factory.cpp +619 -397
  174. data/vendor/faiss/faiss/index_factory.h +8 -6
  175. data/vendor/faiss/faiss/index_io.h +23 -26
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  177. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  178. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  179. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  180. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  181. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  183. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  185. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  186. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  187. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  188. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  189. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  190. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  191. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  192. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  193. data/vendor/faiss/faiss/utils/distances.cpp +305 -312
  194. data/vendor/faiss/faiss/utils/distances.h +170 -122
  195. data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
  196. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  197. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  198. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  199. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  200. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  201. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  202. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  203. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  204. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  205. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  206. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  207. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  208. data/vendor/faiss/faiss/utils/random.h +13 -16
  209. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  210. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  211. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  212. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  213. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  214. data/vendor/faiss/faiss/utils/utils.h +54 -49
  215. metadata +29 -4
@@ -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