faiss 0.2.0 → 0.2.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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/faiss/version.rb +1 -1
  4. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  5. data/vendor/faiss/faiss/AutoTune.h +55 -56
  6. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  7. data/vendor/faiss/faiss/Clustering.h +88 -35
  8. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  9. data/vendor/faiss/faiss/IVFlib.h +48 -51
  10. data/vendor/faiss/faiss/Index.cpp +85 -103
  11. data/vendor/faiss/faiss/Index.h +54 -48
  12. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  13. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  14. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  15. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  16. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  17. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  18. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  19. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  20. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  21. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  22. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  23. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  24. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  25. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  26. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  27. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  28. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  29. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  30. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  31. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  32. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  33. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  34. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  35. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  36. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  37. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  38. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  39. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  40. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +125 -133
  41. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  42. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  43. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  44. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  45. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  46. data/vendor/faiss/faiss/IndexNNDescent.cpp +231 -0
  47. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  48. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  49. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  50. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  51. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  52. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  53. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  54. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  55. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  56. data/vendor/faiss/faiss/IndexRefine.cpp +115 -131
  57. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  58. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  59. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  60. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  61. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  62. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  63. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  64. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  65. data/vendor/faiss/faiss/IndexShards.h +85 -73
  66. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  67. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  68. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  69. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  70. data/vendor/faiss/faiss/MetricType.h +7 -7
  71. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  72. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  73. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  74. data/vendor/faiss/faiss/clone_index.h +4 -9
  75. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  76. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  77. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  78. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  79. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  80. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  81. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  82. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  83. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  84. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  85. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  86. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  87. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  88. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  89. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  90. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  91. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  92. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  93. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  94. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  95. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  96. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  97. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  98. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  99. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  100. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  101. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  102. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  103. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  104. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  105. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  106. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  107. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  108. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  109. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  110. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  111. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  112. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  113. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  114. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  115. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  116. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  117. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  118. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  119. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  120. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  121. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  122. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  123. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  124. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  125. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  126. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  127. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  128. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  129. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  130. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  131. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  132. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  133. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  134. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  135. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  136. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  137. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  138. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  139. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  140. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  141. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  142. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  143. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  144. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  145. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  146. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  147. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  148. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  149. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  150. data/vendor/faiss/faiss/impl/io.h +31 -41
  151. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  152. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  153. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  154. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  155. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  156. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  157. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  158. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  159. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  160. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  161. data/vendor/faiss/faiss/index_factory.h +6 -7
  162. data/vendor/faiss/faiss/index_io.h +23 -26
  163. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  164. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  165. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  166. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  167. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  168. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  169. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  170. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  171. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  172. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  173. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  174. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  175. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  176. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  177. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  178. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  179. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  180. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  181. data/vendor/faiss/faiss/utils/distances.h +133 -118
  182. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  183. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  184. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  185. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  186. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  187. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  188. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  189. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  190. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  191. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  192. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  193. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  194. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  195. data/vendor/faiss/faiss/utils/random.h +13 -16
  196. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  197. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  198. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  199. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  200. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  201. data/vendor/faiss/faiss/utils/utils.h +53 -48
  202. metadata +20 -2
@@ -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