faiss 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/ext/faiss/extconf.rb +1 -1
  4. data/lib/faiss/version.rb +1 -1
  5. data/vendor/faiss/benchs/bench_6bit_codec.cpp +80 -0
  6. data/vendor/faiss/c_api/AutoTune_c.h +2 -0
  7. data/vendor/faiss/c_api/IndexShards_c.cpp +0 -6
  8. data/vendor/faiss/c_api/IndexShards_c.h +1 -4
  9. data/vendor/faiss/c_api/gpu/GpuAutoTune_c.cpp +4 -2
  10. data/vendor/faiss/c_api/gpu/GpuClonerOptions_c.cpp +1 -1
  11. data/vendor/faiss/c_api/gpu/GpuIndex_c.cpp +1 -1
  12. data/vendor/faiss/c_api/gpu/GpuResources_c.cpp +1 -1
  13. data/vendor/faiss/c_api/gpu/StandardGpuResources_c.cpp +1 -1
  14. data/vendor/faiss/demos/demo_imi_flat.cpp +5 -2
  15. data/vendor/faiss/demos/demo_imi_pq.cpp +6 -2
  16. data/vendor/faiss/demos/demo_ivfpq_indexing.cpp +7 -2
  17. data/vendor/faiss/{AutoTune.cpp → faiss/AutoTune.cpp} +9 -9
  18. data/vendor/faiss/{AutoTune.h → faiss/AutoTune.h} +0 -0
  19. data/vendor/faiss/{Clustering.cpp → faiss/Clustering.cpp} +13 -12
  20. data/vendor/faiss/{Clustering.h → faiss/Clustering.h} +0 -0
  21. data/vendor/faiss/{DirectMap.cpp → faiss/DirectMap.cpp} +0 -0
  22. data/vendor/faiss/{DirectMap.h → faiss/DirectMap.h} +0 -0
  23. data/vendor/faiss/{IVFlib.cpp → faiss/IVFlib.cpp} +86 -11
  24. data/vendor/faiss/{IVFlib.h → faiss/IVFlib.h} +26 -8
  25. data/vendor/faiss/{Index.cpp → faiss/Index.cpp} +0 -0
  26. data/vendor/faiss/{Index.h → faiss/Index.h} +1 -1
  27. data/vendor/faiss/{Index2Layer.cpp → faiss/Index2Layer.cpp} +12 -11
  28. data/vendor/faiss/{Index2Layer.h → faiss/Index2Layer.h} +0 -0
  29. data/vendor/faiss/{IndexBinary.cpp → faiss/IndexBinary.cpp} +2 -1
  30. data/vendor/faiss/{IndexBinary.h → faiss/IndexBinary.h} +0 -0
  31. data/vendor/faiss/{IndexBinaryFlat.cpp → faiss/IndexBinaryFlat.cpp} +0 -0
  32. data/vendor/faiss/{IndexBinaryFlat.h → faiss/IndexBinaryFlat.h} +0 -0
  33. data/vendor/faiss/{IndexBinaryFromFloat.cpp → faiss/IndexBinaryFromFloat.cpp} +1 -0
  34. data/vendor/faiss/{IndexBinaryFromFloat.h → faiss/IndexBinaryFromFloat.h} +0 -0
  35. data/vendor/faiss/{IndexBinaryHNSW.cpp → faiss/IndexBinaryHNSW.cpp} +1 -2
  36. data/vendor/faiss/{IndexBinaryHNSW.h → faiss/IndexBinaryHNSW.h} +0 -0
  37. data/vendor/faiss/{IndexBinaryHash.cpp → faiss/IndexBinaryHash.cpp} +16 -7
  38. data/vendor/faiss/{IndexBinaryHash.h → faiss/IndexBinaryHash.h} +2 -1
  39. data/vendor/faiss/{IndexBinaryIVF.cpp → faiss/IndexBinaryIVF.cpp} +10 -16
  40. data/vendor/faiss/{IndexBinaryIVF.h → faiss/IndexBinaryIVF.h} +1 -1
  41. data/vendor/faiss/{IndexFlat.cpp → faiss/IndexFlat.cpp} +0 -0
  42. data/vendor/faiss/{IndexFlat.h → faiss/IndexFlat.h} +0 -0
  43. data/vendor/faiss/{IndexHNSW.cpp → faiss/IndexHNSW.cpp} +63 -32
  44. data/vendor/faiss/{IndexHNSW.h → faiss/IndexHNSW.h} +0 -0
  45. data/vendor/faiss/{IndexIVF.cpp → faiss/IndexIVF.cpp} +129 -46
  46. data/vendor/faiss/{IndexIVF.h → faiss/IndexIVF.h} +7 -3
  47. data/vendor/faiss/{IndexIVFFlat.cpp → faiss/IndexIVFFlat.cpp} +6 -5
  48. data/vendor/faiss/{IndexIVFFlat.h → faiss/IndexIVFFlat.h} +0 -0
  49. data/vendor/faiss/{IndexIVFPQ.cpp → faiss/IndexIVFPQ.cpp} +9 -8
  50. data/vendor/faiss/{IndexIVFPQ.h → faiss/IndexIVFPQ.h} +4 -2
  51. data/vendor/faiss/{IndexIVFPQR.cpp → faiss/IndexIVFPQR.cpp} +3 -1
  52. data/vendor/faiss/{IndexIVFPQR.h → faiss/IndexIVFPQR.h} +0 -0
  53. data/vendor/faiss/{IndexIVFSpectralHash.cpp → faiss/IndexIVFSpectralHash.cpp} +1 -1
  54. data/vendor/faiss/{IndexIVFSpectralHash.h → faiss/IndexIVFSpectralHash.h} +0 -0
  55. data/vendor/faiss/{IndexLSH.cpp → faiss/IndexLSH.cpp} +0 -0
  56. data/vendor/faiss/{IndexLSH.h → faiss/IndexLSH.h} +0 -0
  57. data/vendor/faiss/{IndexLattice.cpp → faiss/IndexLattice.cpp} +0 -0
  58. data/vendor/faiss/{IndexLattice.h → faiss/IndexLattice.h} +0 -0
  59. data/vendor/faiss/{IndexPQ.cpp → faiss/IndexPQ.cpp} +6 -6
  60. data/vendor/faiss/{IndexPQ.h → faiss/IndexPQ.h} +3 -1
  61. data/vendor/faiss/{IndexPreTransform.cpp → faiss/IndexPreTransform.cpp} +0 -0
  62. data/vendor/faiss/{IndexPreTransform.h → faiss/IndexPreTransform.h} +0 -0
  63. data/vendor/faiss/{IndexReplicas.cpp → faiss/IndexReplicas.cpp} +102 -10
  64. data/vendor/faiss/{IndexReplicas.h → faiss/IndexReplicas.h} +6 -0
  65. data/vendor/faiss/{IndexScalarQuantizer.cpp → faiss/IndexScalarQuantizer.cpp} +3 -3
  66. data/vendor/faiss/{IndexScalarQuantizer.h → faiss/IndexScalarQuantizer.h} +0 -0
  67. data/vendor/faiss/{IndexShards.cpp → faiss/IndexShards.cpp} +37 -12
  68. data/vendor/faiss/{IndexShards.h → faiss/IndexShards.h} +3 -4
  69. data/vendor/faiss/{InvertedLists.cpp → faiss/InvertedLists.cpp} +2 -2
  70. data/vendor/faiss/{InvertedLists.h → faiss/InvertedLists.h} +1 -0
  71. data/vendor/faiss/{MatrixStats.cpp → faiss/MatrixStats.cpp} +0 -0
  72. data/vendor/faiss/{MatrixStats.h → faiss/MatrixStats.h} +0 -0
  73. data/vendor/faiss/{MetaIndexes.cpp → faiss/MetaIndexes.cpp} +5 -3
  74. data/vendor/faiss/{MetaIndexes.h → faiss/MetaIndexes.h} +0 -0
  75. data/vendor/faiss/{MetricType.h → faiss/MetricType.h} +0 -0
  76. data/vendor/faiss/{OnDiskInvertedLists.cpp → faiss/OnDiskInvertedLists.cpp} +141 -3
  77. data/vendor/faiss/{OnDiskInvertedLists.h → faiss/OnDiskInvertedLists.h} +27 -7
  78. data/vendor/faiss/{VectorTransform.cpp → faiss/VectorTransform.cpp} +4 -3
  79. data/vendor/faiss/{VectorTransform.h → faiss/VectorTransform.h} +0 -0
  80. data/vendor/faiss/{clone_index.cpp → faiss/clone_index.cpp} +0 -0
  81. data/vendor/faiss/{clone_index.h → faiss/clone_index.h} +0 -0
  82. data/vendor/faiss/{gpu → faiss/gpu}/GpuAutoTune.cpp +0 -0
  83. data/vendor/faiss/{gpu → faiss/gpu}/GpuAutoTune.h +0 -0
  84. data/vendor/faiss/{gpu → faiss/gpu}/GpuCloner.cpp +14 -14
  85. data/vendor/faiss/{gpu → faiss/gpu}/GpuCloner.h +6 -7
  86. data/vendor/faiss/{gpu → faiss/gpu}/GpuClonerOptions.cpp +0 -0
  87. data/vendor/faiss/{gpu → faiss/gpu}/GpuClonerOptions.h +0 -0
  88. data/vendor/faiss/{gpu → faiss/gpu}/GpuDistance.h +12 -4
  89. data/vendor/faiss/{gpu → faiss/gpu}/GpuFaissAssert.h +0 -0
  90. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndex.h +3 -9
  91. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexBinaryFlat.h +7 -7
  92. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexFlat.h +35 -10
  93. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVF.h +1 -2
  94. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFFlat.h +4 -3
  95. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFPQ.h +21 -4
  96. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndexIVFScalarQuantizer.h +4 -3
  97. data/vendor/faiss/{gpu → faiss/gpu}/GpuIndicesOptions.h +0 -0
  98. data/vendor/faiss/faiss/gpu/GpuResources.cpp +200 -0
  99. data/vendor/faiss/faiss/gpu/GpuResources.h +264 -0
  100. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +572 -0
  101. data/vendor/faiss/{gpu → faiss/gpu}/StandardGpuResources.h +83 -15
  102. data/vendor/faiss/{gpu → faiss/gpu}/impl/RemapIndices.cpp +0 -0
  103. data/vendor/faiss/{gpu → faiss/gpu}/impl/RemapIndices.h +0 -0
  104. data/vendor/faiss/{gpu → faiss/gpu}/perf/IndexWrapper-inl.h +1 -1
  105. data/vendor/faiss/{gpu → faiss/gpu}/perf/IndexWrapper.h +1 -1
  106. data/vendor/faiss/{gpu → faiss/gpu}/perf/PerfClustering.cpp +1 -1
  107. data/vendor/faiss/{gpu → faiss/gpu}/perf/PerfIVFPQAdd.cpp +0 -0
  108. data/vendor/faiss/{gpu → faiss/gpu}/perf/WriteIndex.cpp +0 -0
  109. data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexBinaryFlat.cpp +0 -0
  110. data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexFlat.cpp +1 -1
  111. data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexIVFFlat.cpp +0 -0
  112. data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuIndexIVFPQ.cpp +141 -52
  113. data/vendor/faiss/{gpu → faiss/gpu}/test/TestGpuMemoryException.cpp +0 -0
  114. data/vendor/faiss/{gpu → faiss/gpu}/test/TestUtils.cpp +4 -2
  115. data/vendor/faiss/{gpu → faiss/gpu}/test/TestUtils.h +0 -0
  116. data/vendor/faiss/{gpu → faiss/gpu}/test/demo_ivfpq_indexing_gpu.cpp +7 -5
  117. data/vendor/faiss/{gpu → faiss/gpu}/utils/DeviceUtils.h +1 -1
  118. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +213 -0
  119. data/vendor/faiss/{gpu → faiss/gpu}/utils/StackDeviceMemory.h +25 -40
  120. data/vendor/faiss/{gpu → faiss/gpu}/utils/StaticUtils.h +0 -0
  121. data/vendor/faiss/{gpu → faiss/gpu}/utils/Timer.cpp +0 -0
  122. data/vendor/faiss/{gpu → faiss/gpu}/utils/Timer.h +0 -0
  123. data/vendor/faiss/{impl → faiss/impl}/AuxIndexStructures.cpp +1 -0
  124. data/vendor/faiss/{impl → faiss/impl}/AuxIndexStructures.h +3 -1
  125. data/vendor/faiss/{impl → faiss/impl}/FaissAssert.h +1 -0
  126. data/vendor/faiss/{impl → faiss/impl}/FaissException.cpp +26 -0
  127. data/vendor/faiss/{impl → faiss/impl}/FaissException.h +4 -0
  128. data/vendor/faiss/{impl → faiss/impl}/HNSW.cpp +26 -26
  129. data/vendor/faiss/{impl → faiss/impl}/HNSW.h +19 -11
  130. data/vendor/faiss/{impl → faiss/impl}/PolysemousTraining.cpp +1 -1
  131. data/vendor/faiss/{impl → faiss/impl}/PolysemousTraining.h +1 -1
  132. data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer-inl.h +0 -1
  133. data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer.cpp +9 -9
  134. data/vendor/faiss/{impl → faiss/impl}/ProductQuantizer.h +0 -0
  135. data/vendor/faiss/{impl → faiss/impl}/ScalarQuantizer.cpp +63 -39
  136. data/vendor/faiss/{impl → faiss/impl}/ScalarQuantizer.h +1 -1
  137. data/vendor/faiss/{impl → faiss/impl}/ThreadedIndex-inl.h +0 -0
  138. data/vendor/faiss/{impl → faiss/impl}/ThreadedIndex.h +0 -0
  139. data/vendor/faiss/{impl → faiss/impl}/index_read.cpp +99 -116
  140. data/vendor/faiss/{impl → faiss/impl}/index_write.cpp +15 -50
  141. data/vendor/faiss/{impl → faiss/impl}/io.cpp +15 -10
  142. data/vendor/faiss/{impl → faiss/impl}/io.h +22 -8
  143. data/vendor/faiss/faiss/impl/io_macros.h +57 -0
  144. data/vendor/faiss/{impl → faiss/impl}/lattice_Zn.cpp +52 -36
  145. data/vendor/faiss/{impl → faiss/impl}/lattice_Zn.h +3 -3
  146. data/vendor/faiss/faiss/impl/platform_macros.h +24 -0
  147. data/vendor/faiss/{index_factory.cpp → faiss/index_factory.cpp} +33 -12
  148. data/vendor/faiss/{index_factory.h → faiss/index_factory.h} +0 -0
  149. data/vendor/faiss/{index_io.h → faiss/index_io.h} +55 -1
  150. data/vendor/faiss/faiss/python/python_callbacks.cpp +112 -0
  151. data/vendor/faiss/faiss/python/python_callbacks.h +45 -0
  152. data/vendor/faiss/{utils → faiss/utils}/Heap.cpp +5 -5
  153. data/vendor/faiss/{utils → faiss/utils}/Heap.h +1 -3
  154. data/vendor/faiss/{utils → faiss/utils}/WorkerThread.cpp +0 -0
  155. data/vendor/faiss/{utils → faiss/utils}/WorkerThread.h +0 -0
  156. data/vendor/faiss/{utils → faiss/utils}/distances.cpp +28 -13
  157. data/vendor/faiss/{utils → faiss/utils}/distances.h +2 -1
  158. data/vendor/faiss/{utils → faiss/utils}/distances_simd.cpp +5 -5
  159. data/vendor/faiss/{utils → faiss/utils}/extra_distances.cpp +8 -7
  160. data/vendor/faiss/{utils → faiss/utils}/extra_distances.h +0 -0
  161. data/vendor/faiss/{utils → faiss/utils}/hamming-inl.h +1 -3
  162. data/vendor/faiss/{utils → faiss/utils}/hamming.cpp +8 -7
  163. data/vendor/faiss/{utils → faiss/utils}/hamming.h +7 -1
  164. data/vendor/faiss/{utils → faiss/utils}/random.cpp +5 -5
  165. data/vendor/faiss/{utils → faiss/utils}/random.h +0 -0
  166. data/vendor/faiss/{utils → faiss/utils}/utils.cpp +27 -28
  167. data/vendor/faiss/{utils → faiss/utils}/utils.h +4 -0
  168. data/vendor/faiss/misc/test_blas.cpp +4 -1
  169. data/vendor/faiss/tests/test_binary_flat.cpp +0 -2
  170. data/vendor/faiss/tests/test_dealloc_invlists.cpp +6 -1
  171. data/vendor/faiss/tests/test_ivfpq_codec.cpp +4 -1
  172. data/vendor/faiss/tests/test_ivfpq_indexing.cpp +6 -4
  173. data/vendor/faiss/tests/test_lowlevel_ivf.cpp +12 -5
  174. data/vendor/faiss/tests/test_merge.cpp +6 -3
  175. data/vendor/faiss/tests/test_ondisk_ivf.cpp +7 -2
  176. data/vendor/faiss/tests/test_pairs_decoding.cpp +5 -1
  177. data/vendor/faiss/tests/test_params_override.cpp +7 -2
  178. data/vendor/faiss/tests/test_sliding_ivf.cpp +10 -4
  179. data/vendor/faiss/tutorial/cpp/1-Flat.cpp +14 -8
  180. data/vendor/faiss/tutorial/cpp/2-IVFFlat.cpp +11 -7
  181. data/vendor/faiss/tutorial/cpp/3-IVFPQ.cpp +12 -7
  182. data/vendor/faiss/tutorial/cpp/4-GPU.cpp +6 -3
  183. data/vendor/faiss/tutorial/cpp/5-Multiple-GPUs.cpp +7 -3
  184. metadata +154 -153
  185. data/vendor/faiss/gpu/GpuResources.cpp +0 -52
  186. data/vendor/faiss/gpu/GpuResources.h +0 -73
  187. data/vendor/faiss/gpu/StandardGpuResources.cpp +0 -303
  188. data/vendor/faiss/gpu/utils/DeviceMemory.cpp +0 -77
  189. data/vendor/faiss/gpu/utils/DeviceMemory.h +0 -71
  190. data/vendor/faiss/gpu/utils/MemorySpace.cpp +0 -89
  191. data/vendor/faiss/gpu/utils/MemorySpace.h +0 -44
  192. data/vendor/faiss/gpu/utils/StackDeviceMemory.cpp +0 -239
