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
|
@@ -8,45 +8,51 @@
|
|
|
8
8
|
#include <faiss/IndexIVFPQFastScan.h>
|
|
9
9
|
|
|
10
10
|
#include <array>
|
|
11
|
-
#include <cassert>
|
|
12
11
|
#include <cstdio>
|
|
13
12
|
|
|
14
13
|
#include <memory>
|
|
15
14
|
|
|
16
15
|
#include <faiss/impl/AuxIndexStructures.h>
|
|
17
16
|
#include <faiss/impl/FaissAssert.h>
|
|
18
|
-
#include <faiss/
|
|
17
|
+
#include <faiss/impl/ResultHandler.h>
|
|
18
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
19
19
|
#include <faiss/utils/distances.h>
|
|
20
|
+
#include <faiss/utils/distances_dispatch.h>
|
|
20
21
|
#include <faiss/utils/extra_distances.h>
|
|
21
|
-
#include <faiss/utils/simdlib.h>
|
|
22
22
|
|
|
23
23
|
#include <faiss/invlists/BlockInvertedLists.h>
|
|
24
24
|
|
|
25
|
-
#include <faiss/impl/
|
|
26
|
-
#include <faiss/impl/
|
|
25
|
+
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
|
|
26
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
27
|
+
#include <faiss/impl/fast_scan/simd_result_handlers.h>
|
|
27
28
|
|
|
28
29
|
namespace faiss {
|
|
29
30
|
|
|
30
|
-
using namespace simd_result_handlers;
|
|
31
|
-
|
|
32
31
|
inline size_t roundup(size_t a, size_t b) {
|
|
33
32
|
return (a + b - 1) / b * b;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
IndexIVFPQFastScan::IndexIVFPQFastScan(
|
|
37
|
-
Index*
|
|
38
|
-
size_t
|
|
39
|
-
size_t
|
|
40
|
-
size_t
|
|
41
|
-
size_t
|
|
36
|
+
Index* quantizer_in,
|
|
37
|
+
size_t d_in,
|
|
38
|
+
size_t nlist_in,
|
|
39
|
+
size_t M_in,
|
|
40
|
+
size_t nbits_in,
|
|
42
41
|
MetricType metric,
|
|
43
|
-
int
|
|
44
|
-
bool
|
|
45
|
-
: IndexIVFFastScan(
|
|
46
|
-
|
|
42
|
+
int bbs_in,
|
|
43
|
+
bool own_invlists_in)
|
|
44
|
+
: IndexIVFFastScan(
|
|
45
|
+
quantizer_in,
|
|
46
|
+
d_in,
|
|
47
|
+
nlist_in,
|
|
48
|
+
0,
|
|
49
|
+
metric,
|
|
50
|
+
own_invlists_in),
|
|
51
|
+
pq(d_in, M_in, nbits_in) {
|
|
47
52
|
by_residual = false; // set to false by default because it's faster
|
|
48
53
|
|
|
49
|
-
init_fastscan(
|
|
54
|
+
init_fastscan(
|
|
55
|
+
&pq, M_in, nbits_in, nlist_in, metric, bbs_in, own_invlists_in);
|
|
50
56
|
}
|
|
51
57
|
|
|
52
58
|
IndexIVFPQFastScan::IndexIVFPQFastScan() {
|
|
@@ -55,7 +61,7 @@ IndexIVFPQFastScan::IndexIVFPQFastScan() {
|
|
|
55
61
|
M2 = 0;
|
|
56
62
|
}
|
|
57
63
|
|
|
58
|
-
IndexIVFPQFastScan::IndexIVFPQFastScan(const IndexIVFPQ& orig, int
|
|
64
|
+
IndexIVFPQFastScan::IndexIVFPQFastScan(const IndexIVFPQ& orig, int bbs_in)
|
|
59
65
|
: IndexIVFFastScan(
|
|
60
66
|
orig.quantizer,
|
|
61
67
|
orig.d,
|
|
@@ -72,7 +78,7 @@ IndexIVFPQFastScan::IndexIVFPQFastScan(const IndexIVFPQ& orig, int bbs)
|
|
|
72
78
|
orig.pq.nbits,
|
|
73
79
|
orig.nlist,
|
|
74
80
|
orig.metric_type,
|
|
75
|
-
|
|
81
|
+
bbs_in,
|
|
76
82
|
orig.own_invlists);
|
|
77
83
|
|
|
78
84
|
by_residual = orig.by_residual;
|
|
@@ -89,7 +95,7 @@ IndexIVFPQFastScan::IndexIVFPQFastScan(const IndexIVFPQ& orig, int bbs)
|
|
|
89
95
|
}
|
|
90
96
|
|
|
91
97
|
#pragma omp parallel for if (nlist > 100)
|
|
92
|
-
for (idx_t i = 0; i < nlist; i++) {
|
|
98
|
+
for (idx_t i = 0; i < static_cast<idx_t>(nlist); i++) {
|
|
93
99
|
size_t nb = orig.invlists->list_size(i);
|
|
94
100
|
size_t nb2 = roundup(nb, bbs);
|
|
95
101
|
AlignedTable<uint8_t> tmp(nb2 * M2 / 2);
|
|
@@ -111,6 +117,10 @@ IndexIVFPQFastScan::IndexIVFPQFastScan(const IndexIVFPQ& orig, int bbs)
|
|
|
111
117
|
orig_invlists = orig.invlists;
|
|
112
118
|
}
|
|
113
119
|
|
|
120
|
+
size_t IndexIVFPQFastScan::fast_scan_code_size() const {
|
|
121
|
+
return M2 / 2;
|
|
122
|
+
}
|
|
123
|
+
|
|
114
124
|
/*********************************************************
|
|
115
125
|
* Training
|
|
116
126
|
*********************************************************/
|
|
@@ -118,7 +128,7 @@ IndexIVFPQFastScan::IndexIVFPQFastScan(const IndexIVFPQ& orig, int bbs)
|
|
|
118
128
|
void IndexIVFPQFastScan::train_encoder(
|
|
119
129
|
idx_t n,
|
|
120
130
|
const float* x,
|
|
121
|
-
const idx_t* assign) {
|
|
131
|
+
const idx_t* /*assign*/) {
|
|
122
132
|
pq.verbose = verbose;
|
|
123
133
|
pq.train(n, x);
|
|
124
134
|
|
|
@@ -153,7 +163,7 @@ void IndexIVFPQFastScan::encode_vectors(
|
|
|
153
163
|
bool include_listnos) const {
|
|
154
164
|
if (by_residual) {
|
|
155
165
|
AlignedTable<float> residuals(n * d);
|
|
156
|
-
for (
|
|
166
|
+
for (idx_t i = 0; i < n; i++) {
|
|
157
167
|
if (list_nos[i] < 0) {
|
|
158
168
|
memset(residuals.data() + i * d, 0, sizeof(residuals[0]) * d);
|
|
159
169
|
} else {
|
|
@@ -180,16 +190,19 @@ void IndexIVFPQFastScan::encode_vectors(
|
|
|
180
190
|
* Look-Up Table functions
|
|
181
191
|
*********************************************************/
|
|
182
192
|
|
|
193
|
+
// Explicit SIMD-level alias (no global bare aliases).
|
|
194
|
+
using simd8float32 = simd8float32_tpl<SINGLE_SIMD_LEVEL_256>;
|
|
195
|
+
|
|
183
196
|
void fvec_madd_simd(
|
|
184
197
|
size_t n,
|
|
185
198
|
const float* a,
|
|
186
199
|
float bf,
|
|
187
200
|
const float* b,
|
|
188
201
|
float* c) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
202
|
+
FAISS_THROW_IF_NOT_MSG(is_aligned_pointer(a), "pointer a is not aligned");
|
|
203
|
+
FAISS_THROW_IF_NOT_MSG(is_aligned_pointer(b), "pointer b is not aligned");
|
|
204
|
+
FAISS_THROW_IF_NOT_MSG(is_aligned_pointer(c), "pointer c is not aligned");
|
|
205
|
+
FAISS_THROW_IF_NOT_MSG(n % 8 == 0, "n must be a multiple of 8");
|
|
193
206
|
simd8float32 bf8(bf);
|
|
194
207
|
n /= 8;
|
|
195
208
|
for (size_t i = 0; i < n; i++) {
|
|
@@ -216,23 +229,24 @@ void IndexIVFPQFastScan::compute_LUT(
|
|
|
216
229
|
AlignedTable<float>& biases,
|
|
217
230
|
const FastScanDistancePostProcessing&) const {
|
|
218
231
|
size_t dim12 = pq.ksub * pq.M;
|
|
219
|
-
size_t
|
|
220
|
-
size_t
|
|
232
|
+
size_t pq_d = pq.d;
|
|
233
|
+
size_t cq_nprobe = cq.nprobe;
|
|
221
234
|
|
|
222
235
|
if (by_residual) {
|
|
223
236
|
if (metric_type == METRIC_L2) {
|
|
224
|
-
dis_tables.resize(n *
|
|
237
|
+
dis_tables.resize(n * cq_nprobe * dim12);
|
|
225
238
|
|
|
226
239
|
if (use_precomputed_table == 1) {
|
|
227
|
-
biases.resize(n *
|
|
228
|
-
memcpy(biases.get(), cq.dis, sizeof(float) * n *
|
|
240
|
+
biases.resize(n * cq_nprobe);
|
|
241
|
+
memcpy(biases.get(), cq.dis, sizeof(float) * n * cq_nprobe);
|
|
229
242
|
|
|
230
243
|
AlignedTable<float> ip_table(n * dim12);
|
|
231
244
|
pq.compute_inner_prod_tables(n, x, ip_table.get());
|
|
232
245
|
|
|
233
|
-
#pragma omp parallel for if (n *
|
|
234
|
-
for (idx_t ij = 0; ij < n *
|
|
235
|
-
|
|
246
|
+
#pragma omp parallel for if (n * cq_nprobe > 8000)
|
|
247
|
+
for (idx_t ij = 0; ij < static_cast<idx_t>(n * cq_nprobe);
|
|
248
|
+
ij++) {
|
|
249
|
+
idx_t i = ij / cq_nprobe;
|
|
236
250
|
float* tab = dis_tables.get() + ij * dim12;
|
|
237
251
|
idx_t cij = cq.ids[ij];
|
|
238
252
|
|
|
@@ -251,26 +265,27 @@ void IndexIVFPQFastScan::compute_LUT(
|
|
|
251
265
|
}
|
|
252
266
|
|
|
253
267
|
} else {
|
|
254
|
-
std::unique_ptr<float[]> xrel(new float[n *
|
|
255
|
-
biases.resize(n *
|
|
256
|
-
memset(biases.get(), 0, sizeof(float) * n *
|
|
257
|
-
|
|
258
|
-
#pragma omp parallel for if (n *
|
|
259
|
-
for (idx_t ij = 0; ij < n *
|
|
260
|
-
|
|
261
|
-
|
|
268
|
+
std::unique_ptr<float[]> xrel(new float[n * cq_nprobe * pq_d]);
|
|
269
|
+
biases.resize(n * cq_nprobe);
|
|
270
|
+
memset(biases.get(), 0, sizeof(float) * n * cq_nprobe);
|
|
271
|
+
|
|
272
|
+
#pragma omp parallel for if (n * cq_nprobe > 8000)
|
|
273
|
+
for (idx_t ij = 0; ij < static_cast<idx_t>(n * cq_nprobe);
|
|
274
|
+
ij++) {
|
|
275
|
+
idx_t i = ij / cq_nprobe;
|
|
276
|
+
float* xij = &xrel[ij * pq_d];
|
|
262
277
|
idx_t cij = cq.ids[ij];
|
|
263
278
|
|
|
264
279
|
if (cij >= 0) {
|
|
265
|
-
quantizer->compute_residual(x + i *
|
|
280
|
+
quantizer->compute_residual(x + i * pq_d, xij, cij);
|
|
266
281
|
} else {
|
|
267
282
|
// will fill with NaNs
|
|
268
|
-
memset(xij, -1, sizeof(float) *
|
|
283
|
+
memset(xij, -1, sizeof(float) * pq_d);
|
|
269
284
|
}
|
|
270
285
|
}
|
|
271
286
|
|
|
272
287
|
pq.compute_distance_tables(
|
|
273
|
-
n *
|
|
288
|
+
n * cq_nprobe, xrel.get(), dis_tables.get());
|
|
274
289
|
}
|
|
275
290
|
|
|
276
291
|
} else if (metric_type == METRIC_INNER_PRODUCT) {
|
|
@@ -278,8 +293,8 @@ void IndexIVFPQFastScan::compute_LUT(
|
|
|
278
293
|
pq.compute_inner_prod_tables(n, x, dis_tables.get());
|
|
279
294
|
// compute_inner_prod_tables(pq, n, x, dis_tables.get());
|
|
280
295
|
|
|
281
|
-
biases.resize(n *
|
|
282
|
-
memcpy(biases.get(), cq.dis, sizeof(float) * n *
|
|
296
|
+
biases.resize(n * cq_nprobe);
|
|
297
|
+
memcpy(biases.get(), cq.dis, sizeof(float) * n * cq_nprobe);
|
|
283
298
|
} else {
|
|
284
299
|
FAISS_THROW_FMT("metric %d not supported", metric_type);
|
|
285
300
|
}
|
|
@@ -303,7 +318,9 @@ void IndexIVFPQFastScan::compute_LUT(
|
|
|
303
318
|
namespace {
|
|
304
319
|
|
|
305
320
|
struct IVFPQFastScanScanner : InvertedListScanner {
|
|
306
|
-
|
|
321
|
+
using InvertedListScanner::scan_codes;
|
|
322
|
+
[[maybe_unused]] static constexpr int impl =
|
|
323
|
+
10; // based on search_implem_10
|
|
307
324
|
static constexpr size_t nq = 1; // 1 query at a time.
|
|
308
325
|
const IndexIVFPQFastScan& index;
|
|
309
326
|
AlignedTable<uint8_t> dis_tables;
|
|
@@ -313,24 +330,24 @@ struct IVFPQFastScanScanner : InvertedListScanner {
|
|
|
313
330
|
const float* xi = nullptr;
|
|
314
331
|
|
|
315
332
|
IVFPQFastScanScanner(
|
|
316
|
-
const IndexIVFPQFastScan&
|
|
317
|
-
bool
|
|
318
|
-
const IDSelector*
|
|
319
|
-
: InvertedListScanner(
|
|
320
|
-
this->keep_max = is_similarity_metric(
|
|
321
|
-
residual.resize(
|
|
333
|
+
const IndexIVFPQFastScan& index_in,
|
|
334
|
+
bool store_pairs_in,
|
|
335
|
+
const IDSelector* sel_in)
|
|
336
|
+
: InvertedListScanner(store_pairs_in, sel_in), index(index_in) {
|
|
337
|
+
this->keep_max = is_similarity_metric(index_in.metric_type);
|
|
338
|
+
residual.resize(index_in.d);
|
|
322
339
|
}
|
|
323
340
|
|
|
324
341
|
void set_query(const float* query) override {
|
|
325
342
|
this->xi = query;
|
|
326
343
|
}
|
|
327
344
|
|
|
328
|
-
void set_list(idx_t
|
|
329
|
-
this->list_no =
|
|
345
|
+
void set_list(idx_t list_no_in, float coarse_dis_in) override {
|
|
346
|
+
this->list_no = list_no_in;
|
|
330
347
|
IndexIVFFastScan::CoarseQuantized cq{
|
|
331
|
-
.nprobe = 1,
|
|
332
|
-
.dis = &
|
|
333
|
-
.ids = &
|
|
348
|
+
.nprobe = 1, // 1 due to explicitly passing in list_no
|
|
349
|
+
.dis = &coarse_dis_in, // dis from query to list_no centroid.
|
|
350
|
+
.ids = &list_no_in, // id of the current list we are scanning
|
|
334
351
|
};
|
|
335
352
|
FastScanDistancePostProcessing empty_context{};
|
|
336
353
|
index.compute_LUT_uint8(
|
|
@@ -349,7 +366,7 @@ struct IVFPQFastScanScanner : InvertedListScanner {
|
|
|
349
366
|
const float* x = index.by_residual ? residual.data() : this->xi;
|
|
350
367
|
float accu = 0;
|
|
351
368
|
// implemented for all vector distances, although only L2 and IP are
|
|
352
|
-
//
|
|
369
|
+
// supported by FastScan
|
|
353
370
|
with_VectorDistance(pq.dsub, index.metric_type, 0.0, [&](auto vd) {
|
|
354
371
|
int m;
|
|
355
372
|
for (m = 0; m + 1 < pq.M; m += 2) {
|
|
@@ -377,73 +394,86 @@ struct IVFPQFastScanScanner : InvertedListScanner {
|
|
|
377
394
|
size_t ntotal,
|
|
378
395
|
const uint8_t* codes,
|
|
379
396
|
const idx_t* ids,
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
size_t k
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
curr_labels.data(),
|
|
396
|
-
sel,
|
|
397
|
-
empty_context,
|
|
398
|
-
&normalizers[0]));
|
|
399
|
-
|
|
400
|
-
// This does not quite match search_implem_10, but it is fine because
|
|
401
|
-
// the scanner operates on a single query at a time, and this value is
|
|
402
|
-
// used as the query index. For a single query, the value is always 0.
|
|
403
|
-
int qmap1[1] = {0};
|
|
404
|
-
|
|
405
|
-
handler->q_map = qmap1;
|
|
406
|
-
handler->begin(&normalizers[0]);
|
|
407
|
-
|
|
408
|
-
const uint8_t* LUT = dis_tables.get();
|
|
409
|
-
handler->dbias = biases.get();
|
|
410
|
-
|
|
411
|
-
handler->ntotal = ntotal;
|
|
412
|
-
handler->id_map = ids;
|
|
413
|
-
|
|
414
|
-
pq4_accumulate_loop(
|
|
415
|
-
1,
|
|
416
|
-
roundup(ntotal, index.bbs),
|
|
417
|
-
index.bbs,
|
|
418
|
-
static_cast<int>(index.M2),
|
|
419
|
-
codes,
|
|
420
|
-
LUT,
|
|
421
|
-
*handler,
|
|
422
|
-
nullptr,
|
|
423
|
-
index.get_block_stride());
|
|
424
|
-
|
|
425
|
-
// The handler is for the results of this iteration.
|
|
426
|
-
// Then we need a second heap to combine across iterations.
|
|
427
|
-
handler->end();
|
|
428
|
-
if (keep_max) {
|
|
429
|
-
minheap_addn(
|
|
397
|
+
ResultHandler& handler) const override {
|
|
398
|
+
auto scan_with_heap = [&](auto* heap_handler) -> size_t {
|
|
399
|
+
const size_t k = heap_handler->k;
|
|
400
|
+
if (k == 0) {
|
|
401
|
+
return 0;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// initialize the current iteration heap to the worst possible value
|
|
405
|
+
// of the caller-owned result handler.
|
|
406
|
+
std::vector<float> curr_dists(k, handler.threshold);
|
|
407
|
+
std::vector<idx_t> curr_labels(k, -1);
|
|
408
|
+
|
|
409
|
+
auto scanner = index.make_knn_scanner(
|
|
410
|
+
!keep_max,
|
|
411
|
+
nq,
|
|
430
412
|
k,
|
|
431
|
-
distances,
|
|
432
|
-
labels,
|
|
433
413
|
curr_dists.data(),
|
|
434
414
|
curr_labels.data(),
|
|
435
|
-
|
|
415
|
+
sel);
|
|
416
|
+
|
|
417
|
+
SIMDResultHandlerToFloat* rh = scanner->handler();
|
|
418
|
+
|
|
419
|
+
// This does not quite match search_implem_10, but it is fine
|
|
420
|
+
// because the scanner operates on a single query at a time, and
|
|
421
|
+
// this value is used as the query index. For a single query, the
|
|
422
|
+
// value is always 0.
|
|
423
|
+
int qmap1[1] = {0};
|
|
424
|
+
|
|
425
|
+
rh->q_map = qmap1;
|
|
426
|
+
rh->begin(&normalizers[0]);
|
|
427
|
+
|
|
428
|
+
rh->dbias = biases.get();
|
|
429
|
+
rh->ntotal = ntotal;
|
|
430
|
+
rh->id_map = ids;
|
|
431
|
+
|
|
432
|
+
scanner->accumulate_loop(
|
|
433
|
+
1,
|
|
434
|
+
roundup(ntotal, index.bbs),
|
|
435
|
+
index.bbs,
|
|
436
|
+
static_cast<int>(index.M2),
|
|
437
|
+
codes,
|
|
438
|
+
dis_tables.get(),
|
|
439
|
+
0,
|
|
440
|
+
index.get_block_stride());
|
|
441
|
+
|
|
442
|
+
const size_t scan_cnt = rh->count_scanned_rows();
|
|
443
|
+
rh->end();
|
|
444
|
+
|
|
445
|
+
handler.stats.scan_cnt += scan_cnt;
|
|
446
|
+
size_t nup = 0;
|
|
447
|
+
for (size_t j = 0; j < k; j++) {
|
|
448
|
+
if (curr_labels[j] < 0) {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
if (handler.add_result(curr_dists[j], curr_labels[j])) {
|
|
452
|
+
handler.stats.nheap_updates++;
|
|
453
|
+
nup++;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return nup;
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
if (!keep_max) {
|
|
460
|
+
using C = CMax<float, idx_t>;
|
|
461
|
+
if (auto* heap_handler =
|
|
462
|
+
dynamic_cast<HeapResultHandler<C, false>*>(&handler)) {
|
|
463
|
+
return scan_with_heap(heap_handler);
|
|
464
|
+
}
|
|
436
465
|
} else {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
curr_labels.data(),
|
|
443
|
-
k);
|
|
466
|
+
using C = CMin<float, idx_t>;
|
|
467
|
+
if (auto* heap_handler =
|
|
468
|
+
dynamic_cast<HeapResultHandler<C, false>*>(&handler)) {
|
|
469
|
+
return scan_with_heap(heap_handler);
|
|
470
|
+
}
|
|
444
471
|
}
|
|
445
472
|
|
|
446
|
-
|
|
473
|
+
FAISS_THROW_MSG(
|
|
474
|
+
"IVFPQFastScanScanner::scan_codes requires HeapResultHandler; "
|
|
475
|
+
"custom ResultHandler scan is not supported by this optimized "
|
|
476
|
+
"scanner");
|
|
447
477
|
}
|
|
448
478
|
};
|
|
449
479
|
|
|
@@ -55,6 +55,9 @@ struct IndexIVFPQFastScan : IndexIVFFastScan {
|
|
|
55
55
|
// built from an IndexIVFPQ
|
|
56
56
|
explicit IndexIVFPQFastScan(const IndexIVFPQ& orig, int bbs = 32);
|
|
57
57
|
|
|
58
|
+
/// Packed code size: M2 / 2 bytes (4-bit PQ sub-quantizer nibbles)
|
|
59
|
+
size_t fast_scan_code_size() const override;
|
|
60
|
+
|
|
58
61
|
void train_encoder(idx_t n, const float* x, const idx_t* assign) override;
|
|
59
62
|
|
|
60
63
|
idx_t train_encoder_num_vectors() const override;
|
|
@@ -25,23 +25,23 @@ namespace faiss {
|
|
|
25
25
|
******************************************/
|
|
26
26
|
|
|
27
27
|
IndexIVFPQR::IndexIVFPQR(
|
|
28
|
-
Index*
|
|
29
|
-
size_t
|
|
30
|
-
size_t
|
|
28
|
+
Index* quantizer_in,
|
|
29
|
+
size_t d_in,
|
|
30
|
+
size_t nlist_in,
|
|
31
31
|
size_t M,
|
|
32
32
|
size_t nbits_per_idx,
|
|
33
33
|
size_t M_refine,
|
|
34
34
|
size_t nbits_per_idx_refine,
|
|
35
|
-
bool
|
|
35
|
+
bool own_invlists_in)
|
|
36
36
|
: IndexIVFPQ(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
quantizer_in,
|
|
38
|
+
d_in,
|
|
39
|
+
nlist_in,
|
|
40
40
|
M,
|
|
41
41
|
nbits_per_idx,
|
|
42
42
|
METRIC_L2,
|
|
43
|
-
|
|
44
|
-
refine_pq(
|
|
43
|
+
own_invlists_in),
|
|
44
|
+
refine_pq(d_in, M_refine, nbits_per_idx_refine),
|
|
45
45
|
k_factor(4) {
|
|
46
46
|
by_residual = true;
|
|
47
47
|
refine_pq.cp.max_points_per_centroid = 1000;
|
|
@@ -126,7 +126,7 @@ void IndexIVFPQR::search_preassigned(
|
|
|
126
126
|
idx_t* labels,
|
|
127
127
|
bool store_pairs,
|
|
128
128
|
const IVFSearchParameters* params,
|
|
129
|
-
IndexIVFStats* stats) const {
|
|
129
|
+
IndexIVFStats* /*stats*/) const {
|
|
130
130
|
uint64_t t0;
|
|
131
131
|
TIC;
|
|
132
132
|
size_t k_coarse = long((size_t)k * k_factor);
|
|
@@ -166,18 +166,22 @@ void IndexIVFPQR::search_preassigned(
|
|
|
166
166
|
idx_t* heap_ids = labels + k * i;
|
|
167
167
|
maxheap_heapify(k, heap_sim, heap_ids);
|
|
168
168
|
|
|
169
|
-
for (
|
|
169
|
+
for (size_t j = 0; j < k_coarse; j++) {
|
|
170
170
|
idx_t sl = shortlist[j];
|
|
171
171
|
|
|
172
172
|
if (sl == -1) {
|
|
173
173
|
continue;
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
int list_no = lo_listno(sl);
|
|
177
|
-
int ofs = lo_offset(sl);
|
|
176
|
+
int list_no = static_cast<int>(lo_listno(sl));
|
|
177
|
+
int ofs = static_cast<int>(lo_offset(sl));
|
|
178
178
|
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
FAISS_THROW_IF_NOT(
|
|
180
|
+
list_no >= 0 && static_cast<size_t>(list_no) < nlist);
|
|
181
|
+
FAISS_THROW_IF_NOT(
|
|
182
|
+
ofs >= 0 &&
|
|
183
|
+
static_cast<size_t>(ofs) <
|
|
184
|
+
invlists->list_size(list_no));
|
|
181
185
|
|
|
182
186
|
// 1st level residual
|
|
183
187
|
quantizer->compute_residual(xq, residual_1.get(), list_no);
|
|
@@ -192,7 +196,7 @@ void IndexIVFPQR::search_preassigned(
|
|
|
192
196
|
|
|
193
197
|
// 3rd level residual's approximation
|
|
194
198
|
idx_t id = invlists->get_single_id(list_no, ofs);
|
|
195
|
-
|
|
199
|
+
FAISS_THROW_IF_NOT(0 <= id && id < ntotal);
|
|
196
200
|
refine_pq.decode(
|
|
197
201
|
&refine_codes[id * refine_pq.code_size],
|
|
198
202
|
residual_1.get());
|
|
@@ -219,7 +223,7 @@ void IndexIVFPQR::reconstruct_from_offset(
|
|
|
219
223
|
IndexIVFPQ::reconstruct_from_offset(list_no, offset, recons);
|
|
220
224
|
|
|
221
225
|
idx_t id = invlists->get_single_id(list_no, offset);
|
|
222
|
-
|
|
226
|
+
FAISS_THROW_IF_NOT(0 <= id && id < ntotal);
|
|
223
227
|
|
|
224
228
|
std::vector<float> r3(d);
|
|
225
229
|
refine_pq.decode(&refine_codes[id * refine_pq.code_size], r3.data());
|