faiss 0.6.1 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +3 -1
- data/vendor/faiss/faiss/Clustering.cpp +9 -1
- data/vendor/faiss/faiss/IVFlib.cpp +14 -3
- data/vendor/faiss/faiss/Index.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +9 -10
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +1 -2
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +10 -12
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +5 -9
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +5 -7
- data/vendor/faiss/faiss/IndexEDEN.cpp +273 -0
- data/vendor/faiss/faiss/IndexEDEN.h +57 -0
- data/vendor/faiss/faiss/IndexFastScan.cpp +15 -4
- data/vendor/faiss/faiss/IndexFlat.cpp +13 -50
- data/vendor/faiss/faiss/IndexHNSW.cpp +177 -148
- data/vendor/faiss/faiss/IndexIDMap.cpp +16 -3
- data/vendor/faiss/faiss/IndexIDMap.h +2 -0
- data/vendor/faiss/faiss/IndexIVF.cpp +19 -8
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -4
- data/vendor/faiss/faiss/IndexIVFEDEN.cpp +302 -0
- data/vendor/faiss/faiss/IndexIVFEDEN.h +70 -0
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +5 -6
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +6 -5
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +3 -3
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +1 -1
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +42 -25
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +0 -1
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +23 -62
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +180 -76
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +5 -4
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +8 -6
- data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
- data/vendor/faiss/faiss/IndexLattice.cpp +5 -0
- data/vendor/faiss/faiss/IndexNNDescent.cpp +10 -3
- data/vendor/faiss/faiss/IndexNSG.cpp +8 -4
- data/vendor/faiss/faiss/IndexPQ.cpp +6 -8
- data/vendor/faiss/faiss/IndexPreTransform.cpp +15 -0
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +2 -2
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +1 -2
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +5 -1
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -1
- data/vendor/faiss/faiss/IndexReplicas.cpp +1 -2
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +68 -6
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
- data/vendor/faiss/faiss/IndexShards.cpp +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
- data/vendor/faiss/faiss/MetaIndexes.cpp +2 -4
- data/vendor/faiss/faiss/SuperKMeans.cpp +256 -240
- data/vendor/faiss/faiss/SuperKMeans.h +30 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +33 -2
- data/vendor/faiss/faiss/clone_index.cpp +5 -0
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
- data/vendor/faiss/faiss/factory_tools.cpp +51 -4
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +11 -11
- data/vendor/faiss/faiss/gpu/GpuIndex.h +34 -11
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +47 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +17 -0
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +16 -0
- data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +11 -12
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +3 -3
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +180 -0
- data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +7 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +177 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFPQ.h +88 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +48 -3
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h +193 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFPQ.h +134 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +2 -2
- data/vendor/faiss/faiss/impl/DistanceComputer.h +34 -0
- data/vendor/faiss/faiss/impl/EDENQuantizer.h +119 -0
- data/vendor/faiss/faiss/impl/HNSW.cpp +658 -344
- data/vendor/faiss/faiss/impl/HNSW.h +51 -13
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +18 -12
- data/vendor/faiss/faiss/impl/Panorama.h +20 -7
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +152 -84
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +59 -24
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +45 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +35 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +175 -68
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +19 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +2 -11
- data/vendor/faiss/faiss/impl/ResultHandler.h +26 -31
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +522 -58
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +70 -0
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +33 -13
- data/vendor/faiss/faiss/impl/VisitedTable.h +88 -33
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +1 -1
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +4 -4
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +38 -3
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +1 -1
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +35 -43
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -15
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +86 -40
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +81 -50
- data/vendor/faiss/faiss/impl/index_read.cpp +476 -75
- data/vendor/faiss/faiss/impl/index_write.cpp +56 -4
- data/vendor/faiss/faiss/impl/io_macros.h +25 -0
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +8 -9
- data/vendor/faiss/faiss/impl/platform_macros.h +15 -9
- data/vendor/faiss/faiss/impl/polysemous_training/avx512.cpp +284 -0
- data/vendor/faiss/faiss/impl/polysemous_training/dispatch.h +115 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +0 -1
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +26 -15
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +6 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +2 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +2 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +20 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +36 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +2 -0
- data/vendor/faiss/faiss/impl/result_handler/ResultHandler.cpp +195 -0
- data/vendor/faiss/faiss/impl/result_handler/avx2.cpp +133 -0
- data/vendor/faiss/faiss/impl/result_handler/avx512.cpp +281 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx2.cpp +72 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer-avx512.cpp +228 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/EDENQuantizer.cpp +882 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +6 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +336 -26
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +331 -32
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +558 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +284 -45
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +502 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +157 -32
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +86 -8
- data/vendor/faiss/faiss/index_factory.cpp +37 -7
- data/vendor/faiss/faiss/index_io.h +16 -0
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +5 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +15 -15
- data/vendor/faiss/faiss/invlists/InvertedLists.h +2 -2
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +19 -4
- data/vendor/faiss/faiss/python/python_callbacks.cpp +3 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +60 -0
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +26 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +13 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +150 -23
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +30 -7
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +65 -25
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +3 -2
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +1 -1
- data/vendor/faiss/faiss/utils/bf16.h +34 -0
- data/vendor/faiss/faiss/utils/distances.cpp +14 -2
- data/vendor/faiss/faiss/utils/distances_simd.cpp +4 -4
- data/vendor/faiss/faiss/utils/extra_distances.cpp +4 -14
- data/vendor/faiss/faiss/utils/extra_distances.h +1 -2
- data/vendor/faiss/faiss/utils/hamming.cpp +9 -9
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +2 -1
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +6 -30
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +0 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +29 -8
- data/vendor/faiss/faiss/utils/rabitq_simd.h +202 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +0 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +263 -15
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +160 -18
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +14 -68
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +245 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +273 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +435 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +11 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +143 -6
- data/vendor/faiss/faiss/utils/simd_levels.cpp +56 -2
- data/vendor/faiss/faiss/utils/simd_levels.h +14 -0
- data/vendor/faiss/faiss/utils/utils.cpp +9 -27
- metadata +27 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <faiss/IndexFlatCodes.h>
|
|
11
|
+
#include <faiss/impl/EDENQuantizer.h>
|
|
12
|
+
|
|
13
|
+
namespace faiss {
|
|
14
|
+
|
|
15
|
+
struct IndexEDEN : IndexFlatCodes {
|
|
16
|
+
ScalarQuantizer sq;
|
|
17
|
+
EDENScaleType scale_type = EDENScaleType_UNBIASED;
|
|
18
|
+
|
|
19
|
+
// Center of all training points. Random rotation, if desired, is expected
|
|
20
|
+
// to be supplied externally via IndexPreTransform.
|
|
21
|
+
std::vector<float> center;
|
|
22
|
+
|
|
23
|
+
IndexEDEN();
|
|
24
|
+
|
|
25
|
+
// Factory strings: EDEN, EDEN<n>, EDENBIASED, EDEN<n>BIASED.
|
|
26
|
+
// <n> is the Lloyd-Max bit budget, 1..8. The default is EDEN's original
|
|
27
|
+
// unbiased scale; the BIASED suffix selects the MSE-minimizing scale.
|
|
28
|
+
explicit IndexEDEN(
|
|
29
|
+
idx_t d,
|
|
30
|
+
MetricType metric = METRIC_L2,
|
|
31
|
+
uint8_t nb_bits = 1,
|
|
32
|
+
EDENScaleType scale_type = EDENScaleType_UNBIASED);
|
|
33
|
+
|
|
34
|
+
void train(idx_t n, const float* x) override;
|
|
35
|
+
|
|
36
|
+
void sa_encode(idx_t n, const float* x, uint8_t* bytes) const override;
|
|
37
|
+
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
38
|
+
|
|
39
|
+
FlatCodesDistanceComputer* get_FlatCodesDistanceComputer() const override;
|
|
40
|
+
|
|
41
|
+
void search(
|
|
42
|
+
idx_t n,
|
|
43
|
+
const float* x,
|
|
44
|
+
idx_t k,
|
|
45
|
+
float* distances,
|
|
46
|
+
idx_t* labels,
|
|
47
|
+
const SearchParameters* params = nullptr) const override;
|
|
48
|
+
|
|
49
|
+
void range_search(
|
|
50
|
+
idx_t n,
|
|
51
|
+
const float* x,
|
|
52
|
+
float radius,
|
|
53
|
+
RangeSearchResult* result,
|
|
54
|
+
const SearchParameters* params = nullptr) const override;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
} // namespace faiss
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include <faiss/IndexFastScan.h>
|
|
9
9
|
|
|
10
10
|
#include <omp.h>
|
|
11
|
+
#include <algorithm>
|
|
11
12
|
#include <cstring>
|
|
12
13
|
#include <memory>
|
|
13
14
|
|
|
@@ -266,8 +267,7 @@ void IndexFastScan::search(
|
|
|
266
267
|
float* distances,
|
|
267
268
|
idx_t* labels,
|
|
268
269
|
const SearchParameters* params) const {
|
|
269
|
-
|
|
270
|
-
!params, "search params not supported for this index");
|
|
270
|
+
FAISS_THROW_IF_MSG(params, "search params not supported for this index");
|
|
271
271
|
FAISS_THROW_IF_NOT(k > 0);
|
|
272
272
|
|
|
273
273
|
FastScanDistancePostProcessing empty_context{};
|
|
@@ -316,7 +316,7 @@ void IndexFastScan::search_dispatch_implem(
|
|
|
316
316
|
if (implem == 1) {
|
|
317
317
|
FAISS_THROW_MSG("not implemented");
|
|
318
318
|
} else if (implem == 2 || implem == 3 || implem == 4) {
|
|
319
|
-
FAISS_THROW_IF_NOT(orig_codes
|
|
319
|
+
FAISS_THROW_IF_NOT(orig_codes);
|
|
320
320
|
search_implem_234<Cfloat>(n, x, k, distances, labels, context);
|
|
321
321
|
} else if (impl >= 12 && impl <= 15) {
|
|
322
322
|
FAISS_THROW_IF_NOT(ntotal < INT_MAX);
|
|
@@ -617,8 +617,19 @@ template void IndexFastScan::search_dispatch_implem<false>(
|
|
|
617
617
|
const FastScanDistancePostProcessing& context) const;
|
|
618
618
|
|
|
619
619
|
void IndexFastScan::reconstruct(idx_t key, float* recons) const {
|
|
620
|
-
|
|
620
|
+
FAISS_THROW_IF_NOT_FMT(
|
|
621
|
+
key >= 0 && key < ntotal,
|
|
622
|
+
"IndexFastScan::reconstruct: key %zd out of range (ntotal=%zd)",
|
|
623
|
+
(size_t)key,
|
|
624
|
+
(size_t)ntotal);
|
|
621
625
|
std::unique_ptr<CodePacker> packer(get_CodePacker());
|
|
626
|
+
size_t block_no = (size_t)key / packer->nvec;
|
|
627
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
628
|
+
mul_no_overflow(
|
|
629
|
+
block_no + 1, packer->block_size, "IndexFastScan codes") <=
|
|
630
|
+
codes.size(),
|
|
631
|
+
"IndexFastScan::reconstruct: packed codes buffer too small");
|
|
632
|
+
std::vector<uint8_t> code(std::max(code_size, packer->code_size), 0);
|
|
622
633
|
packer->unpack_1(codes.data(), key, code.data());
|
|
623
634
|
sa_decode(1, code.data(), recons);
|
|
624
635
|
}
|
|
@@ -77,7 +77,8 @@ void IndexFlat::range_search(
|
|
|
77
77
|
range_search_L2sqr(x, get_xb(), d, n, ntotal, radius, result, sel);
|
|
78
78
|
break;
|
|
79
79
|
default:
|
|
80
|
-
|
|
80
|
+
IndexFlatCodes::range_search(n, x, radius, result, params);
|
|
81
|
+
break;
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
|
|
@@ -105,13 +106,8 @@ namespace {
|
|
|
105
106
|
template <SIMDLevel SL>
|
|
106
107
|
struct FlatL2Dis : FlatCodesDistanceComputer {
|
|
107
108
|
size_t d;
|
|
108
|
-
idx_t nb;
|
|
109
|
-
const float* b;
|
|
110
|
-
size_t ndis;
|
|
111
|
-
size_t npartial_dot_products;
|
|
112
109
|
|
|
113
110
|
float distance_to_code(const uint8_t* code) final {
|
|
114
|
-
ndis++;
|
|
115
111
|
return fvec_L2sqr<SL>(q, (float*)code, d);
|
|
116
112
|
}
|
|
117
113
|
|
|
@@ -119,25 +115,21 @@ struct FlatL2Dis : FlatCodesDistanceComputer {
|
|
|
119
115
|
const idx_t i,
|
|
120
116
|
const uint32_t offset,
|
|
121
117
|
const uint32_t num_components) final override {
|
|
122
|
-
|
|
118
|
+
const float* b = (const float*)this->codes;
|
|
123
119
|
return fvec_inner_product<SL>(
|
|
124
120
|
q + offset, b + i * d + offset, num_components);
|
|
125
121
|
}
|
|
126
122
|
|
|
127
123
|
float symmetric_dis(idx_t i, idx_t j) override {
|
|
124
|
+
const float* b = (const float*)this->codes;
|
|
128
125
|
return fvec_L2sqr<SL>(b + j * d, b + i * d, d);
|
|
129
126
|
}
|
|
130
127
|
|
|
131
|
-
explicit FlatL2Dis(const IndexFlat& storage
|
|
128
|
+
explicit FlatL2Dis(const IndexFlat& storage)
|
|
132
129
|
: FlatCodesDistanceComputer(
|
|
133
130
|
storage.codes.data(),
|
|
134
|
-
storage.code_size,
|
|
135
|
-
|
|
136
|
-
d(storage.d),
|
|
137
|
-
nb(storage.ntotal),
|
|
138
|
-
b(storage.get_xb()),
|
|
139
|
-
ndis(0),
|
|
140
|
-
npartial_dot_products(0) {}
|
|
131
|
+
storage.code_size),
|
|
132
|
+
d(storage.d) {}
|
|
141
133
|
|
|
142
134
|
void set_query(const float* x) override {
|
|
143
135
|
q = x;
|
|
@@ -153,8 +145,6 @@ struct FlatL2Dis : FlatCodesDistanceComputer {
|
|
|
153
145
|
float& dis1,
|
|
154
146
|
float& dis2,
|
|
155
147
|
float& dis3) final override {
|
|
156
|
-
ndis += 4;
|
|
157
|
-
|
|
158
148
|
// compute first, assign next
|
|
159
149
|
const float* __restrict y0 =
|
|
160
150
|
reinterpret_cast<const float*>(codes + idx0 * code_size);
|
|
@@ -187,8 +177,6 @@ struct FlatL2Dis : FlatCodesDistanceComputer {
|
|
|
187
177
|
float& dp3,
|
|
188
178
|
const uint32_t offset,
|
|
189
179
|
const uint32_t num_components) final override {
|
|
190
|
-
npartial_dot_products += 4;
|
|
191
|
-
|
|
192
180
|
// compute first, assign next
|
|
193
181
|
const float* __restrict y0 =
|
|
194
182
|
reinterpret_cast<const float*>(codes + idx0 * code_size);
|
|
@@ -224,29 +212,21 @@ struct FlatL2Dis : FlatCodesDistanceComputer {
|
|
|
224
212
|
template <SIMDLevel SL>
|
|
225
213
|
struct FlatIPDis : FlatCodesDistanceComputer {
|
|
226
214
|
size_t d;
|
|
227
|
-
idx_t nb;
|
|
228
|
-
const float* q;
|
|
229
|
-
const float* b;
|
|
230
|
-
size_t ndis;
|
|
231
215
|
|
|
232
216
|
float symmetric_dis(idx_t i, idx_t j) final override {
|
|
217
|
+
const float* b = (const float*)this->codes;
|
|
233
218
|
return fvec_inner_product<SL>(b + j * d, b + i * d, d);
|
|
234
219
|
}
|
|
235
220
|
|
|
236
221
|
float distance_to_code(const uint8_t* code) final override {
|
|
237
|
-
ndis++;
|
|
238
222
|
return fvec_inner_product<SL>(q, (const float*)code, d);
|
|
239
223
|
}
|
|
240
224
|
|
|
241
|
-
explicit FlatIPDis(const IndexFlat& storage
|
|
225
|
+
explicit FlatIPDis(const IndexFlat& storage)
|
|
242
226
|
: FlatCodesDistanceComputer(
|
|
243
227
|
storage.codes.data(),
|
|
244
228
|
storage.code_size),
|
|
245
|
-
d(storage.d)
|
|
246
|
-
nb(storage.ntotal),
|
|
247
|
-
q(q_in),
|
|
248
|
-
b(storage.get_xb()),
|
|
249
|
-
ndis(0) {}
|
|
229
|
+
d(storage.d) {}
|
|
250
230
|
|
|
251
231
|
void set_query(const float* x) override {
|
|
252
232
|
q = x;
|
|
@@ -262,8 +242,6 @@ struct FlatIPDis : FlatCodesDistanceComputer {
|
|
|
262
242
|
float& dis1,
|
|
263
243
|
float& dis2,
|
|
264
244
|
float& dis3) final override {
|
|
265
|
-
ndis += 4;
|
|
266
|
-
|
|
267
245
|
// compute first, assign next
|
|
268
246
|
const float* __restrict y0 =
|
|
269
247
|
reinterpret_cast<const float*>(codes + idx0 * code_size);
|
|
@@ -296,8 +274,7 @@ FlatCodesDistanceComputer* IndexFlat::get_FlatCodesDistanceComputer() const {
|
|
|
296
274
|
} else if (metric_type == METRIC_INNER_PRODUCT) {
|
|
297
275
|
with_simd_level([&]<SIMDLevel SL>() { dc = new FlatIPDis<SL>(*this); });
|
|
298
276
|
} else {
|
|
299
|
-
dc = get_extra_distance_computer(
|
|
300
|
-
d, metric_type, metric_arg, ntotal, get_xb());
|
|
277
|
+
dc = get_extra_distance_computer(d, metric_type, metric_arg, get_xb());
|
|
301
278
|
}
|
|
302
279
|
return dc;
|
|
303
280
|
}
|
|
@@ -327,16 +304,11 @@ namespace {
|
|
|
327
304
|
template <SIMDLevel SL>
|
|
328
305
|
struct FlatL2WithNormsDis : FlatCodesDistanceComputer {
|
|
329
306
|
size_t d;
|
|
330
|
-
idx_t nb;
|
|
331
|
-
const float* q;
|
|
332
|
-
const float* b;
|
|
333
|
-
size_t ndis;
|
|
334
307
|
|
|
335
308
|
const float* l2norms;
|
|
336
309
|
float query_l2norm;
|
|
337
310
|
|
|
338
311
|
float distance_to_code(const uint8_t* code) final override {
|
|
339
|
-
ndis++;
|
|
340
312
|
return fvec_L2sqr<SL>(q, (float*)code, d);
|
|
341
313
|
}
|
|
342
314
|
|
|
@@ -361,17 +333,11 @@ struct FlatL2WithNormsDis : FlatCodesDistanceComputer {
|
|
|
361
333
|
return l2norms[i] + l2norms[j] - 2 * dp0;
|
|
362
334
|
}
|
|
363
335
|
|
|
364
|
-
explicit FlatL2WithNormsDis(
|
|
365
|
-
const IndexFlatL2& storage,
|
|
366
|
-
const float* q_in = nullptr)
|
|
336
|
+
explicit FlatL2WithNormsDis(const IndexFlatL2& storage)
|
|
367
337
|
: FlatCodesDistanceComputer(
|
|
368
338
|
storage.codes.data(),
|
|
369
339
|
storage.code_size),
|
|
370
340
|
d(storage.d),
|
|
371
|
-
nb(storage.ntotal),
|
|
372
|
-
q(q_in),
|
|
373
|
-
b(storage.get_xb()),
|
|
374
|
-
ndis(0),
|
|
375
341
|
l2norms(storage.cached_l2norms.data()),
|
|
376
342
|
query_l2norm(0) {}
|
|
377
343
|
|
|
@@ -390,8 +356,6 @@ struct FlatL2WithNormsDis : FlatCodesDistanceComputer {
|
|
|
390
356
|
float& dis1,
|
|
391
357
|
float& dis2,
|
|
392
358
|
float& dis3) final override {
|
|
393
|
-
ndis += 4;
|
|
394
|
-
|
|
395
359
|
// compute first, assign next
|
|
396
360
|
const float* __restrict y0 =
|
|
397
361
|
reinterpret_cast<const float*>(codes + idx0 * code_size);
|
|
@@ -487,8 +451,7 @@ void IndexFlat1D::search(
|
|
|
487
451
|
float* distances,
|
|
488
452
|
idx_t* labels,
|
|
489
453
|
const SearchParameters* params) const {
|
|
490
|
-
|
|
491
|
-
!params, "search params not supported for this index");
|
|
454
|
+
FAISS_THROW_IF_MSG(params, "search params not supported for this index");
|
|
492
455
|
FAISS_THROW_IF_NOT(k > 0);
|
|
493
456
|
FAISS_THROW_IF_NOT_MSG(
|
|
494
457
|
perm.size() == static_cast<size_t>(ntotal),
|