faiss 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/faiss/extconf.rb +2 -1
- data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
- data/ext/faiss/index_binary.cpp +1 -1
- data/ext/faiss/kmeans.cpp +1 -1
- data/ext/faiss/pca_matrix.cpp +1 -1
- data/ext/faiss/product_quantizer.cpp +1 -1
- data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +93 -80
- data/vendor/faiss/faiss/Clustering.cpp +39 -240
- data/vendor/faiss/faiss/Clustering.h +6 -0
- data/vendor/faiss/faiss/IVFlib.cpp +41 -21
- data/vendor/faiss/faiss/Index.cpp +6 -5
- data/vendor/faiss/faiss/Index.h +5 -5
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
- data/vendor/faiss/faiss/IndexBinary.h +4 -4
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +84 -92
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
- data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +87 -415
- data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
- data/vendor/faiss/faiss/IndexFastScan.h +25 -23
- data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
- data/vendor/faiss/faiss/IndexFlat.h +21 -18
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
- data/vendor/faiss/faiss/IndexHNSW.cpp +283 -145
- data/vendor/faiss/faiss/IndexHNSW.h +16 -2
- data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +465 -362
- data/vendor/faiss/faiss/IndexIVF.h +33 -12
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
- data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +36 -68
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
- data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
- data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +39 -23
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
- data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
- data/vendor/faiss/faiss/IndexPQ.h +3 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
- data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
- data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
- data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
- data/vendor/faiss/faiss/IndexRefine.h +4 -4
- data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
- data/vendor/faiss/faiss/IndexShards.cpp +10 -9
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
- data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
- data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
- data/vendor/faiss/faiss/MetaIndexes.h +1 -1
- data/vendor/faiss/faiss/MetricType.h +14 -7
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
- data/vendor/faiss/faiss/VectorTransform.h +16 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +48 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
- data/vendor/faiss/faiss/factory_tools.cpp +5 -0
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
- data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
- data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
- data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
- data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
- data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
- data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
- data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
- data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +92 -317
- data/vendor/faiss/faiss/impl/HNSW.h +13 -34
- data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
- data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
- data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
- data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +38 -21
- data/vendor/faiss/faiss/impl/NSG.h +4 -4
- data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
- data/vendor/faiss/faiss/impl/Panorama.h +258 -87
- data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
- data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +30 -23
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +296 -283
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +99 -75
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.h +7 -0
- data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
- data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
- data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
- data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
- data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
- data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
- data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
- data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
- data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
- data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
- data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
- data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1132 -45
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
- data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +33 -16
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
- data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +29 -111
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +238 -5
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +3 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +148 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +100 -66
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
- data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
- data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
- data/vendor/faiss/faiss/impl/svs_io.h +8 -2
- data/vendor/faiss/faiss/index_factory.cpp +86 -18
- data/vendor/faiss/faiss/index_io.h +24 -0
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
- data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
- data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
- data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
- data/vendor/faiss/faiss/utils/distances.cpp +390 -560
- data/vendor/faiss/faiss/utils/distances.h +20 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
- data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -177
- data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
- data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
- data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
- data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
- data/vendor/faiss/faiss/utils/hamming.h +92 -2
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
- data/vendor/faiss/faiss/utils/partitioning.h +31 -0
- data/vendor/faiss/faiss/utils/popcount.h +29 -0
- data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
- data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
- data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
- data/vendor/faiss/faiss/utils/random.cpp +6 -6
- data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
- data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
- data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
- data/vendor/faiss/faiss/utils/simd_levels.cpp +17 -5
- data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +5 -5
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +119 -34
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
- data/vendor/faiss/faiss/utils/simdlib.h +0 -42
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
- /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
data/vendor/faiss/faiss/Index.h
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
#define FAISS_VERSION_MAJOR 1
|
|
19
19
|
#define FAISS_VERSION_MINOR 14
|
|
20
|
-
#define FAISS_VERSION_PATCH
|
|
20
|
+
#define FAISS_VERSION_PATCH 2
|
|
21
21
|
|
|
22
22
|
// Macro to combine the version components into a single string
|
|
23
23
|
#ifndef FAISS_STRINGIFY
|
|
@@ -114,8 +114,8 @@ struct Index {
|
|
|
114
114
|
MetricType metric_type;
|
|
115
115
|
float metric_arg; ///< argument of the metric type
|
|
116
116
|
|
|
117
|
-
explicit Index(idx_t
|
|
118
|
-
: d(
|
|
117
|
+
explicit Index(idx_t d_in = 0, MetricType metric = METRIC_L2)
|
|
118
|
+
: d(static_cast<int>(d_in)),
|
|
119
119
|
ntotal(0),
|
|
120
120
|
verbose(false),
|
|
121
121
|
is_trained(true),
|
|
@@ -131,7 +131,7 @@ struct Index {
|
|
|
131
131
|
*/
|
|
132
132
|
virtual void train(idx_t n, const float* x);
|
|
133
133
|
|
|
134
|
-
/**
|
|
134
|
+
/** Perform training on a representative set of vectors and a representative
|
|
135
135
|
* set of queries
|
|
136
136
|
*
|
|
137
137
|
* @param n nb of training vectors
|
|
@@ -139,7 +139,7 @@ struct Index {
|
|
|
139
139
|
* @param n_train_q nb of training queries
|
|
140
140
|
* @param xq_train training queries, size n_train_q * d
|
|
141
141
|
*/
|
|
142
|
-
virtual void
|
|
142
|
+
virtual void train_with_queries(
|
|
143
143
|
idx_t n,
|
|
144
144
|
const float* x,
|
|
145
145
|
idx_t n_train_q,
|
|
@@ -13,10 +13,6 @@
|
|
|
13
13
|
#include <cstdint>
|
|
14
14
|
#include <cstdio>
|
|
15
15
|
|
|
16
|
-
#ifdef __SSE3__
|
|
17
|
-
#include <immintrin.h>
|
|
18
|
-
#endif
|
|
19
|
-
|
|
20
16
|
#include <algorithm>
|
|
21
17
|
|
|
22
18
|
#include <faiss/IndexIVFPQ.h>
|
|
@@ -138,12 +134,13 @@ struct Distance2Level : DistanceComputer {
|
|
|
138
134
|
size_t d;
|
|
139
135
|
const Index2Layer& storage;
|
|
140
136
|
std::vector<float> buf;
|
|
141
|
-
const float* q;
|
|
137
|
+
const float* q = nullptr;
|
|
142
138
|
|
|
143
|
-
const float
|
|
139
|
+
const float* pq_l1_tab = nullptr;
|
|
140
|
+
const float* pq_l2_tab = nullptr;
|
|
144
141
|
|
|
145
|
-
explicit Distance2Level(const Index2Layer&
|
|
146
|
-
d =
|
|
142
|
+
explicit Distance2Level(const Index2Layer& storage_) : storage(storage_) {
|
|
143
|
+
d = storage_.d;
|
|
147
144
|
FAISS_ASSERT(storage.pq.dsub == 4);
|
|
148
145
|
pq_l2_tab = storage.pq.centroids.data();
|
|
149
146
|
buf.resize(2 * d);
|
|
@@ -162,46 +159,40 @@ struct Distance2Level : DistanceComputer {
|
|
|
162
159
|
|
|
163
160
|
// well optimized for xNN+PQNN
|
|
164
161
|
struct DistanceXPQ4 : Distance2Level {
|
|
165
|
-
int M
|
|
162
|
+
int M = 0;
|
|
163
|
+
int k = 0;
|
|
166
164
|
|
|
167
|
-
explicit DistanceXPQ4(const Index2Layer&
|
|
168
|
-
: Distance2Level(
|
|
165
|
+
explicit DistanceXPQ4(const Index2Layer& storage_)
|
|
166
|
+
: Distance2Level(storage_) {
|
|
169
167
|
const IndexFlat* quantizer =
|
|
170
168
|
dynamic_cast<IndexFlat*>(storage.q1.quantizer);
|
|
171
169
|
|
|
172
170
|
FAISS_ASSERT(quantizer);
|
|
173
|
-
M = storage.pq.M;
|
|
171
|
+
M = static_cast<int>(storage.pq.M);
|
|
174
172
|
pq_l1_tab = quantizer->get_xb();
|
|
175
173
|
}
|
|
176
174
|
|
|
177
175
|
float operator()(idx_t i) override {
|
|
178
|
-
#ifdef __SSE3__
|
|
179
176
|
const uint8_t* code = storage.codes.data() + i * storage.code_size;
|
|
180
177
|
idx_t key = 0;
|
|
181
178
|
memcpy(&key, code, storage.code_size_1);
|
|
182
179
|
code += storage.code_size_1;
|
|
183
180
|
|
|
184
|
-
// walking pointers
|
|
185
181
|
const float* qa = q;
|
|
186
|
-
const
|
|
187
|
-
const
|
|
188
|
-
|
|
182
|
+
const float* l1 = pq_l1_tab + d * key;
|
|
183
|
+
const float* l2 = pq_l2_tab;
|
|
184
|
+
float accu = 0;
|
|
189
185
|
|
|
190
186
|
for (int m = 0; m < M; m++) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
187
|
+
for (int j = 0; j < 4; j++) {
|
|
188
|
+
float diff = qa[j] - (l1[m * 4 + j] + l2[*code * 4 + j]);
|
|
189
|
+
accu += diff * diff;
|
|
190
|
+
}
|
|
191
|
+
code++;
|
|
192
|
+
l2 += 256 * 4;
|
|
196
193
|
qa += 4;
|
|
197
194
|
}
|
|
198
|
-
|
|
199
|
-
accu = _mm_hadd_ps(accu, accu);
|
|
200
|
-
accu = _mm_hadd_ps(accu, accu);
|
|
201
|
-
return _mm_cvtss_f32(accu);
|
|
202
|
-
#else
|
|
203
|
-
FAISS_THROW_MSG("not implemented for non-x64 platforms");
|
|
204
|
-
#endif
|
|
195
|
+
return accu;
|
|
205
196
|
}
|
|
206
197
|
};
|
|
207
198
|
|
|
@@ -209,15 +200,15 @@ struct DistanceXPQ4 : Distance2Level {
|
|
|
209
200
|
struct Distance2xXPQ4 : Distance2Level {
|
|
210
201
|
int M_2, mi_nbits;
|
|
211
202
|
|
|
212
|
-
explicit Distance2xXPQ4(const Index2Layer&
|
|
213
|
-
: Distance2Level(
|
|
203
|
+
explicit Distance2xXPQ4(const Index2Layer& storage_)
|
|
204
|
+
: Distance2Level(storage_) {
|
|
214
205
|
const MultiIndexQuantizer* mi =
|
|
215
206
|
dynamic_cast<MultiIndexQuantizer*>(storage.q1.quantizer);
|
|
216
207
|
|
|
217
208
|
FAISS_ASSERT(mi);
|
|
218
209
|
FAISS_ASSERT(storage.pq.M % 2 == 0);
|
|
219
|
-
M_2 = storage.pq.M / 2;
|
|
220
|
-
mi_nbits = mi->pq.nbits;
|
|
210
|
+
M_2 = static_cast<int>(storage.pq.M / 2);
|
|
211
|
+
mi_nbits = static_cast<int>(mi->pq.nbits);
|
|
221
212
|
pq_l1_tab = mi->pq.centroids.data();
|
|
222
213
|
}
|
|
223
214
|
|
|
@@ -226,42 +217,36 @@ struct Distance2xXPQ4 : Distance2Level {
|
|
|
226
217
|
int64_t key01 = 0;
|
|
227
218
|
memcpy(&key01, code, storage.code_size_1);
|
|
228
219
|
code += storage.code_size_1;
|
|
229
|
-
#ifdef __SSE3__
|
|
230
220
|
|
|
231
|
-
// walking pointers
|
|
232
221
|
const float* qa = q;
|
|
233
|
-
const
|
|
234
|
-
const
|
|
235
|
-
|
|
222
|
+
const float* l1 = pq_l1_tab;
|
|
223
|
+
const float* l2 = pq_l2_tab;
|
|
224
|
+
float accu = 0;
|
|
236
225
|
|
|
237
226
|
for (int mi_m = 0; mi_m < 2; mi_m++) {
|
|
238
227
|
int64_t l1_idx = key01 & (((int64_t)1 << mi_nbits) - 1);
|
|
239
|
-
const
|
|
228
|
+
const float* l1_sub = l1 + M_2 * l1_idx * 4;
|
|
240
229
|
|
|
241
230
|
for (int m = 0; m < M_2; m++) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
231
|
+
for (int j = 0; j < 4; j++) {
|
|
232
|
+
float diff =
|
|
233
|
+
qa[j] - (l1_sub[m * 4 + j] + l2[*code * 4 + j]);
|
|
234
|
+
accu += diff * diff;
|
|
235
|
+
}
|
|
236
|
+
code++;
|
|
237
|
+
l2 += 256 * 4;
|
|
247
238
|
qa += 4;
|
|
248
239
|
}
|
|
249
|
-
|
|
240
|
+
l1 += (M_2 << mi_nbits) * 4;
|
|
250
241
|
key01 >>= mi_nbits;
|
|
251
242
|
}
|
|
252
|
-
|
|
253
|
-
accu = _mm_hadd_ps(accu, accu);
|
|
254
|
-
return _mm_cvtss_f32(accu);
|
|
255
|
-
#else
|
|
256
|
-
FAISS_THROW_MSG("not implemented for non-x64 platforms");
|
|
257
|
-
#endif
|
|
243
|
+
return accu;
|
|
258
244
|
}
|
|
259
245
|
};
|
|
260
246
|
|
|
261
247
|
} // namespace
|
|
262
248
|
|
|
263
249
|
DistanceComputer* Index2Layer::get_distance_computer() const {
|
|
264
|
-
#ifdef __SSE3__
|
|
265
250
|
const MultiIndexQuantizer* mi =
|
|
266
251
|
dynamic_cast<MultiIndexQuantizer*>(q1.quantizer);
|
|
267
252
|
|
|
@@ -274,7 +259,6 @@ DistanceComputer* Index2Layer::get_distance_computer() const {
|
|
|
274
259
|
if (fl && pq.dsub == 4) {
|
|
275
260
|
return new DistanceXPQ4(*this);
|
|
276
261
|
}
|
|
277
|
-
#endif
|
|
278
262
|
|
|
279
263
|
return Index::get_distance_computer();
|
|
280
264
|
}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
#include <faiss/impl/FaissAssert.h>
|
|
14
14
|
#include <faiss/impl/ResidualQuantizer.h>
|
|
15
15
|
#include <faiss/impl/ResultHandler.h>
|
|
16
|
+
#include <faiss/utils/distances_dispatch.h>
|
|
16
17
|
#include <faiss/utils/extra_distances.h>
|
|
17
18
|
|
|
18
19
|
namespace faiss {
|
|
@@ -22,10 +23,10 @@ namespace faiss {
|
|
|
22
23
|
**************************************************************************************/
|
|
23
24
|
|
|
24
25
|
IndexAdditiveQuantizer::IndexAdditiveQuantizer(
|
|
25
|
-
idx_t
|
|
26
|
-
AdditiveQuantizer*
|
|
26
|
+
idx_t d_,
|
|
27
|
+
AdditiveQuantizer* aq_,
|
|
27
28
|
MetricType metric)
|
|
28
|
-
: IndexFlatCodes(
|
|
29
|
+
: IndexFlatCodes(aq_->code_size, d_, metric), aq(aq_) {
|
|
29
30
|
FAISS_THROW_IF_NOT(metric == METRIC_INNER_PRODUCT || metric == METRIC_L2);
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -44,14 +45,14 @@ struct AQDistanceComputerDecompress : FlatCodesDistanceComputer {
|
|
|
44
45
|
|
|
45
46
|
AQDistanceComputerDecompress(
|
|
46
47
|
const IndexAdditiveQuantizer& iaq,
|
|
47
|
-
VectorDistance
|
|
48
|
+
VectorDistance vd_)
|
|
48
49
|
: FlatCodesDistanceComputer(iaq.codes.data(), iaq.code_size),
|
|
49
50
|
tmp(iaq.d * 2),
|
|
50
51
|
aq(*iaq.aq),
|
|
51
|
-
vd(
|
|
52
|
+
vd(vd_),
|
|
52
53
|
d(iaq.d) {}
|
|
53
54
|
|
|
54
|
-
const float* q;
|
|
55
|
+
const float* q = nullptr;
|
|
55
56
|
void set_query(const float* x) final {
|
|
56
57
|
q = x;
|
|
57
58
|
}
|
|
@@ -82,7 +83,7 @@ struct AQDistanceComputerLUT : FlatCodesDistanceComputer {
|
|
|
82
83
|
aq(*iaq.aq),
|
|
83
84
|
d(iaq.d) {}
|
|
84
85
|
|
|
85
|
-
float bias;
|
|
86
|
+
float bias = 0.0f;
|
|
86
87
|
void set_query(const float* x) final {
|
|
87
88
|
q = x;
|
|
88
89
|
// this is quite sub-optimal for multiple queries
|
|
@@ -127,7 +128,7 @@ void search_with_decompress(
|
|
|
127
128
|
typename BlockResultHandler::SingleResultHandler;
|
|
128
129
|
|
|
129
130
|
#pragma omp parallel for if (res.nq > 100)
|
|
130
|
-
for (int64_t q = 0; q < res.nq; q++) {
|
|
131
|
+
for (int64_t q = 0; q < static_cast<int64_t>(res.nq); q++) {
|
|
131
132
|
SingleResultHandler resi(res);
|
|
132
133
|
resi.begin(q);
|
|
133
134
|
std::vector<float> tmp(ir.d);
|
|
@@ -163,7 +164,7 @@ void search_with_LUT(
|
|
|
163
164
|
aq.compute_LUT(nq, xq, LUT.get());
|
|
164
165
|
|
|
165
166
|
#pragma omp parallel for if (nq > 100)
|
|
166
|
-
for (int64_t q = 0; q < nq; q++) {
|
|
167
|
+
for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
|
|
167
168
|
SingleResultHandler resi(res);
|
|
168
169
|
resi.begin(q);
|
|
169
170
|
std::vector<float> tmp(aq.d);
|
|
@@ -298,23 +299,23 @@ void IndexAdditiveQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
|
|
|
298
299
|
**************************************************************************************/
|
|
299
300
|
|
|
300
301
|
IndexResidualQuantizer::IndexResidualQuantizer(
|
|
301
|
-
int
|
|
302
|
+
int d_, ///< dimensionality of the input vectors
|
|
302
303
|
size_t M, ///< number of subquantizers
|
|
303
304
|
size_t nbits, ///< number of bit per subvector index
|
|
304
305
|
MetricType metric,
|
|
305
306
|
Search_type_t search_type)
|
|
306
307
|
: IndexResidualQuantizer(
|
|
307
|
-
|
|
308
|
+
d_,
|
|
308
309
|
std::vector<size_t>(M, nbits),
|
|
309
310
|
metric,
|
|
310
311
|
search_type) {}
|
|
311
312
|
|
|
312
313
|
IndexResidualQuantizer::IndexResidualQuantizer(
|
|
313
|
-
int
|
|
314
|
+
int d_,
|
|
314
315
|
const std::vector<size_t>& nbits,
|
|
315
316
|
MetricType metric,
|
|
316
317
|
Search_type_t search_type)
|
|
317
|
-
: IndexAdditiveQuantizer(
|
|
318
|
+
: IndexAdditiveQuantizer(d_, &rq, metric), rq(d_, nbits, search_type) {
|
|
318
319
|
code_size = rq.code_size;
|
|
319
320
|
is_trained = false;
|
|
320
321
|
}
|
|
@@ -332,13 +333,13 @@ void IndexResidualQuantizer::train(idx_t n, const float* x) {
|
|
|
332
333
|
**************************************************************************************/
|
|
333
334
|
|
|
334
335
|
IndexLocalSearchQuantizer::IndexLocalSearchQuantizer(
|
|
335
|
-
int
|
|
336
|
+
int d_,
|
|
336
337
|
size_t M, ///< number of subquantizers
|
|
337
338
|
size_t nbits, ///< number of bit per subvector index
|
|
338
339
|
MetricType metric,
|
|
339
340
|
Search_type_t search_type)
|
|
340
|
-
: IndexAdditiveQuantizer(
|
|
341
|
-
lsq(
|
|
341
|
+
: IndexAdditiveQuantizer(d_, &lsq, metric),
|
|
342
|
+
lsq(d_, M, nbits, search_type) {
|
|
342
343
|
code_size = lsq.code_size;
|
|
343
344
|
is_trained = false;
|
|
344
345
|
}
|
|
@@ -356,14 +357,14 @@ void IndexLocalSearchQuantizer::train(idx_t n, const float* x) {
|
|
|
356
357
|
**************************************************************************************/
|
|
357
358
|
|
|
358
359
|
IndexProductResidualQuantizer::IndexProductResidualQuantizer(
|
|
359
|
-
int
|
|
360
|
+
int d_, ///< dimensionality of the input vectors
|
|
360
361
|
size_t nsplits, ///< number of residual quantizers
|
|
361
362
|
size_t Msub, ///< number of subquantizers per RQ
|
|
362
363
|
size_t nbits, ///< number of bit per subvector index
|
|
363
364
|
MetricType metric,
|
|
364
365
|
Search_type_t search_type)
|
|
365
|
-
: IndexAdditiveQuantizer(
|
|
366
|
-
prq(
|
|
366
|
+
: IndexAdditiveQuantizer(d_, &prq, metric),
|
|
367
|
+
prq(d_, nsplits, Msub, nbits, search_type) {
|
|
367
368
|
code_size = prq.code_size;
|
|
368
369
|
is_trained = false;
|
|
369
370
|
}
|
|
@@ -381,14 +382,14 @@ void IndexProductResidualQuantizer::train(idx_t n, const float* x) {
|
|
|
381
382
|
**************************************************************************************/
|
|
382
383
|
|
|
383
384
|
IndexProductLocalSearchQuantizer::IndexProductLocalSearchQuantizer(
|
|
384
|
-
int
|
|
385
|
+
int d_, ///< dimensionality of the input vectors
|
|
385
386
|
size_t nsplits, ///< number of local search quantizers
|
|
386
387
|
size_t Msub, ///< number of subquantizers per LSQ
|
|
387
388
|
size_t nbits, ///< number of bit per subvector index
|
|
388
389
|
MetricType metric,
|
|
389
390
|
Search_type_t search_type)
|
|
390
|
-
: IndexAdditiveQuantizer(
|
|
391
|
-
plsq(
|
|
391
|
+
: IndexAdditiveQuantizer(d_, &plsq, metric),
|
|
392
|
+
plsq(d_, nsplits, Msub, nbits, search_type) {
|
|
392
393
|
code_size = plsq.code_size;
|
|
393
394
|
is_trained = false;
|
|
394
395
|
}
|
|
@@ -406,10 +407,10 @@ void IndexProductLocalSearchQuantizer::train(idx_t n, const float* x) {
|
|
|
406
407
|
**************************************************************************************/
|
|
407
408
|
|
|
408
409
|
AdditiveCoarseQuantizer::AdditiveCoarseQuantizer(
|
|
409
|
-
idx_t
|
|
410
|
-
AdditiveQuantizer*
|
|
410
|
+
idx_t d_,
|
|
411
|
+
AdditiveQuantizer* aq_,
|
|
411
412
|
MetricType metric)
|
|
412
|
-
: Index(
|
|
413
|
+
: Index(d_, metric), aq(aq_) {}
|
|
413
414
|
|
|
414
415
|
void AdditiveCoarseQuantizer::add(idx_t, const float*) {
|
|
415
416
|
FAISS_THROW_MSG("not applicable");
|
|
@@ -463,7 +464,8 @@ void AdditiveCoarseQuantizer::search(
|
|
|
463
464
|
if (metric_type == METRIC_INNER_PRODUCT) {
|
|
464
465
|
aq->knn_centroids_inner_product(n, x, k, distances, labels);
|
|
465
466
|
} else if (metric_type == METRIC_L2) {
|
|
466
|
-
FAISS_THROW_IF_NOT(
|
|
467
|
+
FAISS_THROW_IF_NOT(
|
|
468
|
+
centroid_norms.size() == static_cast<size_t>(ntotal));
|
|
467
469
|
aq->knn_centroids_L2(n, x, k, distances, labels, centroid_norms.data());
|
|
468
470
|
}
|
|
469
471
|
}
|
|
@@ -473,20 +475,20 @@ void AdditiveCoarseQuantizer::search(
|
|
|
473
475
|
**************************************************************************************/
|
|
474
476
|
|
|
475
477
|
ResidualCoarseQuantizer::ResidualCoarseQuantizer(
|
|
476
|
-
int
|
|
478
|
+
int d_, ///< dimensionality of the input vectors
|
|
477
479
|
const std::vector<size_t>& nbits,
|
|
478
480
|
MetricType metric)
|
|
479
|
-
: AdditiveCoarseQuantizer(
|
|
481
|
+
: AdditiveCoarseQuantizer(d_, &rq, metric), rq(d_, nbits) {
|
|
480
482
|
FAISS_THROW_IF_NOT(rq.tot_bits <= 63);
|
|
481
483
|
is_trained = false;
|
|
482
484
|
}
|
|
483
485
|
|
|
484
486
|
ResidualCoarseQuantizer::ResidualCoarseQuantizer(
|
|
485
|
-
int
|
|
487
|
+
int d_,
|
|
486
488
|
size_t M, ///< number of subquantizers
|
|
487
489
|
size_t nbits, ///< number of bit per subvector index
|
|
488
490
|
MetricType metric)
|
|
489
|
-
: ResidualCoarseQuantizer(
|
|
491
|
+
: ResidualCoarseQuantizer(d_, std::vector<size_t>(M, nbits), metric) {}
|
|
490
492
|
|
|
491
493
|
ResidualCoarseQuantizer::ResidualCoarseQuantizer()
|
|
492
494
|
: ResidualCoarseQuantizer(0, 0, 0) {}
|
|
@@ -504,7 +506,8 @@ void ResidualCoarseQuantizer::set_beam_factor(float new_beam_factor) {
|
|
|
504
506
|
// Does not use the cross_products
|
|
505
507
|
rq.codebook_cross_products.resize(0);
|
|
506
508
|
// but the centroid norms are necessary!
|
|
507
|
-
if (metric_type == METRIC_L2 &&
|
|
509
|
+
if (metric_type == METRIC_L2 &&
|
|
510
|
+
static_cast<size_t>(ntotal) != centroid_norms.size()) {
|
|
508
511
|
if (verbose) {
|
|
509
512
|
printf("AdditiveCoarseQuantizer::train: computing centroid norms for %zd centroids\n",
|
|
510
513
|
size_t(ntotal));
|
|
@@ -540,7 +543,7 @@ void ResidualCoarseQuantizer::search(
|
|
|
540
543
|
|
|
541
544
|
int beam_size = int(k * actual_beam_factor);
|
|
542
545
|
if (beam_size > ntotal) {
|
|
543
|
-
beam_size = ntotal;
|
|
546
|
+
beam_size = static_cast<int>(ntotal);
|
|
544
547
|
}
|
|
545
548
|
size_t memory_per_point = rq.memory_per_point(beam_size);
|
|
546
549
|
|
|
@@ -573,8 +576,17 @@ void ResidualCoarseQuantizer::search(
|
|
|
573
576
|
return;
|
|
574
577
|
}
|
|
575
578
|
|
|
576
|
-
|
|
577
|
-
|
|
579
|
+
size_t codes_size = mul_no_overflow(
|
|
580
|
+
mul_no_overflow(
|
|
581
|
+
static_cast<size_t>(beam_size), rq.M, "beam_size * M"),
|
|
582
|
+
static_cast<size_t>(n),
|
|
583
|
+
"beam_size * M * n");
|
|
584
|
+
size_t beam_dist_size = mul_no_overflow(
|
|
585
|
+
static_cast<size_t>(n),
|
|
586
|
+
static_cast<size_t>(beam_size),
|
|
587
|
+
"n * beam_size");
|
|
588
|
+
std::vector<int32_t> codes(codes_size);
|
|
589
|
+
std::vector<float> beam_distances(beam_dist_size);
|
|
578
590
|
|
|
579
591
|
rq.refine_beam(
|
|
580
592
|
n, 1, x, beam_size, codes.data(), nullptr, beam_distances.data());
|
|
@@ -590,7 +602,7 @@ void ResidualCoarseQuantizer::search(
|
|
|
590
602
|
for (idx_t j = 0; j < k; j++) {
|
|
591
603
|
idx_t l = 0;
|
|
592
604
|
int shift = 0;
|
|
593
|
-
for (
|
|
605
|
+
for (size_t m = 0; m < rq.M; m++) {
|
|
594
606
|
l |= (*codes_i++) << shift;
|
|
595
607
|
shift += rq.nbits[m];
|
|
596
608
|
}
|
|
@@ -613,11 +625,11 @@ void ResidualCoarseQuantizer::initialize_from(
|
|
|
613
625
|
**************************************************************************************/
|
|
614
626
|
|
|
615
627
|
LocalSearchCoarseQuantizer::LocalSearchCoarseQuantizer(
|
|
616
|
-
int
|
|
628
|
+
int d_, ///< dimensionality of the input vectors
|
|
617
629
|
size_t M, ///< number of subquantizers
|
|
618
630
|
size_t nbits, ///< number of bit per subvector index
|
|
619
631
|
MetricType metric)
|
|
620
|
-
: AdditiveCoarseQuantizer(
|
|
632
|
+
: AdditiveCoarseQuantizer(d_, &lsq, metric), lsq(d_, M, nbits) {
|
|
621
633
|
FAISS_THROW_IF_NOT(lsq.tot_bits <= 63);
|
|
622
634
|
is_trained = false;
|
|
623
635
|
}
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
#include <memory>
|
|
12
12
|
|
|
13
13
|
#include <faiss/impl/FaissAssert.h>
|
|
14
|
-
#include <faiss/impl/FastScanDistancePostProcessing.h>
|
|
15
14
|
#include <faiss/impl/LocalSearchQuantizer.h>
|
|
16
|
-
#include <faiss/impl/LookupTableScaler.h>
|
|
17
15
|
#include <faiss/impl/ResidualQuantizer.h>
|
|
18
|
-
#include <faiss/impl/
|
|
16
|
+
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
|
|
17
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
19
18
|
#include <faiss/utils/quantize_lut.h>
|
|
20
19
|
#include <faiss/utils/utils.h>
|
|
21
20
|
|
|
@@ -26,16 +25,16 @@ inline size_t roundup(size_t a, size_t b) {
|
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan(
|
|
29
|
-
AdditiveQuantizer*
|
|
28
|
+
AdditiveQuantizer* aq_,
|
|
30
29
|
MetricType metric,
|
|
31
|
-
int
|
|
32
|
-
init(
|
|
30
|
+
int bbs_) {
|
|
31
|
+
init(aq_, metric, bbs_);
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
void IndexAdditiveQuantizerFastScan::init(
|
|
36
35
|
AdditiveQuantizer* aq_init,
|
|
37
36
|
MetricType metric,
|
|
38
|
-
int
|
|
37
|
+
int bbs_) {
|
|
39
38
|
FAISS_THROW_IF_NOT(aq_init != nullptr);
|
|
40
39
|
FAISS_THROW_IF_NOT(!aq_init->nbits.empty());
|
|
41
40
|
FAISS_THROW_IF_NOT(aq_init->nbits[0] == 4);
|
|
@@ -57,7 +56,7 @@ void IndexAdditiveQuantizerFastScan::init(
|
|
|
57
56
|
} else {
|
|
58
57
|
M = aq_init->M;
|
|
59
58
|
}
|
|
60
|
-
init_fastscan(aq_init->d, M, 4, metric,
|
|
59
|
+
init_fastscan(static_cast<int>(aq_init->d), M, 4, metric, bbs_);
|
|
61
60
|
|
|
62
61
|
max_train_points = 1024 * ksub * M;
|
|
63
62
|
}
|
|
@@ -70,8 +69,8 @@ IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan()
|
|
|
70
69
|
|
|
71
70
|
IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan(
|
|
72
71
|
const IndexAdditiveQuantizer& orig,
|
|
73
|
-
int
|
|
74
|
-
init(orig.aq, orig.metric_type,
|
|
72
|
+
int bbs_) {
|
|
73
|
+
init(orig.aq, orig.metric_type, bbs_);
|
|
75
74
|
|
|
76
75
|
ntotal = orig.ntotal;
|
|
77
76
|
is_trained = orig.is_trained;
|
|
@@ -202,9 +201,8 @@ void IndexAdditiveQuantizerFastScan::search(
|
|
|
202
201
|
return;
|
|
203
202
|
}
|
|
204
203
|
|
|
205
|
-
NormTableScaler scaler(norm_scale);
|
|
206
204
|
FastScanDistancePostProcessing context;
|
|
207
|
-
context.
|
|
205
|
+
context.pq2x4_scale = norm_scale;
|
|
208
206
|
if (metric_type == METRIC_L2) {
|
|
209
207
|
search_dispatch_implem<true>(n, x, k, distances, labels, context);
|
|
210
208
|
} else {
|
|
@@ -219,19 +217,23 @@ void IndexAdditiveQuantizerFastScan::sa_decode(
|
|
|
219
217
|
aq->decode(bytes, x, n);
|
|
220
218
|
}
|
|
221
219
|
|
|
220
|
+
size_t IndexAdditiveQuantizerFastScan::fast_scan_code_size() const {
|
|
221
|
+
return M2 / 2;
|
|
222
|
+
}
|
|
223
|
+
|
|
222
224
|
/**************************************************************************************
|
|
223
225
|
* IndexResidualQuantizerFastScan
|
|
224
226
|
**************************************************************************************/
|
|
225
227
|
|
|
226
228
|
IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan(
|
|
227
|
-
int
|
|
228
|
-
size_t
|
|
229
|
-
size_t
|
|
229
|
+
int d_, ///< dimensionality of the input vectors
|
|
230
|
+
size_t M_, ///< number of subquantizers
|
|
231
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
230
232
|
MetricType metric,
|
|
231
233
|
Search_type_t search_type,
|
|
232
|
-
int
|
|
233
|
-
: rq(
|
|
234
|
-
init(&rq, metric,
|
|
234
|
+
int bbs_)
|
|
235
|
+
: rq(d_, M_, nbits_, search_type) {
|
|
236
|
+
init(&rq, metric, bbs_);
|
|
235
237
|
}
|
|
236
238
|
|
|
237
239
|
IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan() {
|
|
@@ -243,14 +245,14 @@ IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan() {
|
|
|
243
245
|
**************************************************************************************/
|
|
244
246
|
|
|
245
247
|
IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan(
|
|
246
|
-
int
|
|
247
|
-
size_t
|
|
248
|
-
size_t
|
|
248
|
+
int d_,
|
|
249
|
+
size_t M_, ///< number of subquantizers
|
|
250
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
249
251
|
MetricType metric,
|
|
250
252
|
Search_type_t search_type,
|
|
251
|
-
int
|
|
252
|
-
: lsq(
|
|
253
|
-
init(&lsq, metric,
|
|
253
|
+
int bbs_)
|
|
254
|
+
: lsq(d_, M_, nbits_, search_type) {
|
|
255
|
+
init(&lsq, metric, bbs_);
|
|
254
256
|
}
|
|
255
257
|
|
|
256
258
|
IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan() {
|
|
@@ -262,15 +264,15 @@ IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan() {
|
|
|
262
264
|
**************************************************************************************/
|
|
263
265
|
|
|
264
266
|
IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan(
|
|
265
|
-
int
|
|
267
|
+
int d_, ///< dimensionality of the input vectors
|
|
266
268
|
size_t nsplits, ///< number of residual quantizers
|
|
267
269
|
size_t Msub, ///< number of subquantizers per RQ
|
|
268
|
-
size_t
|
|
270
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
269
271
|
MetricType metric,
|
|
270
272
|
Search_type_t search_type,
|
|
271
|
-
int
|
|
272
|
-
: prq(
|
|
273
|
-
init(&prq, metric,
|
|
273
|
+
int bbs_)
|
|
274
|
+
: prq(d_, nsplits, Msub, nbits_, search_type) {
|
|
275
|
+
init(&prq, metric, bbs_);
|
|
274
276
|
}
|
|
275
277
|
|
|
276
278
|
IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan() {
|
|
@@ -283,15 +285,15 @@ IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan() {
|
|
|
283
285
|
|
|
284
286
|
IndexProductLocalSearchQuantizerFastScan::
|
|
285
287
|
IndexProductLocalSearchQuantizerFastScan(
|
|
286
|
-
int
|
|
288
|
+
int d_, ///< dimensionality of the input vectors
|
|
287
289
|
size_t nsplits, ///< number of local search quantizers
|
|
288
290
|
size_t Msub, ///< number of subquantizers per LSQ
|
|
289
|
-
size_t
|
|
291
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
290
292
|
MetricType metric,
|
|
291
293
|
Search_type_t search_type,
|
|
292
|
-
int
|
|
293
|
-
: plsq(
|
|
294
|
-
init(&plsq, metric,
|
|
294
|
+
int bbs_)
|
|
295
|
+
: plsq(d_, nsplits, Msub, nbits_, search_type) {
|
|
296
|
+
init(&plsq, metric, bbs_);
|
|
295
297
|
}
|
|
296
298
|
|
|
297
299
|
IndexProductLocalSearchQuantizerFastScan::
|
|
@@ -28,7 +28,7 @@ namespace faiss {
|
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
30
|
struct IndexAdditiveQuantizerFastScan : IndexFastScan {
|
|
31
|
-
AdditiveQuantizer* aq;
|
|
31
|
+
AdditiveQuantizer* aq = nullptr;
|
|
32
32
|
using Search_type_t = AdditiveQuantizer::Search_type_t;
|
|
33
33
|
|
|
34
34
|
bool rescale_norm = true;
|
|
@@ -86,6 +86,9 @@ struct IndexAdditiveQuantizerFastScan : IndexFastScan {
|
|
|
86
86
|
* @param x output vectors, size n * d
|
|
87
87
|
*/
|
|
88
88
|
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
89
|
+
|
|
90
|
+
/// Packed code size: M2 / 2 bytes (4-bit AQ sub-quantizer nibbles)
|
|
91
|
+
size_t fast_scan_code_size() const override;
|
|
89
92
|
};
|
|
90
93
|
|
|
91
94
|
/** Index based on a residual quantizer. Stored vectors are
|
|
@@ -16,9 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
namespace faiss {
|
|
18
18
|
|
|
19
|
-
IndexBinary::IndexBinary(idx_t
|
|
20
|
-
: d(
|
|
21
|
-
|
|
19
|
+
IndexBinary::IndexBinary(idx_t d_, MetricType metric)
|
|
20
|
+
: d(static_cast<int>(d_)),
|
|
21
|
+
code_size(static_cast<int>(d_ / 8)),
|
|
22
|
+
metric_type(metric) {
|
|
23
|
+
FAISS_THROW_IF_NOT(d_ % 8 == 0);
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
IndexBinary::~IndexBinary() = default;
|