faiss 0.6.0 → 0.6.2
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/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 +88 -97
- 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 +89 -417
- 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 +374 -206
- 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 +467 -364
- data/vendor/faiss/faiss/IndexIVF.h +33 -12
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +79 -76
- 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 +39 -69
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +56 -33
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +73 -846
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -20
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +30 -52
- 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 +38 -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 +150 -20
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
- 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/SaDecodeKernels.h +1 -1
- 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/Level2-neon-inl.h +902 -12
- 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/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
- data/vendor/faiss/faiss/factory_tools.cpp +9 -0
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +15 -16
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +5 -4
- 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/MetalDistance.h +87 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +58 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +181 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +111 -0
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -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/gpu_metal/impl/MetalIVFFlat.h +193 -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 +639 -507
- data/vendor/faiss/faiss/impl/HNSW.h +61 -44
- 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 +53 -32
- 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 +269 -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 +55 -25
- 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 +302 -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 +100 -75
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +318 -7
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +77 -1
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +10 -10
- data/vendor/faiss/faiss/impl/VisitedTable.h +70 -28
- 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 +270 -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 +83 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +113 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +150 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +142 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1227 -79
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
- data/vendor/faiss/faiss/impl/index_write.cpp +96 -13
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +58 -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 +15 -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 +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +23 -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 +45 -107
- 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 +274 -5
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +10 -7
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +70 -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 +9 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +419 -19
- 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 +387 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +559 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +341 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +425 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +290 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +337 -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 +157 -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 +90 -18
- data/vendor/faiss/faiss/index_io.h +40 -0
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +28 -15
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +170 -86
- data/vendor/faiss/faiss/invlists/InvertedLists.h +88 -25
- 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 +142 -21
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +33 -7
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +77 -27
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +10 -4
- 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/bf16.h +34 -0
- 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 -178
- 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 +16 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.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 +210 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -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 -989
- 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 +1031 -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_avx512_spr.cpp +343 -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 +29 -7
- 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 +129 -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
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
#include <omp.h>
|
|
16
16
|
|
|
17
|
+
#include <faiss/impl/ResultHandler.h>
|
|
18
|
+
#include <faiss/impl/expanded_scanners.h>
|
|
19
|
+
|
|
17
20
|
#include <faiss/impl/FaissAssert.h>
|
|
18
21
|
#include <faiss/impl/IDSelector.h>
|
|
19
22
|
#include <faiss/impl/ScalarQuantizer.h>
|
|
@@ -26,10 +29,10 @@ namespace faiss {
|
|
|
26
29
|
********************************************************************/
|
|
27
30
|
|
|
28
31
|
IndexScalarQuantizer::IndexScalarQuantizer(
|
|
29
|
-
int
|
|
32
|
+
int d_in,
|
|
30
33
|
ScalarQuantizer::QuantizerType qtype,
|
|
31
34
|
MetricType metric)
|
|
32
|
-
: IndexFlatCodes(0,
|
|
35
|
+
: IndexFlatCodes(0, d_in, metric), sq(d_in, qtype) {
|
|
33
36
|
is_trained = qtype == ScalarQuantizer::QT_fp16 ||
|
|
34
37
|
qtype == ScalarQuantizer::QT_8bit_direct ||
|
|
35
38
|
qtype == ScalarQuantizer::QT_bf16 ||
|
|
@@ -117,21 +120,29 @@ void IndexScalarQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
|
|
|
117
120
|
********************************************************************/
|
|
118
121
|
|
|
119
122
|
IndexIVFScalarQuantizer::IndexIVFScalarQuantizer(
|
|
120
|
-
Index*
|
|
121
|
-
size_t
|
|
122
|
-
size_t
|
|
123
|
+
Index* quantizer_,
|
|
124
|
+
size_t d_,
|
|
125
|
+
size_t nlist_,
|
|
123
126
|
ScalarQuantizer::QuantizerType qtype,
|
|
124
127
|
MetricType metric,
|
|
125
|
-
bool
|
|
126
|
-
bool
|
|
127
|
-
: IndexIVF(
|
|
128
|
+
bool by_residual_,
|
|
129
|
+
bool own_invlists_)
|
|
130
|
+
: IndexIVF(quantizer_, d_, nlist_, 0, metric, own_invlists_),
|
|
131
|
+
sq(d_, qtype) {
|
|
128
132
|
code_size = sq.code_size;
|
|
129
|
-
this->by_residual =
|
|
133
|
+
this->by_residual = by_residual_;
|
|
130
134
|
if (invlists) {
|
|
131
135
|
// was not known at construction time
|
|
132
136
|
invlists->code_size = code_size;
|
|
133
137
|
}
|
|
134
138
|
is_trained = false;
|
|
139
|
+
if (qtype == ScalarQuantizer::QT_0bit) {
|
|
140
|
+
by_residual = false;
|
|
141
|
+
is_trained = true; // no training needed
|
|
142
|
+
}
|
|
143
|
+
if (ScalarQuantizer::TurboQuantRefine::is_turboq_full(qtype)) {
|
|
144
|
+
by_residual = false;
|
|
145
|
+
}
|
|
135
146
|
}
|
|
136
147
|
|
|
137
148
|
IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
|
|
@@ -141,7 +152,7 @@ IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
|
|
|
141
152
|
void IndexIVFScalarQuantizer::train_encoder(
|
|
142
153
|
idx_t n,
|
|
143
154
|
const float* x,
|
|
144
|
-
const idx_t* assign) {
|
|
155
|
+
const idx_t* /*assign*/) {
|
|
145
156
|
sq.train(n, x);
|
|
146
157
|
}
|
|
147
158
|
|
|
@@ -155,6 +166,19 @@ void IndexIVFScalarQuantizer::encode_vectors(
|
|
|
155
166
|
const idx_t* list_nos,
|
|
156
167
|
uint8_t* codes,
|
|
157
168
|
bool include_listnos) const {
|
|
169
|
+
if (sq.code_size == 0) {
|
|
170
|
+
// QT_0bit: nothing to encode, but handle coarse codes if needed
|
|
171
|
+
if (include_listnos) {
|
|
172
|
+
size_t coarse_size = coarse_code_size();
|
|
173
|
+
for (idx_t i = 0; i < n; i++) {
|
|
174
|
+
int64_t list_no = list_nos[i];
|
|
175
|
+
if (list_no >= 0) {
|
|
176
|
+
encode_listno(list_no, codes + i * coarse_size);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
158
182
|
std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
|
|
159
183
|
size_t coarse_size = include_listnos ? coarse_code_size() : 0;
|
|
160
184
|
memset(codes, 0, (code_size + coarse_size) * n);
|
|
@@ -185,14 +209,42 @@ void IndexIVFScalarQuantizer::encode_vectors(
|
|
|
185
209
|
void IndexIVFScalarQuantizer::decode_vectors(
|
|
186
210
|
idx_t n,
|
|
187
211
|
const uint8_t* codes,
|
|
188
|
-
const idx_t
|
|
212
|
+
const idx_t* list_nos,
|
|
189
213
|
float* x) const {
|
|
214
|
+
if (sq.code_size == 0 && list_nos) {
|
|
215
|
+
// QT_0bit: reconstruct centroids if list_nos provided
|
|
216
|
+
for (idx_t i = 0; i < n; i++) {
|
|
217
|
+
quantizer->reconstruct(list_nos[i], x + i * d);
|
|
218
|
+
}
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
190
221
|
FAISS_THROW_IF_NOT(is_trained);
|
|
191
|
-
|
|
222
|
+
sq.decode(codes, x, n);
|
|
223
|
+
if (by_residual) {
|
|
224
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
225
|
+
list_nos, "decode_vectors with by_residual requires list_nos");
|
|
226
|
+
#pragma omp parallel for if (n > 1000)
|
|
227
|
+
for (idx_t i = 0; i < n; i++) {
|
|
228
|
+
std::vector<float> centroid(d);
|
|
229
|
+
quantizer->reconstruct(list_nos[i], centroid.data());
|
|
230
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
231
|
+
x[i * d + j] += centroid[j];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
192
235
|
}
|
|
193
236
|
|
|
194
237
|
void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
|
|
195
238
|
const {
|
|
239
|
+
if (sq.code_size == 0) {
|
|
240
|
+
size_t coarse_size = coarse_code_size();
|
|
241
|
+
for (idx_t i = 0; i < n; i++) {
|
|
242
|
+
const uint8_t* code = codes + i * coarse_size;
|
|
243
|
+
int64_t list_no = decode_listno(code);
|
|
244
|
+
quantizer->reconstruct(list_no, x + i * d);
|
|
245
|
+
}
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
196
248
|
std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
|
|
197
249
|
size_t coarse_size = coarse_code_size();
|
|
198
250
|
|
|
@@ -208,7 +260,7 @@ void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
|
|
|
208
260
|
squant->decode_vector(code + coarse_size, xi);
|
|
209
261
|
if (by_residual) {
|
|
210
262
|
quantizer->reconstruct(list_no, residual.data());
|
|
211
|
-
for (size_t j = 0; j < d; j++) {
|
|
263
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
212
264
|
xi[j] += residual[j];
|
|
213
265
|
}
|
|
214
266
|
}
|
|
@@ -223,6 +275,23 @@ void IndexIVFScalarQuantizer::add_core(
|
|
|
223
275
|
const idx_t* coarse_idx,
|
|
224
276
|
void* inverted_list_context) {
|
|
225
277
|
FAISS_THROW_IF_NOT(is_trained);
|
|
278
|
+
if (sq.code_size == 0) {
|
|
279
|
+
// QT_0bit: just add IDs with empty codes
|
|
280
|
+
uint8_t dummy_code = 0;
|
|
281
|
+
DirectMapAdd dm_add(direct_map, n, xids);
|
|
282
|
+
for (idx_t i = 0; i < n; i++) {
|
|
283
|
+
int64_t list_no = coarse_idx[i];
|
|
284
|
+
if (list_no >= 0) {
|
|
285
|
+
int64_t id = xids ? xids[i] : ntotal + i;
|
|
286
|
+
size_t ofs = invlists->add_entry(list_no, id, &dummy_code);
|
|
287
|
+
dm_add.add(i, list_no, ofs);
|
|
288
|
+
} else {
|
|
289
|
+
dm_add.add(i, -1, 0);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
ntotal += n;
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
226
295
|
|
|
227
296
|
std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
|
|
228
297
|
|
|
@@ -236,7 +305,7 @@ void IndexIVFScalarQuantizer::add_core(
|
|
|
236
305
|
int rank = omp_get_thread_num();
|
|
237
306
|
|
|
238
307
|
// each thread takes care of a subset of lists
|
|
239
|
-
for (
|
|
308
|
+
for (idx_t i = 0; i < n; i++) {
|
|
240
309
|
int64_t list_no = coarse_idx[i];
|
|
241
310
|
if (list_no >= 0 && list_no % nt == rank) {
|
|
242
311
|
int64_t id = xids ? xids[i] : ntotal + i;
|
|
@@ -267,27 +336,88 @@ void IndexIVFScalarQuantizer::add_core(
|
|
|
267
336
|
InvertedListScanner* IndexIVFScalarQuantizer::get_InvertedListScanner(
|
|
268
337
|
bool store_pairs,
|
|
269
338
|
const IDSelector* sel,
|
|
270
|
-
const IVFSearchParameters*) const {
|
|
271
|
-
|
|
272
|
-
|
|
339
|
+
const IVFSearchParameters* search_params) const {
|
|
340
|
+
if (!ScalarQuantizer::TurboQuantRefine::is_turboq_full(sq.qtype)) {
|
|
341
|
+
return sq.select_InvertedListScanner(
|
|
342
|
+
metric_type, quantizer, store_pairs, sel, by_residual);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// TurboQ full types: create a TQ-specific scanner that supports
|
|
346
|
+
// search params (qb, int_qjl) and pre-screening.
|
|
347
|
+
uint8_t tq_qb = 0;
|
|
348
|
+
bool tq_int_qjl = false;
|
|
349
|
+
if (auto* tp = dynamic_cast<const IVFSQTurboQSearchParameters*>(
|
|
350
|
+
search_params)) {
|
|
351
|
+
tq_qb = tp->qb;
|
|
352
|
+
tq_int_qjl = tp->int_qjl;
|
|
353
|
+
}
|
|
354
|
+
using TurboQDC = ScalarQuantizer::TurboQuantRefine::DistanceComputer;
|
|
355
|
+
auto* dc = static_cast<TurboQDC*>(sq.get_distance_computer(metric_type));
|
|
356
|
+
dc->configure(tq_qb, tq_int_qjl);
|
|
357
|
+
|
|
358
|
+
struct TQScanner : InvertedListScanner {
|
|
359
|
+
std::unique_ptr<TurboQDC> dc;
|
|
360
|
+
|
|
361
|
+
explicit TQScanner(
|
|
362
|
+
TurboQDC* dc_in,
|
|
363
|
+
bool store_pairs_in,
|
|
364
|
+
const IDSelector* sel_in,
|
|
365
|
+
bool keep_max_in)
|
|
366
|
+
: InvertedListScanner(store_pairs_in, sel_in), dc(dc_in) {
|
|
367
|
+
this->keep_max = keep_max_in;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
void set_query(const float* query) override {
|
|
371
|
+
dc->set_query(query);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
void set_list(idx_t list_no_in, float) override {
|
|
375
|
+
this->list_no = list_no_in;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
float distance_to_code(const uint8_t* code) const final {
|
|
379
|
+
return dc->distance_to_code(code);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
size_t scan_codes(
|
|
383
|
+
size_t list_size,
|
|
384
|
+
const uint8_t* codes,
|
|
385
|
+
const idx_t* ids,
|
|
386
|
+
ResultHandler& handler) const override {
|
|
387
|
+
dc->set_prescreen_threshold(&handler.threshold, !keep_max);
|
|
388
|
+
size_t nup = run_scan_codes(*this, list_size, codes, ids, handler);
|
|
389
|
+
dc->clear_prescreen_threshold();
|
|
390
|
+
return nup;
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
auto* scanner = new TQScanner(
|
|
395
|
+
dc, store_pairs, sel, is_similarity_metric(metric_type));
|
|
396
|
+
scanner->code_size = code_size;
|
|
397
|
+
return scanner;
|
|
273
398
|
}
|
|
274
399
|
|
|
275
400
|
void IndexIVFScalarQuantizer::reconstruct_from_offset(
|
|
276
401
|
int64_t list_no,
|
|
277
402
|
int64_t offset,
|
|
278
403
|
float* recons) const {
|
|
279
|
-
|
|
404
|
+
if (sq.code_size == 0) {
|
|
405
|
+
// QT_0bit: reconstruct from centroid
|
|
406
|
+
quantizer->reconstruct(list_no, recons);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
InvertedLists::ScopedCodes sc(invlists, list_no, offset);
|
|
280
410
|
|
|
281
411
|
if (by_residual) {
|
|
282
412
|
std::vector<float> centroid(d);
|
|
283
413
|
quantizer->reconstruct(list_no, centroid.data());
|
|
284
414
|
|
|
285
|
-
sq.decode(
|
|
415
|
+
sq.decode(sc.get(), recons, 1);
|
|
286
416
|
for (int i = 0; i < d; ++i) {
|
|
287
417
|
recons[i] += centroid[i];
|
|
288
418
|
}
|
|
289
419
|
} else {
|
|
290
|
-
sq.decode(
|
|
420
|
+
sq.decode(sc.get(), recons, 1);
|
|
291
421
|
}
|
|
292
422
|
}
|
|
293
423
|
|
|
@@ -63,6 +63,16 @@ struct IndexScalarQuantizer : IndexFlatCodes {
|
|
|
63
63
|
* distances are computed.
|
|
64
64
|
*/
|
|
65
65
|
|
|
66
|
+
/// Search parameters for TurboQuant full types (QT_*_tq).
|
|
67
|
+
struct IVFSQTurboQSearchParameters : IVFSearchParameters {
|
|
68
|
+
/// Query quantization bits for integer MSE pre-screening.
|
|
69
|
+
/// 0 = float path (default), 1-8 = integer popcount path.
|
|
70
|
+
uint8_t qb = 0;
|
|
71
|
+
|
|
72
|
+
/// Also use integer popcount for QJL stage (requires qb > 0).
|
|
73
|
+
bool int_qjl = false;
|
|
74
|
+
};
|
|
75
|
+
|
|
66
76
|
struct IndexIVFScalarQuantizer : IndexIVF {
|
|
67
77
|
ScalarQuantizer sq;
|
|
68
78
|
|
|
@@ -46,27 +46,28 @@ void translate_labels(int64_t n, idx_t* labels, int64_t translation) {
|
|
|
46
46
|
|
|
47
47
|
template <typename IndexT>
|
|
48
48
|
IndexShardsTemplate<IndexT>::IndexShardsTemplate(
|
|
49
|
-
idx_t
|
|
49
|
+
idx_t d_,
|
|
50
50
|
bool threaded,
|
|
51
|
-
bool
|
|
52
|
-
: ThreadedIndex<IndexT>(
|
|
51
|
+
bool successive_ids_)
|
|
52
|
+
: ThreadedIndex<IndexT>(static_cast<int>(d_), threaded),
|
|
53
|
+
successive_ids(successive_ids_) {
|
|
53
54
|
sync_d(this);
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
template <typename IndexT>
|
|
57
58
|
IndexShardsTemplate<IndexT>::IndexShardsTemplate(
|
|
58
|
-
int
|
|
59
|
+
int d_,
|
|
59
60
|
bool threaded,
|
|
60
|
-
bool
|
|
61
|
-
: ThreadedIndex<IndexT>(
|
|
61
|
+
bool successive_ids_)
|
|
62
|
+
: ThreadedIndex<IndexT>(d_, threaded), successive_ids(successive_ids_) {
|
|
62
63
|
sync_d(this);
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
template <typename IndexT>
|
|
66
67
|
IndexShardsTemplate<IndexT>::IndexShardsTemplate(
|
|
67
68
|
bool threaded,
|
|
68
|
-
bool
|
|
69
|
-
: ThreadedIndex<IndexT>(threaded), successive_ids(
|
|
69
|
+
bool successive_ids_)
|
|
70
|
+
: ThreadedIndex<IndexT>(threaded), successive_ids(successive_ids_) {
|
|
70
71
|
sync_d(this);
|
|
71
72
|
}
|
|
72
73
|
|
|
@@ -202,7 +203,7 @@ void IndexShardsTemplate<IndexT>::search(
|
|
|
202
203
|
const SearchParameters* params) const {
|
|
203
204
|
FAISS_THROW_IF_NOT(k > 0);
|
|
204
205
|
|
|
205
|
-
|
|
206
|
+
int nshard = this->count();
|
|
206
207
|
|
|
207
208
|
std::vector<distance_t> all_distances(nshard * k * n);
|
|
208
209
|
std::vector<idx_t> all_labels(nshard * k * n);
|
|
@@ -43,13 +43,14 @@ void translate_labels(int64_t n, idx_t* labels, int64_t translation) {
|
|
|
43
43
|
************************************************************/
|
|
44
44
|
|
|
45
45
|
IndexShardsIVF::IndexShardsIVF(
|
|
46
|
-
Index*
|
|
47
|
-
size_t
|
|
46
|
+
Index* quantizer_,
|
|
47
|
+
size_t nlist_,
|
|
48
48
|
bool threaded,
|
|
49
|
-
bool
|
|
50
|
-
: IndexShardsTemplate<Index>(
|
|
51
|
-
Level1Quantizer(
|
|
52
|
-
is_trained =
|
|
49
|
+
bool successive_ids_)
|
|
50
|
+
: IndexShardsTemplate<Index>(quantizer_->d, threaded, successive_ids_),
|
|
51
|
+
Level1Quantizer(quantizer_, nlist_) {
|
|
52
|
+
is_trained = quantizer_->is_trained &&
|
|
53
|
+
quantizer_->ntotal == static_cast<idx_t>(nlist_);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
void IndexShardsIVF::addIndex(Index* index) {
|
|
@@ -73,11 +74,11 @@ void IndexShardsIVF::train(idx_t n, const component_t* x) {
|
|
|
73
74
|
for (size_t i = 0; i < indices_.size(); i++) {
|
|
74
75
|
Index* index = indices_[i].first;
|
|
75
76
|
auto index_ivf = dynamic_cast<IndexIVFInterface*>(index);
|
|
76
|
-
Index*
|
|
77
|
-
if (!
|
|
78
|
-
|
|
77
|
+
Index* sub_quantizer = index_ivf->quantizer;
|
|
78
|
+
if (!sub_quantizer->is_trained) {
|
|
79
|
+
sub_quantizer->train(nlist, centroids.data());
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
+
sub_quantizer->add(nlist, centroids.data());
|
|
81
82
|
// finish training
|
|
82
83
|
index->train(n, x);
|
|
83
84
|
}
|
|
@@ -132,9 +133,9 @@ void IndexShardsIVF::add_with_ids(
|
|
|
132
133
|
}
|
|
133
134
|
ids = aids.data();
|
|
134
135
|
}
|
|
135
|
-
idx_t
|
|
136
|
+
idx_t cur_d = this->d;
|
|
136
137
|
|
|
137
|
-
auto fn = [n, ids, x, nshard,
|
|
138
|
+
auto fn = [n, ids, x, nshard, cur_d, Iq](int no, Index* index) {
|
|
138
139
|
idx_t i0 = (idx_t)no * n / nshard;
|
|
139
140
|
idx_t i1 = ((idx_t)no + 1) * n / nshard;
|
|
140
141
|
auto index_ivf = dynamic_cast<IndexIVF*>(index);
|
|
@@ -144,7 +145,10 @@ void IndexShardsIVF::add_with_ids(
|
|
|
144
145
|
}
|
|
145
146
|
|
|
146
147
|
index_ivf->add_core(
|
|
147
|
-
i1 - i0,
|
|
148
|
+
i1 - i0,
|
|
149
|
+
x + i0 * cur_d,
|
|
150
|
+
ids ? ids + i0 : nullptr,
|
|
151
|
+
Iq.data() + i0);
|
|
148
152
|
|
|
149
153
|
if (index->verbose) {
|
|
150
154
|
printf("end add shard %d on %" PRId64 " points\n", no, i1 - i0);
|
|
@@ -179,7 +183,7 @@ void IndexShardsIVF::search(
|
|
|
179
183
|
|
|
180
184
|
quantizer->search(n, x, nprobe, Dq.data(), Iq.data());
|
|
181
185
|
|
|
182
|
-
|
|
186
|
+
int nshard = this->count();
|
|
183
187
|
|
|
184
188
|
std::vector<distance_t> all_distances(nshard * k * n);
|
|
185
189
|
std::vector<idx_t> all_labels(nshard * k * n);
|
|
@@ -199,7 +203,9 @@ void IndexShardsIVF::search(
|
|
|
199
203
|
|
|
200
204
|
auto index = dynamic_cast<const IndexIVFInterface*>(indexIn);
|
|
201
205
|
|
|
202
|
-
FAISS_THROW_IF_NOT_MSG(
|
|
206
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
207
|
+
index->nprobe == static_cast<size_t>(nprobe),
|
|
208
|
+
"inconsistent nprobe");
|
|
203
209
|
|
|
204
210
|
index->search_preassigned(
|
|
205
211
|
n,
|
|
@@ -52,7 +52,7 @@ void MatrixStats::PerDimStats::compute_mean_std() {
|
|
|
52
52
|
if (var < 0) {
|
|
53
53
|
var = 0;
|
|
54
54
|
}
|
|
55
|
-
stddev = sqrt(var);
|
|
55
|
+
stddev = std::sqrt(var);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
void MatrixStats::do_comment(const char* fmt, ...) {
|
|
@@ -67,7 +67,8 @@ void MatrixStats::do_comment(const char* fmt, ...) {
|
|
|
67
67
|
buf += size;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
MatrixStats::MatrixStats(size_t
|
|
70
|
+
MatrixStats::MatrixStats(size_t n_in, size_t d_in, const float* x)
|
|
71
|
+
: n(n_in), d(d_in) {
|
|
71
72
|
std::vector<char> comment_buf(10000);
|
|
72
73
|
buf = comment_buf.data();
|
|
73
74
|
nbuf = comment_buf.size();
|
|
@@ -162,8 +163,8 @@ MatrixStats::MatrixStats(size_t n, size_t d, const float* x) : n(n), d(d) {
|
|
|
162
163
|
}
|
|
163
164
|
|
|
164
165
|
{ // norm stats
|
|
165
|
-
min_norm2 = sqrt(min_norm2);
|
|
166
|
-
max_norm2 = sqrt(max_norm2);
|
|
166
|
+
min_norm2 = std::sqrt(min_norm2);
|
|
167
|
+
max_norm2 = std::sqrt(max_norm2);
|
|
167
168
|
do_comment(
|
|
168
169
|
"range of L2 norms=[%g, %g] (%zd null vectors)\n",
|
|
169
170
|
min_norm2,
|
|
@@ -27,8 +27,8 @@ namespace faiss {
|
|
|
27
27
|
* IndexSplitVectors implementation
|
|
28
28
|
*******************************************************/
|
|
29
29
|
|
|
30
|
-
IndexSplitVectors::IndexSplitVectors(idx_t
|
|
31
|
-
: Index(
|
|
30
|
+
IndexSplitVectors::IndexSplitVectors(idx_t d_in, bool threaded_in)
|
|
31
|
+
: Index(d_in), own_fields(false), threaded(threaded_in), sum_d(0) {}
|
|
32
32
|
|
|
33
33
|
void IndexSplitVectors::add_sub_index(Index* index) {
|
|
34
34
|
sub_indexes.push_back(index);
|
|
@@ -44,7 +44,7 @@ void IndexSplitVectors::sync_with_sub_indexes() {
|
|
|
44
44
|
metric_type = index0->metric_type;
|
|
45
45
|
is_trained = index0->is_trained;
|
|
46
46
|
ntotal = index0->ntotal;
|
|
47
|
-
for (
|
|
47
|
+
for (size_t i = 1; i < sub_indexes.size(); i++) {
|
|
48
48
|
Index* index = sub_indexes[i];
|
|
49
49
|
FAISS_THROW_IF_NOT(metric_type == index->metric_type);
|
|
50
50
|
FAISS_THROW_IF_NOT(ntotal == index->ntotal);
|
|
@@ -88,7 +88,7 @@ void IndexSplitVectors::search(
|
|
|
88
88
|
n);
|
|
89
89
|
}
|
|
90
90
|
const Index* sub_index = index->sub_indexes[no];
|
|
91
|
-
int64_t sub_d = sub_index->d
|
|
91
|
+
int64_t sub_d = sub_index->d;
|
|
92
92
|
idx_t ofs = 0;
|
|
93
93
|
for (int i = 0; i < no; i++) {
|
|
94
94
|
ofs += index->sub_indexes[i]->d;
|
|
@@ -107,17 +107,18 @@ void IndexSplitVectors::search(
|
|
|
107
107
|
};
|
|
108
108
|
|
|
109
109
|
if (!threaded) {
|
|
110
|
-
for (
|
|
111
|
-
query_func(i);
|
|
110
|
+
for (int64_t i = 0; i < nshard; i++) {
|
|
111
|
+
query_func(static_cast<int>(i));
|
|
112
112
|
}
|
|
113
113
|
} else {
|
|
114
114
|
std::vector<std::unique_ptr<WorkerThread>> threads;
|
|
115
115
|
std::vector<std::future<bool>> v;
|
|
116
116
|
|
|
117
|
-
for (
|
|
117
|
+
for (int64_t i = 0; i < nshard; i++) {
|
|
118
118
|
threads.emplace_back(new WorkerThread());
|
|
119
119
|
WorkerThread* wt = threads.back().get();
|
|
120
|
-
v.emplace_back(wt->add(
|
|
120
|
+
v.emplace_back(wt->add(
|
|
121
|
+
[i, query_func]() { query_func(static_cast<int>(i)); }));
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// Blocking wait for completion
|
|
@@ -155,7 +156,7 @@ void IndexSplitVectors::reset() {
|
|
|
155
156
|
|
|
156
157
|
IndexSplitVectors::~IndexSplitVectors() {
|
|
157
158
|
if (own_fields) {
|
|
158
|
-
for (
|
|
159
|
+
for (size_t s = 0; s < sub_indexes.size(); s++) {
|
|
159
160
|
delete sub_indexes[s];
|
|
160
161
|
}
|
|
161
162
|
}
|
|
@@ -166,12 +167,12 @@ IndexSplitVectors::~IndexSplitVectors() {
|
|
|
166
167
|
*/
|
|
167
168
|
|
|
168
169
|
IndexRandom::IndexRandom(
|
|
169
|
-
idx_t
|
|
170
|
-
idx_t
|
|
171
|
-
int64_t
|
|
172
|
-
MetricType
|
|
173
|
-
: Index(
|
|
174
|
-
this->ntotal =
|
|
170
|
+
idx_t d_in,
|
|
171
|
+
idx_t ntotal_in,
|
|
172
|
+
int64_t seed_in,
|
|
173
|
+
MetricType metric_type_in)
|
|
174
|
+
: Index(d_in, metric_type_in), seed(seed_in) {
|
|
175
|
+
this->ntotal = ntotal_in;
|
|
175
176
|
is_trained = true;
|
|
176
177
|
}
|
|
177
178
|
|
|
@@ -216,7 +217,8 @@ void IndexRandom::search(
|
|
|
216
217
|
perm[j] = j;
|
|
217
218
|
}
|
|
218
219
|
for (int j = 0; j < k; j++) {
|
|
219
|
-
std::swap(
|
|
220
|
+
std::swap(
|
|
221
|
+
perm[j], perm[rng.rand_int(static_cast<int>(ntotal))]);
|
|
220
222
|
I[j] = perm[j];
|
|
221
223
|
}
|
|
222
224
|
}
|
|
@@ -234,7 +236,7 @@ void IndexRandom::search(
|
|
|
234
236
|
|
|
235
237
|
void IndexRandom::reconstruct(idx_t key, float* recons) const {
|
|
236
238
|
RandomGenerator rng(seed + 123332 + key);
|
|
237
|
-
for (
|
|
239
|
+
for (int i = 0; i < d; i++) {
|
|
238
240
|
recons[i] = rng.rand_float();
|
|
239
241
|
}
|
|
240
242
|
}
|
|
@@ -24,14 +24,15 @@ namespace faiss {
|
|
|
24
24
|
/// (brute-force) indices supporting additional metric types for vector
|
|
25
25
|
/// comparison.
|
|
26
26
|
///
|
|
27
|
-
/// NOTE: when adding or removing values, update metric_type_from_int()
|
|
27
|
+
/// NOTE: when adding or removing values, update metric_type_from_int()
|
|
28
|
+
/// and metric_type_count() below.
|
|
28
29
|
enum MetricType {
|
|
29
|
-
METRIC_INNER_PRODUCT
|
|
30
|
-
METRIC_L2
|
|
31
|
-
METRIC_L1,
|
|
32
|
-
METRIC_Linf,
|
|
33
|
-
METRIC_Lp,
|
|
34
|
-
|
|
30
|
+
METRIC_INNER_PRODUCT, ///< maximum inner product search
|
|
31
|
+
METRIC_L2, ///< squared L2 search
|
|
32
|
+
METRIC_L1, ///< L1 (aka cityblock)
|
|
33
|
+
METRIC_Linf, ///< infinity distance
|
|
34
|
+
METRIC_Lp, ///< L_p distance, p is given by a faiss::Index
|
|
35
|
+
/// metric_arg
|
|
35
36
|
|
|
36
37
|
/// some additional metrics defined in scipy.spatial.distance
|
|
37
38
|
METRIC_Canberra = 20,
|
|
@@ -68,6 +69,12 @@ inline MetricType metric_type_from_int(int x) {
|
|
|
68
69
|
return static_cast<MetricType>(x);
|
|
69
70
|
}
|
|
70
71
|
|
|
72
|
+
/// Count of entries in the MetricType enum.
|
|
73
|
+
constexpr size_t metric_type_count() {
|
|
74
|
+
return (METRIC_Lp - METRIC_INNER_PRODUCT) + 1 +
|
|
75
|
+
(METRIC_GOWER - METRIC_Canberra) + 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
71
78
|
} // namespace faiss
|
|
72
79
|
|
|
73
80
|
#endif
|