@@ -14,6 +14,7 @@
14
14
  #include <faiss/IndexPreTransform.h>
15
15
  #include <faiss/impl/FaissAssert.h>
16
16
  #include <faiss/MetaIndexes.h>
17
+ #include <faiss/utils/utils.h>
17
18
 
18
19
 
19
20
 
@@ -180,9 +181,9 @@ SlidingIndexWindow::SlidingIndexWindow (Index *index): index (index) {
180
181
  n_slice = 0;
181
182
  IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf (index));
182
183
  ils = dynamic_cast<ArrayInvertedLists *> (index_ivf->invlists);
183
- nlist = ils->nlist;
184
184
  FAISS_THROW_IF_NOT_MSG (ils,
185
185
  "only supports indexes with ArrayInvertedLists");
186
+ nlist = ils->nlist;
186
187
  sizes.resize(nlist);
187
188
  }
188
189
 
@@ -310,17 +311,34 @@ void set_invlist_range (Index *index, long i0, long i1,
310
311
  ivf->ntotal = index->ntotal = ntotal;
311
312
  }
312
313
 
314
+ static size_t count_ndis(const IndexIVF * index_ivf, size_t n_list_scan,
315
+ const idx_t *Iq)
316
+ {
317
+ size_t nb_dis = 0;
318
+ const InvertedLists *il = index_ivf->invlists;
319
+ for (idx_t i = 0; i < n_list_scan; i++) {
320
+ if (Iq[i] >= 0) {
321
+ nb_dis += il->list_size(Iq[i]);
322
+ }
323
+ }
324
+ return nb_dis;
325
+ }
326
+
327
+
313
328
 
