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
|
@@ -58,7 +58,7 @@ struct IndexBinary {
|
|
|
58
58
|
} else {
|
|
59
59
|
FAISS_THROW_MSG("IndexBinary::train: unsupported numeric type");
|
|
60
60
|
}
|
|
61
|
-
}
|
|
61
|
+
}
|
|
62
62
|
|
|
63
63
|
/** Add n vectors of dimension d to the index.
|
|
64
64
|
*
|
|
@@ -72,7 +72,7 @@ struct IndexBinary {
|
|
|
72
72
|
} else {
|
|
73
73
|
FAISS_THROW_MSG("IndexBinary::add: unsupported numeric type");
|
|
74
74
|
}
|
|
75
|
-
}
|
|
75
|
+
}
|
|
76
76
|
|
|
77
77
|
/** Same as add, but stores xids instead of sequential ids.
|
|
78
78
|
*
|
|
@@ -93,7 +93,7 @@ struct IndexBinary {
|
|
|
93
93
|
FAISS_THROW_MSG(
|
|
94
94
|
"IndexBinary::add_with_ids: unsupported numeric type");
|
|
95
95
|
}
|
|
96
|
-
}
|
|
96
|
+
}
|
|
97
97
|
|
|
98
98
|
/** Query n vectors of dimension d to the index.
|
|
99
99
|
*
|
|
@@ -129,7 +129,7 @@ struct IndexBinary {
|
|
|
129
129
|
} else {
|
|
130
130
|
FAISS_THROW_MSG("IndexBinary::search: unsupported numeric type");
|
|
131
131
|
}
|
|
132
|
-
}
|
|
132
|
+
}
|
|
133
133
|
|
|
134
134
|
/** Query n vectors of dimension d to the index.
|
|
135
135
|
*
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
namespace faiss {
|
|
20
20
|
|
|
21
|
-
IndexBinaryFlat::IndexBinaryFlat(idx_t
|
|
21
|
+
IndexBinaryFlat::IndexBinaryFlat(idx_t d_) : IndexBinary(d_) {}
|
|
22
22
|
|
|
23
23
|
void IndexBinaryFlat::add(idx_t n, const uint8_t* x) {
|
|
24
24
|
xb.insert(xb.end(), x, x + n * code_size);
|
|
@@ -18,10 +18,10 @@ namespace faiss {
|
|
|
18
18
|
|
|
19
19
|
IndexBinaryFromFloat::IndexBinaryFromFloat() = default;
|
|
20
20
|
|
|
21
|
-
IndexBinaryFromFloat::IndexBinaryFromFloat(Index*
|
|
22
|
-
: IndexBinary(
|
|
23
|
-
is_trained =
|
|
24
|
-
ntotal =
|
|
21
|
+
IndexBinaryFromFloat::IndexBinaryFromFloat(Index* index_)
|
|
22
|
+
: IndexBinary(index_->d), index(index_), own_fields(false) {
|
|
23
|
+
is_trained = index_->is_trained;
|
|
24
|
+
ntotal = index_->ntotal;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
IndexBinaryFromFloat::~IndexBinaryFromFloat() {
|
|
@@ -27,8 +27,18 @@
|
|
|
27
27
|
#include <faiss/utils/hamming.h>
|
|
28
28
|
#include <faiss/utils/random.h>
|
|
29
29
|
|
|
30
|
+
#include <faiss/impl/simd_dispatch.h>
|
|
31
|
+
|
|
30
32
|
#include <random>
|
|
31
33
|
|
|
34
|
+
// Scalar (NONE) fallback for dynamic dispatch
|
|
35
|
+
#define THE_SIMD_LEVEL SIMDLevel::NONE
|
|
36
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
37
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
38
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
|
|
39
|
+
#include <faiss/utils/hamming_distance/hamming_computer-generic.h>
|
|
40
|
+
#undef THE_SIMD_LEVEL
|
|
41
|
+
|
|
32
42
|
namespace faiss {
|
|
33
43
|
|
|
34
44
|
/**************************************************************
|
|
@@ -61,10 +71,8 @@ void hnsw_add_vertices(
|
|
|
61
71
|
printf(" max_level = %d\n", max_level);
|
|
62
72
|
}
|
|
63
73
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
omp_init_lock(&locks[i]);
|
|
67
|
-
}
|
|
74
|
+
auto& locks = index_hnsw.locks;
|
|
75
|
+
locks.prepare(ntotal);
|
|
68
76
|
|
|
69
77
|
// add vectors from highest to lowest level
|
|
70
78
|
std::vector<int> hist;
|
|
@@ -73,10 +81,11 @@ void hnsw_add_vertices(
|
|
|
73
81
|
{ // make buckets with vectors of the same level
|
|
74
82
|
|
|
75
83
|
// build histogram
|
|
76
|
-
for (
|
|
77
|
-
HNSW::storage_idx_t pt_id =
|
|
84
|
+
for (size_t i = 0; i < n; i++) {
|
|
85
|
+
HNSW::storage_idx_t pt_id =
|
|
86
|
+
static_cast<HNSW::storage_idx_t>(i + n0);
|
|
78
87
|
int pt_level = hnsw.levels[pt_id] - 1;
|
|
79
|
-
while (pt_level >= hist.size()) {
|
|
88
|
+
while (pt_level >= static_cast<int>(hist.size())) {
|
|
80
89
|
hist.push_back(0);
|
|
81
90
|
}
|
|
82
91
|
hist[pt_level]++;
|
|
@@ -84,13 +93,14 @@ void hnsw_add_vertices(
|
|
|
84
93
|
|
|
85
94
|
// accumulate
|
|
86
95
|
std::vector<int> offsets(hist.size() + 1, 0);
|
|
87
|
-
for (
|
|
96
|
+
for (size_t i = 0; i < hist.size() - 1; i++) {
|
|
88
97
|
offsets[i + 1] = offsets[i] + hist[i];
|
|
89
98
|
}
|
|
90
99
|
|
|
91
100
|
// bucket sort
|
|
92
|
-
for (
|
|
93
|
-
HNSW::storage_idx_t pt_id =
|
|
101
|
+
for (size_t i = 0; i < n; i++) {
|
|
102
|
+
HNSW::storage_idx_t pt_id =
|
|
103
|
+
static_cast<HNSW::storage_idx_t>(i + n0);
|
|
94
104
|
int pt_level = hnsw.levels[pt_id] - 1;
|
|
95
105
|
order[offsets[pt_level]++] = pt_id;
|
|
96
106
|
}
|
|
@@ -99,20 +109,22 @@ void hnsw_add_vertices(
|
|
|
99
109
|
{ // perform add
|
|
100
110
|
RandomGenerator rng2(789);
|
|
101
111
|
|
|
102
|
-
|
|
112
|
+
size_t i1 = static_cast<int>(n);
|
|
103
113
|
|
|
104
|
-
for (int pt_level = hist.size() - 1;
|
|
114
|
+
for (int pt_level = static_cast<int>(hist.size()) - 1;
|
|
105
115
|
pt_level >= int(!index_hnsw.init_level0);
|
|
106
116
|
pt_level--) {
|
|
107
|
-
|
|
117
|
+
size_t i0 = i1 - hist[pt_level];
|
|
108
118
|
|
|
109
119
|
if (verbose) {
|
|
110
|
-
printf("Adding %
|
|
120
|
+
printf("Adding %zu elements at level %d\n", i1 - i0, pt_level);
|
|
111
121
|
}
|
|
112
122
|
|
|
113
123
|
// random permutation to get rid of dataset order bias
|
|
114
|
-
for (
|
|
115
|
-
std::swap(
|
|
124
|
+
for (size_t j = i0; j < i1; j++) {
|
|
125
|
+
std::swap(
|
|
126
|
+
order[j],
|
|
127
|
+
order[j + rng2.rand_int(static_cast<int>(i1 - j))]);
|
|
116
128
|
}
|
|
117
129
|
|
|
118
130
|
#pragma omp parallel
|
|
@@ -121,11 +133,11 @@ void hnsw_add_vertices(
|
|
|
121
133
|
|
|
122
134
|
std::unique_ptr<DistanceComputer> dis(
|
|
123
135
|
index_hnsw.get_distance_computer());
|
|
124
|
-
|
|
125
|
-
|
|
136
|
+
bool do_display = verbose && omp_get_thread_num() == 0;
|
|
137
|
+
size_t prev_display = 0;
|
|
126
138
|
|
|
127
139
|
#pragma omp for schedule(dynamic)
|
|
128
|
-
for (
|
|
140
|
+
for (int64_t i = i0; i < i1; i++) {
|
|
129
141
|
HNSW::storage_idx_t pt_id = order[i];
|
|
130
142
|
dis->set_query(
|
|
131
143
|
(float*)(x + (pt_id - n0) * index_hnsw.code_size));
|
|
@@ -138,9 +150,9 @@ void hnsw_add_vertices(
|
|
|
138
150
|
vt,
|
|
139
151
|
index_hnsw.keep_max_size_level0 && (pt_level == 0));
|
|
140
152
|
|
|
141
|
-
if (
|
|
153
|
+
if (do_display && i - i0 > prev_display + 10000) {
|
|
142
154
|
prev_display = i - i0;
|
|
143
|
-
printf(" %
|
|
155
|
+
printf(" %zu / %zu\r", i - i0, i1 - i0);
|
|
144
156
|
fflush(stdout);
|
|
145
157
|
}
|
|
146
158
|
}
|
|
@@ -156,9 +168,8 @@ void hnsw_add_vertices(
|
|
|
156
168
|
if (verbose) {
|
|
157
169
|
printf("Done in %.3f ms\n", getmillisecs() - t0);
|
|
158
170
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
omp_destroy_lock(&locks[i]);
|
|
171
|
+
if (!index_hnsw.retain_locks) {
|
|
172
|
+
locks.clear();
|
|
162
173
|
}
|
|
163
174
|
}
|
|
164
175
|
|
|
@@ -172,19 +183,19 @@ IndexBinaryHNSW::IndexBinaryHNSW() {
|
|
|
172
183
|
is_trained = true;
|
|
173
184
|
}
|
|
174
185
|
|
|
175
|
-
IndexBinaryHNSW::IndexBinaryHNSW(int
|
|
176
|
-
: IndexBinary(
|
|
186
|
+
IndexBinaryHNSW::IndexBinaryHNSW(int d_, int M)
|
|
187
|
+
: IndexBinary(d_),
|
|
177
188
|
hnsw(M),
|
|
178
189
|
own_fields(true),
|
|
179
|
-
storage(new IndexBinaryFlat(
|
|
190
|
+
storage(new IndexBinaryFlat(d_)) {
|
|
180
191
|
is_trained = true;
|
|
181
192
|
}
|
|
182
193
|
|
|
183
|
-
IndexBinaryHNSW::IndexBinaryHNSW(IndexBinary*
|
|
184
|
-
: IndexBinary(
|
|
194
|
+
IndexBinaryHNSW::IndexBinaryHNSW(IndexBinary* storage_, int M)
|
|
195
|
+
: IndexBinary(storage_->d),
|
|
185
196
|
hnsw(M),
|
|
186
197
|
own_fields(false),
|
|
187
|
-
storage(
|
|
198
|
+
storage(storage_) {
|
|
188
199
|
is_trained = true;
|
|
189
200
|
}
|
|
190
201
|
|
|
@@ -222,42 +233,57 @@ void IndexBinaryHNSW::search(
|
|
|
222
233
|
using RH = HeapBlockResultHandler<HNSW::C>;
|
|
223
234
|
RH bres(n, distances_f, labels, k);
|
|
224
235
|
|
|
236
|
+
size_t n1 = 0, n2 = 0, ndis = 0, nhops = 0;
|
|
237
|
+
|
|
225
238
|
#pragma omp parallel
|
|
226
239
|
{
|
|
227
240
|
VisitedTable vt(ntotal);
|
|
228
241
|
std::unique_ptr<DistanceComputer> dis(get_distance_computer());
|
|
229
242
|
RH::SingleResultHandler res(bres);
|
|
230
243
|
|
|
231
|
-
#pragma omp for
|
|
244
|
+
#pragma omp for reduction(+ : n1, n2, ndis, nhops)
|
|
232
245
|
for (idx_t i = 0; i < n; i++) {
|
|
233
246
|
res.begin(i);
|
|
234
247
|
dis->set_query((float*)(x + i * code_size));
|
|
235
248
|
// Given that IndexBinaryHNSW is not an IndexHNSW, we pass nullptr
|
|
236
249
|
// as the index parameter. This state does not get used in the
|
|
237
|
-
// search function, as it is merely there to
|
|
250
|
+
// search function, as it is merely there to enable Panorama
|
|
238
251
|
// execution for IndexHNSWFlatPanorama.
|
|
239
|
-
hnsw.search(*dis, nullptr, res, vt, params_in);
|
|
252
|
+
HNSWStats stats = hnsw.search(*dis, nullptr, res, vt, params_in);
|
|
253
|
+
n1 += stats.n1;
|
|
254
|
+
n2 += stats.n2;
|
|
255
|
+
ndis += stats.ndis;
|
|
256
|
+
nhops += stats.nhops;
|
|
240
257
|
res.end();
|
|
241
258
|
}
|
|
242
259
|
}
|
|
243
260
|
|
|
261
|
+
hnsw_stats.combine({n1, n2, ndis, nhops});
|
|
262
|
+
|
|
244
263
|
#pragma omp parallel for
|
|
245
|
-
for (
|
|
264
|
+
for (idx_t i = 0; i < n * k; ++i) {
|
|
246
265
|
distances[i] = std::round(distances_f[i]);
|
|
247
266
|
}
|
|
248
267
|
}
|
|
249
268
|
|
|
250
269
|
void IndexBinaryHNSW::add(idx_t n, const uint8_t* x) {
|
|
251
270
|
FAISS_THROW_IF_NOT(is_trained);
|
|
252
|
-
|
|
271
|
+
size_t n0 = ntotal;
|
|
253
272
|
storage->add(n, x);
|
|
254
273
|
ntotal = storage->ntotal;
|
|
255
274
|
|
|
256
|
-
hnsw_add_vertices(
|
|
275
|
+
hnsw_add_vertices(
|
|
276
|
+
*this,
|
|
277
|
+
n0,
|
|
278
|
+
n,
|
|
279
|
+
x,
|
|
280
|
+
verbose,
|
|
281
|
+
hnsw.levels.size() == static_cast<size_t>(ntotal));
|
|
257
282
|
}
|
|
258
283
|
|
|
259
284
|
void IndexBinaryHNSW::reset() {
|
|
260
285
|
hnsw.reset();
|
|
286
|
+
locks.clear();
|
|
261
287
|
storage->reset();
|
|
262
288
|
ntotal = 0;
|
|
263
289
|
}
|
|
@@ -266,60 +292,15 @@ void IndexBinaryHNSW::reconstruct(idx_t key, uint8_t* recons) const {
|
|
|
266
292
|
storage->reconstruct(key, recons);
|
|
267
293
|
}
|
|
268
294
|
|
|
269
|
-
namespace {
|
|
270
|
-
|
|
271
|
-
template <class HammingComputer>
|
|
272
|
-
struct FlatHammingDis : DistanceComputer {
|
|
273
|
-
const int code_size;
|
|
274
|
-
const uint8_t* b;
|
|
275
|
-
size_t ndis;
|
|
276
|
-
HammingComputer hc;
|
|
277
|
-
|
|
278
|
-
float operator()(idx_t i) override {
|
|
279
|
-
ndis++;
|
|
280
|
-
return hc.hamming(b + i * code_size);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
float symmetric_dis(idx_t i, idx_t j) override {
|
|
284
|
-
return HammingComputerDefault(b + j * code_size, code_size)
|
|
285
|
-
.hamming(b + i * code_size);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
explicit FlatHammingDis(const IndexBinaryFlat& storage)
|
|
289
|
-
: code_size(storage.code_size),
|
|
290
|
-
b(storage.xb.data()),
|
|
291
|
-
ndis(0),
|
|
292
|
-
hc() {}
|
|
293
|
-
|
|
294
|
-
// NOTE: Pointers are cast from float in order to reuse the floating-point
|
|
295
|
-
// DistanceComputer.
|
|
296
|
-
void set_query(const float* x) override {
|
|
297
|
-
hc.set((uint8_t*)x, code_size);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
~FlatHammingDis() override {
|
|
301
|
-
#pragma omp critical
|
|
302
|
-
{
|
|
303
|
-
hnsw_stats.ndis += ndis;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
struct BuildDistanceComputer {
|
|
309
|
-
using T = DistanceComputer*;
|
|
310
|
-
template <class HammingComputer>
|
|
311
|
-
DistanceComputer* f(IndexBinaryFlat* flat_storage) {
|
|
312
|
-
return new FlatHammingDis<HammingComputer>(*flat_storage);
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
|
|
316
|
-
} // namespace
|
|
317
|
-
|
|
318
295
|
DistanceComputer* IndexBinaryHNSW::get_distance_computer() const {
|
|
319
296
|
IndexBinaryFlat* flat_storage = dynamic_cast<IndexBinaryFlat*>(storage);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
297
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
298
|
+
flat_storage != nullptr,
|
|
299
|
+
"IndexBinaryHNSW requires IndexBinaryFlat storage");
|
|
300
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
301
|
+
return make_binary_hnsw_distance_computer_fixSL<SL>(
|
|
302
|
+
code_size, flat_storage);
|
|
303
|
+
});
|
|
323
304
|
}
|
|
324
305
|
|
|
325
306
|
/**************************************************************
|
|
@@ -330,8 +311,8 @@ IndexBinaryHNSWCagra::IndexBinaryHNSWCagra() : IndexBinaryHNSW() {
|
|
|
330
311
|
storage = nullptr;
|
|
331
312
|
}
|
|
332
313
|
|
|
333
|
-
IndexBinaryHNSWCagra::IndexBinaryHNSWCagra(int
|
|
334
|
-
: IndexBinaryHNSW(
|
|
314
|
+
IndexBinaryHNSWCagra::IndexBinaryHNSWCagra(int d_, int M)
|
|
315
|
+
: IndexBinaryHNSW(d_, M) {
|
|
335
316
|
init_level0 = true;
|
|
336
317
|
keep_max_size_level0 = true;
|
|
337
318
|
}
|
|
@@ -354,6 +335,13 @@ void IndexBinaryHNSWCagra::search(
|
|
|
354
335
|
if (!base_level_only) {
|
|
355
336
|
IndexBinaryHNSW::search(n, x, k, distances, labels, params);
|
|
356
337
|
} else {
|
|
338
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
339
|
+
ntotal > 0, "IndexBinaryHNSWCagra: cannot search empty index");
|
|
340
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
341
|
+
num_base_level_search_entrypoints > 0,
|
|
342
|
+
"IndexBinaryHNSWCagra: "
|
|
343
|
+
"num_base_level_search_entrypoints must be > 0");
|
|
344
|
+
|
|
357
345
|
float* distances_f = (float*)distances;
|
|
358
346
|
|
|
359
347
|
using RH = HeapBlockResultHandler<HNSW::C>;
|
|
@@ -379,7 +367,7 @@ void IndexBinaryHNSWCagra::search(
|
|
|
379
367
|
float distance = (*dis)(idx);
|
|
380
368
|
|
|
381
369
|
if (distance < nearest_d[i]) {
|
|
382
|
-
nearest[i] = idx;
|
|
370
|
+
nearest[i] = static_cast<storage_idx_t>(idx);
|
|
383
371
|
nearest_d[i] = distance;
|
|
384
372
|
}
|
|
385
373
|
}
|
|
@@ -412,10 +400,14 @@ void IndexBinaryHNSWCagra::search(
|
|
|
412
400
|
|
|
413
401
|
res.end();
|
|
414
402
|
}
|
|
403
|
+
#pragma omp critical
|
|
404
|
+
{
|
|
405
|
+
hnsw_stats.combine(search_stats);
|
|
406
|
+
}
|
|
415
407
|
}
|
|
416
408
|
|
|
417
409
|
#pragma omp parallel for
|
|
418
|
-
for (
|
|
410
|
+
for (idx_t i = 0; i < n * k; ++i) {
|
|
419
411
|
distances[i] = std::round(distances_f[i]);
|
|
420
412
|
}
|
|
421
413
|
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#include <faiss/IndexBinaryFlat.h>
|
|
13
13
|
#include <faiss/impl/HNSW.h>
|
|
14
|
+
#include <faiss/impl/hnsw/LockVector.h>
|
|
14
15
|
#include <faiss/utils/utils.h>
|
|
15
16
|
|
|
16
17
|
namespace faiss {
|
|
@@ -19,14 +20,14 @@ namespace faiss {
|
|
|
19
20
|
* link structure built on top */
|
|
20
21
|
|
|
21
22
|
struct IndexBinaryHNSW : IndexBinary {
|
|
22
|
-
|
|
23
|
+
using storage_idx_t = HNSW::storage_idx_t;
|
|
23
24
|
|
|
24
25
|
// the link structure
|
|
25
26
|
HNSW hnsw;
|
|
26
27
|
|
|
27
28
|
// the sequential storage
|
|
28
|
-
bool own_fields;
|
|
29
|
-
IndexBinary* storage;
|
|
29
|
+
bool own_fields = false;
|
|
30
|
+
IndexBinary* storage = nullptr;
|
|
30
31
|
|
|
31
32
|
// When set to false, level 0 in the knn graph is not initialized.
|
|
32
33
|
// This option is used by GpuIndexBinaryCagra::copyTo(IndexBinaryHNSW*)
|
|
@@ -40,6 +41,11 @@ struct IndexBinaryHNSW : IndexBinary {
|
|
|
40
41
|
// used when GpuIndexBinaryCagra::copyFrom(IndexBinaryHNSW*) is called.
|
|
41
42
|
bool keep_max_size_level0 = false;
|
|
42
43
|
|
|
44
|
+
// Per-node locks for HNSW graph construction.
|
|
45
|
+
LockVector locks;
|
|
46
|
+
// locks are freed after each call to add() unless this flag is set.
|
|
47
|
+
bool retain_locks = false;
|
|
48
|
+
|
|
43
49
|
explicit IndexBinaryHNSW();
|
|
44
50
|
explicit IndexBinaryHNSW(int d, int M = 32);
|
|
45
51
|
explicit IndexBinaryHNSW(IndexBinary* storage, int M = 32);
|