faiss 0.1.7 → 0.2.3

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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +7 -7
  4. data/ext/faiss/ext.cpp +1 -1
  5. data/ext/faiss/extconf.rb +8 -2
  6. data/ext/faiss/index.cpp +102 -69
  7. data/ext/faiss/index_binary.cpp +24 -30
  8. data/ext/faiss/kmeans.cpp +20 -16
  9. data/ext/faiss/numo.hpp +867 -0
  10. data/ext/faiss/pca_matrix.cpp +13 -14
  11. data/ext/faiss/product_quantizer.cpp +23 -24
  12. data/ext/faiss/utils.cpp +10 -37
  13. data/ext/faiss/utils.h +2 -13
  14. data/lib/faiss/version.rb +1 -1
  15. data/lib/faiss.rb +0 -5
  16. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  17. data/vendor/faiss/faiss/AutoTune.h +55 -56
  18. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  19. data/vendor/faiss/faiss/Clustering.h +88 -35
  20. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  21. data/vendor/faiss/faiss/IVFlib.h +48 -51
  22. data/vendor/faiss/faiss/Index.cpp +85 -103
  23. data/vendor/faiss/faiss/Index.h +54 -48
  24. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  25. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  26. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  27. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  28. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  29. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  30. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  31. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  32. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  33. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  34. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  35. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  36. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  37. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  38. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  39. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  40. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  41. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  42. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  43. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  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 +125 -133
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  54. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  55. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  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 +231 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  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 +115 -131
  69. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  73. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  74. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  75. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  76. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  77. data/vendor/faiss/faiss/IndexShards.h +85 -73
  78. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  79. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  80. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  81. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  82. data/vendor/faiss/faiss/MetricType.h +7 -7
  83. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  84. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  85. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  86. data/vendor/faiss/faiss/clone_index.h +4 -9
  87. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  88. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  89. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  90. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  91. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  92. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  93. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  94. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  95. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  96. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  97. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  101. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  102. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  103. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  104. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  106. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  108. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  110. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  112. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  113. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  114. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  115. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  116. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  121. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  122. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  124. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  125. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  126. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  128. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  129. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  130. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  131. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  133. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  135. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  136. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  137. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  138. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  139. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  140. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  142. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  144. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  145. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  146. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  148. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  149. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  151. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  153. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  154. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  156. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  157. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  158. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  159. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  160. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  161. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  162. data/vendor/faiss/faiss/impl/io.h +31 -41
  163. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  164. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  165. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  166. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  167. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  171. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  172. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  173. data/vendor/faiss/faiss/index_factory.h +6 -7
  174. data/vendor/faiss/faiss/index_io.h +23 -26
  175. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  177. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  178. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  179. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  180. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  181. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  183. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  185. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  186. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  187. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  188. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  189. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  190. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  191. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  192. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  193. data/vendor/faiss/faiss/utils/distances.h +133 -118
  194. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  195. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  196. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  197. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  198. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  199. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  200. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  201. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  202. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  203. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  204. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  205. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  206. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  207. data/vendor/faiss/faiss/utils/random.h +13 -16
  208. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  209. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  210. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  211. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  212. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  213. data/vendor/faiss/faiss/utils/utils.h +53 -48
  214. metadata +26 -12
  215. data/lib/faiss/index.rb +0 -20
  216. data/lib/faiss/index_binary.rb +0 -20
  217. data/lib/faiss/kmeans.rb +0 -15
  218. data/lib/faiss/pca_matrix.rb +0 -15
  219. data/lib/faiss/product_quantizer.rb +0 -22
@@ -9,22 +9,20 @@
9
9
 
10
10
  #pragma once
11
11
 
12
- #include <vector>
13
- #include <unordered_set>
14
12
  #include <queue>
13
+ #include <unordered_set>
14
+ #include <vector>
15
15
 
16
16
  #include <omp.h>
17
17
 
18
18
  #include <faiss/Index.h>
19
19
  #include <faiss/impl/FaissAssert.h>