314
329
  void search_with_parameters (const Index *index,
315
330
  idx_t n, const float *x, idx_t k,
316
331
  float *distances, idx_t *labels,
317
- IVFSearchParameters *params,
318
- size_t *nb_dis_ptr)
332
+ const IVFSearchParameters *params,
333
+ size_t *nb_dis_ptr,
334
+ double *ms_per_stage)
319
335
  {
320
336
  FAISS_THROW_IF_NOT (params);
321
337
  const float *prev_x = x;
322
338
  ScopeDeleter<float> del;
323
339
 
340
+ double t0 = getmillisecs();
341
+
324
342
  if (auto ip = dynamic_cast<const IndexPreTransform *> (index)) {
325
343
  x = ip->apply_chain (n, x);
326
344
  if (x != prev_x) {
@@ -329,6 +347,8 @@ void search_with_parameters (const Index *index,
329
347
  index = ip->index;
330
348
  }
331
349
 
350
+ double t1 = getmillisecs();
351
+
332
352
  std::vector<idx_t> Iq(params->nprobe * n);
333
353
  std::vector<float> Dq(params->nprobe * n);
334
354
 
@@ -339,21 +359,76 @@ void search_with_parameters (const Index *index,
339
359
  Dq.data(), Iq.data());
340
360
 
341
361
  if (nb_dis_ptr) {
342
- size_t nb_dis = 0;
343
- const InvertedLists *il = index_ivf->invlists;
344
- for (idx_t i = 0; i < n * params->nprobe; i++) {
345
- if (Iq[i] >= 0) {
346
- nb_dis += il->list_size(Iq[i]);
347
- }
348
- }
349
- *nb_dis_ptr = nb_dis;
362
+ *nb_dis_ptr = count_ndis (index_ivf, n * params->nprobe, Iq.data());
350
363
  }
351
364
 
365
+ double t2 = getmillisecs();
366
+
352
367
  index_ivf->search_preassigned(n, x, k, Iq.data(), Dq.data(),
353
368
  distances, labels,
354
369
  false, params);
370
+ double t3 = getmillisecs();
371
+ if (ms_per_stage) {
372
+ ms_per_stage[0] = t1 - t0;
373
+ ms_per_stage[1] = t2 - t1;
374
+ ms_per_stage[2] = t3 - t2;
375
+ }
376
+ }
377
+
378
+ void range_search_with_parameters (const Index *index,
379
+ idx_t n, const float *x, float radius,
380
+ RangeSearchResult *result,
381
+ const IVFSearchParameters *params,
382
+ size_t *nb_dis_ptr,
383
+ double *ms_per_stage)
384
+ {
385
+ FAISS_THROW_IF_NOT (params);
386
+ const float *prev_x = x;
387
+ ScopeDeleter<float> del;
388
+
389
+ double t0 = getmillisecs();
390
+
391
+ if (auto ip = dynamic_cast<const IndexPreTransform *> (index)) {
392
+ x = ip->apply_chain (n, x);
393
+ if (x != prev_x) {
394
+ del.set(x);
395
+ }
396
+ index = ip->index;
397
+ }
398
+
399
+ double t1 = getmillisecs();
400
+
401
+ std::vector<idx_t> Iq(params->nprobe * n);
402
+ std::vector<float> Dq(params->nprobe * n);
403
+
404
+ const IndexIVF *index_ivf = dynamic_cast<const IndexIVF *>(index);
405
+ FAISS_THROW_IF_NOT (index_ivf);
406
+
407
+ index_ivf->quantizer->search(n, x, params->nprobe,
408
+ Dq.data(), Iq.data());
409
+
410
+ if (nb_dis_ptr) {
411
+ *nb_dis_ptr = count_ndis (index_ivf, n * params->nprobe, Iq.data());
412
+ }
413
+
414
+ double t2 = getmillisecs();
415
+
416
+ index_ivf->range_search_preassigned(
417
+ n, x, radius, Iq.data(), Dq.data(),
418
+ result, false, params
419
+ );
420
+
421
+ double t3 = getmillisecs();
422
+ if (ms_per_stage) {
423
+ ms_per_stage[0] = t1 - t0;
424
+ ms_per_stage[1] = t2 - t1;
425
+ ms_per_stage[2] = t3 - t2;
426
+ }
355
427
  }
356
428
 
357
429
 
358
430
 
431
+
432
+
433
+
359
434
  } } // namespace faiss::ivflib
