faiss 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +103 -3
  4. data/ext/faiss/ext.cpp +99 -32
  5. data/ext/faiss/extconf.rb +12 -2
  6. data/lib/faiss/ext.bundle +0 -0
  7. data/lib/faiss/index.rb +3 -3
  8. data/lib/faiss/index_binary.rb +3 -3
  9. data/lib/faiss/kmeans.rb +1 -1
  10. data/lib/faiss/pca_matrix.rb +2 -2
  11. data/lib/faiss/product_quantizer.rb +3 -3
  12. data/lib/faiss/version.rb +1 -1
  13. data/vendor/faiss/AutoTune.cpp +719 -0
  14. data/vendor/faiss/AutoTune.h +212 -0
  15. data/vendor/faiss/Clustering.cpp +261 -0
  16. data/vendor/faiss/Clustering.h +101 -0
  17. data/vendor/faiss/IVFlib.cpp +339 -0
  18. data/vendor/faiss/IVFlib.h +132 -0
  19. data/vendor/faiss/Index.cpp +171 -0
  20. data/vendor/faiss/Index.h +261 -0
  21. data/vendor/faiss/Index2Layer.cpp +437 -0
  22. data/vendor/faiss/Index2Layer.h +85 -0
  23. data/vendor/faiss/IndexBinary.cpp +77 -0
  24. data/vendor/faiss/IndexBinary.h +163 -0
  25. data/vendor/faiss/IndexBinaryFlat.cpp +83 -0
  26. data/vendor/faiss/IndexBinaryFlat.h +54 -0
  27. data/vendor/faiss/IndexBinaryFromFloat.cpp +78 -0
  28. data/vendor/faiss/IndexBinaryFromFloat.h +52 -0
  29. data/vendor/faiss/IndexBinaryHNSW.cpp +325 -0
  30. data/vendor/faiss/IndexBinaryHNSW.h +56 -0
  31. data/vendor/faiss/IndexBinaryIVF.cpp +671 -0
  32. data/vendor/faiss/IndexBinaryIVF.h +211 -0
  33. data/vendor/faiss/IndexFlat.cpp +508 -0
  34. data/vendor/faiss/IndexFlat.h +175 -0
  35. data/vendor/faiss/IndexHNSW.cpp +1090 -0
  36. data/vendor/faiss/IndexHNSW.h +170 -0
  37. data/vendor/faiss/IndexIVF.cpp +909 -0
  38. data/vendor/faiss/IndexIVF.h +353 -0
  39. data/vendor/faiss/IndexIVFFlat.cpp +502 -0
  40. data/vendor/faiss/IndexIVFFlat.h +118 -0
  41. data/vendor/faiss/IndexIVFPQ.cpp +1207 -0
  42. data/vendor/faiss/IndexIVFPQ.h +161 -0
  43. data/vendor/faiss/IndexIVFPQR.cpp +219 -0
  44. data/vendor/faiss/IndexIVFPQR.h +65 -0
  45. data/vendor/faiss/IndexIVFSpectralHash.cpp +331 -0
  46. data/vendor/faiss/IndexIVFSpectralHash.h +75 -0
  47. data/vendor/faiss/IndexLSH.cpp +225 -0
  48. data/vendor/faiss/IndexLSH.h +87 -0
  49. data/vendor/faiss/IndexLattice.cpp +143 -0
  50. data/vendor/faiss/IndexLattice.h +68 -0
  51. data/vendor/faiss/IndexPQ.cpp +1188 -0
  52. data/vendor/faiss/IndexPQ.h +199 -0
  53. data/vendor/faiss/IndexPreTransform.cpp +288 -0
  54. data/vendor/faiss/IndexPreTransform.h +91 -0
  55. data/vendor/faiss/IndexReplicas.cpp +123 -0
  56. data/vendor/faiss/IndexReplicas.h +76 -0
  57. data/vendor/faiss/IndexScalarQuantizer.cpp +317 -0
  58. data/vendor/faiss/IndexScalarQuantizer.h +127 -0
  59. data/vendor/faiss/IndexShards.cpp +317 -0
  60. data/vendor/faiss/IndexShards.h +100 -0
  61. data/vendor/faiss/InvertedLists.cpp +623 -0
  62. data/vendor/faiss/InvertedLists.h +334 -0
  63. data/vendor/faiss/LICENSE +21 -0
  64. data/vendor/faiss/MatrixStats.cpp +252 -0
  65. data/vendor/faiss/MatrixStats.h +62 -0
  66. data/vendor/faiss/MetaIndexes.cpp +351 -0
  67. data/vendor/faiss/MetaIndexes.h +126 -0
  68. data/vendor/faiss/OnDiskInvertedLists.cpp +674 -0
  69. data/vendor/faiss/OnDiskInvertedLists.h +127 -0
  70. data/vendor/faiss/VectorTransform.cpp +1157 -0
  71. data/vendor/faiss/VectorTransform.h +322 -0
  72. data/vendor/faiss/c_api/AutoTune_c.cpp +83 -0
  73. data/vendor/faiss/c_api/AutoTune_c.h +64 -0
  74. data/vendor/faiss/c_api/Clustering_c.cpp +139 -0
  75. data/vendor/faiss/c_api/Clustering_c.h +117 -0
  76. data/vendor/faiss/c_api/IndexFlat_c.cpp +140 -0
  77. data/vendor/faiss/c_api/IndexFlat_c.h +115 -0
  78. data/vendor/faiss/c_api/IndexIVFFlat_c.cpp +64 -0
  79. data/vendor/faiss/c_api/IndexIVFFlat_c.h +58 -0
  80. data/vendor/faiss/c_api/IndexIVF_c.cpp +92 -0
  81. data/vendor/faiss/c_api/IndexIVF_c.h +135 -0
  82. data/vendor/faiss/c_api/IndexLSH_c.cpp +37 -0
  83. data/vendor/faiss/c_api/IndexLSH_c.h +40 -0
  84. data/vendor/faiss/c_api/IndexShards_c.cpp +44 -0
  85. data/vendor/faiss/c_api/IndexShards_c.h +42 -0
  86. data/vendor/faiss/c_api/Index_c.cpp +105 -0
  87. data/vendor/faiss/c_api/Index_c.h +183 -0
  88. data/vendor/faiss/c_api/MetaIndexes_c.cpp +49 -0
  89. data/vendor/faiss/c_api/MetaIndexes_c.h +49 -0
  90. data/vendor/faiss/c_api/clone_index_c.cpp +23 -0
  91. data/vendor/faiss/c_api/clone_index_c.h +32 -0
  92. data/vendor/faiss/c_api/error_c.h +42 -0
  93. data/vendor/faiss/c_api/error_impl.cpp +27 -0
  94. data/vendor/faiss/c_api/error_impl.h +16 -0
  95. data/vendor/faiss/c_api/faiss_c.h +58 -0
  96. data/vendor/faiss/c_api/gpu/GpuAutoTune_c.cpp +96 -0
  97. data/vendor/faiss/c_api/gpu/GpuAutoTune_c.h +56 -0
  98. data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.cpp +52 -0
  99. data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.h +68 -0
  100. data/vendor/faiss/c_api/gpu/GpuIndex_c.cpp +17 -0
  101. data/vendor/faiss/c_api/gpu/GpuIndex_c.h +30 -0
  102. data/vendor/faiss/c_api/gpu/GpuIndicesOptions_c.h +38 -0
  103. data/vendor/faiss/c_api/gpu/GpuResources_c.cpp +86 -0
  104. data/vendor/faiss/c_api/gpu/GpuResources_c.h +66 -0
  105. data/vendor/faiss/c_api/gpu/StandardGpuResources_c.cpp +54 -0
  106. data/vendor/faiss/c_api/gpu/StandardGpuResources_c.h +53 -0
  107. data/vendor/faiss/c_api/gpu/macros_impl.h +42 -0
  108. data/vendor/faiss/c_api/impl/AuxIndexStructures_c.cpp +220 -0
  109. data/vendor/faiss/c_api/impl/AuxIndexStructures_c.h +149 -0
  110. data/vendor/faiss/c_api/index_factory_c.cpp +26 -0
  111. data/vendor/faiss/c_api/index_factory_c.h +30 -0
  112. data/vendor/faiss/c_api/index_io_c.cpp +42 -0
  113. data/vendor/faiss/c_api/index_io_c.h +50 -0
  114. data/vendor/faiss/c_api/macros_impl.h +110 -0
  115. data/vendor/faiss/clone_index.cpp +147 -0
  116. data/vendor/faiss/clone_index.h +38 -0
  117. data/vendor/faiss/demos/demo_imi_flat.cpp +151 -0
  118. data/vendor/faiss/demos/demo_imi_pq.cpp +199 -0
  119. data/vendor/faiss/demos/demo_ivfpq_indexing.cpp +146 -0
  120. data/vendor/faiss/demos/demo_sift1M.cpp +252 -0
  121. data/vendor/faiss/gpu/GpuAutoTune.cpp +95 -0
  122. data/vendor/faiss/gpu/GpuAutoTune.h +27 -0
  123. data/vendor/faiss/gpu/GpuCloner.cpp +403 -0
  124. data/vendor/faiss/gpu/GpuCloner.h +82 -0
  125. data/vendor/faiss/gpu/GpuClonerOptions.cpp +28 -0
  126. data/vendor/faiss/gpu/GpuClonerOptions.h +53 -0
  127. data/vendor/faiss/gpu/GpuDistance.h +52 -0
  128. data/vendor/faiss/gpu/GpuFaissAssert.h +29 -0
  129. data/vendor/faiss/gpu/GpuIndex.h +148 -0
  130. data/vendor/faiss/gpu/GpuIndexBinaryFlat.h +89 -0
  131. data/vendor/faiss/gpu/GpuIndexFlat.h +190 -0
  132. data/vendor/faiss/gpu/GpuIndexIVF.h +89 -0
  133. data/vendor/faiss/gpu/GpuIndexIVFFlat.h +85 -0
  134. data/vendor/faiss/gpu/GpuIndexIVFPQ.h +143 -0
  135. data/vendor/faiss/gpu/GpuIndexIVFScalarQuantizer.h +100 -0
  136. data/vendor/faiss/gpu/GpuIndicesOptions.h +30 -0
  137. data/vendor/faiss/gpu/GpuResources.cpp +52 -0
  138. data/vendor/faiss/gpu/GpuResources.h +73 -0
  139. data/vendor/faiss/gpu/StandardGpuResources.cpp +295 -0
  140. data/vendor/faiss/gpu/StandardGpuResources.h +114 -0
  141. data/vendor/faiss/gpu/impl/RemapIndices.cpp +43 -0
  142. data/vendor/faiss/gpu/impl/RemapIndices.h +24 -0
  143. data/vendor/faiss/gpu/perf/IndexWrapper-inl.h +71 -0
  144. data/vendor/faiss/gpu/perf/IndexWrapper.h +39 -0
  145. data/vendor/faiss/gpu/perf/PerfClustering.cpp +115 -0
  146. data/vendor/faiss/gpu/perf/PerfIVFPQAdd.cpp +139 -0
  147. data/vendor/faiss/gpu/perf/WriteIndex.cpp +102 -0
  148. data/vendor/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +130 -0
  149. data/vendor/faiss/gpu/test/TestGpuIndexFlat.cpp +371 -0
  150. data/vendor/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +550 -0
  151. data/vendor/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +450 -0
  152. data/vendor/faiss/gpu/test/TestGpuMemoryException.cpp +84 -0
  153. data/vendor/faiss/gpu/test/TestUtils.cpp +315 -0
  154. data/vendor/faiss/gpu/test/TestUtils.h +93 -0
  155. data/vendor/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +159 -0
  156. data/vendor/faiss/gpu/utils/DeviceMemory.cpp +77 -0
  157. data/vendor/faiss/gpu/utils/DeviceMemory.h +71 -0
  158. data/vendor/faiss/gpu/utils/DeviceUtils.h +185 -0
  159. data/vendor/faiss/gpu/utils/MemorySpace.cpp +89 -0
  160. data/vendor/faiss/gpu/utils/MemorySpace.h +44 -0
  161. data/vendor/faiss/gpu/utils/StackDeviceMemory.cpp +239 -0
  162. data/vendor/faiss/gpu/utils/StackDeviceMemory.h +129 -0
  163. data/vendor/faiss/gpu/utils/StaticUtils.h +83 -0
  164. data/vendor/faiss/gpu/utils/Timer.cpp +60 -0
  165. data/vendor/faiss/gpu/utils/Timer.h +52 -0
  166. data/vendor/faiss/impl/AuxIndexStructures.cpp +305 -0
  167. data/vendor/faiss/impl/AuxIndexStructures.h +246 -0
  168. data/vendor/faiss/impl/FaissAssert.h +95 -0
  169. data/vendor/faiss/impl/FaissException.cpp +66 -0
  170. data/vendor/faiss/impl/FaissException.h +71 -0
  171. data/vendor/faiss/impl/HNSW.cpp +818 -0
  172. data/vendor/faiss/impl/HNSW.h +275 -0
  173. data/vendor/faiss/impl/PolysemousTraining.cpp +953 -0
  174. data/vendor/faiss/impl/PolysemousTraining.h +158 -0
  175. data/vendor/faiss/impl/ProductQuantizer.cpp +876 -0
  176. data/vendor/faiss/impl/ProductQuantizer.h +242 -0
  177. data/vendor/faiss/impl/ScalarQuantizer.cpp +1628 -0
  178. data/vendor/faiss/impl/ScalarQuantizer.h +120 -0
  179. data/vendor/faiss/impl/ThreadedIndex-inl.h +192 -0
  180. data/vendor/faiss/impl/ThreadedIndex.h +80 -0
  181. data/vendor/faiss/impl/index_read.cpp +793 -0
  182. data/vendor/faiss/impl/index_write.cpp +558 -0
  183. data/vendor/faiss/impl/io.cpp +142 -0
  184. data/vendor/faiss/impl/io.h +98 -0
  185. data/vendor/faiss/impl/lattice_Zn.cpp +712 -0
  186. data/vendor/faiss/impl/lattice_Zn.h +199 -0
  187. data/vendor/faiss/index_factory.cpp +392 -0
  188. data/vendor/faiss/index_factory.h +25 -0
  189. data/vendor/faiss/index_io.h +75 -0
  190. data/vendor/faiss/misc/test_blas.cpp +84 -0
  191. data/vendor/faiss/tests/test_binary_flat.cpp +64 -0
  192. data/vendor/faiss/tests/test_dealloc_invlists.cpp +183 -0
  193. data/vendor/faiss/tests/test_ivfpq_codec.cpp +67 -0
  194. data/vendor/faiss/tests/test_ivfpq_indexing.cpp +98 -0
  195. data/vendor/faiss/tests/test_lowlevel_ivf.cpp +566 -0
  196. data/vendor/faiss/tests/test_merge.cpp +258 -0
  197. data/vendor/faiss/tests/test_omp_threads.cpp +14 -0
  198. data/vendor/faiss/tests/test_ondisk_ivf.cpp +220 -0
  199. data/vendor/faiss/tests/test_pairs_decoding.cpp +189 -0
  200. data/vendor/faiss/tests/test_params_override.cpp +231 -0
  201. data/vendor/faiss/tests/test_pq_encoding.cpp +98 -0
  202. data/vendor/faiss/tests/test_sliding_ivf.cpp +240 -0
  203. data/vendor/faiss/tests/test_threaded_index.cpp +253 -0
  204. data/vendor/faiss/tests/test_transfer_invlists.cpp +159 -0
  205. data/vendor/faiss/tutorial/cpp/1-Flat.cpp +98 -0
  206. data/vendor/faiss/tutorial/cpp/2-IVFFlat.cpp +81 -0
  207. data/vendor/faiss/tutorial/cpp/3-IVFPQ.cpp +93 -0
  208. data/vendor/faiss/tutorial/cpp/4-GPU.cpp +119 -0
  209. data/vendor/faiss/tutorial/cpp/5-Multiple-GPUs.cpp +99 -0
  210. data/vendor/faiss/utils/Heap.cpp +122 -0
  211. data/vendor/faiss/utils/Heap.h +495 -0
  212. data/vendor/faiss/utils/WorkerThread.cpp +126 -0
  213. data/vendor/faiss/utils/WorkerThread.h +61 -0
  214. data/vendor/faiss/utils/distances.cpp +765 -0
  215. data/vendor/faiss/utils/distances.h +243 -0
  216. data/vendor/faiss/utils/distances_simd.cpp +809 -0
  217. data/vendor/faiss/utils/extra_distances.cpp +336 -0
  218. data/vendor/faiss/utils/extra_distances.h +54 -0
  219. data/vendor/faiss/utils/hamming-inl.h +472 -0
  220. data/vendor/faiss/utils/hamming.cpp +792 -0
  221. data/vendor/faiss/utils/hamming.h +220 -0
  222. data/vendor/faiss/utils/random.cpp +192 -0
  223. data/vendor/faiss/utils/random.h +60 -0
  224. data/vendor/faiss/utils/utils.cpp +783 -0
  225. data/vendor/faiss/utils/utils.h +181 -0
  226. metadata +216 -2
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <memory>
9
+ #include <cstdio>
10
+ #include <cstdlib>
11
+
12
+ #include <gtest/gtest.h>
13
+
14
+ #include <faiss/IndexIVFFlat.h>
15
+ #include <faiss/index_io.h>
16
+ #include <faiss/impl/io.h>
17
+ #include <faiss/AutoTune.h>
18
+ #include <faiss/index_factory.h>
19
+ #include <faiss/clone_index.h>
20
+ #include <faiss/VectorTransform.h>
21
+ #include <faiss/utils/random.h>
22
+ #include <faiss/IVFlib.h>
23
+
24
+
25
+ namespace {
26
+
27
+ // parameters to use for the test
28
+ int d = 64;
29
+ size_t nb = 1000;
30
+ size_t nq = 100;
31
+ size_t nt = 500;
32
+ int k = 10;
33
+ int nlist = 40;
34
+
35
+ using namespace faiss;
36
+
37
+ typedef faiss::Index::idx_t idx_t;
38
+
39
+
40
+ std::vector<float> get_data (size_t nb, int seed) {
41
+ std::vector<float> x (nb * d);
42
+ float_randn (x.data(), nb * d, seed);
43
+ return x;
44
+ }
45
+
46
+
47
+ void test_index_type(const char *factory_string) {
48
+
49
+ // transfer inverted lists in nslice slices
50
+ int nslice = 3;
51
+
52
+ /****************************************************************
53
+ * trained reference index
54
+ ****************************************************************/
55
+
56
+ std::unique_ptr<Index> trained (index_factory (d, factory_string));
57
+
58
+ {
59
+ auto xt = get_data (nt, 123);
60
+ trained->train (nt, xt.data());
61
+ }
62
+
63
+ // sample nq query vectors to check if results are the same
64
+ auto xq = get_data (nq, 818);
65
+
66
+
67
+ /****************************************************************
68
+ * source index
69
+ ***************************************************************/
70
+ std::unique_ptr<Index> src_index (clone_index (trained.get()));
71
+
72
+ { // add some data to source index
73
+ auto xb = get_data (nb, 245);
74
+ src_index->add (nb, xb.data());
75
+ }
76
+
77
+ ParameterSpace().set_index_parameter (src_index.get(), "nprobe", 4);
78
+
79
+ // remember reference search result on source index
80
+ std::vector<idx_t> Iref (nq * k);
81
+ std::vector<float> Dref (nq * k);
82
+ src_index->search (nq, xq.data(), k, Dref.data(), Iref.data());
83
+
84
+ /****************************************************************
85
+ * destination index -- should be replaced by source index
86
+ ***************************************************************/
87
+
88
+ std::unique_ptr<Index> dst_index (clone_index (trained.get()));
89
+
90
+ { // initial state: filled in with some garbage
91
+ int nb2 = nb + 10;
92
+ auto xb = get_data (nb2, 366);
93
+ dst_index->add (nb2, xb.data());
94
+ }
95
+
96
+ std::vector<idx_t> Inew (nq * k);
97
+ std::vector<float> Dnew (nq * k);
98
+
99
+ ParameterSpace().set_index_parameter (dst_index.get(), "nprobe", 4);
100
+
101
+ // transfer from source to destination in nslice slices
102
+ for (int sl = 0; sl < nslice; sl++) {
103
+
104
+ // so far, the indexes are different
105
+ dst_index->search (nq, xq.data(), k, Dnew.data(), Inew.data());
106
+ EXPECT_TRUE (Iref != Inew);
107
+ EXPECT_TRUE (Dref != Dnew);
108
+
109
+ // range of inverted list indices to transfer
110
+ long i0 = sl * nlist / nslice;
111
+ long i1 = (sl + 1) * nlist / nslice;
112
+
113
+ std::vector<uint8_t> data_to_transfer;
114
+ {
115
+ std::unique_ptr<ArrayInvertedLists> il
116
+ (ivflib::get_invlist_range (src_index.get(), i0, i1));
117
+ // serialize inverted lists
118
+ VectorIOWriter wr;
119
+ write_InvertedLists (il.get(), &wr);
120
+ data_to_transfer.swap (wr.data);
121
+ }
122
+
123
+ // transfer data here from source machine to dest machine
124
+
125
+ {
126
+ VectorIOReader reader;
127
+ reader.data.swap (data_to_transfer);
128
+
129
+ // deserialize inverted lists
130
+ std::unique_ptr<ArrayInvertedLists> il
131
+ (dynamic_cast<ArrayInvertedLists *>
132
+ (read_InvertedLists (&reader)));
133
+
134
+ // swap inverted lists. Block searches here!
135
+ {
136
+ ivflib::set_invlist_range (dst_index.get(), i0, i1, il.get());
137
+ }
138
+ }
139
+
140
+ }
141
+ EXPECT_EQ (dst_index->ntotal, src_index->ntotal);
142
+
143
+ // now, the indexes are the same
144
+ dst_index->search (nq, xq.data(), k, Dnew.data(), Inew.data());
145
+ EXPECT_TRUE (Iref == Inew);
146
+ EXPECT_TRUE (Dref == Dnew);
147
+
148
+ }
149
+
150
+ } // namespace
151
+
152
+
153
+ TEST(TRANS, IVFFlat) {
154
+ test_index_type ("IVF40,Flat");
155
+ }
156
+
157
+ TEST(TRANS, IVFFlatPreproc) {
158
+ test_index_type ("PCAR32,IVF40,Flat");
159
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <cstdio>
9
+ #include <cstdlib>
10
+
11
+ #include <faiss/IndexFlat.h>
12
+
13
+
14
+ int main() {
15
+ int d = 64; // dimension
16
+ int nb = 100000; // database size
17
+ int nq = 10000; // nb of queries
18
+
19
+ float *xb = new float[d * nb];
20
+ float *xq = new float[d * nq];
21
+
22
+ for(int i = 0; i < nb; i++) {
23
+ for(int j = 0; j < d; j++)
24
+ xb[d * i + j] = drand48();
25
+ xb[d * i] += i / 1000.;
26
+ }
27
+
28
+ for(int i = 0; i < nq; i++) {
29
+ for(int j = 0; j < d; j++)
30
+ xq[d * i + j] = drand48();
31
+ xq[d * i] += i / 1000.;
32
+ }
33
+
34
+ faiss::IndexFlatL2 index(d); // call constructor
35
+ printf("is_trained = %s\n", index.is_trained ? "true" : "false");
36
+ index.add(nb, xb); // add vectors to the index
37
+ printf("ntotal = %ld\n", index.ntotal);
38
+
39
+ int k = 4;
40
+
41
+ { // sanity check: search 5 first vectors of xb
42
+ long *I = new long[k * 5];
43
+ float *D = new float[k * 5];
44
+
45
+ index.search(5, xb, k, D, I);
46
+
47
+ // print results
48
+ printf("I=\n");
49
+ for(int i = 0; i < 5; i++) {
50
+ for(int j = 0; j < k; j++)
51
+ printf("%5ld ", I[i * k + j]);
52
+ printf("\n");
53
+ }
54
+
55
+ printf("D=\n");
56
+ for(int i = 0; i < 5; i++) {
57
+ for(int j = 0; j < k; j++)
58
+ printf("%7g ", D[i * k + j]);
59
+ printf("\n");
60
+ }
61
+
62
+ delete [] I;
63
+ delete [] D;
64
+ }
65
+
66
+
67
+ { // search xq
68
+ long *I = new long[k * nq];
69
+ float *D = new float[k * nq];
70
+
71
+ index.search(nq, xq, k, D, I);
72
+
73
+ // print results
74
+ printf("I (5 first results)=\n");
75
+ for(int i = 0; i < 5; i++) {
76
+ for(int j = 0; j < k; j++)
77
+ printf("%5ld ", I[i * k + j]);
78
+ printf("\n");
79
+ }
80
+
81
+ printf("I (5 last results)=\n");
82
+ for(int i = nq - 5; i < nq; i++) {
83
+ for(int j = 0; j < k; j++)
84
+ printf("%5ld ", I[i * k + j]);
85
+ printf("\n");
86
+ }
87
+
88
+ delete [] I;
89
+ delete [] D;
90
+ }
91
+
92
+
93
+
94
+ delete [] xb;
95
+ delete [] xq;
96
+
97
+ return 0;
98
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <cstdio>
9
+ #include <cstdlib>
10
+ #include <cassert>
11
+
12
+ #include <faiss/IndexFlat.h>
13
+ #include <faiss/IndexIVFFlat.h>
14
+
15
+
16
+ int main() {
17
+ int d = 64; // dimension
18
+ int nb = 100000; // database size
19
+ int nq = 10000; // nb of queries
20
+
21
+ float *xb = new float[d * nb];
22
+ float *xq = new float[d * nq];
23
+
24
+ for(int i = 0; i < nb; i++) {
25
+ for(int j = 0; j < d; j++)
26
+ xb[d * i + j] = drand48();
27
+ xb[d * i] += i / 1000.;
28
+ }
29
+
30
+ for(int i = 0; i < nq; i++) {
31
+ for(int j = 0; j < d; j++)
32
+ xq[d * i + j] = drand48();
33
+ xq[d * i] += i / 1000.;
34
+ }
35
+
36
+
37
+ int nlist = 100;
38
+ int k = 4;
39
+
40
+ faiss::IndexFlatL2 quantizer(d); // the other index
41
+ faiss::IndexIVFFlat index(&quantizer, d, nlist, faiss::METRIC_L2);
42
+ // here we specify METRIC_L2, by default it performs inner-product search
43
+ assert(!index.is_trained);
44
+ index.train(nb, xb);
45
+ assert(index.is_trained);
46
+ index.add(nb, xb);
47
+
48
+ { // search xq
49
+ long *I = new long[k * nq];
50
+ float *D = new float[k * nq];
51
+
52
+ index.search(nq, xq, k, D, I);
53
+
54
+ printf("I=\n");
55
+ for(int i = nq - 5; i < nq; i++) {
56
+ for(int j = 0; j < k; j++)
57
+ printf("%5ld ", I[i * k + j]);
58
+ printf("\n");
59
+ }
60
+
61
+ index.nprobe = 10;
62
+ index.search(nq, xq, k, D, I);
63
+
64
+ printf("I=\n");
65
+ for(int i = nq - 5; i < nq; i++) {
66
+ for(int j = 0; j < k; j++)
67
+ printf("%5ld ", I[i * k + j]);
68
+ printf("\n");
69
+ }
70
+
71
+ delete [] I;
72
+ delete [] D;
73
+ }
74
+
75
+
76
+
77
+ delete [] xb;
78
+ delete [] xq;
79
+
80
+ return 0;
81
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <cstdio>
9
+ #include <cstdlib>
10
+
11
+ #include <faiss/IndexFlat.h>
12
+ #include <faiss/IndexIVFPQ.h>
13
+
14
+
15
+ int main() {
16
+ int d = 64; // dimension
17
+ int nb = 100000; // database size
18
+ int nq = 10000; // nb of queries
19
+
20
+ float *xb = new float[d * nb];
21
+ float *xq = new float[d * nq];
22
+
23
+ for(int i = 0; i < nb; i++) {
24
+ for(int j = 0; j < d; j++)
25
+ xb[d * i + j] = drand48();
26
+ xb[d * i] += i / 1000.;
27
+ }
28
+
29
+ for(int i = 0; i < nq; i++) {
30
+ for(int j = 0; j < d; j++)
31
+ xq[d * i + j] = drand48();
32
+ xq[d * i] += i / 1000.;
33
+ }
34
+
35
+
36
+ int nlist = 100;
37
+ int k = 4;
38
+ int m = 8; // bytes per vector
39
+ faiss::IndexFlatL2 quantizer(d); // the other index
40
+ faiss::IndexIVFPQ index(&quantizer, d, nlist, m, 8);
41
+ // here we specify METRIC_L2, by default it performs inner-product search
42
+ index.train(nb, xb);
43
+ index.add(nb, xb);
44
+
45
+ { // sanity check
46
+ long *I = new long[k * 5];
47
+ float *D = new float[k * 5];
48
+
49
+ index.search(5, xb, k, D, I);
50
+
51
+ printf("I=\n");
52
+ for(int i = 0; i < 5; i++) {
53
+ for(int j = 0; j < k; j++)
54
+ printf("%5ld ", I[i * k + j]);
55
+ printf("\n");
56
+ }
57
+
58
+ printf("D=\n");
59
+ for(int i = 0; i < 5; i++) {
60
+ for(int j = 0; j < k; j++)
61
+ printf("%7g ", D[i * k + j]);
62
+ printf("\n");
63
+ }
64
+
65
+ delete [] I;
66
+ delete [] D;
67
+ }
68
+
69
+ { // search xq
70
+ long *I = new long[k * nq];
71
+ float *D = new float[k * nq];
72
+
73
+ index.nprobe = 10;
74
+ index.search(nq, xq, k, D, I);
75
+
76
+ printf("I=\n");
77
+ for(int i = nq - 5; i < nq; i++) {
78
+ for(int j = 0; j < k; j++)
79
+ printf("%5ld ", I[i * k + j]);
80
+ printf("\n");
81
+ }
82
+
83
+ delete [] I;
84
+ delete [] D;
85
+ }
86
+
87
+
88
+
89
+ delete [] xb;
90
+ delete [] xq;
91
+
92
+ return 0;
93
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #include <cstdio>
9
+ #include <cstdlib>
10
+ #include <cassert>
11
+
12
+ #include <faiss/IndexFlat.h>
13
+ #include <faiss/gpu/GpuIndexFlat.h>
14
+ #include <faiss/gpu/GpuIndexIVFFlat.h>
15
+ #include <faiss/gpu/StandardGpuResources.h>
16
+
17
+
18
+ int main() {
19
+ int d = 64; // dimension
20
+ int nb = 100000; // database size
21
+ int nq = 10000; // nb of queries
22
+
23
+ float *xb = new float[d * nb];
24
+ float *xq = new float[d * nq];
25
+
26
+ for(int i = 0; i < nb; i++) {
27
+ for(int j = 0; j < d; j++)
28
+ xb[d * i + j] = drand48();
29
+ xb[d * i] += i / 1000.;
30
+ }
31
+
32
+ for(int i = 0; i < nq; i++) {
33
+ for(int j = 0; j < d; j++)
34
+ xq[d * i + j] = drand48();
35
+ xq[d * i] += i / 1000.;
36
+ }
37
+
38
+ faiss::gpu::StandardGpuResources res;
39
+
40
+ // Using a flat index
41
+
42
+ faiss::gpu::GpuIndexFlatL2 index_flat(&res, d);
43
+
44
+ printf("is_trained = %s\n", index_flat.is_trained ? "true" : "false");
45
+ index_flat.add(nb, xb); // add vectors to the index
46
+ printf("ntotal = %ld\n", index_flat.ntotal);
47
+
48
+ int k = 4;
49
+
50
+ { // search xq
51
+ long *I = new long[k * nq];
52
+ float *D = new float[k * nq];
53
+
54
+ index_flat.search(nq, xq, k, D, I);
55
+
56
+ // print results
57
+ printf("I (5 first results)=\n");
58
+ for(int i = 0; i < 5; i++) {
59
+ for(int j = 0; j < k; j++)
60
+ printf("%5ld ", I[i * k + j]);
61
+ printf("\n");
62
+ }
63
+
64
+ printf("I (5 last results)=\n");
65
+ for(int i = nq - 5; i < nq; i++) {
66
+ for(int j = 0; j < k; j++)
67
+ printf("%5ld ", I[i * k + j]);
68
+ printf("\n");
69
+ }
70
+
71
+ delete [] I;
72
+ delete [] D;
73
+ }
74
+
75
+ // Using an IVF index
76
+
77
+ int nlist = 100;
78
+ faiss::gpu::GpuIndexIVFFlat index_ivf(&res, d, nlist, faiss::METRIC_L2);
79
+ // here we specify METRIC_L2, by default it performs inner-product search
80
+
81
+ assert(!index_ivf.is_trained);
82
+ index_ivf.train(nb, xb);
83
+ assert(index_ivf.is_trained);
84
+ index_ivf.add(nb, xb); // add vectors to the index
85
+
86
+ printf("is_trained = %s\n", index_ivf.is_trained ? "true" : "false");
87
+ printf("ntotal = %ld\n", index_ivf.ntotal);
88
+
89
+ { // search xq
90
+ long *I = new long[k * nq];
91
+ float *D = new float[k * nq];
92
+
93
+ index_ivf.search(nq, xq, k, D, I);
94
+
95
+ // print results
96
+ printf("I (5 first results)=\n");
97
+ for(int i = 0; i < 5; i++) {
98
+ for(int j = 0; j < k; j++)
99
+ printf("%5ld ", I[i * k + j]);
100
+ printf("\n");
101
+ }
102
+
103
+ printf("I (5 last results)=\n");
104
+ for(int i = nq - 5; i < nq; i++) {
105
+ for(int j = 0; j < k; j++)
106
+ printf("%5ld ", I[i * k + j]);
107
+ printf("\n");
108
+ }
109
+
110
+ delete [] I;
111
+ delete [] D;
112
+ }
113
+
114
+
115
+ delete [] xb;
116
+ delete [] xq;
117
+
118
+ return 0;
119
+ }