faiss 0.3.1 → 0.3.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/LICENSE.txt +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +2 -2
- data/vendor/faiss/faiss/AutoTune.h +3 -3
- data/vendor/faiss/faiss/Clustering.cpp +37 -6
- data/vendor/faiss/faiss/Clustering.h +12 -3
- data/vendor/faiss/faiss/IVFlib.cpp +6 -3
- data/vendor/faiss/faiss/IVFlib.h +2 -2
- data/vendor/faiss/faiss/Index.cpp +6 -2
- data/vendor/faiss/faiss/Index.h +30 -8
- data/vendor/faiss/faiss/Index2Layer.cpp +2 -2
- data/vendor/faiss/faiss/Index2Layer.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +7 -7
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +14 -16
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +2 -2
- data/vendor/faiss/faiss/IndexBinary.cpp +13 -2
- data/vendor/faiss/faiss/IndexBinary.h +8 -2
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryFlat.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +2 -2
- data/vendor/faiss/faiss/IndexBinaryFromFloat.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +2 -7
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +3 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +2 -3
- data/vendor/faiss/faiss/IndexBinaryHash.h +2 -2
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +3 -3
- data/vendor/faiss/faiss/IndexBinaryIVF.h +2 -2
- data/vendor/faiss/faiss/IndexFastScan.cpp +32 -18
- data/vendor/faiss/faiss/IndexFastScan.h +11 -2
- data/vendor/faiss/faiss/IndexFlat.cpp +13 -10
- data/vendor/faiss/faiss/IndexFlat.h +2 -2
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +170 -7
- data/vendor/faiss/faiss/IndexFlatCodes.h +25 -5
- data/vendor/faiss/faiss/IndexHNSW.cpp +156 -96
- data/vendor/faiss/faiss/IndexHNSW.h +54 -5
- data/vendor/faiss/faiss/IndexIDMap.cpp +19 -3
- data/vendor/faiss/faiss/IndexIDMap.h +5 -2
- data/vendor/faiss/faiss/IndexIVF.cpp +5 -6
- data/vendor/faiss/faiss/IndexIVF.h +13 -4
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +21 -7
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +5 -2
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +3 -14
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +2 -4
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +201 -91
- data/vendor/faiss/faiss/IndexIVFFastScan.h +33 -9
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFFlat.h +2 -2
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +3 -6
- data/vendor/faiss/faiss/IndexIVFPQ.h +2 -2
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +7 -14
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +2 -4
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +2 -2
- data/vendor/faiss/faiss/IndexIVFPQR.h +2 -2
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +2 -3
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +2 -2
- data/vendor/faiss/faiss/IndexLSH.cpp +2 -3
- data/vendor/faiss/faiss/IndexLSH.h +2 -2
- data/vendor/faiss/faiss/IndexLattice.cpp +3 -21
- data/vendor/faiss/faiss/IndexLattice.h +5 -24
- data/vendor/faiss/faiss/IndexNNDescent.cpp +2 -31
- data/vendor/faiss/faiss/IndexNNDescent.h +3 -3
- data/vendor/faiss/faiss/IndexNSG.cpp +2 -5
- data/vendor/faiss/faiss/IndexNSG.h +3 -3
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +56 -0
- data/vendor/faiss/faiss/IndexNeuralNetCodec.h +49 -0
- data/vendor/faiss/faiss/IndexPQ.cpp +26 -26
- data/vendor/faiss/faiss/IndexPQ.h +2 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +2 -5
- data/vendor/faiss/faiss/IndexPQFastScan.h +2 -11
- data/vendor/faiss/faiss/IndexPreTransform.cpp +2 -2
- data/vendor/faiss/faiss/IndexPreTransform.h +3 -3
- data/vendor/faiss/faiss/IndexRefine.cpp +46 -9
- data/vendor/faiss/faiss/IndexRefine.h +9 -2
- data/vendor/faiss/faiss/IndexReplicas.cpp +2 -2
- data/vendor/faiss/faiss/IndexReplicas.h +2 -2
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +2 -2
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +2 -2
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +5 -4
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +2 -2
- data/vendor/faiss/faiss/IndexShards.cpp +2 -2
- data/vendor/faiss/faiss/IndexShards.h +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +2 -2
- data/vendor/faiss/faiss/IndexShardsIVF.h +2 -2
- data/vendor/faiss/faiss/MatrixStats.cpp +2 -2
- data/vendor/faiss/faiss/MatrixStats.h +2 -2
- data/vendor/faiss/faiss/MetaIndexes.cpp +2 -3
- data/vendor/faiss/faiss/MetaIndexes.h +2 -2
- data/vendor/faiss/faiss/MetricType.h +9 -4
- data/vendor/faiss/faiss/VectorTransform.cpp +2 -2
- data/vendor/faiss/faiss/VectorTransform.h +2 -2
- data/vendor/faiss/faiss/clone_index.cpp +2 -2
- data/vendor/faiss/faiss/clone_index.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/detail/CoarseBitType.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/detail/UintReader.h +97 -19
- data/vendor/faiss/faiss/cppcontrib/factory_tools.cpp +192 -0
- data/vendor/faiss/faiss/cppcontrib/factory_tools.h +29 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +85 -32
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMax-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/MinMaxFP16-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +2 -2
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +2 -5
- data/vendor/faiss/faiss/gpu/GpuAutoTune.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +45 -13
- data/vendor/faiss/faiss/gpu/GpuCloner.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +12 -6
- data/vendor/faiss/faiss/gpu/GpuDistance.h +11 -7
- data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +3 -3
- data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndex.h +10 -15
- data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +285 -0
- data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +8 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +4 -2
- data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +3 -3
- data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +2 -2
- data/vendor/faiss/faiss/gpu/GpuResources.cpp +7 -2
- data/vendor/faiss/faiss/gpu/GpuResources.h +11 -4
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +66 -11
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +15 -5
- data/vendor/faiss/faiss/gpu/impl/IndexUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +28 -23
- data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +2 -2
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +2 -2
- data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +2 -2
- data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +8 -2
- data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +2 -3
- data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +10 -7
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +54 -54
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +144 -77
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +51 -51
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +2 -2
- data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +3 -3
- data/vendor/faiss/faiss/gpu/test/TestGpuResidualQuantizer.cpp +70 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +74 -4
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +3 -3
- data/vendor/faiss/faiss/gpu/utils/{RaftUtils.h → CuvsUtils.h} +12 -11
- data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +8 -2
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +2 -2
- data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +2 -2
- data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +2 -2
- data/vendor/faiss/faiss/gpu/utils/Timer.cpp +6 -3
- data/vendor/faiss/faiss/gpu/utils/Timer.h +3 -3
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +79 -11
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +17 -5
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +27 -2
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +11 -3
- data/vendor/faiss/faiss/impl/CodePacker.cpp +2 -2
- data/vendor/faiss/faiss/impl/CodePacker.h +2 -2
- data/vendor/faiss/faiss/impl/DistanceComputer.h +48 -2
- data/vendor/faiss/faiss/impl/FaissAssert.h +6 -4
- data/vendor/faiss/faiss/impl/FaissException.cpp +2 -2
- data/vendor/faiss/faiss/impl/FaissException.h +2 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +378 -205
- data/vendor/faiss/faiss/impl/HNSW.h +55 -24
- data/vendor/faiss/faiss/impl/IDSelector.cpp +2 -2
- data/vendor/faiss/faiss/impl/IDSelector.h +2 -2
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +10 -10
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/LookupTableScaler.h +36 -2
- data/vendor/faiss/faiss/impl/NNDescent.cpp +15 -10
- data/vendor/faiss/faiss/impl/NNDescent.h +2 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +26 -49
- data/vendor/faiss/faiss/impl/NSG.h +20 -8
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +2 -2
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +2 -2
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +2 -4
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +2 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +2 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +3 -2
- data/vendor/faiss/faiss/impl/ProductQuantizer.h +7 -3
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +2 -36
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +3 -13
- data/vendor/faiss/faiss/impl/ResultHandler.h +153 -34
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +721 -104
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +5 -2
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +2 -2
- data/vendor/faiss/faiss/impl/ThreadedIndex.h +2 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +7 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-avx512.h +248 -0
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +2 -2
- data/vendor/faiss/faiss/impl/code_distance/code_distance-sve.h +440 -0
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +55 -2
- data/vendor/faiss/faiss/impl/index_read.cpp +31 -20
- data/vendor/faiss/faiss/impl/index_read_utils.h +37 -0
- data/vendor/faiss/faiss/impl/index_write.cpp +30 -16
- data/vendor/faiss/faiss/impl/io.cpp +15 -7
- data/vendor/faiss/faiss/impl/io.h +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +8 -9
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +2 -3
- data/vendor/faiss/faiss/impl/kmeans1d.h +2 -2
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +2 -3
- data/vendor/faiss/faiss/impl/lattice_Zn.h +2 -2
- data/vendor/faiss/faiss/impl/platform_macros.h +34 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +13 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +20 -2
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +3 -3
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +450 -3
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +8 -8
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +3 -3
- data/vendor/faiss/faiss/impl/simd_result_handlers.h +151 -67
- data/vendor/faiss/faiss/index_factory.cpp +51 -34
- data/vendor/faiss/faiss/index_factory.h +2 -2
- data/vendor/faiss/faiss/index_io.h +14 -7
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +30 -10
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +5 -2
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +11 -3
- data/vendor/faiss/faiss/invlists/DirectMap.h +2 -2
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +57 -19
- data/vendor/faiss/faiss/invlists/InvertedLists.h +20 -11
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +2 -2
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +2 -2
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +23 -9
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +4 -3
- data/vendor/faiss/faiss/python/python_callbacks.cpp +5 -5
- data/vendor/faiss/faiss/python/python_callbacks.h +2 -2
- data/vendor/faiss/faiss/utils/AlignedTable.h +5 -3
- data/vendor/faiss/faiss/utils/Heap.cpp +2 -2
- data/vendor/faiss/faiss/utils/Heap.h +107 -2
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +346 -0
- data/vendor/faiss/faiss/utils/NeuralNet.h +147 -0
- data/vendor/faiss/faiss/utils/WorkerThread.cpp +2 -2
- data/vendor/faiss/faiss/utils/WorkerThread.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/generic.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +2 -2
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +2 -2
- data/vendor/faiss/faiss/utils/bf16.h +36 -0
- data/vendor/faiss/faiss/utils/distances.cpp +249 -90
- data/vendor/faiss/faiss/utils/distances.h +8 -8
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +2 -2
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +2 -2
- data/vendor/faiss/faiss/utils/distances_simd.cpp +1543 -56
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +72 -2
- data/vendor/faiss/faiss/utils/extra_distances.cpp +87 -140
- data/vendor/faiss/faiss/utils/extra_distances.h +5 -4
- data/vendor/faiss/faiss/utils/fp16-arm.h +2 -2
- data/vendor/faiss/faiss/utils/fp16-fp16c.h +2 -2
- data/vendor/faiss/faiss/utils/fp16-inl.h +2 -2
- data/vendor/faiss/faiss/utils/fp16.h +2 -2
- data/vendor/faiss/faiss/utils/hamming-inl.h +2 -2
- data/vendor/faiss/faiss/utils/hamming.cpp +3 -4
- data/vendor/faiss/faiss/utils/hamming.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +490 -0
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +2 -2
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +6 -3
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +7 -3
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +5 -5
- data/vendor/faiss/faiss/utils/ordered_key_value.h +2 -2
- data/vendor/faiss/faiss/utils/partitioning.cpp +2 -2
- data/vendor/faiss/faiss/utils/partitioning.h +2 -2
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.h +2 -2
- data/vendor/faiss/faiss/utils/random.cpp +45 -2
- data/vendor/faiss/faiss/utils/random.h +27 -2
- data/vendor/faiss/faiss/utils/simdlib.h +12 -3
- data/vendor/faiss/faiss/utils/simdlib_avx2.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +296 -0
- data/vendor/faiss/faiss/utils/simdlib_emulated.h +2 -2
- data/vendor/faiss/faiss/utils/simdlib_neon.h +7 -4
- data/vendor/faiss/faiss/utils/simdlib_ppc64.h +1084 -0
- data/vendor/faiss/faiss/utils/sorting.cpp +2 -2
- data/vendor/faiss/faiss/utils/sorting.h +2 -2
- data/vendor/faiss/faiss/utils/transpose/transpose-avx2-inl.h +2 -2
- data/vendor/faiss/faiss/utils/transpose/transpose-avx512-inl.h +176 -0
- data/vendor/faiss/faiss/utils/utils.cpp +17 -10
- data/vendor/faiss/faiss/utils/utils.h +7 -3
- metadata +22 -11
- data/vendor/faiss/faiss/impl/code_distance/code_distance_avx512.h +0 -102
@@ -0,0 +1,440 @@
|
|
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
|
+
#ifdef __ARM_FEATURE_SVE
|
11
|
+
|
12
|
+
#include <arm_sve.h>
|
13
|
+
|
14
|
+
#include <tuple>
|
15
|
+
#include <type_traits>
|
16
|
+
|
17
|
+
#include <faiss/impl/code_distance/code_distance-generic.h>
|
18
|
+
|
19
|
+
namespace faiss {
|
20
|
+
|
21
|
+
template <typename PQDecoderT>
|
22
|
+
std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
|
23
|
+
// the product quantizer
|
24
|
+
const size_t M,
|
25
|
+
// number of bits per quantization index
|
26
|
+
const size_t nbits,
|
27
|
+
// precomputed distances, layout (M, ksub)
|
28
|
+
const float* sim_table,
|
29
|
+
const uint8_t* code) {
|
30
|
+
// default implementation
|
31
|
+
return distance_single_code_generic<PQDecoderT>(M, nbits, sim_table, code);
|
32
|
+
}
|
33
|
+
|
34
|
+
static inline void distance_codes_kernel(
|
35
|
+
svbool_t pg,
|
36
|
+
svuint32_t idx1,
|
37
|
+
svuint32_t offsets_0,
|
38
|
+
const float* tab,
|
39
|
+
svfloat32_t& partialSum) {
|
40
|
+
// add offset
|
41
|
+
const auto indices_to_read_from = svadd_u32_x(pg, idx1, offsets_0);
|
42
|
+
|
43
|
+
// gather values, similar to some operations of tab[index]
|
44
|
+
const auto collected =
|
45
|
+
svld1_gather_u32index_f32(pg, tab, indices_to_read_from);
|
46
|
+
|
47
|
+
// collect partial sum
|
48
|
+
partialSum = svadd_f32_m(pg, partialSum, collected);
|
49
|
+
}
|
50
|
+
|
51
|
+
static float distance_single_code_sve_for_small_m(
|
52
|
+
// the product quantizer
|
53
|
+
const size_t M,
|
54
|
+
// precomputed distances, layout (M, ksub)
|
55
|
+
const float* sim_table,
|
56
|
+
// codes
|
57
|
+
const uint8_t* __restrict code) {
|
58
|
+
constexpr size_t nbits = 8u;
|
59
|
+
|
60
|
+
const size_t ksub = 1 << nbits;
|
61
|
+
|
62
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
63
|
+
|
64
|
+
// loop
|
65
|
+
const auto pg = svwhilelt_b32_u64(0, M);
|
66
|
+
|
67
|
+
auto mm1 = svld1ub_u32(pg, code);
|
68
|
+
mm1 = svadd_u32_x(pg, mm1, offsets_0);
|
69
|
+
const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm1);
|
70
|
+
return svaddv_f32(pg, collected0);
|
71
|
+
}
|
72
|
+
|
73
|
+
template <typename PQDecoderT>
|
74
|
+
std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, float> inline distance_single_code_sve(
|
75
|
+
// the product quantizer
|
76
|
+
const size_t M,
|
77
|
+
// number of bits per quantization index
|
78
|
+
const size_t nbits,
|
79
|
+
// precomputed distances, layout (M, ksub)
|
80
|
+
const float* sim_table,
|
81
|
+
const uint8_t* code) {
|
82
|
+
if (M <= svcntw())
|
83
|
+
return distance_single_code_sve_for_small_m(M, sim_table, code);
|
84
|
+
|
85
|
+
const float* tab = sim_table;
|
86
|
+
|
87
|
+
const size_t ksub = 1 << nbits;
|
88
|
+
|
89
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
90
|
+
|
91
|
+
// accumulators of partial sums
|
92
|
+
auto partialSum = svdup_n_f32(0.f);
|
93
|
+
|
94
|
+
const auto lanes = svcntb();
|
95
|
+
const auto quad_lanes = lanes / 4;
|
96
|
+
|
97
|
+
// loop
|
98
|
+
for (std::size_t m = 0; m < M;) {
|
99
|
+
const auto pg = svwhilelt_b8_u64(m, M);
|
100
|
+
|
101
|
+
const auto mm1 = svld1_u8(pg, code + m);
|
102
|
+
{
|
103
|
+
const auto mm1lo = svunpklo_u16(mm1);
|
104
|
+
const auto pglo = svunpklo_b(pg);
|
105
|
+
|
106
|
+
{
|
107
|
+
// convert uint8 values to uint32 values
|
108
|
+
const auto idx1 = svunpklo_u32(mm1lo);
|
109
|
+
const auto pglolo = svunpklo_b(pglo);
|
110
|
+
|
111
|
+
distance_codes_kernel(pglolo, idx1, offsets_0, tab, partialSum);
|
112
|
+
tab += ksub * quad_lanes;
|
113
|
+
}
|
114
|
+
|
115
|
+
m += quad_lanes;
|
116
|
+
if (m >= M)
|
117
|
+
break;
|
118
|
+
|
119
|
+
{
|
120
|
+
// convert uint8 values to uint32 values
|
121
|
+
const auto idx1 = svunpkhi_u32(mm1lo);
|
122
|
+
const auto pglohi = svunpkhi_b(pglo);
|
123
|
+
|
124
|
+
distance_codes_kernel(pglohi, idx1, offsets_0, tab, partialSum);
|
125
|
+
tab += ksub * quad_lanes;
|
126
|
+
}
|
127
|
+
|
128
|
+
m += quad_lanes;
|
129
|
+
if (m >= M)
|
130
|
+
break;
|
131
|
+
}
|
132
|
+
|
133
|
+
{
|
134
|
+
const auto mm1hi = svunpkhi_u16(mm1);
|
135
|
+
const auto pghi = svunpkhi_b(pg);
|
136
|
+
|
137
|
+
{
|
138
|
+
// convert uint8 values to uint32 values
|
139
|
+
const auto idx1 = svunpklo_u32(mm1hi);
|
140
|
+
const auto pghilo = svunpklo_b(pghi);
|
141
|
+
|
142
|
+
distance_codes_kernel(pghilo, idx1, offsets_0, tab, partialSum);
|
143
|
+
tab += ksub * quad_lanes;
|
144
|
+
}
|
145
|
+
|
146
|
+
m += quad_lanes;
|
147
|
+
if (m >= M)
|
148
|
+
break;
|
149
|
+
|
150
|
+
{
|
151
|
+
// convert uint8 values to uint32 values
|
152
|
+
const auto idx1 = svunpkhi_u32(mm1hi);
|
153
|
+
const auto pghihi = svunpkhi_b(pghi);
|
154
|
+
|
155
|
+
distance_codes_kernel(pghihi, idx1, offsets_0, tab, partialSum);
|
156
|
+
tab += ksub * quad_lanes;
|
157
|
+
}
|
158
|
+
|
159
|
+
m += quad_lanes;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
return svaddv_f32(svptrue_b32(), partialSum);
|
164
|
+
}
|
165
|
+
|
166
|
+
template <typename PQDecoderT>
|
167
|
+
std::enable_if_t<!std::is_same_v<PQDecoderT, PQDecoder8>, void>
|
168
|
+
distance_four_codes_sve(
|
169
|
+
// the product quantizer
|
170
|
+
const size_t M,
|
171
|
+
// number of bits per quantization index
|
172
|
+
const size_t nbits,
|
173
|
+
// precomputed distances, layout (M, ksub)
|
174
|
+
const float* sim_table,
|
175
|
+
// codes
|
176
|
+
const uint8_t* __restrict code0,
|
177
|
+
const uint8_t* __restrict code1,
|
178
|
+
const uint8_t* __restrict code2,
|
179
|
+
const uint8_t* __restrict code3,
|
180
|
+
// computed distances
|
181
|
+
float& result0,
|
182
|
+
float& result1,
|
183
|
+
float& result2,
|
184
|
+
float& result3) {
|
185
|
+
distance_four_codes_generic<PQDecoderT>(
|
186
|
+
M,
|
187
|
+
nbits,
|
188
|
+
sim_table,
|
189
|
+
code0,
|
190
|
+
code1,
|
191
|
+
code2,
|
192
|
+
code3,
|
193
|
+
result0,
|
194
|
+
result1,
|
195
|
+
result2,
|
196
|
+
result3);
|
197
|
+
}
|
198
|
+
|
199
|
+
static void distance_four_codes_sve_for_small_m(
|
200
|
+
// the product quantizer
|
201
|
+
const size_t M,
|
202
|
+
// precomputed distances, layout (M, ksub)
|
203
|
+
const float* sim_table,
|
204
|
+
// codes
|
205
|
+
const uint8_t* __restrict code0,
|
206
|
+
const uint8_t* __restrict code1,
|
207
|
+
const uint8_t* __restrict code2,
|
208
|
+
const uint8_t* __restrict code3,
|
209
|
+
// computed distances
|
210
|
+
float& result0,
|
211
|
+
float& result1,
|
212
|
+
float& result2,
|
213
|
+
float& result3) {
|
214
|
+
constexpr size_t nbits = 8u;
|
215
|
+
|
216
|
+
const size_t ksub = 1 << nbits;
|
217
|
+
|
218
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
219
|
+
|
220
|
+
const auto quad_lanes = svcntw();
|
221
|
+
|
222
|
+
// loop
|
223
|
+
const auto pg = svwhilelt_b32_u64(0, M);
|
224
|
+
|
225
|
+
auto mm10 = svld1ub_u32(pg, code0);
|
226
|
+
auto mm11 = svld1ub_u32(pg, code1);
|
227
|
+
auto mm12 = svld1ub_u32(pg, code2);
|
228
|
+
auto mm13 = svld1ub_u32(pg, code3);
|
229
|
+
mm10 = svadd_u32_x(pg, mm10, offsets_0);
|
230
|
+
mm11 = svadd_u32_x(pg, mm11, offsets_0);
|
231
|
+
mm12 = svadd_u32_x(pg, mm12, offsets_0);
|
232
|
+
mm13 = svadd_u32_x(pg, mm13, offsets_0);
|
233
|
+
const auto collected0 = svld1_gather_u32index_f32(pg, sim_table, mm10);
|
234
|
+
const auto collected1 = svld1_gather_u32index_f32(pg, sim_table, mm11);
|
235
|
+
const auto collected2 = svld1_gather_u32index_f32(pg, sim_table, mm12);
|
236
|
+
const auto collected3 = svld1_gather_u32index_f32(pg, sim_table, mm13);
|
237
|
+
result0 = svaddv_f32(pg, collected0);
|
238
|
+
result1 = svaddv_f32(pg, collected1);
|
239
|
+
result2 = svaddv_f32(pg, collected2);
|
240
|
+
result3 = svaddv_f32(pg, collected3);
|
241
|
+
}
|
242
|
+
|
243
|
+
// Combines 4 operations of distance_single_code()
|
244
|
+
template <typename PQDecoderT>
|
245
|
+
std::enable_if_t<std::is_same_v<PQDecoderT, PQDecoder8>, void>
|
246
|
+
distance_four_codes_sve(
|
247
|
+
// the product quantizer
|
248
|
+
const size_t M,
|
249
|
+
// number of bits per quantization index
|
250
|
+
const size_t nbits,
|
251
|
+
// precomputed distances, layout (M, ksub)
|
252
|
+
const float* sim_table,
|
253
|
+
// codes
|
254
|
+
const uint8_t* __restrict code0,
|
255
|
+
const uint8_t* __restrict code1,
|
256
|
+
const uint8_t* __restrict code2,
|
257
|
+
const uint8_t* __restrict code3,
|
258
|
+
// computed distances
|
259
|
+
float& result0,
|
260
|
+
float& result1,
|
261
|
+
float& result2,
|
262
|
+
float& result3) {
|
263
|
+
if (M <= svcntw()) {
|
264
|
+
distance_four_codes_sve_for_small_m(
|
265
|
+
M,
|
266
|
+
sim_table,
|
267
|
+
code0,
|
268
|
+
code1,
|
269
|
+
code2,
|
270
|
+
code3,
|
271
|
+
result0,
|
272
|
+
result1,
|
273
|
+
result2,
|
274
|
+
result3);
|
275
|
+
return;
|
276
|
+
}
|
277
|
+
|
278
|
+
const float* tab = sim_table;
|
279
|
+
|
280
|
+
const size_t ksub = 1 << nbits;
|
281
|
+
|
282
|
+
const auto offsets_0 = svindex_u32(0, static_cast<uint32_t>(ksub));
|
283
|
+
|
284
|
+
// accumulators of partial sums
|
285
|
+
auto partialSum0 = svdup_n_f32(0.f);
|
286
|
+
auto partialSum1 = svdup_n_f32(0.f);
|
287
|
+
auto partialSum2 = svdup_n_f32(0.f);
|
288
|
+
auto partialSum3 = svdup_n_f32(0.f);
|
289
|
+
|
290
|
+
const auto lanes = svcntb();
|
291
|
+
const auto quad_lanes = lanes / 4;
|
292
|
+
|
293
|
+
// loop
|
294
|
+
for (std::size_t m = 0; m < M;) {
|
295
|
+
const auto pg = svwhilelt_b8_u64(m, M);
|
296
|
+
|
297
|
+
const auto mm10 = svld1_u8(pg, code0 + m);
|
298
|
+
const auto mm11 = svld1_u8(pg, code1 + m);
|
299
|
+
const auto mm12 = svld1_u8(pg, code2 + m);
|
300
|
+
const auto mm13 = svld1_u8(pg, code3 + m);
|
301
|
+
{
|
302
|
+
const auto mm10lo = svunpklo_u16(mm10);
|
303
|
+
const auto mm11lo = svunpklo_u16(mm11);
|
304
|
+
const auto mm12lo = svunpklo_u16(mm12);
|
305
|
+
const auto mm13lo = svunpklo_u16(mm13);
|
306
|
+
const auto pglo = svunpklo_b(pg);
|
307
|
+
|
308
|
+
{
|
309
|
+
const auto pglolo = svunpklo_b(pglo);
|
310
|
+
{
|
311
|
+
const auto idx1 = svunpklo_u32(mm10lo);
|
312
|
+
distance_codes_kernel(
|
313
|
+
pglolo, idx1, offsets_0, tab, partialSum0);
|
314
|
+
}
|
315
|
+
{
|
316
|
+
const auto idx1 = svunpklo_u32(mm11lo);
|
317
|
+
distance_codes_kernel(
|
318
|
+
pglolo, idx1, offsets_0, tab, partialSum1);
|
319
|
+
}
|
320
|
+
{
|
321
|
+
const auto idx1 = svunpklo_u32(mm12lo);
|
322
|
+
distance_codes_kernel(
|
323
|
+
pglolo, idx1, offsets_0, tab, partialSum2);
|
324
|
+
}
|
325
|
+
{
|
326
|
+
const auto idx1 = svunpklo_u32(mm13lo);
|
327
|
+
distance_codes_kernel(
|
328
|
+
pglolo, idx1, offsets_0, tab, partialSum3);
|
329
|
+
}
|
330
|
+
tab += ksub * quad_lanes;
|
331
|
+
}
|
332
|
+
|
333
|
+
m += quad_lanes;
|
334
|
+
if (m >= M)
|
335
|
+
break;
|
336
|
+
|
337
|
+
{
|
338
|
+
const auto pglohi = svunpkhi_b(pglo);
|
339
|
+
{
|
340
|
+
const auto idx1 = svunpkhi_u32(mm10lo);
|
341
|
+
distance_codes_kernel(
|
342
|
+
pglohi, idx1, offsets_0, tab, partialSum0);
|
343
|
+
}
|
344
|
+
{
|
345
|
+
const auto idx1 = svunpkhi_u32(mm11lo);
|
346
|
+
distance_codes_kernel(
|
347
|
+
pglohi, idx1, offsets_0, tab, partialSum1);
|
348
|
+
}
|
349
|
+
{
|
350
|
+
const auto idx1 = svunpkhi_u32(mm12lo);
|
351
|
+
distance_codes_kernel(
|
352
|
+
pglohi, idx1, offsets_0, tab, partialSum2);
|
353
|
+
}
|
354
|
+
{
|
355
|
+
const auto idx1 = svunpkhi_u32(mm13lo);
|
356
|
+
distance_codes_kernel(
|
357
|
+
pglohi, idx1, offsets_0, tab, partialSum3);
|
358
|
+
}
|
359
|
+
tab += ksub * quad_lanes;
|
360
|
+
}
|
361
|
+
|
362
|
+
m += quad_lanes;
|
363
|
+
if (m >= M)
|
364
|
+
break;
|
365
|
+
}
|
366
|
+
|
367
|
+
{
|
368
|
+
const auto mm10hi = svunpkhi_u16(mm10);
|
369
|
+
const auto mm11hi = svunpkhi_u16(mm11);
|
370
|
+
const auto mm12hi = svunpkhi_u16(mm12);
|
371
|
+
const auto mm13hi = svunpkhi_u16(mm13);
|
372
|
+
const auto pghi = svunpkhi_b(pg);
|
373
|
+
|
374
|
+
{
|
375
|
+
const auto pghilo = svunpklo_b(pghi);
|
376
|
+
{
|
377
|
+
const auto idx1 = svunpklo_u32(mm10hi);
|
378
|
+
distance_codes_kernel(
|
379
|
+
pghilo, idx1, offsets_0, tab, partialSum0);
|
380
|
+
}
|
381
|
+
{
|
382
|
+
const auto idx1 = svunpklo_u32(mm11hi);
|
383
|
+
distance_codes_kernel(
|
384
|
+
pghilo, idx1, offsets_0, tab, partialSum1);
|
385
|
+
}
|
386
|
+
{
|
387
|
+
const auto idx1 = svunpklo_u32(mm12hi);
|
388
|
+
distance_codes_kernel(
|
389
|
+
pghilo, idx1, offsets_0, tab, partialSum2);
|
390
|
+
}
|
391
|
+
{
|
392
|
+
const auto idx1 = svunpklo_u32(mm13hi);
|
393
|
+
distance_codes_kernel(
|
394
|
+
pghilo, idx1, offsets_0, tab, partialSum3);
|
395
|
+
}
|
396
|
+
tab += ksub * quad_lanes;
|
397
|
+
}
|
398
|
+
|
399
|
+
m += quad_lanes;
|
400
|
+
if (m >= M)
|
401
|
+
break;
|
402
|
+
|
403
|
+
{
|
404
|
+
const auto pghihi = svunpkhi_b(pghi);
|
405
|
+
{
|
406
|
+
const auto idx1 = svunpkhi_u32(mm10hi);
|
407
|
+
distance_codes_kernel(
|
408
|
+
pghihi, idx1, offsets_0, tab, partialSum0);
|
409
|
+
}
|
410
|
+
{
|
411
|
+
const auto idx1 = svunpkhi_u32(mm11hi);
|
412
|
+
distance_codes_kernel(
|
413
|
+
pghihi, idx1, offsets_0, tab, partialSum1);
|
414
|
+
}
|
415
|
+
{
|
416
|
+
const auto idx1 = svunpkhi_u32(mm12hi);
|
417
|
+
distance_codes_kernel(
|
418
|
+
pghihi, idx1, offsets_0, tab, partialSum2);
|
419
|
+
}
|
420
|
+
{
|
421
|
+
const auto idx1 = svunpkhi_u32(mm13hi);
|
422
|
+
distance_codes_kernel(
|
423
|
+
pghihi, idx1, offsets_0, tab, partialSum3);
|
424
|
+
}
|
425
|
+
tab += ksub * quad_lanes;
|
426
|
+
}
|
427
|
+
|
428
|
+
m += quad_lanes;
|
429
|
+
}
|
430
|
+
}
|
431
|
+
|
432
|
+
result0 = svaddv_f32(svptrue_b32(), partialSum0);
|
433
|
+
result1 = svaddv_f32(svptrue_b32(), partialSum1);
|
434
|
+
result2 = svaddv_f32(svptrue_b32(), partialSum2);
|
435
|
+
result3 = svaddv_f32(svptrue_b32(), partialSum3);
|
436
|
+
}
|
437
|
+
|
438
|
+
} // namespace faiss
|
439
|
+
|
440
|
+
#endif
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
* Copyright (c)
|
1
|
+
/*
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
3
3
|
*
|
4
4
|
* This source code is licensed under the MIT license found in the
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
@@ -77,6 +77,59 @@ inline void distance_four_codes(
|
|
77
77
|
|
78
78
|
} // namespace faiss
|
79
79
|
|
80
|
+
#elif defined(__ARM_FEATURE_SVE)
|
81
|
+
|
82
|
+
#include <faiss/impl/code_distance/code_distance-sve.h>
|
83
|
+
|
84
|
+
namespace faiss {
|
85
|
+
|
86
|
+
template <typename PQDecoderT>
|
87
|
+
inline float distance_single_code(
|
88
|
+
// the product quantizer
|
89
|
+
const size_t M,
|
90
|
+
// number of bits per quantization index
|
91
|
+
const size_t nbits,
|
92
|
+
// precomputed distances, layout (M, ksub)
|
93
|
+
const float* sim_table,
|
94
|
+
// the code
|
95
|
+
const uint8_t* code) {
|
96
|
+
return distance_single_code_sve<PQDecoderT>(M, nbits, sim_table, code);
|
97
|
+
}
|
98
|
+
|
99
|
+
template <typename PQDecoderT>
|
100
|
+
inline void distance_four_codes(
|
101
|
+
// the product quantizer
|
102
|
+
const size_t M,
|
103
|
+
// number of bits per quantization index
|
104
|
+
const size_t nbits,
|
105
|
+
// precomputed distances, layout (M, ksub)
|
106
|
+
const float* sim_table,
|
107
|
+
// codes
|
108
|
+
const uint8_t* __restrict code0,
|
109
|
+
const uint8_t* __restrict code1,
|
110
|
+
const uint8_t* __restrict code2,
|
111
|
+
const uint8_t* __restrict code3,
|
112
|
+
// computed distances
|
113
|
+
float& result0,
|
114
|
+
float& result1,
|
115
|
+
float& result2,
|
116
|
+
float& result3) {
|
117
|
+
distance_four_codes_sve<PQDecoderT>(
|
118
|
+
M,
|
119
|
+
nbits,
|
120
|
+
sim_table,
|
121
|
+
code0,
|
122
|
+
code1,
|
123
|
+
code2,
|
124
|
+
code3,
|
125
|
+
result0,
|
126
|
+
result1,
|
127
|
+
result2,
|
128
|
+
result3);
|
129
|
+
}
|
130
|
+
|
131
|
+
} // namespace faiss
|
132
|
+
|
80
133
|
#else
|
81
134
|
|
82
135
|
#include <faiss/impl/code_distance/code_distance-generic.h>
|
@@ -1,12 +1,11 @@
|
|
1
|
-
|
2
|
-
* Copyright (c)
|
1
|
+
/*
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
3
3
|
*
|
4
4
|
* This source code is licensed under the MIT license found in the
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
6
6
|
*/
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
#include <faiss/impl/index_read_utils.h>
|
10
9
|
#include <faiss/index_io.h>
|
11
10
|
|
12
11
|
#include <faiss/impl/io_macros.h>
|
@@ -14,9 +13,6 @@
|
|
14
13
|
#include <cstdio>
|
15
14
|
#include <cstdlib>
|
16
15
|
|
17
|
-
#include <sys/stat.h>
|
18
|
-
#include <sys/types.h>
|
19
|
-
|
20
16
|
#include <faiss/impl/FaissAssert.h>
|
21
17
|
#include <faiss/impl/io.h>
|
22
18
|
#include <faiss/impl/io_macros.h>
|
@@ -63,7 +59,7 @@ namespace faiss {
|
|
63
59
|
* Read
|
64
60
|
**************************************************************/
|
65
61
|
|
66
|
-
|
62
|
+
void read_index_header(Index* idx, IOReader* f) {
|
67
63
|
READ1(idx->d);
|
68
64
|
READ1(idx->ntotal);
|
69
65
|
idx_t dummy;
|
@@ -232,7 +228,7 @@ InvertedLists* read_InvertedLists(IOReader* f, int io_flags) {
|
|
232
228
|
}
|
233
229
|
}
|
234
230
|
|
235
|
-
|
231
|
+
void read_InvertedLists(IndexIVF* ivf, IOReader* f, int io_flags) {
|
236
232
|
InvertedLists* ils = read_InvertedLists(f, io_flags);
|
237
233
|
if (ils) {
|
238
234
|
FAISS_THROW_IF_NOT(ils->nlist == ivf->nlist);
|
@@ -244,7 +240,7 @@ static void read_InvertedLists(IndexIVF* ivf, IOReader* f, int io_flags) {
|
|
244
240
|
ivf->own_invlists = true;
|
245
241
|
}
|
246
242
|
|
247
|
-
|
243
|
+
void read_ProductQuantizer(ProductQuantizer* pq, IOReader* f) {
|
248
244
|
READ1(pq->d);
|
249
245
|
READ1(pq->M);
|
250
246
|
READ1(pq->nbits);
|
@@ -354,7 +350,7 @@ static void read_ProductLocalSearchQuantizer(
|
|
354
350
|
}
|
355
351
|
}
|
356
352
|
|
357
|
-
|
353
|
+
void read_ScalarQuantizer(ScalarQuantizer* ivsc, IOReader* f) {
|
358
354
|
READ1(ivsc->qtype);
|
359
355
|
READ1(ivsc->rangestat);
|
360
356
|
READ1(ivsc->rangestat_arg);
|
@@ -375,7 +371,10 @@ static void read_HNSW(HNSW* hnsw, IOReader* f) {
|
|
375
371
|
READ1(hnsw->max_level);
|
376
372
|
READ1(hnsw->efConstruction);
|
377
373
|
READ1(hnsw->efSearch);
|
378
|
-
|
374
|
+
|
375
|
+
// // deprecated field
|
376
|
+
// READ1(hnsw->upper_beam);
|
377
|
+
READ1_DUMMY(int)
|
379
378
|
}
|
380
379
|
|
381
380
|
static void read_NSG(NSG* nsg, IOReader* f) {
|
@@ -440,7 +439,7 @@ ProductQuantizer* read_ProductQuantizer(IOReader* reader) {
|
|
440
439
|
return pq;
|
441
440
|
}
|
442
441
|
|
443
|
-
|
442
|
+
void read_direct_map(DirectMap* dm, IOReader* f) {
|
444
443
|
char maintain_direct_map;
|
445
444
|
READ1(maintain_direct_map);
|
446
445
|
dm->type = (DirectMap::Type)maintain_direct_map;
|
@@ -456,10 +455,10 @@ static void read_direct_map(DirectMap* dm, IOReader* f) {
|
|
456
455
|
}
|
457
456
|
}
|
458
457
|
|
459
|
-
|
458
|
+
void read_ivf_header(
|
460
459
|
IndexIVF* ivf,
|
461
460
|
IOReader* f,
|
462
|
-
std::vector<std::vector<idx_t>>* ids
|
461
|
+
std::vector<std::vector<idx_t>>* ids) {
|
463
462
|
read_index_header(ivf, f);
|
464
463
|
READ1(ivf->nlist);
|
465
464
|
READ1(ivf->nprobe);
|
@@ -474,7 +473,7 @@ static void read_ivf_header(
|
|
474
473
|
}
|
475
474
|
|
476
475
|
// used for legacy formats
|
477
|
-
|
476
|
+
ArrayInvertedLists* set_array_invlist(
|
478
477
|
IndexIVF* ivf,
|
479
478
|
std::vector<std::vector<idx_t>>& ids) {
|
480
479
|
ArrayInvertedLists* ail =
|
@@ -531,7 +530,11 @@ Index* read_index(IOReader* f, int io_flags) {
|
|
531
530
|
Index* idx = nullptr;
|
532
531
|
uint32_t h;
|
533
532
|
READ1(h);
|
534
|
-
if (h == fourcc("
|
533
|
+
if (h == fourcc("null")) {
|
534
|
+
// denotes a missing index, useful for some cases
|
535
|
+
return nullptr;
|
536
|
+
} else if (
|
537
|
+
h == fourcc("IxFI") || h == fourcc("IxF2") || h == fourcc("IxFl")) {
|
535
538
|
IndexFlat* idxf;
|
536
539
|
if (h == fourcc("IxFI")) {
|
537
540
|
idxf = new IndexFlatIP();
|
@@ -948,7 +951,7 @@ Index* read_index(IOReader* f, int io_flags) {
|
|
948
951
|
idx = idxp;
|
949
952
|
} else if (
|
950
953
|
h == fourcc("IHNf") || h == fourcc("IHNp") || h == fourcc("IHNs") ||
|
951
|
-
h == fourcc("IHN2")) {
|
954
|
+
h == fourcc("IHN2") || h == fourcc("IHNc")) {
|
952
955
|
IndexHNSW* idxhnsw = nullptr;
|
953
956
|
if (h == fourcc("IHNf"))
|
954
957
|
idxhnsw = new IndexHNSWFlat();
|
@@ -958,11 +961,19 @@ Index* read_index(IOReader* f, int io_flags) {
|
|
958
961
|
idxhnsw = new IndexHNSWSQ();
|
959
962
|
if (h == fourcc("IHN2"))
|
960
963
|
idxhnsw = new IndexHNSW2Level();
|
964
|
+
if (h == fourcc("IHNc"))
|
965
|
+
idxhnsw = new IndexHNSWCagra();
|
961
966
|
read_index_header(idxhnsw, f);
|
967
|
+
if (h == fourcc("IHNc")) {
|
968
|
+
READ1(idxhnsw->keep_max_size_level0);
|
969
|
+
auto idx_hnsw_cagra = dynamic_cast<IndexHNSWCagra*>(idxhnsw);
|
970
|
+
READ1(idx_hnsw_cagra->base_level_only);
|
971
|
+
READ1(idx_hnsw_cagra->num_base_level_search_entrypoints);
|
972
|
+
}
|
962
973
|
read_HNSW(&idxhnsw->hnsw, f);
|
963
974
|
idxhnsw->storage = read_index(f, io_flags);
|
964
|
-
idxhnsw->own_fields =
|
965
|
-
if (h == fourcc("IHNp")) {
|
975
|
+
idxhnsw->own_fields = idxhnsw->storage != nullptr;
|
976
|
+
if (h == fourcc("IHNp") && !(io_flags & IO_FLAG_PQ_SKIP_SDC_TABLE)) {
|
966
977
|
dynamic_cast<IndexPQ*>(idxhnsw->storage)->pq.compute_sdc_table();
|
967
978
|
}
|
968
979
|
idx = idxhnsw;
|
@@ -0,0 +1,37 @@
|
|
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
|
+
// Utils for index_read
|
9
|
+
|
10
|
+
#ifndef FAISS_INDEX_READ_UTILS_H
|
11
|
+
#define FAISS_INDEX_READ_UTILS_H
|
12
|
+
|
13
|
+
#include <faiss/IndexIVF.h>
|
14
|
+
#include <faiss/impl/io.h>
|
15
|
+
|
16
|
+
#pragma once
|
17
|
+
|
18
|
+
namespace faiss {
|
19
|
+
struct ProductQuantizer;
|
20
|
+
struct ScalarQuantizer;
|
21
|
+
|
22
|
+
void read_index_header(Index* idx, IOReader* f);
|
23
|
+
void read_direct_map(DirectMap* dm, IOReader* f);
|
24
|
+
void read_ivf_header(
|
25
|
+
IndexIVF* ivf,
|
26
|
+
IOReader* f,
|
27
|
+
std::vector<std::vector<idx_t>>* ids = nullptr);
|
28
|
+
void read_InvertedLists(IndexIVF* ivf, IOReader* f, int io_flags);
|
29
|
+
ArrayInvertedLists* set_array_invlist(
|
30
|
+
IndexIVF* ivf,
|
31
|
+
std::vector<std::vector<idx_t>>& ids);
|
32
|
+
void read_ProductQuantizer(ProductQuantizer* pq, IOReader* f);
|
33
|
+
void read_ScalarQuantizer(ScalarQuantizer* ivsc, IOReader* f);
|
34
|
+
|
35
|
+
} // namespace faiss
|
36
|
+
|
37
|
+
#endif
|