20
- #include <faiss/utils/random.h>
21
- #include <faiss/utils/Heap.h>
22
20
  #include <faiss/impl/platform_macros.h>
23
-
21
+ #include <faiss/utils/Heap.h>
22
+ #include <faiss/utils/random.h>
24
23
 
25
24
  namespace faiss {
26
25
 
27
-
28
26
  /** Implementation of the Hierarchical Navigable Small World
29
27
  * datastructure.
30
28
  *
@@ -33,7 +31,7 @@ namespace faiss {
33
31
  *
34
32
  * Yu. A. Malkov, D. A. Yashunin, arXiv 2017
35
33
  *
36
- * This implmentation is heavily influenced by the NMSlib
34
+ * This implementation is heavily influenced by the NMSlib
37
35
  * implementation by Yury Malkov and Leonid Boystov
38
36
  * (https://github.com/searchivarius/nmslib)
39
37
  *
@@ -41,243 +39,224 @@ namespace faiss {
41
39
  * IndexHNSW.h for the full index object.
42
40
  */
43
41
 
44
-
45
42
  struct VisitedTable;
46
43
  struct DistanceComputer; // from AuxIndexStructures
47
44
  struct HNSWStats;
48
45
 
49
46
  struct HNSW {
50
- /// internal storage of vectors (32 bits: this is expensive)
51
- typedef int storage_idx_t;
52
-
53
- /// Faiss results are 64-bit
54
- typedef Index::idx_t idx_t;
55
-
56
- typedef std::pair<float, storage_idx_t> Node;
57
-
58
- /** Heap structure that allows fast
59
- */
60
- struct MinimaxHeap {
61
- int n;
62
- int k;
63
- int nvalid;
64
-
65
- std::vector<storage_idx_t> ids;
66
- std::vector<float> dis;
67
- typedef faiss::CMax<float, storage_idx_t> HC;
68
-
69
- explicit MinimaxHeap(int n): n(n), k(0), nvalid(0), ids(n), dis(n) {}
70
-
71
- void push(storage_idx_t i, float v);
72
-
73
- float max() const;
74
-
75
- int size() const;
76
-
77
- void clear();
47
+ /// internal storage of vectors (32 bits: this is expensive)
48
+ typedef int storage_idx_t;
78
49
 
79
- int pop_min(float *vmin_out = nullptr);
50
+ /// Faiss results are 64-bit
51
+ typedef Index::idx_t idx_t;
80
52
 
81
- int count_below(float thresh);
82
- };
53
+ typedef std::pair<float, storage_idx_t> Node;
83
54
 
55
+ /** Heap structure that allows fast
56
+ */
57
+ struct MinimaxHeap {
58
+ int n;
59
+ int k;
60
+ int nvalid;
84
61
 
85
- /// to sort pairs of (id, distance) from nearest to fathest or the reverse
86
- struct NodeDistCloser {
87
- float d;
88
- int id;
89
- NodeDistCloser(float d, int id): d(d), id(id) {}
90
- bool operator < (const NodeDistCloser &obj1) const { return d < obj1.d; }
91
- };
62
+ std::vector<storage_idx_t> ids;
63
+ std::vector<float> dis;
64
+ typedef faiss::CMax<float, storage_idx_t> HC;
92
65
 
93
- struct NodeDistFarther {
94
- float d;
95
- int id;
96
- NodeDistFarther(float d, int id): d(d), id(id) {}
97
- bool operator < (const NodeDistFarther &obj1) const { return d > obj1.d; }
98
- };
66
+ explicit MinimaxHeap(int n) : n(n), k(0), nvalid(0), ids(n), dis(n) {}
99
67
 
68
+ void push(storage_idx_t i, float v);
100
69
 
101
- /// assignment probability to each layer (sum=1)
102
- std::vector<double> assign_probas;
70
+ float max() const;
103
71
 
104
- /// number of neighbors stored per layer (cumulative), should not
105
- /// be changed after first add
106
- std::vector<int> cum_nneighbor_per_level;
72
+ int size() const;
107
73
 
108
- /// level of each vector (base level = 1), size = ntotal
109
- std::vector<int> levels;
74
+ void clear();
110
75
 
111
- /// offsets[i] is the offset in the neighbors array where vector i is stored
112
- /// size ntotal + 1
113
- std::vector<size_t> offsets;
76
+ int pop_min(float* vmin_out = nullptr);
114
77
 
115
- /// neighbors[offsets[i]:offsets[i+1]] is the list of neighbors of vector i
116
- /// for all levels. this is where all storage goes.
117
- std::vector<storage_idx_t> neighbors;
78
+ int count_below(float thresh);
79
+ };
118
80
 
119
- /// entry point in the search structure (one of the points with maximum level
120
- storage_idx_t entry_point;
81
+ /// to sort pairs of (id, distance) from nearest to fathest or the reverse
82
+ struct NodeDistCloser {
83
+ float d;
84
+ int id;
85
+ NodeDistCloser(float d, int id) : d(d), id(id) {}
86
+ bool operator<(const NodeDistCloser& obj1) const {
87
+ return d < obj1.d;
88
+ }
89
+ };
121
90
 
122
- faiss::RandomGenerator rng;
91
+ struct NodeDistFarther {
92
+ float d;
93
+ int id;
94
+ NodeDistFarther(float d, int id) : d(d), id(id) {}
95
+ bool operator<(const NodeDistFarther& obj1) const {
96
+ return d > obj1.d;
97
+ }
98
+ };
123
99
 
124
- /// maximum level
125
- int max_level;
100
+ /// assignment probability to each layer (sum=1)
101
+ std::vector<double> assign_probas;
126
102
 
127
- /// expansion factor at construction time
128
- int efConstruction;
103
+ /// number of neighbors stored per layer (cumulative), should not
104
+ /// be changed after first add
105
+ std::vector<int> cum_nneighbor_per_level;
129
106
 
130
- /// expansion factor at search time
131
- int efSearch;
107
+ /// level of each vector (base level = 1), size = ntotal
108
+ std::vector<int> levels;
132
109
 
133
- /// during search: do we check whether the next best distance is good enough?
134
- bool check_relative_distance = true;
110
+ /// offsets[i] is the offset in the neighbors array where vector i is stored
111
+ /// size ntotal + 1
112
+ std::vector<size_t> offsets;
135
113
 
136
- /// number of entry points in levels > 0.
137
- int upper_beam;
114
+ /// neighbors[offsets[i]:offsets[i+1]] is the list of neighbors of vector i
115
+ /// for all levels. this is where all storage goes.
116
+ std::vector<storage_idx_t> neighbors;
138
117
 
139
- /// use bounded queue during exploration
140
- bool search_bounded_queue = true;
118
+ /// entry point in the search structure (one of the points with maximum
119
+ /// level
120
+ storage_idx_t entry_point;
141
121
 
142
- // methods that initialize the tree sizes
122
+ faiss::RandomGenerator rng;
143
123
 
144
- /// initialize the assign_probas and cum_nneighbor_per_level to
145
- /// have 2*M links on level 0 and M links on levels > 0
146
- void set_default_probas(int M, float levelMult);
124
+ /// maximum level
125
+ int max_level;
147
126
 
148
- /// set nb of neighbors for this level (before adding anything)
149
- void set_nb_neighbors(int level_no, int n);
127
+ /// expansion factor at construction time
128
+ int efConstruction;
150
129
 
151
- // methods that access the tree sizes
130
+ /// expansion factor at search time
131
+ int efSearch;
152
132
 
153
- /// nb of neighbors for this level
154
- int nb_neighbors(int layer_no) const;
133
+ /// during search: do we check whether the next best distance is good
134
+ /// enough?
135
+ bool check_relative_distance = true;
155
136
 
156
- /// cumumlative nb up to (and excluding) this level
157
- int cum_nb_neighbors(int layer_no) const;
137
+ /// number of entry points in levels > 0.
138
+ int upper_beam;
158
139
 
159
- /// range of entries in the neighbors table of vertex no at layer_no
160
- void neighbor_range(idx_t no, int layer_no,
161
- size_t * begin, size_t * end) const;
140
+ /// use bounded queue during exploration
141
+ bool search_bounded_queue = true;
162
142
 
163
- /// only mandatory parameter: nb of neighbors
164
- explicit HNSW(int M = 32);
143
+ // methods that initialize the tree sizes
165
144
 
166
- /// pick a random level for a new point
167
- int random_level();
145
+ /// initialize the assign_probas and cum_nneighbor_per_level to
146
+ /// have 2*M links on level 0 and M links on levels > 0
147
+ void set_default_probas(int M, float levelMult);
168
148
 
169
- /// add n random levels to table (for debugging...)
170
- void fill_with_random_links(size_t n);
149
+ /// set nb of neighbors for this level (before adding anything)
150
+ void set_nb_neighbors(int level_no, int n);
171
151
 
172
- void add_links_starting_from(DistanceComputer& ptdis,
173
- storage_idx_t pt_id,
174
- storage_idx_t nearest,
175
- float d_nearest,
176
- int level,
177
- omp_lock_t *locks,
178
- VisitedTable &vt);
152
+ // methods that access the tree sizes
153
+
154
+ /// nb of neighbors for this level
155
+ int nb_neighbors(int layer_no) const;
156
+
157
+ /// cumumlative nb up to (and excluding) this level
158
+ int cum_nb_neighbors(int layer_no) const;
179
159
 
160
+ /// range of entries in the neighbors table of vertex no at layer_no
161
+ void neighbor_range(idx_t no, int layer_no, size_t* begin, size_t* end)
162
+ const;
180
163
 
181
- /** add point pt_id on all levels <= pt_level and build the link
182
- * structure for them. */
183
- void add_with_locks(DistanceComputer& ptdis, int pt_level, int pt_id,
184
- std::vector<omp_lock_t>& locks,
185
- VisitedTable& vt);
186
-
187
- int search_from_candidates(DistanceComputer& qdis, int k,
188
- idx_t *I, float *D,
189
- MinimaxHeap& candidates,
190
- VisitedTable &vt,
191
- HNSWStats &stats,
192
- int level, int nres_in = 0) const;
193
-
194
- std::priority_queue<Node> search_from_candidate_unbounded(
195
- const Node& node,
196
- DistanceComputer& qdis,
197
- int ef,
198
- VisitedTable *vt,
199
- HNSWStats &stats) const;
200
-
201
- /// search interface
202
- HNSWStats search(DistanceComputer& qdis, int k,
203
- idx_t *I, float *D,
204
- VisitedTable &vt) const;
205
-
206
- void reset();
207
-
208
- void clear_neighbor_tables(int level);
209
- void print_neighbor_stats(int level) const;
210
-
211
- int prepare_level_tab(size_t n, bool preset_levels = false);
212
-
213
- static void shrink_neighbor_list(
214
- DistanceComputer& qdis,
215
- std::priority_queue<NodeDistFarther>& input,
216
- std::vector<NodeDistFarther>& output,
217
- int max_size);
164
+ /// only mandatory parameter: nb of neighbors
165
+ explicit HNSW(int M = 32);
218
166
 
167
+ /// pick a random level for a new point
168
+ int random_level();
169
+
170
+ /// add n random levels to table (for debugging...)
171
+ void fill_with_random_links(size_t n);
172
+
173
+ void add_links_starting_from(
174
+ DistanceComputer& ptdis,
175
+ storage_idx_t pt_id,
176
+ storage_idx_t nearest,
177
+ float d_nearest,
178
+ int level,
179
+ omp_lock_t* locks,
180
+ VisitedTable& vt);
181
+
182
+ /** add point pt_id on all levels <= pt_level and build the link
183
+ * structure for them. */
184
+ void add_with_locks(
185
+ DistanceComputer& ptdis,
186
+ int pt_level,
187
+ int pt_id,
188
+ std::vector<omp_lock_t>& locks,
189
+ VisitedTable& vt);
190
+
191
+ int search_from_candidates(
192
+ DistanceComputer& qdis,
193
+ int k,
194
+ idx_t* I,
195
+ float* D,
196
+ MinimaxHeap& candidates,
197
+ VisitedTable& vt,
198
+ HNSWStats& stats,
199
+ int level,
200
+ int nres_in = 0) const;
201
+
202
+ std::priority_queue<Node> search_from_candidate_unbounded(
203
+ const Node& node,
204
+ DistanceComputer& qdis,
205
+ int ef,
206
+ VisitedTable* vt,
207
+ HNSWStats& stats) const;
208
+
209
+ /// search interface
210
+ HNSWStats search(
211
+ DistanceComputer& qdis,
212
+ int k,
213
+ idx_t* I,
214
+ float* D,
215
+ VisitedTable& vt) const;
216
+
217
+ void reset();
218
+
219
+ void clear_neighbor_tables(int level);
220
+ void print_neighbor_stats(int level) const;
221
+
222
+ int prepare_level_tab(size_t n, bool preset_levels = false);
223
+
224
+ static void shrink_neighbor_list(
225
+ DistanceComputer& qdis,
226
+ std::priority_queue<NodeDistFarther>& input,
227
+ std::vector<NodeDistFarther>& output,
228
+ int max_size);
219
229
  };
220
230
 
221
-
222
- /**************************************************************
223
- * Auxiliary structures
224
- **************************************************************/
225
-
226
- /// set implementation optimized for fast access.
227
- struct VisitedTable {
228
- std::vector<uint8_t> visited;
229
- int visno;
230
-
231
- explicit VisitedTable(int size)
232
- : visited(size), visno(1) {}
233
-
234
- /// set flog #no to true
235
- void set(int no) {
236
- visited[no] = visno;
237
- }
238
-
239
- /// get flag #no
240
- bool get(int no) const {
241
- return visited[no] == visno;
242
- }
243
-
244
- /// reset all flags to false
245
- void advance() {
246
- visno++;
247
- if (visno == 250) {
248
- // 250 rather than 255 because sometimes we use visno and visno+1
249
- memset(visited.data(), 0, sizeof(visited[0]) * visited.size());
250
- visno = 1;
231
+ struct HNSWStats {
232
+ size_t n1, n2, n3;
233
+ size_t ndis;
234
+ size_t nreorder;
235
+
236
+ HNSWStats(
237
+ size_t n1 = 0,
238
+ size_t n2 = 0,
239
+ size_t n3 = 0,
240
+ size_t ndis = 0,
241
+ size_t nreorder = 0)
242
+ : n1(n1), n2(n2), n3(n3), ndis(ndis), nreorder(nreorder) {}
243
+
244
+ void reset() {
245
+ n1 = n2 = n3 = 0;
246
+ ndis = 0;
247
+ nreorder = 0;
251
248
  }
252
- }
253
- };
254
249
 
255
-
256
- struct HNSWStats {
257
- size_t n1, n2, n3;
258
- size_t ndis;
259
- size_t nreorder;
260
-
261
- HNSWStats(size_t n1 = 0, size_t n2 = 0, size_t n3 = 0, size_t ndis = 0, size_t nreorder = 0)
262
- : n1(n1), n2(n2), n3(n3), ndis(ndis), nreorder(nreorder) {}
263
-
264
- void reset() {
265
- n1 = n2 = n3 = 0;
266
- ndis = 0;
267
- nreorder = 0;
268
- }
269
-
270
- void combine(const HNSWStats& other) {
271
- n1 += other.n1;
272
- n2 += other.n2;
273
- n3 += other.n3;
274
- ndis += other.ndis;
275
- nreorder += other.nreorder;
276
- }
250
+ void combine(const HNSWStats& other) {
251
+ n1 += other.n1;
252
+ n2 += other.n2;
253
+ n3 += other.n3;
254
+ ndis += other.ndis;
255
+ nreorder += other.nreorder;
256
+ }
277
257
  };
278
258
 
279
259
  // global var that collects them all
280
260
  FAISS_API extern HNSWStats hnsw_stats;
281
261
 
282
-
283
- } // namespace faiss
262
+ } // namespace faiss