faiss 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -15,41 +15,39 @@
15
15
 
16
16
  namespace faiss {
17
17
 
18
-
19
18
  /** Class for the clustering parameters. Can be passed to the
20
19
  * constructor of the Clustering object.
21
20
  */
22
21
  struct ClusteringParameters {
23
- int niter; ///< clustering iterations
24
- int nredo; ///< redo clustering this many times and keep best
22
+ int niter; ///< clustering iterations
23
+ int nredo; ///< redo clustering this many times and keep best
25
24
 
26
25
  bool verbose;
27
- bool spherical; ///< do we want normalized centroids?
28
- bool int_centroids; ///< round centroids coordinates to integer
29
- bool update_index; ///< re-train index after each iteration?
30
- bool frozen_centroids; ///< use the centroids provided as input and do not change them during iterations
26
+ bool spherical; ///< do we want normalized centroids?
27
+ bool int_centroids; ///< round centroids coordinates to integer
28
+ bool update_index; ///< re-train index after each iteration?
29
+ bool frozen_centroids; ///< use the centroids provided as input and do not
30
+ ///< change them during iterations
31
31
 
32
32
  int min_points_per_centroid; ///< otherwise you get a warning
33
- int max_points_per_centroid; ///< to limit size of dataset
33
+ int max_points_per_centroid; ///< to limit size of dataset
34
34
 
35
35
  int seed; ///< seed for the random number generator
36
36
 
37
- size_t decode_block_size; ///< how many vectors at a time to decode
37
+ size_t decode_block_size; ///< how many vectors at a time to decode
38
38
 
39
39
  /// sets reasonable defaults
40
- ClusteringParameters ();
40
+ ClusteringParameters();
41
41
  };
42
42
 
43
-
44
43
  struct ClusteringIterationStats {
45
- float obj; ///< objective values (sum of distances reported by index)
46
- double time; ///< seconds for iteration
44
+ float obj; ///< objective values (sum of distances reported by index)
45
+ double time; ///< seconds for iteration
47
46
  double time_search; ///< seconds for just search
48
47
  double imbalance_factor; ///< imbalance factor of iteration
49
48
  int nsplit; ///< number of cluster splits
50
49
  };
51
50
 
52
-
53
51
  /** K-means clustering based on assignment - centroid update iterations
54
52
  *
55
53
  * The clustering is based on an Index object that assigns training
@@ -62,21 +60,22 @@ struct ClusteringIterationStats {
62
60
  * initialization.
63
61
  *
64
62
  */
65
- struct Clustering: ClusteringParameters {
63
+ struct Clustering : ClusteringParameters {
66
64
  typedef Index::idx_t idx_t;
67
- size_t d; ///< dimension of the vectors
68
- size_t k; ///< nb of centroids
65
+ size_t d; ///< dimension of the vectors
66
+ size_t k; ///< nb of centroids
69
67
 
70
68
  /** centroids (k * d)
71
- * if centroids are set on input to train, they will be used as initialization
69
+ * if centroids are set on input to train, they will be used as
70
+ * initialization
72
71
  */
73
72
  std::vector<float> centroids;
74
73
 
75
74
  /// stats at every iteration of clustering
76
75
  std::vector<ClusteringIterationStats> iteration_stats;
77
76
 
78
- Clustering (int d, int k);
79
- Clustering (int d, int k, const ClusteringParameters &cp);
77
+ Clustering(int d, int k);
78
+ Clustering(int d, int k, const ClusteringParameters& cp);
80
79
 
81
80
  /** run k-means training
82
81
  *
@@ -84,9 +83,11 @@ struct Clustering: ClusteringParameters {
84
83
  * @param index index used for assignment
85
84
  * @param x_weights weight associated to each vector: NULL or size n
86
85
  */
87
- virtual void train (idx_t n, const float * x, faiss::Index & index,
88
- const float *x_weights = nullptr);
89
-
86
+ virtual void train(
87
+ idx_t n,
88
+ const float* x,
89
+ faiss::Index& index,
90
+ const float* x_weights = nullptr);
90
91
 
91
92
  /** run with encoded vectors
92
93
  *
@@ -96,17 +97,69 @@ struct Clustering: ClusteringParameters {
96
97
  * @param codec codec used to decode the vectors (nullptr =
97
98
  * vectors are in fact floats) *
98
99
  */
99
- void train_encoded (idx_t nx, const uint8_t *x_in,
100
- const Index * codec, Index & index,
101
- const float *weights = nullptr);
100
+ void train_encoded(
101
+ idx_t nx,
102
+ const uint8_t* x_in,
103
+ const Index* codec,
104
+ Index& index,
105
+ const float* weights = nullptr);
102
106
 
103
107
  /// Post-process the centroids after each centroid update.
104
108
  /// includes optional L2 normalization and nearest integer rounding
105
- void post_process_centroids ();
109
+ void post_process_centroids();
106
110
 
107
111
  virtual ~Clustering() {}
108
112
  };
109
113
 
114
+ struct ProgressiveDimClusteringParameters : ClusteringParameters {
115
+ int progressive_dim_steps; ///< number of incremental steps
116
+ bool apply_pca; ///< apply PCA on input
117
+
118
+ ProgressiveDimClusteringParameters();
119
+ };
120
+
121
+ /** generates an index suitable for clustering when called */
122
+ struct ProgressiveDimIndexFactory {
123
+ /// ownership transferred to caller
124
+ virtual Index* operator()(int dim);
125
+
126
+ virtual ~ProgressiveDimIndexFactory() {}
127
+ };
128
+
129
+ /** K-means clustering with progressive dimensions used
130
+ *
131
+ * The clustering first happens in dim 1, then with exponentially increasing
132
+ * dimension until d (I steps). This is typically applied after a PCA
133
+ * transformation (optional). Reference:
134
+ *
135
+ * "Improved Residual Vector Quantization for High-dimensional Approximate
136
+ * Nearest Neighbor Search"
137
+ *
138
+ * Shicong Liu, Hongtao Lu, Junru Shao, AAAI'15
139
+ *
140
+ * https://arxiv.org/abs/1509.05195
141
+ */
142
+ struct ProgressiveDimClustering : ProgressiveDimClusteringParameters {
143
+ using idx_t = Index::idx_t;
144
+ size_t d; ///< dimension of the vectors
145
+ size_t k; ///< nb of centroids
146
+
147
+ /** centroids (k * d) */
148
+ std::vector<float> centroids;
149
+
150
+ /// stats at every iteration of clustering
151
+ std::vector<ClusteringIterationStats> iteration_stats;
152
+
153
+ ProgressiveDimClustering(int d, int k);
154
+ ProgressiveDimClustering(
155
+ int d,
156
+ int k,
157
+ const ProgressiveDimClusteringParameters& cp);
158
+
159
+ void train(idx_t n, const float* x, ProgressiveDimIndexFactory& factory);
160
+
161
+ virtual ~ProgressiveDimClustering() {}
162
+ };
110
163
 
111
164
  /** simplified interface
112
165
  *
@@ -117,13 +170,13 @@ struct Clustering: ClusteringParameters {
117
170
  * @param centroids output centroids (size k * d)
118
171
  * @return final quantization error
119
172
  */
120
- float kmeans_clustering (size_t d, size_t n, size_t k,
121
- const float *x,
122
- float *centroids);
123
-
124
-
125
-
126
- }
127
-
173
+ float kmeans_clustering(
174
+ size_t d,
175
+ size_t n,
176
+ size_t k,
177
+ const float* x,
178
+ float* centroids);
179
+
180
+ } // namespace faiss
128
181
 
