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
|
@@ -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,17 @@
|
|
|
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
|
+
#undef THE_SIMD_LEVEL
|
|
40
|
+
|
|
32
41
|
namespace faiss {
|
|
33
42
|
|
|
34
43
|
/**************************************************************
|
|
@@ -61,10 +70,8 @@ void hnsw_add_vertices(
|
|
|
61
70
|
printf(" max_level = %d\n", max_level);
|
|
62
71
|
}
|
|
63
72
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
omp_init_lock(&locks[i]);
|
|
67
|
-
}
|
|
73
|
+
auto& locks = index_hnsw.locks;
|
|
74
|
+
locks.prepare(ntotal);
|
|
68
75
|
|
|
69
76
|
// add vectors from highest to lowest level
|
|
70
77
|
std::vector<int> hist;
|
|
@@ -73,10 +80,11 @@ void hnsw_add_vertices(
|
|
|
73
80
|
{ // make buckets with vectors of the same level
|
|
74
81
|
|
|
75
82
|
// build histogram
|
|
76
|
-
for (
|
|
77
|
-
HNSW::storage_idx_t pt_id =
|
|
83
|
+
for (size_t i = 0; i < n; i++) {
|
|
84
|
+
HNSW::storage_idx_t pt_id =
|
|
85
|
+
static_cast<HNSW::storage_idx_t>(i + n0);
|
|
78
86
|
int pt_level = hnsw.levels[pt_id] - 1;
|
|
79
|
-
while (pt_level >= hist.size()) {
|
|
87
|
+
while (pt_level >= static_cast<int>(hist.size())) {
|
|
80
88
|
hist.push_back(0);
|
|
81
89
|
}
|
|
82
90
|
hist[pt_level]++;
|
|
@@ -84,13 +92,14 @@ void hnsw_add_vertices(
|
|
|
84
92
|
|
|
85
93
|
// accumulate
|
|
86
94
|
std::vector<int> offsets(hist.size() + 1, 0);
|
|
87
|
-
for (
|
|
95
|
+
for (size_t i = 0; i < hist.size() - 1; i++) {
|
|
88
96
|
offsets[i + 1] = offsets[i] + hist[i];
|
|
89
97
|
}
|
|
90
98
|
|
|
91
99
|
// bucket sort
|
|
92
|
-
for (
|
|
93
|
-
HNSW::storage_idx_t pt_id =
|
|
100
|
+
for (size_t i = 0; i < n; i++) {
|
|
101
|
+
HNSW::storage_idx_t pt_id =
|
|
102
|
+
static_cast<HNSW::storage_idx_t>(i + n0);
|
|
94
103
|
int pt_level = hnsw.levels[pt_id] - 1;
|
|
95
104
|
order[offsets[pt_level]++] = pt_id;
|
|
96
105
|
}
|
|
@@ -99,33 +108,35 @@ void hnsw_add_vertices(
|
|
|
99
108
|
{ // perform add
|
|
100
109
|
RandomGenerator rng2(789);
|
|
101
110
|
|
|
102
|
-
|
|
111
|
+
size_t i1 = static_cast<int>(n);
|
|
103
112
|
|
|
104
|
-
for (int pt_level = hist.size() - 1;
|
|
113
|
+
for (int pt_level = static_cast<int>(hist.size()) - 1;
|
|
105
114
|
pt_level >= int(!index_hnsw.init_level0);
|
|
106
115
|
pt_level--) {
|
|
107
|
-
|
|
116
|
+
size_t i0 = i1 - hist[pt_level];
|
|
108
117
|
|
|
109
118
|
if (verbose) {
|
|
110
|
-
printf("Adding %
|
|
119
|
+
printf("Adding %zu elements at level %d\n", i1 - i0, pt_level);
|
|
111
120
|
}
|
|
112
121
|
|
|
113
122
|
// random permutation to get rid of dataset order bias
|
|
114
|
-
for (
|
|
115
|
-
std::swap(
|
|
123
|
+
for (size_t j = i0; j < i1; j++) {
|
|
124
|
+
std::swap(
|
|
125
|
+
order[j],
|
|
126
|
+
order[j + rng2.rand_int(static_cast<int>(i1 - j))]);
|
|
116
127
|
}
|
|
117
128
|
|
|
118
129
|
#pragma omp parallel
|
|
119
130
|
{
|
|
120
|
-
VisitedTable vt(ntotal);
|
|
131
|
+
std::unique_ptr<VisitedTable> vt = VisitedTable::create(ntotal);
|
|
121
132
|
|
|
122
133
|
std::unique_ptr<DistanceComputer> dis(
|
|
123
134
|
index_hnsw.get_distance_computer());
|
|
124
|
-
|
|
125
|
-
|
|
135
|
+
bool do_display = verbose && omp_get_thread_num() == 0;
|
|
136
|
+
size_t prev_display = 0;
|
|
126
137
|
|
|
127
138
|
#pragma omp for schedule(dynamic)
|
|
128
|
-
for (
|
|
139
|
+
for (int64_t i = i0; i < i1; i++) {
|
|
129
140
|
HNSW::storage_idx_t pt_id = order[i];
|
|
130
141
|
dis->set_query(
|
|
131
142
|
(float*)(x + (pt_id - n0) * index_hnsw.code_size));
|
|
@@ -135,12 +146,12 @@ void hnsw_add_vertices(
|
|
|
135
146
|
pt_level,
|
|
136
147
|
pt_id,
|
|
137
148
|
locks,
|
|
138
|
-
vt,
|
|
149
|
+
*vt,
|
|
139
150
|
index_hnsw.keep_max_size_level0 && (pt_level == 0));
|
|
140
151
|
|
|
141
|
-
if (
|
|
152
|
+
if (do_display && i - i0 > prev_display + 10000) {
|
|
142
153
|
prev_display = i - i0;
|
|
143
|
-
printf(" %
|
|
154
|
+
printf(" %zu / %zu\r", i - i0, i1 - i0);
|
|
144
155
|
fflush(stdout);
|
|
145
156
|
}
|
|
146
157
|
}
|
|
@@ -156,9 +167,8 @@ void hnsw_add_vertices(
|
|
|
156
167
|
if (verbose) {
|
|
157
168
|
printf("Done in %.3f ms\n", getmillisecs() - t0);
|
|
158
169
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
omp_destroy_lock(&locks[i]);
|
|
170
|
+
if (!index_hnsw.retain_locks) {
|
|
171
|
+
locks.clear();
|
|
162
172
|
}
|
|
163
173
|
}
|
|
164
174
|
|
|
@@ -172,19 +182,19 @@ IndexBinaryHNSW::IndexBinaryHNSW() {
|
|
|
172
182
|
is_trained = true;
|
|
173
183
|
}
|
|
174
184
|
|
|
175
|
-
IndexBinaryHNSW::IndexBinaryHNSW(int
|
|
176
|
-
: IndexBinary(
|
|
185
|
+
IndexBinaryHNSW::IndexBinaryHNSW(int d_, int M)
|
|
186
|
+
: IndexBinary(d_),
|
|
177
187
|
hnsw(M),
|
|
178
188
|
own_fields(true),
|
|
179
|
-
storage(new IndexBinaryFlat(
|
|
189
|
+
storage(new IndexBinaryFlat(d_)) {
|
|
180
190
|
is_trained = true;
|
|
181
191
|
}
|
|
182
192
|
|
|
183
|
-
IndexBinaryHNSW::IndexBinaryHNSW(IndexBinary*
|
|
184
|
-
: IndexBinary(
|
|
193
|
+
IndexBinaryHNSW::IndexBinaryHNSW(IndexBinary* storage_, int M)
|
|
194
|
+
: IndexBinary(storage_->d),
|
|
185
195
|
hnsw(M),
|
|
186
196
|
own_fields(false),
|
|
187
|
-
storage(
|
|
197
|
+
storage(storage_) {
|
|
188
198
|
is_trained = true;
|
|
189
199
|
}
|
|
190
200
|
|
|
@@ -222,42 +232,57 @@ void IndexBinaryHNSW::search(
|
|
|
222
232
|
using RH = HeapBlockResultHandler<HNSW::C>;
|
|
223
233
|
RH bres(n, distances_f, labels, k);
|
|
224
234
|
|
|
235
|
+
size_t n1 = 0, n2 = 0, ndis = 0, nhops = 0;
|
|
236
|
+
|
|
225
237
|
#pragma omp parallel
|
|
226
238
|
{
|
|
227
|
-
VisitedTable vt(ntotal);
|
|
239
|
+
std::unique_ptr<VisitedTable> vt = VisitedTable::create(ntotal);
|
|
228
240
|
std::unique_ptr<DistanceComputer> dis(get_distance_computer());
|
|
229
241
|
RH::SingleResultHandler res(bres);
|
|
230
242
|
|
|
231
|
-
#pragma omp for
|
|
243
|
+
#pragma omp for reduction(+ : n1, n2, ndis, nhops)
|
|
232
244
|
for (idx_t i = 0; i < n; i++) {
|
|
233
245
|
res.begin(i);
|
|
234
246
|
dis->set_query((float*)(x + i * code_size));
|
|
235
247
|
// Given that IndexBinaryHNSW is not an IndexHNSW, we pass nullptr
|
|
236
248
|
// as the index parameter. This state does not get used in the
|
|
237
|
-
// search function, as it is merely there to
|
|
249
|
+
// search function, as it is merely there to enable Panorama
|
|
238
250
|
// execution for IndexHNSWFlatPanorama.
|
|
239
|
-
hnsw.search(*dis, nullptr, res, vt, params_in);
|
|
251
|
+
HNSWStats stats = hnsw.search(*dis, nullptr, res, *vt, params_in);
|
|
252
|
+
n1 += stats.n1;
|
|
253
|
+
n2 += stats.n2;
|
|
254
|
+
ndis += stats.ndis;
|
|
255
|
+
nhops += stats.nhops;
|
|
240
256
|
res.end();
|
|
241
257
|
}
|
|
242
258
|
}
|
|
243
259
|
|
|
260
|
+
hnsw_stats.combine({n1, n2, ndis, nhops});
|
|
261
|
+
|
|
244
262
|
#pragma omp parallel for
|
|
245
|
-
for (
|
|
263
|
+
for (idx_t i = 0; i < n * k; ++i) {
|
|
246
264
|
distances[i] = std::round(distances_f[i]);
|
|
247
265
|
}
|
|
248
266
|
}
|
|
249
267
|
|
|
250
268
|
void IndexBinaryHNSW::add(idx_t n, const uint8_t* x) {
|
|
251
269
|
FAISS_THROW_IF_NOT(is_trained);
|
|
252
|
-
|
|
270
|
+
size_t n0 = ntotal;
|
|
253
271
|
storage->add(n, x);
|
|
254
272
|
ntotal = storage->ntotal;
|
|
255
273
|
|
|
256
|
-
hnsw_add_vertices(
|
|
274
|
+
hnsw_add_vertices(
|
|
275
|
+
*this,
|
|
276
|
+
n0,
|
|
277
|
+
n,
|
|
278
|
+
x,
|
|
279
|
+
verbose,
|
|
280
|
+
hnsw.levels.size() == static_cast<size_t>(ntotal));
|
|
257
281
|
}
|
|
258
282
|
|
|
259
283
|
void IndexBinaryHNSW::reset() {
|
|
260
284
|
hnsw.reset();
|
|
285
|
+
locks.clear();
|
|
261
286
|
storage->reset();
|
|
262
287
|
ntotal = 0;
|
|
263
288
|
}
|
|
@@ -266,60 +291,15 @@ void IndexBinaryHNSW::reconstruct(idx_t key, uint8_t* recons) const {
|
|
|
266
291
|
storage->reconstruct(key, recons);
|
|
267
292
|
}
|
|
268
293
|
|
|
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
294
|
DistanceComputer* IndexBinaryHNSW::get_distance_computer() const {
|
|
319
295
|
IndexBinaryFlat* flat_storage = dynamic_cast<IndexBinaryFlat*>(storage);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
296
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
297
|
+
flat_storage != nullptr,
|
|
298
|
+
"IndexBinaryHNSW requires IndexBinaryFlat storage");
|
|
299
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
300
|
+
return make_binary_hnsw_distance_computer_fixSL<SL>(
|
|
301
|
+
code_size, flat_storage);
|
|
302
|
+
});
|
|
323
303
|
}
|
|
324
304
|
|
|
325
305
|
/**************************************************************
|
|
@@ -330,8 +310,8 @@ IndexBinaryHNSWCagra::IndexBinaryHNSWCagra() : IndexBinaryHNSW() {
|
|
|
330
310
|
storage = nullptr;
|
|
331
311
|
}
|
|
332
312
|
|
|
333
|
-
IndexBinaryHNSWCagra::IndexBinaryHNSWCagra(int
|
|
334
|
-
: IndexBinaryHNSW(
|
|
313
|
+
IndexBinaryHNSWCagra::IndexBinaryHNSWCagra(int d_, int M)
|
|
314
|
+
: IndexBinaryHNSW(d_, M) {
|
|
335
315
|
init_level0 = true;
|
|
336
316
|
keep_max_size_level0 = true;
|
|
337
317
|
}
|
|
@@ -354,6 +334,13 @@ void IndexBinaryHNSWCagra::search(
|
|
|
354
334
|
if (!base_level_only) {
|
|
355
335
|
IndexBinaryHNSW::search(n, x, k, distances, labels, params);
|
|
356
336
|
} else {
|
|
337
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
338
|
+
ntotal > 0, "IndexBinaryHNSWCagra: cannot search empty index");
|
|
339
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
340
|
+
num_base_level_search_entrypoints > 0,
|
|
341
|
+
"IndexBinaryHNSWCagra: "
|
|
342
|
+
"num_base_level_search_entrypoints must be > 0");
|
|
343
|
+
|
|
357
344
|
float* distances_f = (float*)distances;
|
|
358
345
|
|
|
359
346
|
using RH = HeapBlockResultHandler<HNSW::C>;
|
|
@@ -379,7 +366,7 @@ void IndexBinaryHNSWCagra::search(
|
|
|
379
366
|
float distance = (*dis)(idx);
|
|
380
367
|
|
|
381
368
|
if (distance < nearest_d[i]) {
|
|
382
|
-
nearest[i] = idx;
|
|
369
|
+
nearest[i] = static_cast<storage_idx_t>(idx);
|
|
383
370
|
nearest_d[i] = distance;
|
|
384
371
|
}
|
|
385
372
|
}
|
|
@@ -389,7 +376,7 @@ void IndexBinaryHNSWCagra::search(
|
|
|
389
376
|
|
|
390
377
|
#pragma omp parallel
|
|
391
378
|
{
|
|
392
|
-
VisitedTable vt(ntotal);
|
|
379
|
+
std::unique_ptr<VisitedTable> vt = VisitedTable::create(ntotal);
|
|
393
380
|
std::unique_ptr<DistanceComputer> dis(get_distance_computer());
|
|
394
381
|
HNSWStats search_stats;
|
|
395
382
|
RH::SingleResultHandler res(bres);
|
|
@@ -407,15 +394,19 @@ void IndexBinaryHNSWCagra::search(
|
|
|
407
394
|
&nearest_d[i],
|
|
408
395
|
1, // search_type
|
|
409
396
|
search_stats,
|
|
410
|
-
vt,
|
|
397
|
+
*vt,
|
|
411
398
|
params);
|
|
412
399
|
|
|
413
400
|
res.end();
|
|
414
401
|
}
|
|
402
|
+
#pragma omp critical
|
|
403
|
+
{
|
|
404
|
+
hnsw_stats.combine(search_stats);
|
|
405
|
+
}
|
|
415
406
|
}
|
|
416
407
|
|
|
417
408
|
#pragma omp parallel for
|
|
418
|
-
for (
|
|
409
|
+
for (idx_t i = 0; i < n * k; ++i) {
|
|
419
410
|
distances[i] = std::round(distances_f[i]);
|
|
420
411
|
}
|
|
421
412
|
}
|
|
@@ -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);
|