faiss 0.1.3 → 0.1.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 (184) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +1 -1
  5. data/ext/faiss/extconf.rb +1 -1
  6. data/lib/faiss/version.rb +1 -1
  7. data/vendor/faiss/faiss/AutoTune.cpp +36 -33
  8. data/vendor/faiss/faiss/AutoTune.h +6 -3
  9. data/vendor/faiss/faiss/Clustering.cpp +16 -12
  10. data/vendor/faiss/faiss/Index.cpp +3 -4
  11. data/vendor/faiss/faiss/Index.h +3 -3
  12. data/vendor/faiss/faiss/IndexBinary.cpp +3 -4
  13. data/vendor/faiss/faiss/IndexBinary.h +1 -1
  14. data/vendor/faiss/faiss/IndexBinaryHash.cpp +2 -12
  15. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +1 -2
  16. data/vendor/faiss/faiss/IndexFlat.cpp +0 -148
  17. data/vendor/faiss/faiss/IndexFlat.h +0 -51
  18. data/vendor/faiss/faiss/IndexHNSW.cpp +4 -5
  19. data/vendor/faiss/faiss/IndexIVF.cpp +118 -31
  20. data/vendor/faiss/faiss/IndexIVF.h +22 -15
  21. data/vendor/faiss/faiss/IndexIVFFlat.cpp +3 -3
  22. data/vendor/faiss/faiss/IndexIVFFlat.h +2 -1
  23. data/vendor/faiss/faiss/IndexIVFPQ.cpp +39 -15
  24. data/vendor/faiss/faiss/IndexIVFPQ.h +25 -9
  25. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +1116 -0
  26. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +166 -0
  27. data/vendor/faiss/faiss/IndexIVFPQR.cpp +8 -9
  28. data/vendor/faiss/faiss/IndexIVFPQR.h +2 -1
  29. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +1 -2
  30. data/vendor/faiss/faiss/IndexPQ.cpp +34 -18
  31. data/vendor/faiss/faiss/IndexPQFastScan.cpp +536 -0
  32. data/vendor/faiss/faiss/IndexPQFastScan.h +111 -0
  33. data/vendor/faiss/faiss/IndexPreTransform.cpp +47 -0
  34. data/vendor/faiss/faiss/IndexPreTransform.h +2 -0
  35. data/vendor/faiss/faiss/IndexRefine.cpp +256 -0
  36. data/vendor/faiss/faiss/IndexRefine.h +73 -0
  37. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +2 -2
  38. data/vendor/faiss/faiss/IndexScalarQuantizer.h +1 -1
  39. data/vendor/faiss/faiss/gpu/GpuDistance.h +1 -1
  40. data/vendor/faiss/faiss/gpu/GpuIndex.h +16 -9
  41. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +8 -1
  42. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +11 -11
  43. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +19 -2
  44. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +28 -2
  45. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +24 -14
  46. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +29 -2
  47. data/vendor/faiss/faiss/gpu/GpuResources.h +4 -0
  48. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +60 -27
  49. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +28 -6
  50. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +547 -0
  51. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +51 -0
  52. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +3 -3
  53. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +3 -2
  54. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +274 -0
  55. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +7 -2
  56. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +5 -1
  57. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +231 -0
  58. data/vendor/faiss/faiss/gpu/test/TestUtils.h +33 -0
  59. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +1 -0
  60. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +6 -0
  61. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +5 -6
  62. data/vendor/faiss/faiss/gpu/utils/Timer.h +2 -2
  63. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +5 -4
  64. data/vendor/faiss/faiss/impl/HNSW.cpp +2 -4
  65. data/vendor/faiss/faiss/impl/PolysemousTraining.h +4 -4
  66. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +22 -12
  67. data/vendor/faiss/faiss/impl/ProductQuantizer.h +2 -0
  68. data/vendor/faiss/faiss/impl/ResultHandler.h +452 -0
  69. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +29 -19
  70. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +6 -0
  71. data/vendor/faiss/faiss/impl/index_read.cpp +64 -96
  72. data/vendor/faiss/faiss/impl/index_write.cpp +34 -25
  73. data/vendor/faiss/faiss/impl/io.cpp +33 -2
  74. data/vendor/faiss/faiss/impl/io.h +7 -2
  75. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +1 -15
  76. data/vendor/faiss/faiss/impl/platform_macros.h +44 -0
  77. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +272 -0
  78. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +169 -0
  79. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +180 -0
  80. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +354 -0
  81. data/vendor/faiss/faiss/impl/simd_result_handlers.h +559 -0
  82. data/vendor/faiss/faiss/index_factory.cpp +112 -7
  83. data/vendor/faiss/faiss/index_io.h +1 -48
  84. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +151 -0
  85. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +76 -0
  86. data/vendor/faiss/faiss/{DirectMap.cpp → invlists/DirectMap.cpp} +1 -1
  87. data/vendor/faiss/faiss/{DirectMap.h → invlists/DirectMap.h} +1 -1
  88. data/vendor/faiss/faiss/{InvertedLists.cpp → invlists/InvertedLists.cpp} +72 -1
  89. data/vendor/faiss/faiss/{InvertedLists.h → invlists/InvertedLists.h} +32 -1
  90. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +107 -0
  91. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +63 -0
  92. data/vendor/faiss/faiss/{OnDiskInvertedLists.cpp → invlists/OnDiskInvertedLists.cpp} +21 -6
  93. data/vendor/faiss/faiss/{OnDiskInvertedLists.h → invlists/OnDiskInvertedLists.h} +5 -2
  94. data/vendor/faiss/faiss/python/python_callbacks.h +8 -1
  95. data/vendor/faiss/faiss/utils/AlignedTable.h +141 -0
  96. data/vendor/faiss/faiss/utils/Heap.cpp +2 -4
  97. data/vendor/faiss/faiss/utils/Heap.h +61 -50
  98. data/vendor/faiss/faiss/utils/distances.cpp +164 -319
  99. data/vendor/faiss/faiss/utils/distances.h +28 -20
  100. data/vendor/faiss/faiss/utils/distances_simd.cpp +277 -49
  101. data/vendor/faiss/faiss/utils/extra_distances.cpp +1 -2
  102. data/vendor/faiss/faiss/utils/hamming-inl.h +4 -4
  103. data/vendor/faiss/faiss/utils/hamming.cpp +3 -6
  104. data/vendor/faiss/faiss/utils/hamming.h +2 -7
  105. data/vendor/faiss/faiss/utils/ordered_key_value.h +98 -0
  106. data/vendor/faiss/faiss/utils/partitioning.cpp +1256 -0
  107. data/vendor/faiss/faiss/utils/partitioning.h +69 -0
  108. data/vendor/faiss/faiss/utils/quantize_lut.cpp +277 -0
  109. data/vendor/faiss/faiss/utils/quantize_lut.h +80 -0
  110. data/vendor/faiss/faiss/utils/simdlib.h +31 -0
  111. data/vendor/faiss/faiss/utils/simdlib_avx2.h +461 -0
  112. data/vendor/faiss/faiss/utils/simdlib_emulated.h +589 -0
  113. metadata +43 -141
  114. data/vendor/faiss/benchs/bench_6bit_codec.cpp +0 -80
  115. data/vendor/faiss/c_api/AutoTune_c.cpp +0 -83
  116. data/vendor/faiss/c_api/AutoTune_c.h +0 -66
  117. data/vendor/faiss/c_api/Clustering_c.cpp +0 -145
  118. data/vendor/faiss/c_api/Clustering_c.h +0 -123
  119. data/vendor/faiss/c_api/IndexFlat_c.cpp +0 -140
  120. data/vendor/faiss/c_api/IndexFlat_c.h +0 -115
  121. data/vendor/faiss/c_api/IndexIVFFlat_c.cpp +0 -64
  122. data/vendor/faiss/c_api/IndexIVFFlat_c.h +0 -58
  123. data/vendor/faiss/c_api/IndexIVF_c.cpp +0 -99
  124. data/vendor/faiss/c_api/IndexIVF_c.h +0 -142
  125. data/vendor/faiss/c_api/IndexLSH_c.cpp +0 -37
  126. data/vendor/faiss/c_api/IndexLSH_c.h +0 -40
  127. data/vendor/faiss/c_api/IndexPreTransform_c.cpp +0 -21
  128. data/vendor/faiss/c_api/IndexPreTransform_c.h +0 -32
  129. data/vendor/faiss/c_api/IndexShards_c.cpp +0 -38
  130. data/vendor/faiss/c_api/IndexShards_c.h +0 -39
  131. data/vendor/faiss/c_api/Index_c.cpp +0 -105
  132. data/vendor/faiss/c_api/Index_c.h +0 -183
  133. data/vendor/faiss/c_api/MetaIndexes_c.cpp +0 -49
  134. data/vendor/faiss/c_api/MetaIndexes_c.h +0 -49
  135. data/vendor/faiss/c_api/clone_index_c.cpp +0 -23
  136. data/vendor/faiss/c_api/clone_index_c.h +0 -32
  137. data/vendor/faiss/c_api/error_c.h +0 -42
  138. data/vendor/faiss/c_api/error_impl.cpp +0 -27
  139. data/vendor/faiss/c_api/error_impl.h +0 -16
  140. data/vendor/faiss/c_api/faiss_c.h +0 -58
  141. data/vendor/faiss/c_api/gpu/GpuAutoTune_c.cpp +0 -98
  142. data/vendor/faiss/c_api/gpu/GpuAutoTune_c.h +0 -56
  143. data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.cpp +0 -52
  144. data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.h +0 -68
  145. data/vendor/faiss/c_api/gpu/GpuIndex_c.cpp +0 -17
  146. data/vendor/faiss/c_api/gpu/GpuIndex_c.h +0 -30
  147. data/vendor/faiss/c_api/gpu/GpuIndicesOptions_c.h +0 -38
  148. data/vendor/faiss/c_api/gpu/GpuResources_c.cpp +0 -86
  149. data/vendor/faiss/c_api/gpu/GpuResources_c.h +0 -66
  150. data/vendor/faiss/c_api/gpu/StandardGpuResources_c.cpp +0 -54
  151. data/vendor/faiss/c_api/gpu/StandardGpuResources_c.h +0 -53
  152. data/vendor/faiss/c_api/gpu/macros_impl.h +0 -42
  153. data/vendor/faiss/c_api/impl/AuxIndexStructures_c.cpp +0 -220
  154. data/vendor/faiss/c_api/impl/AuxIndexStructures_c.h +0 -149
  155. data/vendor/faiss/c_api/index_factory_c.cpp +0 -26
  156. data/vendor/faiss/c_api/index_factory_c.h +0 -30
  157. data/vendor/faiss/c_api/index_io_c.cpp +0 -42
  158. data/vendor/faiss/c_api/index_io_c.h +0 -50
  159. data/vendor/faiss/c_api/macros_impl.h +0 -110
  160. data/vendor/faiss/demos/demo_imi_flat.cpp +0 -154
  161. data/vendor/faiss/demos/demo_imi_pq.cpp +0 -203
  162. data/vendor/faiss/demos/demo_ivfpq_indexing.cpp +0 -151
  163. data/vendor/faiss/demos/demo_sift1M.cpp +0 -252
  164. data/vendor/faiss/demos/demo_weighted_kmeans.cpp +0 -185
  165. data/vendor/faiss/misc/test_blas.cpp +0 -87
  166. data/vendor/faiss/tests/test_binary_flat.cpp +0 -62
  167. data/vendor/faiss/tests/test_dealloc_invlists.cpp +0 -188
  168. data/vendor/faiss/tests/test_ivfpq_codec.cpp +0 -70
  169. data/vendor/faiss/tests/test_ivfpq_indexing.cpp +0 -100
  170. data/vendor/faiss/tests/test_lowlevel_ivf.cpp +0 -573
  171. data/vendor/faiss/tests/test_merge.cpp +0 -260
  172. data/vendor/faiss/tests/test_omp_threads.cpp +0 -14
  173. data/vendor/faiss/tests/test_ondisk_ivf.cpp +0 -225
  174. data/vendor/faiss/tests/test_pairs_decoding.cpp +0 -193
  175. data/vendor/faiss/tests/test_params_override.cpp +0 -236
  176. data/vendor/faiss/tests/test_pq_encoding.cpp +0 -98
  177. data/vendor/faiss/tests/test_sliding_ivf.cpp +0 -246
  178. data/vendor/faiss/tests/test_threaded_index.cpp +0 -253
  179. data/vendor/faiss/tests/test_transfer_invlists.cpp +0 -159
  180. data/vendor/faiss/tutorial/cpp/1-Flat.cpp +0 -104
  181. data/vendor/faiss/tutorial/cpp/2-IVFFlat.cpp +0 -85
  182. data/vendor/faiss/tutorial/cpp/3-IVFPQ.cpp +0 -98
  183. data/vendor/faiss/tutorial/cpp/4-GPU.cpp +0 -122
  184. data/vendor/faiss/tutorial/cpp/5-Multiple-GPUs.cpp +0 -104