129
182
  #endif
@@ -12,108 +12,95 @@
12
12
  #include <memory>
13
13
 
14
14
  #include <faiss/IndexPreTransform.h>
15
- #include <faiss/impl/FaissAssert.h>
16
15
  #include <faiss/MetaIndexes.h>
16
+ #include <faiss/impl/FaissAssert.h>
17
17
  #include <faiss/utils/utils.h>
18
18
 
19
+ namespace faiss {
20
+ namespace ivflib {
19
21
 
20
-
21
- namespace faiss { namespace ivflib {
22
-
23
-
24
- void check_compatible_for_merge (const Index * index0,
25
- const Index * index1)
26
- {
27
-
28
- const faiss::IndexPreTransform *pt0 =
29
- dynamic_cast<const faiss::IndexPreTransform *>(index0);
22
+ void check_compatible_for_merge(const Index* index0, const Index* index1) {
23
+ const faiss::IndexPreTransform* pt0 =
24
+ dynamic_cast<const faiss::IndexPreTransform*>(index0);
30
25
 
31
26
  if (pt0) {
32
- const faiss::IndexPreTransform *pt1 =
33
- dynamic_cast<const faiss::IndexPreTransform *>(index1);
34
- FAISS_THROW_IF_NOT_MSG (pt1, "both indexes should be pretransforms");
27
+ const faiss::IndexPreTransform* pt1 =
28
+ dynamic_cast<const faiss::IndexPreTransform*>(index1);
29
+ FAISS_THROW_IF_NOT_MSG(pt1, "both indexes should be pretransforms");
35
30
 
36
- FAISS_THROW_IF_NOT (pt0->chain.size() == pt1->chain.size());
31
+ FAISS_THROW_IF_NOT(pt0->chain.size() == pt1->chain.size());
37
32
  for (int i = 0; i < pt0->chain.size(); i++) {
38
- FAISS_THROW_IF_NOT (typeid(pt0->chain[i]) == typeid(pt1->chain[i]));
33
+ FAISS_THROW_IF_NOT(typeid(pt0->chain[i]) == typeid(pt1->chain[i]));
39
34
  }
40
35
 
41
36
  index0 = pt0->index;
42
37
  index1 = pt1->index;
43
38
  }
44
- FAISS_THROW_IF_NOT (typeid(index0) == typeid(index1));
45
- FAISS_THROW_IF_NOT (index0->d == index1->d &&
46
- index0->metric_type == index1->metric_type);
39
+ FAISS_THROW_IF_NOT(typeid(index0) == typeid(index1));
40
+ FAISS_THROW_IF_NOT(
41
+ index0->d == index1->d &&
42
+ index0->metric_type == index1->metric_type);
47
43
 
48
- const faiss::IndexIVF *ivf0 = dynamic_cast<const faiss::IndexIVF *>(index0);
44
+ const faiss::IndexIVF* ivf0 = dynamic_cast<const faiss::IndexIVF*>(index0);
49
45
  if (ivf0) {
50
- const faiss::IndexIVF *ivf1 =
51
- dynamic_cast<const faiss::IndexIVF *>(index1);
52
- FAISS_THROW_IF_NOT (ivf1);
46
+ const faiss::IndexIVF* ivf1 =
47
+ dynamic_cast<const faiss::IndexIVF*>(index1);
48
+ FAISS_THROW_IF_NOT(ivf1);
53
49
 
54
- ivf0->check_compatible_for_merge (*ivf1);
50
+ ivf0->check_compatible_for_merge(*ivf1);
55
51
  }
56
52
 
57
53
  // TODO: check as thoroughfully for other index types
58
-
59
54
  }
60
55
 
61
- const IndexIVF * try_extract_index_ivf (const Index * index)
62
- {
63
- if (auto *pt =
64
- dynamic_cast<const IndexPreTransform *>(index)) {
56
+ const IndexIVF* try_extract_index_ivf(const Index* index) {
57
+ if (auto* pt = dynamic_cast<const IndexPreTransform*>(index)) {
65
58
  index = pt->index;
66
59
  }
67
60
 
68
- if (auto *idmap =
69
- dynamic_cast<const IndexIDMap *>(index)) {
61
+ if (auto* idmap = dynamic_cast<const IndexIDMap*>(index)) {
70
62
  index = idmap->index;
71
63
  }
72
- if (auto *idmap =
73
- dynamic_cast<const IndexIDMap2 *>(index)) {
64
+ if (auto* idmap = dynamic_cast<const IndexIDMap2*>(index)) {
74
65
  index = idmap->index;
75
66
  }
76
67
 
77
- auto *ivf = dynamic_cast<const IndexIVF *>(index);
68
+ auto* ivf = dynamic_cast<const IndexIVF*>(index);
78
69
 
79
70
  return ivf;
80
71
  }
81
72
 
82
- IndexIVF * try_extract_index_ivf (Index * index) {
83
- return const_cast<IndexIVF*> (try_extract_index_ivf ((const Index*)(index)));
73
+ IndexIVF* try_extract_index_ivf(Index* index) {
74
+ return const_cast<IndexIVF*>(try_extract_index_ivf((const Index*)(index)));
84
75
  }
85
76
 
86
- const IndexIVF * extract_index_ivf (const Index * index)
87
- {
88
- const IndexIVF *ivf = try_extract_index_ivf (index);
89
- FAISS_THROW_IF_NOT (ivf);
77
+ const IndexIVF* extract_index_ivf(const Index* index) {
78
+ const IndexIVF* ivf = try_extract_index_ivf(index);
79
+ FAISS_THROW_IF_NOT(ivf);
90
80
  return ivf;
91
81
  }
92
82
 
93
- IndexIVF * extract_index_ivf (Index * index) {
94
- return const_cast<IndexIVF*> (extract_index_ivf ((const Index*)(index)));
83
+ IndexIVF* extract_index_ivf(Index* index) {
84
+ return const_cast<IndexIVF*>(extract_index_ivf((const Index*)(index)));
95
85
  }
96
86
 
87
+ void merge_into(faiss::Index* index0, faiss::Index* index1, bool shift_ids) {
88
+ check_compatible_for_merge(index0, index1);
89
+ IndexIVF* ivf0 = extract_index_ivf(index0);
90
+ IndexIVF* ivf1 = extract_index_ivf(index1);
97
91
 
98
- void merge_into(faiss::Index *index0, faiss::Index *index1, bool shift_ids) {
99
-
100
- check_compatible_for_merge (index0, index1);
101
- IndexIVF * ivf0 = extract_index_ivf (index0);
102
- IndexIVF * ivf1 = extract_index_ivf (index1);
103
-
104
- ivf0->merge_from (*ivf1, shift_ids ? ivf0->ntotal : 0);
92
+ ivf0->merge_from(*ivf1, shift_ids ? ivf0->ntotal : 0);
105
93
 
106
94
  // useful for IndexPreTransform
107
95
  index0->ntotal = ivf0->ntotal;
108
96
  index1->ntotal = ivf1->ntotal;
109
97
  }
110
98
 
111
-
112
-
113
- void search_centroid(faiss::Index *index,
114
- const float* x, int n,
115
- idx_t* centroid_ids)
116
- {
99
+ void search_centroid(
100
+ faiss::Index* index,
101
+ const float* x,
102
+ int n,
103
+ idx_t* centroid_ids) {
117
104
  std::unique_ptr<float[]> del;
118
105
  if (auto index_pre = dynamic_cast<faiss::IndexPreTransform*>(index)) {
119
106
  x = index_pre->apply_chain(n, x);
@@ -125,19 +112,17 @@ void search_centroid(faiss::Index *index,
125
112
  index_ivf->quantizer->assign(n, x, centroid_ids);
126
113
  }
127
114
 
128
-
129
-
130
- void search_and_return_centroids(faiss::Index *index,
131
- size_t n,
132
- const float* xin,
133
- long k,
134
- float *distances,
135
- idx_t* labels,
136
- idx_t* query_centroid_ids,
137
- idx_t* result_centroid_ids)
138
- {
139
- const float *x = xin;
140
- std::unique_ptr<float []> del;
115
+ void search_and_return_centroids(
116
+ faiss::Index* index,
117
+ size_t n,
118
+ const float* xin,
119
+ long k,
120
+ float* distances,
121
+ idx_t* labels,
122
+ idx_t* query_centroid_ids,
123
+ idx_t* result_centroid_ids) {
124
+ const float* x = xin;
125
+ std::unique_ptr<float[]> del;
141
126
  if (auto index_pre = dynamic_cast<faiss::IndexPreTransform*>(index)) {
142
127
  x = index_pre->apply_chain(n, x);
143
128
  del.reset((float*)x);
@@ -147,19 +132,18 @@ void search_and_return_centroids(faiss::Index *index,
147
132
  assert(index_ivf);
148
133
 
149
134
  size_t nprobe = index_ivf->nprobe;
150
- std::vector<idx_t> cent_nos (n * nprobe);
151
- std::vector<float> cent_dis (n * nprobe);
135
+ std::vector<idx_t> cent_nos(n * nprobe);
136
+ std::vector<float> cent_dis(n * nprobe);
152
137
  index_ivf->quantizer->search(
153
- n, x, nprobe, cent_dis.data(), cent_nos.data());
138
+ n, x, nprobe, cent_dis.data(), cent_nos.data());
154
139
 
155
140
  if (query_centroid_ids) {
156
141
  for (size_t i = 0; i < n; i++)
157
142
  query_centroid_ids[i] = cent_nos[i * nprobe];
158
143
  }
159
144
 
160
- index_ivf->search_preassigned (n, x, k,
161
- cent_nos.data(), cent_dis.data(),
162
- distances, labels, true);
145
+ index_ivf->search_preassigned(
146
+ n, x, k, cent_nos.data(), cent_dis.data(), distances, labels, true);
163
147
 
164
148
  for (size_t i = 0; i < n * k; i++) {
165
149
  idx_t label = labels[i];
@@ -167,8 +151,8 @@ void search_and_return_centroids(faiss::Index *index,
167
151
  if (result_centroid_ids)
168
152
  result_centroid_ids[i] = -1;
169
153
  } else {
170
- long list_no = lo_listno (label);
171
- long list_index = lo_offset (label);
154
+ long list_no = lo_listno(label);
155
+ long list_index = lo_offset(label);
172
156
  if (result_centroid_ids)
173
157
  result_centroid_ids[i] = list_no;
174
158
  labels[i] = index_ivf->invlists->get_single_id(list_no, list_index);
@@ -176,61 +160,61 @@ void search_and_return_centroids(faiss::Index *index,
176
160
  }
177
161
  }
178
162
 
179
-
180
- SlidingIndexWindow::SlidingIndexWindow (Index *index): index (index) {
163
+ SlidingIndexWindow::SlidingIndexWindow(Index* index) : index(index) {
181
164
  n_slice = 0;
182
- IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf (index));
183
- ils = dynamic_cast<ArrayInvertedLists *> (index_ivf->invlists);
184
- FAISS_THROW_IF_NOT_MSG (ils,
185
- "only supports indexes with ArrayInvertedLists");
165
+ IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf(index));
166
+ ils = dynamic_cast<ArrayInvertedLists*>(index_ivf->invlists);
167
+ FAISS_THROW_IF_NOT_MSG(
168
+ ils, "only supports indexes with ArrayInvertedLists");
186
169
  nlist = ils->nlist;
187
170
  sizes.resize(nlist);
188
171
  }
189
172
 
190
- template<class T>
191
- static void shift_and_add (std::vector<T> & dst,
192
- size_t remove,
193
- const std::vector<T> & src)
194
- {
173
+ template <class T>
174
+ static void shift_and_add(
175
+ std::vector<T>& dst,
176
+ size_t remove,
177
+ const std::vector<T>& src) {
195
178
  if (remove > 0)
196
- memmove (dst.data(), dst.data() + remove,
197
- (dst.size() - remove) * sizeof (T));
179
+ memmove(dst.data(),
180
+ dst.data() + remove,
181
+ (dst.size() - remove) * sizeof(T));
198
182
  size_t insert_point = dst.size() - remove;
199
- dst.resize (insert_point + src.size());
200
- memcpy (dst.data() + insert_point, src.data (), src.size() * sizeof(T));
183
+ dst.resize(insert_point + src.size());
184
+ memcpy(dst.data() + insert_point, src.data(), src.size() * sizeof(T));
201
185
  }
202
186
 
203
- template<class T>
204
- static void remove_from_begin (std::vector<T> & v,
205
- size_t remove)
206
- {
187
+ template <class T>
188
+ static void remove_from_begin(std::vector<T>& v, size_t remove) {
207
189
  if (remove > 0)
208
- v.erase (v.begin(), v.begin() + remove);
190
+ v.erase(v.begin(), v.begin() + remove);
209
191
  }
210
192
 
211
- void SlidingIndexWindow::step(const Index *sub_index, bool remove_oldest) {
212
-
213
- FAISS_THROW_IF_NOT_MSG (!remove_oldest || n_slice > 0,
214
- "cannot remove slice: there is none");
193
+ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
194
+ FAISS_THROW_IF_NOT_MSG(
195
+ !remove_oldest || n_slice > 0,
196
+ "cannot remove slice: there is none");
215
197
 
216
- const ArrayInvertedLists *ils2 = nullptr;
217
- if(sub_index) {
218
- check_compatible_for_merge (index, sub_index);
198
+ const ArrayInvertedLists* ils2 = nullptr;
199
+ if (sub_index) {
200
+ check_compatible_for_merge(index, sub_index);
219
201
  ils2 = dynamic_cast<const ArrayInvertedLists*>(
220
- extract_index_ivf (sub_index)->invlists);
221
- FAISS_THROW_IF_NOT_MSG (ils2, "supports only ArrayInvertedLists");
202
+ extract_index_ivf(sub_index)->invlists);
203
+ FAISS_THROW_IF_NOT_MSG(ils2, "supports only ArrayInvertedLists");
222
204
  }
223
- IndexIVF *index_ivf = extract_index_ivf (index);
205
+ IndexIVF* index_ivf = extract_index_ivf(index);
224
206
 
225
207
  if (remove_oldest && ils2) {
226
208
  for (int i = 0; i < nlist; i++) {
227
- std::vector<size_t> & sizesi = sizes[i];
209
+ std::vector<size_t>& sizesi = sizes[i];
228
210
  size_t amount_to_remove = sizesi[0];
229
211
  index_ivf->ntotal += ils2->ids[i].size() - amount_to_remove;
230
212
 
231
- shift_and_add (ils->ids[i], amount_to_remove, ils2->ids[i]);
232
- shift_and_add (ils->codes[i], amount_to_remove * ils->code_size,
233
- ils2->codes[i]);
213
+ shift_and_add(ils->ids[i], amount_to_remove, ils2->ids[i]);
214
+ shift_and_add(
215
+ ils->codes[i],
216
+ amount_to_remove * ils->code_size,
217
+ ils2->codes[i]);
234
218
  for (int j = 0; j + 1 < n_slice; j++) {
235
219
  sizesi[j] = sizesi[j + 1] - amount_to_remove;
236
220
  }
@@ -239,8 +223,8 @@ void SlidingIndexWindow::step(const Index *sub_index, bool remove_oldest) {
239
223
  } else if (ils2) {
240
224
  for (int i = 0; i < nlist; i++) {
241
225
  index_ivf->ntotal += ils2->ids[i].size();
242
- shift_and_add (ils->ids[i], 0, ils2->ids[i]);
243
- shift_and_add (ils->codes[i], 0, ils2->codes[i]);
226
+ shift_and_add(ils->ids[i], 0, ils2->ids[i]);
227
+ shift_and_add(ils->codes[i], 0, ils2->codes[i]);
244
228
  sizes[i].push_back(ils->ids[i].size());
245
229
  }
246
230
  n_slice++;
@@ -248,74 +232,72 @@ void SlidingIndexWindow::step(const Index *sub_index, bool remove_oldest) {
248
232
  for (int i = 0; i < nlist; i++) {
249
233
  size_t amount_to_remove = sizes[i][0];
250
234
  index_ivf->ntotal -= amount_to_remove;
251
- remove_from_begin (ils->ids[i], amount_to_remove);
252
- remove_from_begin (ils->codes[i],
253
- amount_to_remove * ils->code_size);
235
+ remove_from_begin(ils->ids[i], amount_to_remove);
236
+ remove_from_begin(ils->codes[i], amount_to_remove * ils->code_size);
254
237
  for (int j = 0; j + 1 < n_slice; j++) {
255
238
  sizes[i][j] = sizes[i][j + 1] - amount_to_remove;
256
239
  }
257
- sizes[i].pop_back ();
240
+ sizes[i].pop_back();
258
241
  }
259
242
  n_slice--;
260
243
  } else {
261
- FAISS_THROW_MSG ("nothing to do???");
244
+ FAISS_THROW_MSG("nothing to do???");
262
245
  }
263
246
  index->ntotal = index_ivf->ntotal;
264
247
  }
265
248
 
266
-
267
-
268
249
  // Get a subset of inverted lists [i0, i1). Works on IndexIVF's and
269
250
  // IndexIVF's embedded in a IndexPreTransform
270
251
 
271
- ArrayInvertedLists *
272
- get_invlist_range (const Index *index, long i0, long i1)
273
- {
274
- const IndexIVF *ivf = extract_index_ivf (index);
252
+ ArrayInvertedLists* get_invlist_range(const Index* index, long i0, long i1) {
253
+ const IndexIVF* ivf = extract_index_ivf(index);
275
254
 
276
- FAISS_THROW_IF_NOT (0 <= i0 && i0 <= i1 && i1 <= ivf->nlist);
255
+ FAISS_THROW_IF_NOT(0 <= i0 && i0 <= i1 && i1 <= ivf->nlist);
277
256
 
278
- const InvertedLists *src = ivf->invlists;
257
+ const InvertedLists* src = ivf->invlists;
279
258
 
280
- ArrayInvertedLists * il = new ArrayInvertedLists(i1 - i0, src->code_size);
259
+ ArrayInvertedLists* il = new ArrayInvertedLists(i1 - i0, src->code_size);
281
260
 
282
261
  for (long i = i0; i < i1; i++) {
283
- il->add_entries(i - i0, src->list_size(i),
284
- InvertedLists::ScopedIds (src, i).get(),
285
- InvertedLists::ScopedCodes (src, i).get());
262
+ il->add_entries(
263
+ i - i0,
264
+ src->list_size(i),
265
+ InvertedLists::ScopedIds(src, i).get(),
266
+ InvertedLists::ScopedCodes(src, i).get());
286
267
  }
287
268
  return il;
288
269
  }
289
270
 
271
+ void set_invlist_range(
272
+ Index* index,
273
+ long i0,
274
+ long i1,
275
+ ArrayInvertedLists* src) {
276
+ IndexIVF* ivf = extract_index_ivf(index);
290
277
 
278
+ FAISS_THROW_IF_NOT(0 <= i0 && i0 <= i1 && i1 <= ivf->nlist);
291
279
 
292
- void set_invlist_range (Index *index, long i0, long i1,
293
- ArrayInvertedLists * src)
294
- {
295
- IndexIVF *ivf = extract_index_ivf (index);
296
-
297
- FAISS_THROW_IF_NOT (0 <= i0 && i0 <= i1 && i1 <= ivf->nlist);
298
-
299
- ArrayInvertedLists *dst = dynamic_cast<ArrayInvertedLists *>(ivf->invlists);
300
- FAISS_THROW_IF_NOT_MSG (dst, "only ArrayInvertedLists supported");
301
- FAISS_THROW_IF_NOT (src->nlist == i1 - i0 &&
302
- dst->code_size == src->code_size);
280
+ ArrayInvertedLists* dst = dynamic_cast<ArrayInvertedLists*>(ivf->invlists);
281
+ FAISS_THROW_IF_NOT_MSG(dst, "only ArrayInvertedLists supported");
282
+ FAISS_THROW_IF_NOT(
283
+ src->nlist == i1 - i0 && dst->code_size == src->code_size);
303
284
 
304
285
  size_t ntotal = index->ntotal;
305
- for (long i = i0 ; i < i1; i++) {
306
- ntotal -= dst->list_size (i);
307
- ntotal += src->list_size (i - i0);
308
- std::swap (src->codes[i - i0], dst->codes[i]);
309
- std::swap (src->ids[i - i0], dst->ids[i]);
286
+ for (long i = i0; i < i1; i++) {
287
+ ntotal -= dst->list_size(i);
288
+ ntotal += src->list_size(i - i0);
289
+ std::swap(src->codes[i - i0], dst->codes[i]);
290
+ std::swap(src->ids[i - i0], dst->ids[i]);
310
291
  }
311
292
  ivf->ntotal = index->ntotal = ntotal;
312
293
  }
313
294
 
314
- static size_t count_ndis(const IndexIVF * index_ivf, size_t n_list_scan,
315
- const idx_t *Iq)
316
- {
295
+ static size_t count_ndis(
296
+ const IndexIVF* index_ivf,
297
+ size_t n_list_scan,
298
+ const idx_t* Iq) {
317
299
  size_t nb_dis = 0;
318
- const InvertedLists *il = index_ivf->invlists;
300
+ const InvertedLists* il = index_ivf->invlists;
319
301
  for (idx_t i = 0; i < n_list_scan; i++) {
320
302
  if (Iq[i] >= 0) {
321
303
  nb_dis += il->list_size(Iq[i]);
@@ -324,23 +306,24 @@ static size_t count_ndis(const IndexIVF * index_ivf, size_t n_list_scan,
324
306
  return nb_dis;
325
307
  }
326
308
 
327
-
328
-
329
- void search_with_parameters (const Index *index,
330
- idx_t n, const float *x, idx_t k,
331
- float *distances, idx_t *labels,
332
- const IVFSearchParameters *params,
333
- size_t *nb_dis_ptr,
334
- double *ms_per_stage)
335
- {
336
- FAISS_THROW_IF_NOT (params);
337
- const float *prev_x = x;
309
+ void search_with_parameters(
310
+ const Index* index,
311
+ idx_t n,
312
+ const float* x,
313
+ idx_t k,
314
+ float* distances,
315
+ idx_t* labels,
316
+ const IVFSearchParameters* params,
317
+ size_t* nb_dis_ptr,
318
+ double* ms_per_stage) {
319
+ FAISS_THROW_IF_NOT(params);
320
+ const float* prev_x = x;
338
321
  ScopeDeleter<float> del;
339
322
 
340
323
  double t0 = getmillisecs();
341
324
 
342
- if (auto ip = dynamic_cast<const IndexPreTransform *> (index)) {
343
- x = ip->apply_chain (n, x);
325
+ if (auto ip = dynamic_cast<const IndexPreTransform*>(index)) {
326
+ x = ip->apply_chain(n, x);
344
327
  if (x != prev_x) {
345
328
  del.set(x);
346
329
  }
@@ -352,21 +335,19 @@ void search_with_parameters (const Index *index,
352
335
  std::vector<idx_t> Iq(params->nprobe * n);
353
336
  std::vector<float> Dq(params->nprobe * n);
354
337
 
355
- const IndexIVF *index_ivf = dynamic_cast<const IndexIVF *>(index);
356
- FAISS_THROW_IF_NOT (index_ivf);
338
+ const IndexIVF* index_ivf = dynamic_cast<const IndexIVF*>(index);
339
+ FAISS_THROW_IF_NOT(index_ivf);
357
340
 
358
- index_ivf->quantizer->search(n, x, params->nprobe,
359
- Dq.data(), Iq.data());
341
+ index_ivf->quantizer->search(n, x, params->nprobe, Dq.data(), Iq.data());
360
342
 
361
343
  if (nb_dis_ptr) {
362
- *nb_dis_ptr = count_ndis (index_ivf, n * params->nprobe, Iq.data());
344
+ *nb_dis_ptr = count_ndis(index_ivf, n * params->nprobe, Iq.data());
363
345
  }
364
346
 
365
347
  double t2 = getmillisecs();
366
348
 
367
- index_ivf->search_preassigned(n, x, k, Iq.data(), Dq.data(),
368
- distances, labels,
369
- false, params);
349
+ index_ivf->search_preassigned(
350
+ n, x, k, Iq.data(), Dq.data(), distances, labels, false, params);
370
351
  double t3 = getmillisecs();
371
352
  if (ms_per_stage) {
372
353
  ms_per_stage[0] = t1 - t0;
@@ -375,21 +356,23 @@ void search_with_parameters (const Index *index,
375
356
  }
376
357
  }
377
358
 
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;
359
+ void range_search_with_parameters(
360
+ const Index* index,
361
+ idx_t n,
362
+ const float* x,
363
+ float radius,
364
+ RangeSearchResult* result,
365
+ const IVFSearchParameters* params,
366
+ size_t* nb_dis_ptr,
367
+ double* ms_per_stage) {
368
+ FAISS_THROW_IF_NOT(params);
369
+ const float* prev_x = x;
387
370
  ScopeDeleter<float> del;
388
371
 
389
372
  double t0 = getmillisecs();
390
373
 
391
- if (auto ip = dynamic_cast<const IndexPreTransform *> (index)) {
392
- x = ip->apply_chain (n, x);
374
+ if (auto ip = dynamic_cast<const IndexPreTransform*>(index)) {
375
+ x = ip->apply_chain(n, x);
393
376
  if (x != prev_x) {
394
377
  del.set(x);
395
378
  }
@@ -401,22 +384,19 @@ void range_search_with_parameters (const Index *index,
401
384
  std::vector<idx_t> Iq(params->nprobe * n);
402
385
  std::vector<float> Dq(params->nprobe * n);
403
386
 
404
- const IndexIVF *index_ivf = dynamic_cast<const IndexIVF *>(index);
405
- FAISS_THROW_IF_NOT (index_ivf);
387
+ const IndexIVF* index_ivf = dynamic_cast<const IndexIVF*>(index);
388
+ FAISS_THROW_IF_NOT(index_ivf);
406
389
 
407
- index_ivf->quantizer->search(n, x, params->nprobe,
408
- Dq.data(), Iq.data());
390
+ index_ivf->quantizer->search(n, x, params->nprobe, Dq.data(), Iq.data());
409
391
 
410
392
  if (nb_dis_ptr) {
411
- *nb_dis_ptr = count_ndis (index_ivf, n * params->nprobe, Iq.data());
393
+ *nb_dis_ptr = count_ndis(index_ivf, n * params->nprobe, Iq.data());
412
394
  }
413
395
 
414
396
  double t2 = getmillisecs();
415
397
 
416
398
  index_ivf->range_search_preassigned(
417
- n, x, radius, Iq.data(), Dq.data(),
418
- result, false, params
419
- );
399
+ n, x, radius, Iq.data(), Dq.data(), result, false, params);
420
400
 
421
401
  double t3 = getmillisecs();
422
402
  if (ms_per_stage) {
@@ -426,9 +406,5 @@ void range_search_with_parameters (const Index *index,
426
406
  }
427
407
  }
428
408
 
429
-
430
-
431
-
432
-
433
-
434
- } } // namespace faiss::ivflib
409
+ } // namespace ivflib
410
+ } // namespace faiss