faiss 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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,22 +9,20 @@
9
9
 
10
10
  #pragma once
11
11
 
12
- #include <vector>
12
+ #include <stdint.h>
13
13
  #include <string>
14
14
  #include <unordered_map>
15
- #include <stdint.h>
16
-
15
+ #include <vector>
17
16
 
18
17
  namespace faiss {
19
18
 
20
-
21
19
  /** Reports some statistics on a dataset and comments on them.
22
20
  *
23
21
  * It is a class rather than a function so that all stats can also be
24
22
  * accessed from code */
25
23
 
26
24
  struct MatrixStats {
27
- MatrixStats (size_t n, size_t d, const float *x);
25
+ MatrixStats(size_t n, size_t d, const float* x);
28
26
  std::string comments;
29
27
 
30
28
  // raw statistics
@@ -42,8 +40,8 @@ struct MatrixStats {
42
40
  double mean, stddev;
43
41
 
44
42
  PerDimStats();
45
- void add (float x);
46
- void compute_mean_std ();
43
+ void add(float x);
44
+ void compute_mean_std();
47
45
  };
48
46
 
49
47
  std::vector<PerDimStats> per_dim_stats;
@@ -53,10 +51,9 @@ struct MatrixStats {
53
51
  };
54
52
  std::unordered_map<uint64_t, Occurrence> occurrences;
55
53
 
56
- char *buf;
54
+ char* buf;
57
55
  size_t nbuf;
58
- void do_comment (const char *fmt, ...);
59
-
56
+ void do_comment(const char* fmt, ...);
60
57
  };
61
58
 
62
59
  } // namespace faiss
@@ -9,34 +9,28 @@
9
9
 
10
10
  #include <faiss/MetaIndexes.h>
11
11
 
12
+ #include <stdint.h>
12
13
  #include <cinttypes>
13
14
  #include <cstdio>
14
15
  #include <limits>
15
- #include <stdint.h>
16
16
 
17
+ #include <faiss/impl/AuxIndexStructures.h>
17
18
  #include <faiss/impl/FaissAssert.h>
18
19
  #include <faiss/utils/Heap.h>
19
- #include <faiss/impl/AuxIndexStructures.h>
20
20
  #include <faiss/utils/WorkerThread.h>
21
21
 