@@ -1,260 +0,0 @@
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 <random>
11
-
12
- #include <gtest/gtest.h>
13
-
14
- #include <faiss/IndexIVFFlat.h>
15
- #include <faiss/IndexIVFPQ.h>
16
- #include <faiss/IndexFlat.h>
17
- #include <faiss/MetaIndexes.h>
18
- #include <faiss/IndexPreTransform.h>
19
- #include <faiss/OnDiskInvertedLists.h>
20
- #include <faiss/IVFlib.h>
21
-
22
-
23
- namespace {
24
-
25
-
26
- struct Tempfilename {
27
-
28
- static pthread_mutex_t mutex;
29
-
30
- std::string filename;
31
-
32
- Tempfilename (const char *prefix = nullptr) {
33
- pthread_mutex_lock (&mutex);
34
- char *cfname = tempnam (nullptr, prefix);
35
- filename = cfname;
36
- free(cfname);
37
- pthread_mutex_unlock (&mutex);
38
- }
39
-
40
- ~Tempfilename () {
41
- if (access (filename.c_str(), F_OK)) {
42
- unlink (filename.c_str());
43
- }
44
- }
45
-
46
- const char *c_str() {
47
- return filename.c_str();
48
- }
49
-
50
- };
51
-
52
- pthread_mutex_t Tempfilename::mutex = PTHREAD_MUTEX_INITIALIZER;
53
-
54
-
55
- typedef faiss::Index::idx_t idx_t;
56
-
57
- // parameters to use for the test
58
- int d = 64;
59
- size_t nb = 1000;
60
- size_t nq = 100;
61
- int nindex = 4;
62
- int k = 10;
63
- int nlist = 40;
64
-
65
- struct CommonData {
66
-
67
- std::vector <float> database;
68
- std::vector <float> queries;
69
- std::vector<idx_t> ids;
70
- faiss::IndexFlatL2 quantizer;
71
-
72
- CommonData(): database (nb * d), queries (nq * d), ids(nb), quantizer (d) {
73
-
74
- std::mt19937 rng;
75
- std::uniform_real_distribution<> distrib;
76
- for (size_t i = 0; i < nb * d; i++) {
77
- database[i] = distrib(rng);
78
- }
79
- for (size_t i = 0; i < nq * d; i++) {
80
- queries[i] = distrib(rng);
81
- }
82
- for (int i = 0; i < nb; i++) {
83
- ids[i] = 123 + 456 * i;
84
- }
85
- { // just to train the quantizer
86
- faiss::IndexIVFFlat iflat (&quantizer, d, nlist);
87
- iflat.train(nb, database.data());
88
- }
89
- }
90
- };
91
-
92
- CommonData cd;
93
-
94
- /// perform a search on shards, then merge and search again and
95
- /// compare results.
96
- int compare_merged (faiss::IndexShards *index_shards, bool shift_ids,
97
- bool standard_merge = true)
98
- {
99
-
100
- std::vector<idx_t> refI(k * nq);
101
- std::vector<float> refD(k * nq);
102
-
103
- index_shards->search(nq, cd.queries.data(), k, refD.data(), refI.data());
104
- Tempfilename filename;
105
-
106
- std::vector<idx_t> newI(k * nq);
107
- std::vector<float> newD(k * nq);
108
-
109
- if (standard_merge) {
110
-
111
- for (int i = 1; i < nindex; i++) {
112
- faiss::ivflib::merge_into(
113
- index_shards->at(0), index_shards->at(i),
114
- shift_ids);
115
- }
116
-
117
- index_shards->syncWithSubIndexes();
118
- } else {
119
- std::vector<const faiss::InvertedLists *> lists;
120
- faiss::IndexIVF *index0 = nullptr;
121
- size_t ntotal = 0;
122
- for (int i = 0; i < nindex; i++) {
123
- auto index_ivf = dynamic_cast<faiss::IndexIVF*>(index_shards->at(i));
124
- assert (index_ivf);
125
- if (i == 0) {
126
- index0 = index_ivf;
127
- }
128
- lists.push_back (index_ivf->invlists);
129
- ntotal += index_ivf->ntotal;
130
- }
131
-
132
- auto il = new faiss::OnDiskInvertedLists(
133
- index0->nlist, index0->code_size,
134
- filename.c_str());
135
-
136
- il->merge_from(lists.data(), lists.size());
137
-
138
- index0->replace_invlists(il, true);
139
- index0->ntotal = ntotal;
140
- }
141
- // search only on first index
142
- index_shards->at(0)->search(nq, cd.queries.data(),
143
- k, newD.data(), newI.data());
144
-
145
- size_t ndiff = 0;
146
- for (size_t i = 0; i < k * nq; i++) {
147
- if (refI[i] != newI[i]) {
148
- ndiff ++;
149
- }
150
- }
151
- return ndiff;
152
- }
153
-
154
- } // namespace
155
-
156
-
157
- // test on IVFFlat with implicit numbering
158
- TEST(MERGE, merge_flat_no_ids) {
159
- faiss::IndexShards index_shards(d);
160
- index_shards.own_fields = true;
161
- for (int i = 0; i < nindex; i++) {
162
- index_shards.add_shard (
163
- new faiss::IndexIVFFlat (&cd.quantizer, d, nlist));
164
- }
165
- EXPECT_TRUE(index_shards.is_trained);
166
- index_shards.add(nb, cd.database.data());
167
- size_t prev_ntotal = index_shards.ntotal;
168
- int ndiff = compare_merged(&index_shards, true);
169
- EXPECT_EQ (prev_ntotal, index_shards.ntotal);
170
- EXPECT_EQ(0, ndiff);
171
- }
172
-
173
-
174
- // test on IVFFlat, explicit ids
175
- TEST(MERGE, merge_flat) {
176
- faiss::IndexShards index_shards(d, false, false);
177
- index_shards.own_fields = true;
178
-
179
- for (int i = 0; i < nindex; i++) {
180
- index_shards.add_shard (
181
- new faiss::IndexIVFFlat (&cd.quantizer, d, nlist));
182
- }
183
-
184
- EXPECT_TRUE(index_shards.is_trained);
185
- index_shards.add_with_ids(nb, cd.database.data(), cd.ids.data());
186
- int ndiff = compare_merged(&index_shards, false);
187
- EXPECT_GE(0, ndiff);
188
- }
189
-
190
- // test on IVFFlat and a VectorTransform
191
- TEST(MERGE, merge_flat_vt) {
192
- faiss::IndexShards index_shards(d, false, false);
193
- index_shards.own_fields = true;
194
-
195
- // here we have to retrain because of the vectorTransform
196
- faiss::RandomRotationMatrix rot(d, d);
197
- rot.init(1234);
198
- faiss::IndexFlatL2 quantizer (d);
199
-
200
- { // just to train the quantizer
201
- faiss::IndexIVFFlat iflat (&quantizer, d, nlist);
202
- faiss::IndexPreTransform ipt (&rot, &iflat);
203
- ipt.train(nb, cd.database.data());
204
- }
205
-
206
- for (int i = 0; i < nindex; i++) {
207
- faiss::IndexPreTransform * ipt = new faiss::IndexPreTransform (
208
- new faiss::RandomRotationMatrix (rot),
209
- new faiss::IndexIVFFlat (&quantizer, d, nlist)
210
- );
211
- ipt->own_fields = true;
212
- index_shards.add_shard (ipt);
213
- }
214
- EXPECT_TRUE(index_shards.is_trained);
215
- index_shards.add_with_ids(nb, cd.database.data(), cd.ids.data());
216
- size_t prev_ntotal = index_shards.ntotal;
217
- int ndiff = compare_merged(&index_shards, false);
218
- EXPECT_EQ (prev_ntotal, index_shards.ntotal);
219
- EXPECT_GE(0, ndiff);
220
- }
221
-
222
-
223
- // put the merged invfile on disk
224
- TEST(MERGE, merge_flat_ondisk) {
225
- faiss::IndexShards index_shards(d, false, false);
226
- index_shards.own_fields = true;
227
- Tempfilename filename;
228
-
229
- for (int i = 0; i < nindex; i++) {
230
- auto ivf = new faiss::IndexIVFFlat (&cd.quantizer, d, nlist);
231
- if (i == 0) {
232
- auto il = new faiss::OnDiskInvertedLists (
233
- ivf->nlist, ivf->code_size,
234
- filename.c_str());
235
- ivf->replace_invlists(il, true);
236
- }
237
- index_shards.add_shard (ivf);
238
- }
239
-
240
- EXPECT_TRUE(index_shards.is_trained);
241
- index_shards.add_with_ids(nb, cd.database.data(), cd.ids.data());
242
- int ndiff = compare_merged(&index_shards, false);
243
-
244
- EXPECT_EQ(ndiff, 0);
245
- }
246
-
247
- // now use ondisk specific merge
248
- TEST(MERGE, merge_flat_ondisk_2) {
249
- faiss::IndexShards index_shards(d, false, false);
250
- index_shards.own_fields = true;
251
-
252
- for (int i = 0; i < nindex; i++) {
253
- index_shards.add_shard (
254
- new faiss::IndexIVFFlat (&cd.quantizer, d, nlist));
255
- }
256
- EXPECT_TRUE(index_shards.is_trained);
257
- index_shards.add_with_ids(nb, cd.database.data(), cd.ids.data());
258
- int ndiff = compare_merged(&index_shards, false, false);
259
- EXPECT_GE(0, ndiff);
260
- }
@@ -1,14 +0,0 @@
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 <gtest/gtest.h>
9
-
10
- #include <faiss/utils/utils.h>
11
-
12
- TEST(Threading, openmp) {
13
- EXPECT_TRUE(faiss::check_openmp());
14
- }
@@ -1,225 +0,0 @@
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 <random>
11
-
12
- #include <omp.h>
13
-
14
- #include <unordered_map>
15
- #include <pthread.h>
16
-
17
- #include <gtest/gtest.h>
18
-
19
- #include <faiss/OnDiskInvertedLists.h>
20
- #include <faiss/IndexIVFFlat.h>
21
- #include <faiss/IndexFlat.h>
22
- #include <faiss/utils/random.h>
23
- #include <faiss/index_io.h>
24
-
25
-
26
- namespace {
27
-
28
- struct Tempfilename {
29
-
30
- static pthread_mutex_t mutex;
31
-
32
- std::string filename;
33
-
34
- Tempfilename (const char *prefix = nullptr) {
35
- pthread_mutex_lock (&mutex);
36
- char *cfname = tempnam (nullptr, prefix);
37
- filename = cfname;
38
- free(cfname);
39
- pthread_mutex_unlock (&mutex);
40
- }
41
-
42
- ~Tempfilename () {
43
- if (access (filename.c_str(), F_OK)) {
44
- unlink (filename.c_str());
45
- }
46
- }
47
-
48
- const char *c_str() {
49
- return filename.c_str();
50
- }
51
-
52
- };
53
-
54
- pthread_mutex_t Tempfilename::mutex = PTHREAD_MUTEX_INITIALIZER;
55
-
56
- } // namespace
57
-
58
-
59
- TEST(ONDISK, make_invlists) {
60
- int nlist = 100;
61
- int code_size = 32;
62
- int nadd = 1000000;
63
- std::unordered_map<int, int> listnos;
64
-
65
- Tempfilename filename;
66
-
67
- faiss::OnDiskInvertedLists ivf (
68
- nlist, code_size,
69
- filename.c_str());
70
-
71
- {
72
- std::vector<uint8_t> code(32);
73
- std::mt19937 rng;
74
- std::uniform_real_distribution<> distrib;
75
- for (int i = 0; i < nadd; i++) {
76
- double d = distrib(rng);
77
- int list_no = int(nlist * d * d); // skewed distribution
78
- int * ar = (int*)code.data();
79
- ar[0] = i;
80
- ar[1] = list_no;
81
- ivf.add_entry (list_no, i, code.data());
82
- listnos[i] = list_no;
83
- }
84
- }
85
-
86
- int ntot = 0;
87
- for (int i = 0; i < nlist; i++) {
88
- int size = ivf.list_size(i);
89
- const faiss::Index::idx_t *ids = ivf.get_ids (i);
90
- const uint8_t *codes = ivf.get_codes (i);
91
- for (int j = 0; j < size; j++) {
92
- faiss::Index::idx_t id = ids[j];
93
- const int * ar = (const int*)&codes[code_size * j];
94
- EXPECT_EQ (ar[0], id);
95
- EXPECT_EQ (ar[1], i);
96
- EXPECT_EQ (listnos[id], i);
97
- ntot ++;
98
- }
99
- }
100
- EXPECT_EQ (ntot, nadd);
101
- };
102
-
103
-
104
- TEST(ONDISK, test_add) {
105
- int d = 8;
106
- int nlist = 30, nq = 200, nb = 1500, k = 10;
107
- faiss::IndexFlatL2 quantizer(d);
108
- {
109
- std::vector<float> x(d * nlist);
110
- faiss::float_rand(x.data(), d * nlist, 12345);
111
- quantizer.add(nlist, x.data());
112
- }
113
- std::vector<float> xb(d * nb);
114
- faiss::float_rand(xb.data(), d * nb, 23456);
115
-
116
- faiss::IndexIVFFlat index(&quantizer, d, nlist);
117
- index.add(nb, xb.data());
118
-
119
- std::vector<float> xq(d * nb);
120
- faiss::float_rand(xq.data(), d * nq, 34567);
121
-
122
- std::vector<float> ref_D (nq * k);
123
- std::vector<faiss::Index::idx_t> ref_I (nq * k);
124
-
125
- index.search (nq, xq.data(), k,
126
- ref_D.data(), ref_I.data());
127
-
128
- Tempfilename filename, filename2;
129
-
130
- // test add + search
131
- {
132
- faiss::IndexIVFFlat index2(&quantizer, d, nlist);
133
-
134
- faiss::OnDiskInvertedLists ivf (
135
- index.nlist, index.code_size,
136
- filename.c_str());
137
-
138
- index2.replace_invlists(&ivf);
139
-
140
- index2.add(nb, xb.data());
141
-
142
- std::vector<float> new_D (nq * k);
143
- std::vector<faiss::Index::idx_t> new_I (nq * k);
144
-
145
- index2.search (nq, xq.data(), k,
146
- new_D.data(), new_I.data());
147
-
148
- EXPECT_EQ (ref_D, new_D);
149
- EXPECT_EQ (ref_I, new_I);
150
-
151
- write_index(&index2, filename2.c_str());
152
-
153
- }
154
-
155
- // test io
156
- {
157
- faiss::Index *index3 = faiss::read_index(filename2.c_str());
158
-
159
- std::vector<float> new_D (nq * k);
160
- std::vector<faiss::Index::idx_t> new_I (nq * k);
161
-
162
- index3->search (nq, xq.data(), k,
163
- new_D.data(), new_I.data());
164
-
165
- EXPECT_EQ (ref_D, new_D);
166
- EXPECT_EQ (ref_I, new_I);
167
-
168
- delete index3;
169
- }
170
-
171
- };
172
-
173
-
174
-
175
- // WARN this thest will run multithreaded only in opt mode
176
- TEST(ONDISK, make_invlists_threaded) {
177
- int nlist = 100;
178
- int code_size = 32;
179
- int nadd = 1000000;
180
-
181
- Tempfilename filename;
182
-
183
- faiss::OnDiskInvertedLists ivf (
184
- nlist, code_size,
185
- filename.c_str());
186
-
187
- std::vector<int> list_nos (nadd);
188
-
189
- std::mt19937 rng;
190
- std::uniform_real_distribution<> distrib;
191
- for (int i = 0; i < nadd; i++) {
192
- double d = distrib(rng);
193
- list_nos[i] = int(nlist * d * d); // skewed distribution
194
- }
195
-
196
- #pragma omp parallel
197
- {
198
- std::vector<uint8_t> code(32);
199
- #pragma omp for
200
- for (int i = 0; i < nadd; i++) {
201
- int list_no = list_nos[i];
202
- int * ar = (int*)code.data();
203
- ar[0] = i;
204
- ar[1] = list_no;
205
- ivf.add_entry (list_no, i, code.data());
206
- }
207
- }
208
-
209
- int ntot = 0;
210
- for (int i = 0; i < nlist; i++) {
211
- int size = ivf.list_size(i);
212
- const faiss::Index::idx_t *ids = ivf.get_ids (i);
213
- const uint8_t *codes = ivf.get_codes (i);
214
- for (int j = 0; j < size; j++) {
215
- faiss::Index::idx_t id = ids[j];
216
- const int * ar = (const int*)&codes[code_size * j];
217
- EXPECT_EQ (ar[0], id);
218
- EXPECT_EQ (ar[1], i);
219
- EXPECT_EQ (list_nos[id], i);
220
- ntot ++;
221
- }
222
- }
223
- EXPECT_EQ (ntot, nadd);
224
-
225
- };