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
@@ -5,51 +5,52 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
8
  #include <faiss/gpu/GpuCloner.h>
9
+ #include <faiss/impl/FaissAssert.h>
10
10
  #include <typeinfo>
11
11
 
12
- #include <faiss/gpu/GpuIndex.h>
13
- #include <faiss/impl/FaissAssert.h>
14
- #include <faiss/index_io.h>
12
+ #include <faiss/gpu/StandardGpuResources.h>
13
+
15
14
  #include <faiss/IndexFlat.h>
16
15
  #include <faiss/IndexIVF.h>
17
16
  #include <faiss/IndexIVFFlat.h>
18
- #include <faiss/IndexScalarQuantizer.h>
19
17
  #include <faiss/IndexIVFPQ.h>
20
- #include <faiss/IndexReplicas.h>
21
18
  #include <faiss/IndexPreTransform.h>
19
+ #include <faiss/IndexReplicas.h>
20
+ #include <faiss/IndexScalarQuantizer.h>
22
21
  #include <faiss/MetaIndexes.h>
22
+ #include <faiss/gpu/GpuIndex.h>
23
23
  #include <faiss/gpu/GpuIndexFlat.h>
24
24
  #include <faiss/gpu/GpuIndexIVFFlat.h>
25
25
  #include <faiss/gpu/GpuIndexIVFPQ.h>
26
26
  #include <faiss/gpu/GpuIndexIVFScalarQuantizer.h>
27
27
  #include <faiss/gpu/utils/DeviceUtils.h>
28
+ #include <faiss/impl/FaissAssert.h>
29
+ #include <faiss/index_io.h>
28
30
 