22
-
23
22
  namespace faiss {
24
23
 
25
- namespace {
26
-
27
-
28
- } // namespace
24
+ namespace {} // namespace
29
25
 
30
26
  /*****************************************************
31
27
  * IndexIDMap implementation
32
28
  *******************************************************/
33
29
 
34
30
  template <typename IndexT>
35
- IndexIDMapTemplate<IndexT>::IndexIDMapTemplate (IndexT *index):
36
- index (index),
37
- own_fields (false)
38
- {
39
- FAISS_THROW_IF_NOT_MSG (index->ntotal == 0, "index must be empty on input");
31
+ IndexIDMapTemplate<IndexT>::IndexIDMapTemplate(IndexT* index)
32
+ : index(index), own_fields(false) {
33
+ FAISS_THROW_IF_NOT_MSG(index->ntotal == 0, "index must be empty on input");
40
34
  this->is_trained = index->is_trained;
41
35
  this->metric_type = index->metric_type;
42
36
  this->verbose = index->verbose;
@@ -44,168 +38,159 @@ IndexIDMapTemplate<IndexT>::IndexIDMapTemplate (IndexT *index):
44
38
  }
45
39
 
46
40
  template <typename IndexT>
47
- void IndexIDMapTemplate<IndexT>::add
48
- (idx_t, const typename IndexT::component_t *)
49
- {
50
- FAISS_THROW_MSG ("add does not make sense with IndexIDMap, "
51
- "use add_with_ids");
41
+ void IndexIDMapTemplate<IndexT>::add(
42
+ idx_t,
43
+ const typename IndexT::component_t*) {
44
+ FAISS_THROW_MSG(
45
+ "add does not make sense with IndexIDMap, "
46
+ "use add_with_ids");
52
47
  }
53
48
 
54
-
55
49
  template <typename IndexT>
56
- void IndexIDMapTemplate<IndexT>::train
57
- (idx_t n, const typename IndexT::component_t *x)
58
- {
59
- index->train (n, x);
50
+ void IndexIDMapTemplate<IndexT>::train(
51
+ idx_t n,
52
+ const typename IndexT::component_t* x) {
53
+ index->train(n, x);
60
54
  this->is_trained = index->is_trained;
61
55
  }
62
56
 
63
57
  template <typename IndexT>
64
- void IndexIDMapTemplate<IndexT>::reset ()
65
- {
66
- index->reset ();
58
+ void IndexIDMapTemplate<IndexT>::reset() {
59
+ index->reset();
67
60
  id_map.clear();
68
61
  this->ntotal = 0;
69
62
  }
70
63
 
71
-
72
64
  template <typename IndexT>
73
- void IndexIDMapTemplate<IndexT>::add_with_ids
74
- (idx_t n, const typename IndexT::component_t * x,
75
- const typename IndexT::idx_t *xids)
76
- {
77
- index->add (n, x);
65
+ void IndexIDMapTemplate<IndexT>::add_with_ids(
66
+ idx_t n,
67
+ const typename IndexT::component_t* x,
68
+ const typename IndexT::idx_t* xids) {
69
+ index->add(n, x);
78
70
  for (idx_t i = 0; i < n; i++)
79
- id_map.push_back (xids[i]);
71
+ id_map.push_back(xids[i]);
80
72
  this->ntotal = index->ntotal;
81
73
  }
82
74
 
83
-
84
75
  template <typename IndexT>
85
- void IndexIDMapTemplate<IndexT>::search
86
- (idx_t n, const typename IndexT::component_t *x, idx_t k,
87
- typename IndexT::distance_t *distances, typename IndexT::idx_t *labels) const
88
- {
89
- index->search (n, x, k, distances, labels);
90
- idx_t *li = labels;
76
+ void IndexIDMapTemplate<IndexT>::search(
77
+ idx_t n,
78
+ const typename IndexT::component_t* x,
79
+ idx_t k,
80
+ typename IndexT::distance_t* distances,
81
+ typename IndexT::idx_t* labels) const {
82
+ index->search(n, x, k, distances, labels);
83
+ idx_t* li = labels;
91
84
  #pragma omp parallel for
92
85
  for (idx_t i = 0; i < n * k; i++) {
93
86
  li[i] = li[i] < 0 ? li[i] : id_map[li[i]];
94
87
  }
95
88
  }
96
89
 
97
-
98
90
  template <typename IndexT>
99
- void IndexIDMapTemplate<IndexT>::range_search
100
- (typename IndexT::idx_t n, const typename IndexT::component_t *x,
101
- typename IndexT::distance_t radius, RangeSearchResult *result) const
102
- {
103
- index->range_search(n, x, radius, result);
91
+ void IndexIDMapTemplate<IndexT>::range_search(
92
+ typename IndexT::idx_t n,
93
+ const typename IndexT::component_t* x,
94
+ typename IndexT::distance_t radius,
95
+ RangeSearchResult* result) const {
96
+ index->range_search(n, x, radius, result);
104
97
  #pragma omp parallel for
105
- for (idx_t i = 0; i < result->lims[result->nq]; i++) {
106
- result->labels[i] = result->labels[i] < 0 ?
107
- result->labels[i] : id_map[result->labels[i]];
108
- }
98
+ for (idx_t i = 0; i < result->lims[result->nq]; i++) {
99
+ result->labels[i] = result->labels[i] < 0 ? result->labels[i]
100
+ : id_map[result->labels[i]];
101
+ }
109
102
  }
110
103
 
111
104
  namespace {
112
105
 
113
- struct IDTranslatedSelector: IDSelector {
114
- const std::vector <int64_t> & id_map;
115
- const IDSelector & sel;
116
- IDTranslatedSelector (const std::vector <int64_t> & id_map,
117
- const IDSelector & sel):
118
- id_map (id_map), sel (sel)
119
- {}
106
+ struct IDTranslatedSelector : IDSelector {
107
+ const std::vector<int64_t>& id_map;
108
+ const IDSelector& sel;
109
+ IDTranslatedSelector(
110
+ const std::vector<int64_t>& id_map,
111
+ const IDSelector& sel)
112
+ : id_map(id_map), sel(sel) {}
120
113
  bool is_member(idx_t id) const override {
121
- return sel.is_member(id_map[id]);
114
+ return sel.is_member(id_map[id]);
122
115
  }
123
116
  };
124
117
 
125
- }
118
+ } // namespace
126
119
 
127
120
  template <typename IndexT>
128
- size_t IndexIDMapTemplate<IndexT>::remove_ids (const IDSelector & sel)
129
- {
121
+ size_t IndexIDMapTemplate<IndexT>::remove_ids(const IDSelector& sel) {
130
122
  // remove in sub-index first
131
- IDTranslatedSelector sel2 (id_map, sel);
132
- size_t nremove = index->remove_ids (sel2);
123
+ IDTranslatedSelector sel2(id_map, sel);
124
+ size_t nremove = index->remove_ids(sel2);
133
125
 
134
126
  int64_t j = 0;
135
127
  for (idx_t i = 0; i < this->ntotal; i++) {
136
- if (sel.is_member (id_map[i])) {
128
+ if (sel.is_member(id_map[i])) {
137
129
  // remove
138
130
  } else {
139
131
  id_map[j] = id_map[i];
140
132
  j++;
141
133
  }
142
134
  }
143
- FAISS_ASSERT (j == index->ntotal);
135
+ FAISS_ASSERT(j == index->ntotal);
144
136
  this->ntotal = j;
145
137
  id_map.resize(this->ntotal);
146
138
  return nremove;
147
139
  }
148
140
 
149
141
  template <typename IndexT>
150
- IndexIDMapTemplate<IndexT>::~IndexIDMapTemplate ()
151
- {
152
- if (own_fields) delete index;
142
+ IndexIDMapTemplate<IndexT>::~IndexIDMapTemplate() {
143
+ if (own_fields)
144
+ delete index;
153
145
  }
154
146
 
155
-
156
-
157
147
  /*****************************************************
158
148
  * IndexIDMap2 implementation
159
149
  *******************************************************/
160
150
 
161
151
  template <typename IndexT>
162
- IndexIDMap2Template<IndexT>::IndexIDMap2Template (IndexT *index):
163
- IndexIDMapTemplate<IndexT> (index)
164
- {}
152
+ IndexIDMap2Template<IndexT>::IndexIDMap2Template(IndexT* index)
153
+ : IndexIDMapTemplate<IndexT>(index) {}
165
154
 
166
155
  template <typename IndexT>
167
- void IndexIDMap2Template<IndexT>::add_with_ids
168
- (idx_t n, const typename IndexT::component_t* x,
169
- const typename IndexT::idx_t* xids)
170
- {
156
+ void IndexIDMap2Template<IndexT>::add_with_ids(
157
+ idx_t n,
158
+ const typename IndexT::component_t* x,
159
+ const typename IndexT::idx_t* xids) {
171
160
  size_t prev_ntotal = this->ntotal;
172
- IndexIDMapTemplate<IndexT>::add_with_ids (n, x, xids);
161
+ IndexIDMapTemplate<IndexT>::add_with_ids(n, x, xids);
173
162
  for (size_t i = prev_ntotal; i < this->ntotal; i++) {
174
- rev_map [this->id_map [i]] = i;
163
+ rev_map[this->id_map[i]] = i;
175
164
  }
176
165
  }
177
166
 
178
167
  template <typename IndexT>
179
- void IndexIDMap2Template<IndexT>::construct_rev_map ()
180
- {
181
- rev_map.clear ();
168
+ void IndexIDMap2Template<IndexT>::construct_rev_map() {
169
+ rev_map.clear();
182
170
  for (size_t i = 0; i < this->ntotal; i++) {
183
- rev_map [this->id_map [i]] = i;
171
+ rev_map[this->id_map[i]] = i;
184
172
  }
185
173
  }
186
174
 
187
-
188
175
  template <typename IndexT>
189
- size_t IndexIDMap2Template<IndexT>::remove_ids(const IDSelector& sel)
190
- {
176
+ size_t IndexIDMap2Template<IndexT>::remove_ids(const IDSelector& sel) {
191
177
  // This is quite inefficient
192
- size_t nremove = IndexIDMapTemplate<IndexT>::remove_ids (sel);
193
- construct_rev_map ();
178
+ size_t nremove = IndexIDMapTemplate<IndexT>::remove_ids(sel);
179
+ construct_rev_map();
194
180
  return nremove;
195
181
  }
196
182
 
197
183
  template <typename IndexT>
198
- void IndexIDMap2Template<IndexT>::reconstruct
199
- (idx_t key, typename IndexT::component_t * recons) const
200
- {
184
+ void IndexIDMap2Template<IndexT>::reconstruct(
185
+ idx_t key,
186
+ typename IndexT::component_t* recons) const {
201
187
  try {
202
- this->index->reconstruct (rev_map.at (key), recons);
188
+ this->index->reconstruct(rev_map.at(key), recons);
203
189
  } catch (const std::out_of_range& e) {
204
- FAISS_THROW_FMT ("key %" PRId64 " not found", key);
190
+ FAISS_THROW_FMT("key %" PRId64 " not found", key);
205
191
  }
206
192
  }
207
193
 
208
-
209
194
  // explicit template instantiations
210
195
 
211
196
  template struct IndexIDMapTemplate<Index>;
@@ -213,81 +198,79 @@ template struct IndexIDMapTemplate<IndexBinary>;
213
198
  template struct IndexIDMap2Template<Index>;
214
199
  template struct IndexIDMap2Template<IndexBinary>;
215
200
 
216
-
217
201
  /*****************************************************
218
202
  * IndexSplitVectors implementation
219
203
  *******************************************************/
220
204
 
205
+ IndexSplitVectors::IndexSplitVectors(idx_t d, bool threaded)
206
+ : Index(d), own_fields(false), threaded(threaded), sum_d(0) {}
221
207
 
222
- IndexSplitVectors::IndexSplitVectors (idx_t d, bool threaded):
223
- Index (d), own_fields (false),
224
- threaded (threaded), sum_d (0)
225
- {
226
-
208
+ void IndexSplitVectors::add_sub_index(Index* index) {
209
+ sub_indexes.push_back(index);
210
+ sync_with_sub_indexes();
227
211
  }
228
212
 
229
- void IndexSplitVectors::add_sub_index (Index *index)
230
- {
231
- sub_indexes.push_back (index);
232
- sync_with_sub_indexes ();
233
- }
234
-
235
- void IndexSplitVectors::sync_with_sub_indexes ()
236
- {
237
- if (sub_indexes.empty()) return;
238
- Index * index0 = sub_indexes[0];
213
+ void IndexSplitVectors::sync_with_sub_indexes() {
214
+ if (sub_indexes.empty())
215
+ return;
216
+ Index* index0 = sub_indexes[0];
239
217
  sum_d = index0->d;
240
218
  metric_type = index0->metric_type;
241
219
  is_trained = index0->is_trained;
242
220
  ntotal = index0->ntotal;
243
221
  for (int i = 1; i < sub_indexes.size(); i++) {
244
- Index * index = sub_indexes[i];
245
- FAISS_THROW_IF_NOT (metric_type == index->metric_type);
246
- FAISS_THROW_IF_NOT (ntotal == index->ntotal);
222
+ Index* index = sub_indexes[i];
223
+ FAISS_THROW_IF_NOT(metric_type == index->metric_type);
224
+ FAISS_THROW_IF_NOT(ntotal == index->ntotal);
247
225
  sum_d += index->d;
248
226
  }
249
-
250
227
  }
251
228
 
252
229
  void IndexSplitVectors::add(idx_t /*n*/, const float* /*x*/) {
253
- FAISS_THROW_MSG("not implemented");
230
+ FAISS_THROW_MSG("not implemented");
254
231
  }
255
232
 
256
-
257
-
258
- void IndexSplitVectors::search (
259
- idx_t n, const float *x, idx_t k,
260
- float *distances, idx_t *labels) const
261
- {
262
- FAISS_THROW_IF_NOT_MSG (k == 1,
263
- "search implemented only for k=1");
264
- FAISS_THROW_IF_NOT_MSG (sum_d == d,
265
- "not enough indexes compared to # dimensions");
233
+ void IndexSplitVectors::search(
234
+ idx_t n,
235
+ const float* x,
236
+ idx_t k,
237
+ float* distances,
238
+ idx_t* labels) const {
239
+ FAISS_THROW_IF_NOT_MSG(k == 1, "search implemented only for k=1");
240
+ FAISS_THROW_IF_NOT_MSG(
241
+ sum_d == d, "not enough indexes compared to # dimensions");
266
242
 
267
243
  int64_t nshard = sub_indexes.size();
268
- float *all_distances = new float [nshard * k * n];
269
- idx_t *all_labels = new idx_t [nshard * k * n];
270
- ScopeDeleter<float> del (all_distances);
271
- ScopeDeleter<idx_t> del2 (all_labels);
272
-
273
- auto query_func = [n, x, k, distances, labels, all_distances, all_labels, this]
274
- (int no) {
275
- const IndexSplitVectors *index = this;
276
- float *distances1 = no == 0 ? distances : all_distances + no * k * n;
277
- idx_t *labels1 = no == 0 ? labels : all_labels + no * k * n;
244
+ float* all_distances = new float[nshard * k * n];
245
+ idx_t* all_labels = new idx_t[nshard * k * n];
246
+ ScopeDeleter<float> del(all_distances);
247
+ ScopeDeleter<idx_t> del2(all_labels);
248
+
249
+ auto query_func = [n,
250
+ x,
251
+ k,
252
+ distances,
253
+ labels,
254
+ all_distances,
255
+ all_labels,
256
+ this](int no) {
257
+ const IndexSplitVectors* index = this;
258
+ float* distances1 = no == 0 ? distances : all_distances + no * k * n;
259
+ idx_t* labels1 = no == 0 ? labels : all_labels + no * k * n;
278
260
  if (index->verbose)
279
- printf ("begin query shard %d on %" PRId64 " points\n", no, n);
280
- const Index * sub_index = index->sub_indexes[no];
261
+ printf("begin query shard %d on %" PRId64 " points\n", no, n);
262
+ const Index* sub_index = index->sub_indexes[no];
281
263
  int64_t sub_d = sub_index->d, d = index->d;
282
264
  idx_t ofs = 0;
283
- for (int i = 0; i < no; i++) ofs += index->sub_indexes[i]->d;
284
- float *sub_x = new float [sub_d * n];
285
- ScopeDeleter<float> del1 (sub_x);
265
+ for (int i = 0; i < no; i++)
266
+ ofs += index->sub_indexes[i]->d;
267
+ float* sub_x = new float[sub_d * n];
268
+ ScopeDeleter<float> del1(sub_x);
286
269
  for (idx_t i = 0; i < n; i++)
287
- memcpy (sub_x + i * sub_d, x + ofs + i * d, sub_d * sizeof (sub_x));
288
- sub_index->search (n, sub_x, k, distances1, labels1);
270
+ memcpy(sub_x + i * sub_d, x + ofs + i * d, sub_d * sizeof(sub_x));
271
+ sub_index->search(n, sub_x, k, distances1, labels1);
289
272
  if (index->verbose)
290
- printf ("end query shard %d\n", no);
273
+ printf("end query shard %d\n", no);
291
274
  };
292
275
 
293
276
  if (!threaded) {
@@ -295,13 +278,13 @@ void IndexSplitVectors::search (
295
278
  query_func(i);
296
279
  }
297
280
  } else {
298
- std::vector<std::unique_ptr<WorkerThread> > threads;
281
+ std::vector<std::unique_ptr<WorkerThread>> threads;
299
282
  std::vector<std::future<bool>> v;
300
283
 
301
284
  for (int i = 0; i < nshard; i++) {
302
285
  threads.emplace_back(new WorkerThread());
303
- WorkerThread *wt = threads.back().get();
304
- v.emplace_back(wt->add([i, query_func](){query_func(i); }));
286
+ WorkerThread* wt = threads.back().get();
287
+ v.emplace_back(wt->add([i, query_func]() { query_func(i); }));
305
288
  }
306
289
 
307
290
  // Blocking wait for completion
@@ -313,8 +296,8 @@ void IndexSplitVectors::search (
313
296
  int64_t factor = 1;
314
297
  for (int i = 0; i < nshard; i++) {
315
298
  if (i > 0) { // results of 0 are already in the table
316
- const float *distances_i = all_distances + i * k * n;
317
- const idx_t *labels_i = all_labels + i * k * n;
299
+ const float* distances_i = all_distances + i * k * n;
300
+ const idx_t* labels_i = all_labels + i * k * n;
318
301
  for (int64_t j = 0; j < n; j++) {
319
302
  if (labels[j] >= 0 && labels_i[j] >= 0) {
320
303
  labels[j] += labels_i[j] * factor;
@@ -327,26 +310,21 @@ void IndexSplitVectors::search (
327
310
  }
328
311
  factor *= sub_indexes[i]->ntotal;
329
312
  }
330
-
331
313
  }
332
314
 
333
315
  void IndexSplitVectors::train(idx_t /*n*/, const float* /*x*/) {
334
- FAISS_THROW_MSG("not implemented");
316
+ FAISS_THROW_MSG("not implemented");
335
317
  }
336
318
 
337
- void IndexSplitVectors::reset ()
338
- {
339
- FAISS_THROW_MSG ("not implemented");
319
+ void IndexSplitVectors::reset() {
320
+ FAISS_THROW_MSG("not implemented");
340
321
  }
341
322
 
342
-
343
- IndexSplitVectors::~IndexSplitVectors ()
344
- {
323
+ IndexSplitVectors::~IndexSplitVectors() {
345
324
  if (own_fields) {
346
325
  for (int s = 0; s < sub_indexes.size(); s++)
347
- delete sub_indexes [s];
326
+ delete sub_indexes[s];
348
327
  }
349
328
  }
350
329
 
351
-
352
330
  } // namespace faiss