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
|
@@ -26,10 +26,10 @@ namespace faiss {
|
|
|
26
26
|
********************************************************************/
|
|
27
27
|
|
|
28
28
|
IndexScalarQuantizer::IndexScalarQuantizer(
|
|
29
|
-
int
|
|
29
|
+
int d_in,
|
|
30
30
|
ScalarQuantizer::QuantizerType qtype,
|
|
31
31
|
MetricType metric)
|
|
32
|
-
: IndexFlatCodes(0,
|
|
32
|
+
: IndexFlatCodes(0, d_in, metric), sq(d_in, qtype) {
|
|
33
33
|
is_trained = qtype == ScalarQuantizer::QT_fp16 ||
|
|
34
34
|
qtype == ScalarQuantizer::QT_8bit_direct ||
|
|
35
35
|
qtype == ScalarQuantizer::QT_bf16 ||
|
|
@@ -117,21 +117,26 @@ void IndexScalarQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
|
|
|
117
117
|
********************************************************************/
|
|
118
118
|
|
|
119
119
|
IndexIVFScalarQuantizer::IndexIVFScalarQuantizer(
|
|
120
|
-
Index*
|
|
121
|
-
size_t
|
|
122
|
-
size_t
|
|
120
|
+
Index* quantizer_,
|
|
121
|
+
size_t d_,
|
|
122
|
+
size_t nlist_,
|
|
123
123
|
ScalarQuantizer::QuantizerType qtype,
|
|
124
124
|
MetricType metric,
|
|
125
|
-
bool
|
|
126
|
-
bool
|
|
127
|
-
: IndexIVF(
|
|
125
|
+
bool by_residual_,
|
|
126
|
+
bool own_invlists_)
|
|
127
|
+
: IndexIVF(quantizer_, d_, nlist_, 0, metric, own_invlists_),
|
|
128
|
+
sq(d_, qtype) {
|
|
128
129
|
code_size = sq.code_size;
|
|
129
|
-
this->by_residual =
|
|
130
|
+
this->by_residual = by_residual_;
|
|
130
131
|
if (invlists) {
|
|
131
132
|
// was not known at construction time
|
|
132
133
|
invlists->code_size = code_size;
|
|
133
134
|
}
|
|
134
135
|
is_trained = false;
|
|
136
|
+
if (qtype == ScalarQuantizer::QT_0bit) {
|
|
137
|
+
by_residual = false;
|
|
138
|
+
is_trained = true; // no training needed
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
141
|
|
|
137
142
|
IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
|
|
@@ -141,7 +146,7 @@ IndexIVFScalarQuantizer::IndexIVFScalarQuantizer() : IndexIVF() {
|
|
|
141
146
|
void IndexIVFScalarQuantizer::train_encoder(
|
|
142
147
|
idx_t n,
|
|
143
148
|
const float* x,
|
|
144
|
-
const idx_t* assign) {
|
|
149
|
+
const idx_t* /*assign*/) {
|
|
145
150
|
sq.train(n, x);
|
|
146
151
|
}
|
|
147
152
|
|
|
@@ -155,6 +160,19 @@ void IndexIVFScalarQuantizer::encode_vectors(
|
|
|
155
160
|
const idx_t* list_nos,
|
|
156
161
|
uint8_t* codes,
|
|
157
162
|
bool include_listnos) const {
|
|
163
|
+
if (sq.code_size == 0) {
|
|
164
|
+
// QT_0bit: nothing to encode, but handle coarse codes if needed
|
|
165
|
+
if (include_listnos) {
|
|
166
|
+
size_t coarse_size = coarse_code_size();
|
|
167
|
+
for (idx_t i = 0; i < n; i++) {
|
|
168
|
+
int64_t list_no = list_nos[i];
|
|
169
|
+
if (list_no >= 0) {
|
|
170
|
+
encode_listno(list_no, codes + i * coarse_size);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
158
176
|
std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
|
|
159
177
|
size_t coarse_size = include_listnos ? coarse_code_size() : 0;
|
|
160
178
|
memset(codes, 0, (code_size + coarse_size) * n);
|
|
@@ -185,14 +203,42 @@ void IndexIVFScalarQuantizer::encode_vectors(
|
|
|
185
203
|
void IndexIVFScalarQuantizer::decode_vectors(
|
|
186
204
|
idx_t n,
|
|
187
205
|
const uint8_t* codes,
|
|
188
|
-
const idx_t
|
|
206
|
+
const idx_t* list_nos,
|
|
189
207
|
float* x) const {
|
|
208
|
+
if (sq.code_size == 0 && list_nos) {
|
|
209
|
+
// QT_0bit: reconstruct centroids if list_nos provided
|
|
210
|
+
for (idx_t i = 0; i < n; i++) {
|
|
211
|
+
quantizer->reconstruct(list_nos[i], x + i * d);
|
|
212
|
+
}
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
190
215
|
FAISS_THROW_IF_NOT(is_trained);
|
|
191
|
-
|
|
216
|
+
sq.decode(codes, x, n);
|
|
217
|
+
if (by_residual) {
|
|
218
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
219
|
+
list_nos, "decode_vectors with by_residual requires list_nos");
|
|
220
|
+
#pragma omp parallel for if (n > 1000)
|
|
221
|
+
for (idx_t i = 0; i < n; i++) {
|
|
222
|
+
std::vector<float> centroid(d);
|
|
223
|
+
quantizer->reconstruct(list_nos[i], centroid.data());
|
|
224
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
225
|
+
x[i * d + j] += centroid[j];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
192
229
|
}
|
|
193
230
|
|
|
194
231
|
void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
|
|
195
232
|
const {
|
|
233
|
+
if (sq.code_size == 0) {
|
|
234
|
+
size_t coarse_size = coarse_code_size();
|
|
235
|
+
for (idx_t i = 0; i < n; i++) {
|
|
236
|
+
const uint8_t* code = codes + i * coarse_size;
|
|
237
|
+
int64_t list_no = decode_listno(code);
|
|
238
|
+
quantizer->reconstruct(list_no, x + i * d);
|
|
239
|
+
}
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
196
242
|
std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
|
|
197
243
|
size_t coarse_size = coarse_code_size();
|
|
198
244
|
|
|
@@ -208,7 +254,7 @@ void IndexIVFScalarQuantizer::sa_decode(idx_t n, const uint8_t* codes, float* x)
|
|
|
208
254
|
squant->decode_vector(code + coarse_size, xi);
|
|
209
255
|
if (by_residual) {
|
|
210
256
|
quantizer->reconstruct(list_no, residual.data());
|
|
211
|
-
for (size_t j = 0; j < d; j++) {
|
|
257
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
212
258
|
xi[j] += residual[j];
|
|
213
259
|
}
|
|
214
260
|
}
|
|
@@ -223,6 +269,23 @@ void IndexIVFScalarQuantizer::add_core(
|
|
|
223
269
|
const idx_t* coarse_idx,
|
|
224
270
|
void* inverted_list_context) {
|
|
225
271
|
FAISS_THROW_IF_NOT(is_trained);
|
|
272
|
+
if (sq.code_size == 0) {
|
|
273
|
+
// QT_0bit: just add IDs with empty codes
|
|
274
|
+
uint8_t dummy_code = 0;
|
|
275
|
+
DirectMapAdd dm_add(direct_map, n, xids);
|
|
276
|
+
for (idx_t i = 0; i < n; i++) {
|
|
277
|
+
int64_t list_no = coarse_idx[i];
|
|
278
|
+
if (list_no >= 0) {
|
|
279
|
+
int64_t id = xids ? xids[i] : ntotal + i;
|
|
280
|
+
size_t ofs = invlists->add_entry(list_no, id, &dummy_code);
|
|
281
|
+
dm_add.add(i, list_no, ofs);
|
|
282
|
+
} else {
|
|
283
|
+
dm_add.add(i, -1, 0);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
ntotal += n;
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
226
289
|
|
|
227
290
|
std::unique_ptr<ScalarQuantizer::SQuantizer> squant(sq.select_quantizer());
|
|
228
291
|
|
|
@@ -236,7 +299,7 @@ void IndexIVFScalarQuantizer::add_core(
|
|
|
236
299
|
int rank = omp_get_thread_num();
|
|
237
300
|
|
|
238
301
|
// each thread takes care of a subset of lists
|
|
239
|
-
for (
|
|
302
|
+
for (idx_t i = 0; i < n; i++) {
|
|
240
303
|
int64_t list_no = coarse_idx[i];
|
|
241
304
|
if (list_no >= 0 && list_no % nt == rank) {
|
|
242
305
|
int64_t id = xids ? xids[i] : ntotal + i;
|
|
@@ -276,6 +339,11 @@ void IndexIVFScalarQuantizer::reconstruct_from_offset(
|
|
|
276
339
|
int64_t list_no,
|
|
277
340
|
int64_t offset,
|
|
278
341
|
float* recons) const {
|
|
342
|
+
if (sq.code_size == 0) {
|
|
343
|
+
// QT_0bit: reconstruct from centroid
|
|
344
|
+
quantizer->reconstruct(list_no, recons);
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
279
347
|
const uint8_t* code = invlists->get_single_code(list_no, offset);
|
|
280
348
|
|
|
281
349
|
if (by_residual) {
|
|
@@ -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
|