29
- namespace faiss { namespace gpu {
30
-
31
+ namespace faiss {
32
+ namespace gpu {
31
33
 
32
34
  /**********************************************************
33
35
  * Cloning to CPU
34
36
  **********************************************************/
35
37
 
36
- void ToCPUCloner::merge_index(Index *dst, Index *src, bool successive_ids)
37
- {
38
- if (auto ifl = dynamic_cast<IndexFlat *>(dst)) {
39
- auto ifl2 = dynamic_cast<const IndexFlat *>(src);
38
+ void ToCPUCloner::merge_index(Index* dst, Index* src, bool successive_ids) {
39
+ if (auto ifl = dynamic_cast<IndexFlat*>(dst)) {
40
+ auto ifl2 = dynamic_cast<const IndexFlat*>(src);
40
41
  FAISS_ASSERT(ifl2);
41
42
  FAISS_ASSERT(successive_ids);
42
- ifl->add(ifl2->ntotal, ifl2->xb.data());
43
- } else if(auto ifl = dynamic_cast<IndexIVFFlat *>(dst)) {
44
- auto ifl2 = dynamic_cast<IndexIVFFlat *>(src);
43
+ ifl->add(ifl2->ntotal, ifl2->get_xb());
44
+ } else if (auto ifl = dynamic_cast<IndexIVFFlat*>(dst)) {
45
+ auto ifl2 = dynamic_cast<IndexIVFFlat*>(src);
45
46
  FAISS_ASSERT(ifl2);
46
47
  ifl->merge_from(*ifl2, successive_ids ? ifl->ntotal : 0);
47
- } else if(auto ifl = dynamic_cast<IndexIVFScalarQuantizer *>(dst)) {
48
- auto ifl2 = dynamic_cast<IndexIVFScalarQuantizer *>(src);
48
+ } else if (auto ifl = dynamic_cast<IndexIVFScalarQuantizer*>(dst)) {
49
+ auto ifl2 = dynamic_cast<IndexIVFScalarQuantizer*>(src);
49
50
  FAISS_ASSERT(ifl2);
50
51
  ifl->merge_from(*ifl2, successive_ids ? ifl->ntotal : 0);
51
- } else if(auto ifl = dynamic_cast<IndexIVFPQ *>(dst)) {
52
- auto ifl2 = dynamic_cast<IndexIVFPQ *>(src);
52
+ } else if (auto ifl = dynamic_cast<IndexIVFPQ*>(dst)) {
53
+ auto ifl2 = dynamic_cast<IndexIVFPQ*>(src);
53
54
  FAISS_ASSERT(ifl2);
54
55
  ifl->merge_from(*ifl2, successive_ids ? ifl->ntotal : 0);
55
56
  } else {
@@ -57,24 +58,22 @@ void ToCPUCloner::merge_index(Index *dst, Index *src, bool successive_ids)
57
58
  }
58
59
  }
59
60
 
60
-
61
- Index *ToCPUCloner::clone_Index(const Index *index)
62
- {
63
- if(auto ifl = dynamic_cast<const GpuIndexFlat *>(index)) {
64
- IndexFlat *res = new IndexFlat();
61
+ Index* ToCPUCloner::clone_Index(const Index* index) {
62
+ if (auto ifl = dynamic_cast<const GpuIndexFlat*>(index)) {
63
+ IndexFlat* res = new IndexFlat();
65
64
  ifl->copyTo(res);
66
65
  return res;
67
- } else if(auto ifl = dynamic_cast<const GpuIndexIVFFlat *>(index)) {
68
- IndexIVFFlat *res = new IndexIVFFlat();
66
+ } else if (auto ifl = dynamic_cast<const GpuIndexIVFFlat*>(index)) {
67
+ IndexIVFFlat* res = new IndexIVFFlat();
69
68
  ifl->copyTo(res);
70
69
  return res;
71
- } else if(auto ifl =
72
- dynamic_cast<const GpuIndexIVFScalarQuantizer *>(index)) {
73
- IndexIVFScalarQuantizer *res = new IndexIVFScalarQuantizer();
70
+ } else if (
71
+ auto ifl = dynamic_cast<const GpuIndexIVFScalarQuantizer*>(index)) {
72
+ IndexIVFScalarQuantizer* res = new IndexIVFScalarQuantizer();
74
73
  ifl->copyTo(res);
75
74
  return res;
76
- } else if(auto ipq = dynamic_cast<const GpuIndexIVFPQ *>(index)) {
77
- IndexIVFPQ *res = new IndexIVFPQ();
75
+ } else if (auto ipq = dynamic_cast<const GpuIndexIVFPQ*>(index)) {
76
+ IndexIVFPQ* res = new IndexIVFPQ();
78
77
  ipq->copyTo(res);
79
78
  return res;
80
79
 
@@ -82,17 +81,17 @@ Index *ToCPUCloner::clone_Index(const Index *index)
82
81
  // objective is to make a single component out of them
83
82
  // (inverse op of ToGpuClonerMultiple)
84
83
 
85
- } else if(auto ish = dynamic_cast<const IndexShards *>(index)) {
84
+ } else if (auto ish = dynamic_cast<const IndexShards*>(index)) {
86
85
  int nshard = ish->count();
87
86
  FAISS_ASSERT(nshard > 0);
88
- Index *res = clone_Index(ish->at(0));
89
- for(int i = 1; i < ish->count(); i++) {
90
- Index *res_i = clone_Index(ish->at(i));
87
+ Index* res = clone_Index(ish->at(0));
88
+ for (int i = 1; i < ish->count(); i++) {
89
+ Index* res_i = clone_Index(ish->at(i));
91
90
  merge_index(res, res_i, ish->successive_ids);
92
91
  delete res_i;
93
92
  }
94
93
  return res;
95
- } else if(auto ipr = dynamic_cast<const IndexReplicas *>(index)) {
94
+ } else if (auto ipr = dynamic_cast<const IndexReplicas*>(index)) {
96
95
  // just clone one of the replicas
97
96
  FAISS_ASSERT(ipr->count() > 0);
98
97
  return clone_Index(ipr->at(0));
@@ -101,81 +100,97 @@ Index *ToCPUCloner::clone_Index(const Index *index)
101
100
  }
102
101
  }
103
102
 
104
- faiss::Index * index_gpu_to_cpu(const faiss::Index *gpu_index)
105
- {
103
+ faiss::Index* index_gpu_to_cpu(const faiss::Index* gpu_index) {
106
104
  ToCPUCloner cl;
107
105
  return cl.clone_Index(gpu_index);
108
106
  }
109
107
 
110
-
111
-
112
-
113
108
  /**********************************************************
114
109
  * Cloning to 1 GPU
115
110
  **********************************************************/
116
111
 
117
- ToGpuCloner::ToGpuCloner(GpuResourcesProvider *prov, int device,
118
- const GpuClonerOptions &options):
119
- GpuClonerOptions(options), provider(prov), device(device)
120
- {}
112
+ ToGpuCloner::ToGpuCloner(
113
+ GpuResourcesProvider* prov,
114
+ int device,
115
+ const GpuClonerOptions& options)
116
+ : GpuClonerOptions(options), provider(prov), device(device) {}
121
117
 
122
- Index *ToGpuCloner::clone_Index(const Index *index)
123
- {
124
- if(auto ifl = dynamic_cast<const IndexFlat *>(index)) {
118
+ Index* ToGpuCloner::clone_Index(const Index* index) {
119
+ using idx_t = Index::idx_t;
120
+ if (auto ifl = dynamic_cast<const IndexFlat*>(index)) {
125
121
  GpuIndexFlatConfig config;
126
122
  config.device = device;
127
123
  config.useFloat16 = useFloat16;
128
124
  config.storeTransposed = storeTransposed;
129
-
130
125
  return new GpuIndexFlat(provider, ifl, config);
131
- } else if(auto ifl = dynamic_cast<const faiss::IndexIVFFlat *>(index)) {
126
+ } else if (
127
+ dynamic_cast<const IndexScalarQuantizer*>(index) &&
128
+ static_cast<const IndexScalarQuantizer*>(index)->sq.qtype ==
129
+ ScalarQuantizer::QT_fp16) {
130
+ GpuIndexFlatConfig config;
131
+ config.device = device;
132
+ config.useFloat16 = true;
133
+ GpuIndexFlat* gif = new GpuIndexFlat(
134
+ provider, index->d, index->metric_type, config);
135
+ // transfer data by blocks
136
+ idx_t bs = 1024 * 1024;
137
+ for (idx_t i0 = 0; i0 < index->ntotal; i0 += bs) {
138
+ idx_t i1 = std::min(i0 + bs, index->ntotal);
139
+ std::vector<float> buffer((i1 - i0) * index->d);
140
+ index->reconstruct_n(i0, i1 - i0, buffer.data());
141
+ gif->add(i1 - i0, buffer.data());
142
+ }
143
+ assert(gif->getNumVecs() == index->ntotal);
144
+ return gif;
145
+ } else if (auto ifl = dynamic_cast<const faiss::IndexIVFFlat*>(index)) {
132
146
  GpuIndexIVFFlatConfig config;
133
147
  config.device = device;
134
148
  config.indicesOptions = indicesOptions;
135
149
  config.flatConfig.useFloat16 = useFloat16CoarseQuantizer;
136
150
  config.flatConfig.storeTransposed = storeTransposed;
137
151
 
138
- GpuIndexIVFFlat *res =
139
- new GpuIndexIVFFlat(provider,
140
- ifl->d,
141
- ifl->nlist,
142
- ifl->metric_type,
143
- config);
144
- if(reserveVecs > 0 && ifl->ntotal == 0) {
152
+ GpuIndexIVFFlat* res = new GpuIndexIVFFlat(
153
+ provider, ifl->d, ifl->nlist, ifl->metric_type, config);
154
+ if (reserveVecs > 0 && ifl->ntotal == 0) {
145
155
  res->reserveMemory(reserveVecs);
146
156
  }
147
157
 
148
158
  res->copyFrom(ifl);
149
159
  return res;
150
- } else if(auto ifl =
151
- dynamic_cast<const faiss::IndexIVFScalarQuantizer *>(index)) {
160
+ } else if (
161
+ auto ifl = dynamic_cast<const faiss::IndexIVFScalarQuantizer*>(
162
+ index)) {
152
163
  GpuIndexIVFScalarQuantizerConfig config;
153
164
  config.device = device;
154
165
  config.indicesOptions = indicesOptions;
155
166
  config.flatConfig.useFloat16 = useFloat16CoarseQuantizer;
156
167
  config.flatConfig.storeTransposed = storeTransposed;
157
168
 
158
- GpuIndexIVFScalarQuantizer *res =
159
- new GpuIndexIVFScalarQuantizer(provider,
160
- ifl->d,
161
- ifl->nlist,
162
- ifl->sq.qtype,
163
- ifl->metric_type,
164
- ifl->by_residual,
165
- config);
166
- if(reserveVecs > 0 && ifl->ntotal == 0) {
169
+ GpuIndexIVFScalarQuantizer* res = new GpuIndexIVFScalarQuantizer(
170
+ provider,
171
+ ifl->d,
172
+ ifl->nlist,
173
+ ifl->sq.qtype,
174
+ ifl->metric_type,
175
+ ifl->by_residual,
176
+ config);
177
+ if (reserveVecs > 0 && ifl->ntotal == 0) {
167
178
  res->reserveMemory(reserveVecs);
168
179
  }
169
180
 
170
181
  res->copyFrom(ifl);
171
182
  return res;
172
- } else if(auto ipq = dynamic_cast<const faiss::IndexIVFPQ *>(index)) {
173
- if(verbose)
183
+ } else if (auto ipq = dynamic_cast<const faiss::IndexIVFPQ*>(index)) {
184
+ if (verbose) {
174
185
  printf(" IndexIVFPQ size %ld -> GpuIndexIVFPQ "
175
186
  "indicesOptions=%d "
176
187
  "usePrecomputed=%d useFloat16=%d reserveVecs=%ld\n",
177
- ipq->ntotal, indicesOptions, usePrecomputed,
178
- useFloat16, reserveVecs);
188
+ ipq->ntotal,
189
+ indicesOptions,
190
+ usePrecomputed,
191
+ useFloat16,
192
+ reserveVecs);
193
+ }
179
194
  GpuIndexIVFPQConfig config;
180
195
  config.device = device;
181
196
  config.indicesOptions = indicesOptions;
@@ -184,154 +199,144 @@ Index *ToGpuCloner::clone_Index(const Index *index)
184
199
  config.useFloat16LookupTables = useFloat16;
185
200
  config.usePrecomputedTables = usePrecomputed;
186
201
 
187
- GpuIndexIVFPQ *res = new GpuIndexIVFPQ(provider, ipq, config);
202
+ GpuIndexIVFPQ* res = new GpuIndexIVFPQ(provider, ipq, config);
188
203
 
189
- if(reserveVecs > 0 && ipq->ntotal == 0) {
204
+ if (reserveVecs > 0 && ipq->ntotal == 0) {
190
205
  res->reserveMemory(reserveVecs);
191
206
  }
192
207
 
193
208
  return res;
194
209
  } else {
210
+ // default: use CPU cloner
195
211
  return Cloner::clone_Index(index);
196
212
  }
197
213
  }
198
214
 
199
-
200
- faiss::Index * index_cpu_to_gpu(
201
- GpuResourcesProvider* provider, int device,
202
- const faiss::Index *index,
203
- const GpuClonerOptions *options)
204
- {
215
+ faiss::Index* index_cpu_to_gpu(
216
+ GpuResourcesProvider* provider,
217
+ int device,
218
+ const faiss::Index* index,
219
+ const GpuClonerOptions* options) {
205
220
  GpuClonerOptions defaults;
206
221
  ToGpuCloner cl(provider, device, options ? *options : defaults);
207
222
  return cl.clone_Index(index);
208
223
  }
209
224
 
210
-
211
225
  /**********************************************************
212
226
  * Cloning to multiple GPUs
213
227
  **********************************************************/
214
228
 
215
229
  ToGpuClonerMultiple::ToGpuClonerMultiple(
216
- std::vector<GpuResourcesProvider *> & provider,
217
- std::vector<int>& devices,
218
- const GpuMultipleClonerOptions &options):
219
- GpuMultipleClonerOptions(options)
220
- {
230
+ std::vector<GpuResourcesProvider*>& provider,
231
+ std::vector<int>& devices,
232
+ const GpuMultipleClonerOptions& options)
233
+ : GpuMultipleClonerOptions(options) {
221
234
  FAISS_ASSERT(provider.size() == devices.size());
222
- for(int i = 0; i < provider.size(); i++) {
235
+ for (int i = 0; i < provider.size(); i++) {
223
236
  sub_cloners.push_back(ToGpuCloner(provider[i], devices[i], options));
224
237
  }
225
238
  }
226
239
 
227
-
228
240
  ToGpuClonerMultiple::ToGpuClonerMultiple(
229
- const std::vector<ToGpuCloner> & sub_cloners,
230
- const GpuMultipleClonerOptions &options):
231
- GpuMultipleClonerOptions(options),
232
- sub_cloners(sub_cloners)
233
- {}
234
-
235
-
236
- void ToGpuClonerMultiple::copy_ivf_shard (
237
- const IndexIVF *index_ivf, IndexIVF *idx2,
238
- long n, long i)
239
- {
241
+ const std::vector<ToGpuCloner>& sub_cloners,
242
+ const GpuMultipleClonerOptions& options)
243
+ : GpuMultipleClonerOptions(options), sub_cloners(sub_cloners) {}
244
+
245
+ void ToGpuClonerMultiple::copy_ivf_shard(
246
+ const IndexIVF* index_ivf,
247
+ IndexIVF* idx2,
248
+ long n,
249
+ long i) {
240
250
  if (shard_type == 2) {
241
251
  long i0 = i * index_ivf->ntotal / n;
242
252
  long i1 = (i + 1) * index_ivf->ntotal / n;
243
253
 
244
- if(verbose)
245
- printf("IndexShards shard %ld indices %ld:%ld\n",
246
- i, i0, i1);
254
+ if (verbose)
255
+ printf("IndexShards shard %ld indices %ld:%ld\n", i, i0, i1);
247
256
  index_ivf->copy_subset_to(*idx2, 2, i0, i1);
248
257
  FAISS_ASSERT(idx2->ntotal == i1 - i0);
249
258
  } else if (shard_type == 1) {
250
- if(verbose)
251
- printf("IndexShards shard %ld select modulo %ld = %ld\n",
252
- i, n, i);
259
+ if (verbose)
260
+ printf("IndexShards shard %ld select modulo %ld = %ld\n", i, n, i);
253
261
  index_ivf->copy_subset_to(*idx2, 1, n, i);
254
262
  } else {
255
- FAISS_THROW_FMT ("shard_type %d not implemented", shard_type);
263
+ FAISS_THROW_FMT("shard_type %d not implemented", shard_type);
256
264
  }
257
-
258
265
  }
259
266
 
260
- Index * ToGpuClonerMultiple::clone_Index_to_shards (const Index *index)
261
- {
267
+ Index* ToGpuClonerMultiple::clone_Index_to_shards(const Index* index) {
262
268
  long n = sub_cloners.size();
263
269
 
264
- auto index_ivfpq =
265
- dynamic_cast<const faiss::IndexIVFPQ *>(index);
266
- auto index_ivfflat =
267
- dynamic_cast<const faiss::IndexIVFFlat *>(index);
270
+ auto index_ivfpq = dynamic_cast<const faiss::IndexIVFPQ*>(index);
271
+ auto index_ivfflat = dynamic_cast<const faiss::IndexIVFFlat*>(index);
268
272
  auto index_ivfsq =
269
- dynamic_cast<const faiss::IndexIVFScalarQuantizer *>(index);
270
- auto index_flat =
271
- dynamic_cast<const faiss::IndexFlat *>(index);
272
- FAISS_THROW_IF_NOT_MSG (
273
- index_ivfpq || index_ivfflat || index_flat || index_ivfsq,
274
- "IndexShards implemented only for "
275
- "IndexIVFFlat, IndexIVFScalarQuantizer, "
276
- "IndexFlat and IndexIVFPQ");
273
+ dynamic_cast<const faiss::IndexIVFScalarQuantizer*>(index);
274
+ auto index_flat = dynamic_cast<const faiss::IndexFlat*>(index);
275
+ FAISS_THROW_IF_NOT_MSG(
276
+ index_ivfpq || index_ivfflat || index_flat || index_ivfsq,
277
+ "IndexShards implemented only for "
278
+ "IndexIVFFlat, IndexIVFScalarQuantizer, "
279
+ "IndexFlat and IndexIVFPQ");
277
280
 
278
281
  std::vector<faiss::Index*> shards(n);
279
282
 
280
- for(long i = 0; i < n; i++) {
283
+ for (long i = 0; i < n; i++) {
281
284
  // make a shallow copy
282
- if(reserveVecs)
283
- sub_cloners[i].reserveVecs =
284
- (reserveVecs + n - 1) / n;
285
+ if (reserveVecs)
286
+ sub_cloners[i].reserveVecs = (reserveVecs + n - 1) / n;
285
287
 
286
288
  if (index_ivfpq) {
287
289
  faiss::IndexIVFPQ idx2(
288
- index_ivfpq->quantizer, index_ivfpq->d,
289
- index_ivfpq->nlist, index_ivfpq->code_size,
290
- index_ivfpq->pq.nbits);
290
+ index_ivfpq->quantizer,
291
+ index_ivfpq->d,
292
+ index_ivfpq->nlist,
293
+ index_ivfpq->code_size,
294
+ index_ivfpq->pq.nbits);
291
295
  idx2.metric_type = index_ivfpq->metric_type;
292
296
  idx2.pq = index_ivfpq->pq;
293
297
  idx2.nprobe = index_ivfpq->nprobe;
294
298
  idx2.use_precomputed_table = 0;
295
299
  idx2.is_trained = index->is_trained;
296
- copy_ivf_shard (index_ivfpq, &idx2, n, i);
300
+ copy_ivf_shard(index_ivfpq, &idx2, n, i);
297
301
  shards[i] = sub_cloners[i].clone_Index(&idx2);
298
302
  } else if (index_ivfflat) {
299
303
  faiss::IndexIVFFlat idx2(
300
- index_ivfflat->quantizer, index->d,
301
- index_ivfflat->nlist, index_ivfflat->metric_type);
304
+ index_ivfflat->quantizer,
305
+ index->d,
306
+ index_ivfflat->nlist,
307
+ index_ivfflat->metric_type);
302
308
  idx2.nprobe = index_ivfflat->nprobe;
303
309
  idx2.is_trained = index->is_trained;
304
- copy_ivf_shard (index_ivfflat, &idx2, n, i);
310
+ copy_ivf_shard(index_ivfflat, &idx2, n, i);
305
311
  shards[i] = sub_cloners[i].clone_Index(&idx2);
306
312
  } else if (index_ivfsq) {
307
313
  faiss::IndexIVFScalarQuantizer idx2(
308
- index_ivfsq->quantizer, index->d, index_ivfsq->nlist,
309
- index_ivfsq->sq.qtype,
310
- index_ivfsq->metric_type,
311
- index_ivfsq->by_residual);
314
+ index_ivfsq->quantizer,
315
+ index->d,
316
+ index_ivfsq->nlist,
317
+ index_ivfsq->sq.qtype,
318
+ index_ivfsq->metric_type,
319
+ index_ivfsq->by_residual);
312
320
 
313
321
  idx2.nprobe = index_ivfsq->nprobe;
314
322
  idx2.is_trained = index->is_trained;
315
323
  idx2.sq = index_ivfsq->sq;
316
- copy_ivf_shard (index_ivfsq, &idx2, n, i);
324
+ copy_ivf_shard(index_ivfsq, &idx2, n, i);
317
325
  shards[i] = sub_cloners[i].clone_Index(&idx2);
318
326
  } else if (index_flat) {
319
- faiss::IndexFlat idx2 (
320
- index->d, index->metric_type);
327
+ faiss::IndexFlat idx2(index->d, index->metric_type);
321
328
  shards[i] = sub_cloners[i].clone_Index(&idx2);
322
329
  if (index->ntotal > 0) {
323
330
  long i0 = index->ntotal * i / n;
324
331
  long i1 = index->ntotal * (i + 1) / n;
325
- shards[i]->add (i1 - i0,
326
- index_flat->xb.data() + i0 * index->d);
332
+ shards[i]->add(i1 - i0, index_flat->get_xb() + i0 * index->d);
327
333
  }
328
334
  }
329
335
  }
330
336
 
331
337
  bool successive_ids = index_flat != nullptr;
332
- faiss::IndexShards *res =
333
- new faiss::IndexShards(index->d, true,
334
- successive_ids);
338
+ faiss::IndexShards* res =
339
+ new faiss::IndexShards(index->d, true, successive_ids);
335
340
 
336
341
  for (int i = 0; i < n; i++) {
337
342
  res->add_shard(shards[i]);
@@ -341,33 +346,32 @@ Index * ToGpuClonerMultiple::clone_Index_to_shards (const Index *index)
341
346
  return res;
342
347
  }
343
348
 
344
- Index *ToGpuClonerMultiple::clone_Index(const Index *index)
345
- {
349
+ Index* ToGpuClonerMultiple::clone_Index(const Index* index) {
346
350
  long n = sub_cloners.size();
347
351
  if (n == 1)
348
352
  return sub_cloners[0].clone_Index(index);
349
353
 
350
- if(dynamic_cast<const IndexFlat *>(index) ||
351
- dynamic_cast<const faiss::IndexIVFFlat *>(index) ||
352
- dynamic_cast<const faiss::IndexIVFScalarQuantizer *>(index) ||
353
- dynamic_cast<const faiss::IndexIVFPQ *>(index)) {
354
- if(!shard) {
355
- IndexReplicas * res = new IndexReplicas();
356
- for(auto & sub_cloner: sub_cloners) {
354
+ if (dynamic_cast<const IndexFlat*>(index) ||
355
+ dynamic_cast<const faiss::IndexIVFFlat*>(index) ||
356
+ dynamic_cast<const faiss::IndexIVFScalarQuantizer*>(index) ||
357
+ dynamic_cast<const faiss::IndexIVFPQ*>(index)) {
358
+ if (!shard) {
359
+ IndexReplicas* res = new IndexReplicas();
360
+ for (auto& sub_cloner : sub_cloners) {
357
361
  res->addIndex(sub_cloner.clone_Index(index));
358
362
  }
359
363
  res->own_fields = true;
360
364
  return res;
361
365
  } else {
362
- return clone_Index_to_shards (index);
366
+ return clone_Index_to_shards(index);
363
367
  }
364
- } else if(auto miq = dynamic_cast<const MultiIndexQuantizer *>(index)) {
368
+ } else if (auto miq = dynamic_cast<const MultiIndexQuantizer*>(index)) {
365
369
  if (verbose) {
366
370
  printf("cloning MultiIndexQuantizer: "
367
371
  "will be valid only for search k=1\n");
368
372
  }
369
- const ProductQuantizer & pq = miq->pq;
370
- IndexSplitVectors *splitv = new IndexSplitVectors(pq.d, true);
373
+ const ProductQuantizer& pq = miq->pq;
374
+ IndexSplitVectors* splitv = new IndexSplitVectors(pq.d, true);
371
375
  splitv->own_fields = true;
372
376
 
373
377
  for (int m = 0; m < pq.M; m++) {
@@ -377,12 +381,13 @@ Index *ToGpuClonerMultiple::clone_Index(const Index *index)
377
381
  long i1 = pq.M <= n ? (m + 1) * n / pq.M : i0 + 1;
378
382
  std::vector<ToGpuCloner> sub_cloners_2;
379
383
  sub_cloners_2.insert(
380
- sub_cloners_2.begin(), sub_cloners.begin() + i0,
381
- sub_cloners.begin() + i1);
384
+ sub_cloners_2.begin(),
385
+ sub_cloners.begin() + i0,
386
+ sub_cloners.begin() + i1);
382
387
  ToGpuClonerMultiple cm(sub_cloners_2, *this);
383
- IndexFlatL2 idxc (pq.dsub);
384
- idxc.add (pq.ksub, pq.centroids.data() + m * pq.d * pq.ksub);
385
- Index *idx2 = cm.clone_Index(&idxc);
388
+ IndexFlatL2 idxc(pq.dsub);
389
+ idxc.add(pq.ksub, pq.centroids.data() + m * pq.d * pq.ksub);
390
+ Index* idx2 = cm.clone_Index(&idxc);
386
391
  splitv->add_sub_index(idx2);
387
392
  }
388
393
  return splitv;
@@ -391,17 +396,39 @@ Index *ToGpuClonerMultiple::clone_Index(const Index *index)
391
396
  }
392
397
  }
393
398
 
394
-
395
-
396
- faiss::Index * index_cpu_to_gpu_multiple(
397
- std::vector<GpuResourcesProvider*> & provider,
398
- std::vector<int> &devices,
399
- const faiss::Index *index,
400
- const GpuMultipleClonerOptions *options)
401
- {
399
+ faiss::Index* index_cpu_to_gpu_multiple(
400
+ std::vector<GpuResourcesProvider*>& provider,
401
+ std::vector<int>& devices,
402
+ const faiss::Index* index,
403
+ const GpuMultipleClonerOptions* options) {
402
404
  GpuMultipleClonerOptions defaults;
403
405
  ToGpuClonerMultiple cl(provider, devices, options ? *options : defaults);
404
406
  return cl.clone_Index(index);
405
407
  }
406
408
 
407
- } } // namespace
409
+ GpuProgressiveDimIndexFactory::GpuProgressiveDimIndexFactory(int ngpu) {
410
+ FAISS_THROW_IF_NOT(ngpu >= 1);
411
+ devices.resize(ngpu);
412
+ vres.resize(ngpu);
413
+
414
+ for (int i = 0; i < ngpu; i++) {
415
+ vres[i] = new StandardGpuResources();
416
+ devices[i] = i;
417
+ }
418
+ ncall = 0;
419
+ }
420
+
421
+ GpuProgressiveDimIndexFactory::~GpuProgressiveDimIndexFactory() {
422
+ for (int i = 0; i < vres.size(); i++) {
423
+ delete vres[i];
424
+ }
425
+ }
426
+
427
+ Index* GpuProgressiveDimIndexFactory::operator()(int dim) {
428
+ IndexFlatL2 index(dim);
429
+ ncall++;
430
+ return index_cpu_to_gpu_multiple(vres, devices, &index, &options);
431
+ }
432
+
433
+ } // namespace gpu
434
+ } // namespace faiss