@@ -120,14 +120,32 @@ ArrayInvertedLists * get_invlist_range (const Index *index,
120
120
  void set_invlist_range (Index *index, long i0, long i1,
121
121
  ArrayInvertedLists * src);
122
122
 
123
- // search an IndexIVF, possibly embedded in an IndexPreTransform with
124
- // given parameters. Optionally returns the number of distances
125
- // computed
126
- void search_with_parameters (const Index *index,
127
- idx_t n, const float *x, idx_t k,
128
- float *distances, idx_t *labels,
129
- IVFSearchParameters *params,
130
- size_t *nb_dis = nullptr);
123
+ /** search an IndexIVF, possibly embedded in an IndexPreTransform with
124
+ * given parameters. This is a way to set the nprobe and get
125
+ * statdistics in a thread-safe way.
126
+ *
127
+ * Optionally returns (if non-nullptr):
128
+ * - nb_dis: number of distances computed
129
+ * - ms_per_stage: [0]: preprocessing time
130
+ * [1]: coarse quantization,
131
+ * [2]: list scanning
132
+ */
133
+ void search_with_parameters (
134
+ const Index *index,
135
+ idx_t n, const float *x, idx_t k,
136
+ float *distances, idx_t *labels,
137
+ const IVFSearchParameters *params,
138
+ size_t *nb_dis = nullptr,
139
+ double *ms_per_stage = nullptr);
140
+
141
+ /** same as search_with_parameters but for range search */
142
+ void range_search_with_parameters (
143
+ const Index *index,
144
+ idx_t n, const float *x, float radius,
145
+ RangeSearchResult *result,
146
+ const IVFSearchParameters *params,
147
+ size_t *nb_dis = nullptr,
148
+ double *ms_per_stage = nullptr);
131
149
 
132
150
 
133
151
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  #define FAISS_VERSION_MAJOR 1
20
20
  #define FAISS_VERSION_MINOR 6
21
- #define FAISS_VERSION_PATCH 3
21
+ #define FAISS_VERSION_PATCH 4
22
22
 
23
23
  /**
24
24
  * @namespace faiss
@@ -9,12 +9,13 @@
9
9
 
10
10
  #include <faiss/Index2Layer.h>
11
11
 
12
+ #include <cinttypes>
12
13
  #include <cmath>
13
14
  #include <cstdio>
14
15
  #include <cassert>
15
16
  #include <stdint.h>
16
17
 
17
- #ifdef __SSE__
18
+ #ifdef __SSE3__
18
19
  #include <immintrin.h>
19
20
  #endif
20
21
 
@@ -77,7 +78,7 @@ Index2Layer::~Index2Layer ()
77
78
  void Index2Layer::train(idx_t n, const float* x)
78
79
  {
79
80
  if (verbose) {
80
- printf ("training level-1 quantizer %ld vectors in %dD\n",
81
+ printf ("training level-1 quantizer %" PRId64 " vectors in %dD\n",
81
82
  n, d);
82
83
  }
83
84
 
@@ -104,7 +105,7 @@ void Index2Layer::train(idx_t n, const float* x)
104
105
  }
105
106
 
106
107
  if (verbose)
107
- printf ("training %zdx%zd product quantizer on %ld vectors in %dD\n",
108
+ printf ("training %zdx%zd product quantizer on %" PRId64 " vectors in %dD\n",
108
109
  pq.M, pq.ksub, n, d);
109
110
  pq.verbose = verbose;
110
111
  pq.train (n, residuals.data());
@@ -119,7 +120,7 @@ void Index2Layer::add(idx_t n, const float* x)
119
120
  for (idx_t i0 = 0; i0 < n; i0 += bs) {
120
121
  idx_t i1 = std::min(i0 + bs, n);
121
122
  if (verbose) {
122
- printf("Index2Layer::add: adding %ld:%ld / %ld\n",
123
+ printf("Index2Layer::add: adding %" PRId64 ":%" PRId64 " / %" PRId64 "\n",
123
124
  i0, i1, n);
124
125
  }
125
126
  add (i1 - i0, x + i0 * d);
@@ -172,14 +173,14 @@ void Index2Layer::search(
172
173
 
173
174
  void Index2Layer::reconstruct_n(idx_t i0, idx_t ni, float* recons) const
174
175
  {
175
- float recons1[d];
176
+ std::vector<float> recons1(d);
176
177
  FAISS_THROW_IF_NOT (i0 >= 0 && i0 + ni <= ntotal);
177
178
  const uint8_t *rp = &codes[i0 * code_size];
178
179
 
179
180
  for (idx_t i = 0; i < ni; i++) {
180
181
  idx_t key = 0;
181
182
  memcpy (&key, rp, code_size_1);
182
- q1.quantizer->reconstruct (key, recons1);
183
+ q1.quantizer->reconstruct (key, recons1.data());
183
184
  rp += code_size_1;
184
185
  pq.decode (rp, recons);
185
186
  for (idx_t j = 0; j < d; j++) {
@@ -270,7 +271,7 @@ struct DistanceXPQ4 : Distance2Level {
270
271
  }
271
272
 
272
273
  float operator () (idx_t i) override {
273
- #ifdef __SSE__
274
+ #ifdef __SSE3__
274
275
  const uint8_t *code = storage.codes.data() + i * storage.code_size;
275
276
  long key = 0;
276
277
  memcpy (&key, code, storage.code_size_1);
@@ -323,7 +324,7 @@ struct Distance2xXPQ4 : Distance2Level {
323
324
  long key01 = 0;
324
325
  memcpy (&key01, code, storage.code_size_1);
325
326
  code += storage.code_size_1;
326
- #ifdef __SSE__
327
+ #ifdef __SSE3__
327
328
 
328
329
  // walking pointers
329
330
  const float *qa = q;
@@ -361,7 +362,7 @@ struct Distance2xXPQ4 : Distance2Level {
361
362
 
362
363
 
363
364
  DistanceComputer * Index2Layer::get_distance_computer() const {
364
- #ifdef __SSE__
365
+ #ifdef __SSE3__
365
366
  const MultiIndexQuantizer *mi =
366
367
  dynamic_cast<MultiIndexQuantizer*> (q1.quantizer);
367
368
 
@@ -416,13 +417,13 @@ void Index2Layer::sa_decode (idx_t n, const uint8_t *bytes, float *x) const
416
417
  std::vector<float> residual (d);
417
418
 
418
419
  #pragma omp for
419
- for (size_t i = 0; i < n; i++) {
420
+ for (idx_t i = 0; i < n; i++) {
420
421
  const uint8_t *code = bytes + i * code_size;
421
422
  int64_t list_no = q1.decode_listno (code);
422
423
  float *xi = x + i * d;
423
424
  pq.decode (code + code_size_1, xi);
424
425
  q1.quantizer->reconstruct (list_no, residual.data());
425
- for (size_t j = 0; j < d; j++) {
426
+ for (int j = 0; j < d; j++) {
426
427
  xi[j] += residual[j];
427
428
  }
428
429
  }
@@ -10,6 +10,7 @@
10
10
  #include <faiss/IndexBinary.h>
11
11
  #include <faiss/impl/FaissAssert.h>
12
12
 
13
+ #include <cinttypes>
13
14
  #include <cstring>
14
15
 
15
16
  namespace faiss {
@@ -70,7 +71,7 @@ void IndexBinary::search_and_reconstruct(idx_t n, const uint8_t *x, idx_t k,
70
71
  }
71
72
 
72
73
  void IndexBinary::display() const {
73
- printf("Index: %s -> %ld elements\n", typeid (*this).name(), ntotal);
74
+ printf("Index: %s -> %" PRId64 " elements\n", typeid (*this).name(), ntotal);
74
75
  }
75
76
 
76
77
 
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <faiss/IndexBinaryFromFloat.h>
11
11
 
12
+ #include <algorithm>
12
13
  #include <memory>
13
14
  #include <faiss/utils/utils.h>
14
15
 
@@ -23,7 +23,6 @@
23
23
 
24
24
  #include <sys/types.h>
25
25
  #include <sys/stat.h>
26
- #include <unistd.h>
27
26
  #include <stdint.h>
28
27
 
29
28
  #include <faiss/utils/random.h>
@@ -52,7 +51,7 @@ void hnsw_add_vertices(IndexBinaryHNSW& index_hnsw,
52
51
  size_t ntotal = n0 + n;
53
52
  double t0 = getmillisecs();
54
53
  if (verbose) {
55
- printf("hnsw_add_vertices: adding %ld elements on top of %ld "
54
+ printf("hnsw_add_vertices: adding %zd elements on top of %zd "
56
55
  "(preset_levels=%d)\n",
57
56
  n, n0, int(preset_levels));
58
57
  }
@@ -5,11 +5,11 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- // Copyright 2004-present Facebook. All Rights Reserved
9
8
  // -*- c++ -*-
10
9
 
11
10
  #include <faiss/IndexBinaryHash.h>
12
11
 
12
+ #include <cinttypes>
13
13
  #include <cstdio>
14
14
  #include <memory>
15
15
 
@@ -19,6 +19,15 @@
19
19
  #include <faiss/impl/AuxIndexStructures.h>
20
20
  #include <faiss/impl/FaissAssert.h>
21
21
 
22
+ #ifdef _MSC_VER
23
+ #include <intrin.h>
24
+
25
+ static inline int __builtin_ctzll(uint64_t x) {
26
+ unsigned long ret;
27
+ _BitScanForward64(&ret, x);
28
+ return (int)ret;
29
+ }
30
+ #endif // _MSC_VER
22
31
 
23
32
  namespace faiss {
24
33
 
@@ -222,7 +231,7 @@ void IndexBinaryHash::range_search(idx_t n, const uint8_t *x, int radius,
222
231
  RangeSearchPartialResult pres (result);
223
232
 
224
233
  #pragma omp for
225
- for (size_t i = 0; i < n; i++) { // loop queries
234
+ for (idx_t i = 0; i < n; i++) { // loop queries
226
235
  RangeQueryResult & qres = pres.new_result (i);
227
236
  RangeSearchResults res = {radius, qres};
228
237
  const uint8_t *q = x + i * code_size;
@@ -246,7 +255,7 @@ void IndexBinaryHash::search(idx_t n, const uint8_t *x, idx_t k,
246
255
  size_t nlist = 0, ndis = 0, n0 = 0;
247
256
 
248
257
  #pragma omp parallel for if(n > 100) reduction(+: nlist, ndis, n0)
249
- for (size_t i = 0; i < n; i++) {
258
+ for (idx_t i = 0; i < n; i++) {
250
259
  int32_t * simi = distances + k * i;
251
260
  idx_t * idxi = labels + k * i;
252
261
 
@@ -272,10 +281,10 @@ size_t IndexBinaryHash::hashtable_size() const
272
281
  void IndexBinaryHash::display() const
273
282
  {
274
283
  for (auto it = invlists.begin(); it != invlists.end(); ++it) {
275
- printf("%ld: [", it->first);
284
+ printf("%" PRId64 ": [", it->first);
276
285
  const std::vector<idx_t> & v = it->second.ids;
277
286
  for (auto x: v) {
278
- printf("%ld ", 0 + x);
287
+ printf("%" PRId64 " ", x);
279
288
  }
280
289
  printf("]\n");
281
290
 
@@ -437,7 +446,7 @@ void IndexBinaryMultiHash::range_search(idx_t n, const uint8_t *x, int radius,
437
446
  RangeSearchPartialResult pres (result);
438
447
 
439
448
  #pragma omp for
440
- for (size_t i = 0; i < n; i++) { // loop queries
449
+ for (idx_t i = 0; i < n; i++) { // loop queries
441
450
  RangeQueryResult & qres = pres.new_result (i);
442
451
  RangeSearchResults res = {radius, qres};
443
452
  const uint8_t *q = x + i * code_size;
@@ -461,7 +470,7 @@ void IndexBinaryMultiHash::search(idx_t n, const uint8_t *x, idx_t k,
461
470
  size_t nlist = 0, ndis = 0, n0 = 0;
462
471
 
463
472
  #pragma omp parallel for if(n > 100) reduction(+: nlist, ndis, n0)
464
- for (size_t i = 0; i < n; i++) {
473
+ for (idx_t i = 0; i < n; i++) {
465
474
  int32_t * simi = distances + k * i;
466
475
  idx_t * idxi = labels + k * i;
467
476
 
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include <faiss/IndexBinary.h>
19
19
  #include <faiss/IndexBinaryFlat.h>
20
+ #include <faiss/impl/platform_macros.h>
20
21
  #include <faiss/utils/Heap.h>
21
22
 
22
23
 
@@ -71,7 +72,7 @@ struct IndexBinaryHashStats {
71
72
  void reset ();
72
73
  };
73
74
 
74
- extern IndexBinaryHashStats indexBinaryHash_stats;
75
+ FAISS_API extern IndexBinaryHashStats indexBinaryHash_stats;
75
76
 
76
77
 
77
78
  /** just uses the b first bits as a hash value */