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
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#include <cinttypes>
|
|
13
13
|
#include <cstdio>
|
|
14
|
+
#include <memory>
|
|
14
15
|
#include <unordered_set>
|
|
15
16
|
|
|
16
17
|
#include <faiss/utils/hamming.h>
|
|
@@ -19,6 +20,16 @@
|
|
|
19
20
|
#include <faiss/impl/AuxIndexStructures.h>
|
|
20
21
|
#include <faiss/impl/FaissAssert.h>
|
|
21
22
|
|
|
23
|
+
#include <faiss/impl/simd_dispatch.h>
|
|
24
|
+
|
|
25
|
+
// Scalar (NONE) fallback for dynamic dispatch
|
|
26
|
+
#define THE_SIMD_LEVEL SIMDLevel::NONE
|
|
27
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
28
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
29
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
|
|
30
|
+
#include <faiss/utils/hamming_distance/hamming_computer-generic.h>
|
|
31
|
+
#undef THE_SIMD_LEVEL
|
|
32
|
+
|
|
22
33
|
namespace faiss {
|
|
23
34
|
|
|
24
35
|
void IndexBinaryHash::InvertedList::add(
|
|
@@ -29,8 +40,8 @@ void IndexBinaryHash::InvertedList::add(
|
|
|
29
40
|
vecs.insert(vecs.end(), code, code + code_size);
|
|
30
41
|
}
|
|
31
42
|
|
|
32
|
-
IndexBinaryHash::IndexBinaryHash(int
|
|
33
|
-
: IndexBinary(
|
|
43
|
+
IndexBinaryHash::IndexBinaryHash(int d_, int b_)
|
|
44
|
+
: IndexBinary(d_), b(b_), nflip(0) {
|
|
34
45
|
is_trained = true;
|
|
35
46
|
}
|
|
36
47
|
|
|
@@ -51,151 +62,20 @@ void IndexBinaryHash::add_with_ids(
|
|
|
51
62
|
idx_t n,
|
|
52
63
|
const uint8_t* x,
|
|
53
64
|
const idx_t* xids) {
|
|
54
|
-
uint64_t mask = ((uint64_t)1 << b) - 1;
|
|
55
65
|
// simplistic add function. Cannot really be parallelized.
|
|
56
66
|
|
|
57
67
|
for (idx_t i = 0; i < n; i++) {
|
|
58
68
|
idx_t id = xids ? xids[i] : ntotal + i;
|
|
59
69
|
const uint8_t* xi = x + i * code_size;
|
|
60
|
-
|
|
70
|
+
BitstringReader br(xi, code_size);
|
|
71
|
+
idx_t hash = br.read(b);
|
|
61
72
|
invlists[hash].add(id, code_size, xi);
|
|
62
73
|
}
|
|
63
74
|
ntotal += n;
|
|
64
75
|
}
|
|
65
76
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
/** Enumerate all bit vectors of size nbit with up to maxflip 1s
|
|
69
|
-
* test in P127257851 P127258235
|
|
70
|
-
*/
|
|
71
|
-
struct FlipEnumerator {
|
|
72
|
-
int nbit, nflip, maxflip;
|
|
73
|
-
uint64_t mask, x;
|
|
74
|
-
|
|
75
|
-
FlipEnumerator(int nbit, int maxflip) : nbit(nbit), maxflip(maxflip) {
|
|
76
|
-
nflip = 0;
|
|
77
|
-
mask = 0;
|
|
78
|
-
x = 0;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
bool next() {
|
|
82
|
-
if (x == mask) {
|
|
83
|
-
if (nflip == maxflip) {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
// increase Hamming radius
|
|
87
|
-
nflip++;
|
|
88
|
-
mask = (((uint64_t)1 << nflip) - 1);
|
|
89
|
-
x = mask << (nbit - nflip);
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
int i = __builtin_ctzll(x);
|
|
94
|
-
|
|
95
|
-
if (i > 0) {
|
|
96
|
-
x ^= (uint64_t)3 << (i - 1);
|
|
97
|
-
} else {
|
|
98
|
-
// nb of LSB 1s
|
|
99
|
-
int n1 = __builtin_ctzll(~x);
|
|
100
|
-
// clear them
|
|
101
|
-
x &= ((uint64_t)(-1) << n1);
|
|
102
|
-
int n2 = __builtin_ctzll(x);
|
|
103
|
-
x ^= (((uint64_t)1 << (n1 + 2)) - 1) << (n2 - n1 - 1);
|
|
104
|
-
}
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
struct RangeSearchResults {
|
|
110
|
-
int radius;
|
|
111
|
-
RangeQueryResult& qres;
|
|
112
|
-
|
|
113
|
-
inline void add(float dis, idx_t id) {
|
|
114
|
-
if (dis < radius) {
|
|
115
|
-
qres.add(dis, id);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
struct KnnSearchResults {
|
|
121
|
-
// heap params
|
|
122
|
-
idx_t k;
|
|
123
|
-
int32_t* heap_sim;
|
|
124
|
-
idx_t* heap_ids;
|
|
125
|
-
|
|
126
|
-
using C = CMax<int, idx_t>;
|
|
127
|
-
|
|
128
|
-
inline void add(float dis, idx_t id) {
|
|
129
|
-
if (dis < heap_sim[0]) {
|
|
130
|
-
heap_replace_top<C>(k, heap_sim, heap_ids, dis, id);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
template <class HammingComputer, class SearchResults>
|
|
136
|
-
void search_single_query_template(
|
|
137
|
-
const IndexBinaryHash& index,
|
|
138
|
-
const uint8_t* q,
|
|
139
|
-
SearchResults& res,
|
|
140
|
-
size_t& n0,
|
|
141
|
-
size_t& nlist,
|
|
142
|
-
size_t& ndis) {
|
|
143
|
-
size_t code_size = index.code_size;
|
|
144
|
-
uint64_t mask = ((uint64_t)1 << index.b) - 1;
|
|
145
|
-
uint64_t qhash = *((uint64_t*)q) & mask;
|
|
146
|
-
HammingComputer hc(q, code_size);
|
|
147
|
-
FlipEnumerator fe(index.b, index.nflip);
|
|
148
|
-
|
|
149
|
-
// loop over neighbors that are at most at nflip bits
|
|
150
|
-
do {
|
|
151
|
-
uint64_t hash = qhash ^ fe.x;
|
|
152
|
-
auto it = index.invlists.find(hash);
|
|
153
|
-
|
|
154
|
-
if (it == index.invlists.end()) {
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const IndexBinaryHash::InvertedList& il = it->second;
|
|
159
|
-
|
|
160
|
-
size_t nv = il.ids.size();
|
|
161
|
-
|
|
162
|
-
if (nv == 0) {
|
|
163
|
-
n0++;
|
|
164
|
-
} else {
|
|
165
|
-
const uint8_t* codes = il.vecs.data();
|
|
166
|
-
for (size_t i = 0; i < nv; i++) {
|
|
167
|
-
int dis = hc.hamming(codes);
|
|
168
|
-
res.add(dis, il.ids[i]);
|
|
169
|
-
codes += code_size;
|
|
170
|
-
}
|
|
171
|
-
ndis += nv;
|
|
172
|
-
nlist++;
|
|
173
|
-
}
|
|
174
|
-
} while (fe.next());
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
struct Run_search_single_query {
|
|
178
|
-
using T = void;
|
|
179
|
-
template <class HammingComputer, class... Types>
|
|
180
|
-
T f(Types*... args) {
|
|
181
|
-
search_single_query_template<HammingComputer>(*args...);
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
template <class SearchResults>
|
|
186
|
-
void search_single_query(
|
|
187
|
-
const IndexBinaryHash& index,
|
|
188
|
-
const uint8_t* q,
|
|
189
|
-
SearchResults& res,
|
|
190
|
-
size_t& n0,
|
|
191
|
-
size_t& nlist,
|
|
192
|
-
size_t& ndis) {
|
|
193
|
-
Run_search_single_query r;
|
|
194
|
-
dispatch_HammingComputer(
|
|
195
|
-
index.code_size, r, &index, &q, &res, &n0, &nlist, &ndis);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
} // anonymous namespace
|
|
77
|
+
// search_single_query_template and helpers are now in
|
|
78
|
+
// impl/binary_hamming/IndexBinaryHash_impl.h (compiled per-ISA)
|
|
199
79
|
|
|
200
80
|
void IndexBinaryHash::range_search(
|
|
201
81
|
idx_t n,
|
|
@@ -214,10 +94,12 @@ void IndexBinaryHash::range_search(
|
|
|
214
94
|
#pragma omp for
|
|
215
95
|
for (idx_t i = 0; i < n; i++) { // loop queries
|
|
216
96
|
RangeQueryResult& qres = pres.new_result(i);
|
|
217
|
-
RangeSearchResults res = {radius, qres};
|
|
218
97
|
const uint8_t* q = x + i * code_size;
|
|
219
98
|
|
|
220
|
-
|
|
99
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
100
|
+
binary_hash_range_search_fixSL<SL>(
|
|
101
|
+
*this, q, radius, qres, n0, nlist, ndis);
|
|
102
|
+
});
|
|
221
103
|
}
|
|
222
104
|
pres.finalize();
|
|
223
105
|
}
|
|
@@ -247,10 +129,12 @@ void IndexBinaryHash::search(
|
|
|
247
129
|
idx_t* idxi = labels + k * i;
|
|
248
130
|
|
|
249
131
|
heap_heapify<HeapForL2>(k, simi, idxi);
|
|
250
|
-
KnnSearchResults res = {k, simi, idxi};
|
|
251
132
|
const uint8_t* q = x + i * code_size;
|
|
252
133
|
|
|
253
|
-
|
|
134
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
135
|
+
binary_hash_knn_search_fixSL<SL>(
|
|
136
|
+
*this, q, k, simi, idxi, n0, nlist, ndis);
|
|
137
|
+
});
|
|
254
138
|
|
|
255
139
|
heap_reorder<HeapForL2>(k, simi, idxi);
|
|
256
140
|
}
|
|
@@ -285,19 +169,15 @@ IndexBinaryHashStats indexBinaryHash_stats;
|
|
|
285
169
|
* IndexBinaryMultiHash implementation
|
|
286
170
|
******************************************************/
|
|
287
171
|
|
|
288
|
-
IndexBinaryMultiHash::IndexBinaryMultiHash(int
|
|
289
|
-
: IndexBinary(
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
nhash(nhash),
|
|
294
|
-
b(b),
|
|
295
|
-
nflip(0) {
|
|
296
|
-
FAISS_THROW_IF_NOT(nhash * b <= d);
|
|
172
|
+
IndexBinaryMultiHash::IndexBinaryMultiHash(int d_, int nhash_, int b_)
|
|
173
|
+
: IndexBinary(d_), maps(nhash_), nhash(nhash_), b(b_), nflip(0) {
|
|
174
|
+
FAISS_THROW_IF_NOT(nhash_ * b_ <= d_);
|
|
175
|
+
storage = std::make_unique<IndexBinaryFlat>(d_).release();
|
|
176
|
+
own_fields = true;
|
|
297
177
|
}
|
|
298
178
|
|
|
299
179
|
IndexBinaryMultiHash::IndexBinaryMultiHash()
|
|
300
|
-
: storage(nullptr),
|
|
180
|
+
: storage(nullptr), nhash(0), b(0), nflip(0) {}
|
|
301
181
|
|
|
302
182
|
IndexBinaryMultiHash::~IndexBinaryMultiHash() {
|
|
303
183
|
if (own_fields) {
|
|
@@ -308,7 +188,7 @@ IndexBinaryMultiHash::~IndexBinaryMultiHash() {
|
|
|
308
188
|
void IndexBinaryMultiHash::reset() {
|
|
309
189
|
storage->reset();
|
|
310
190
|
ntotal = 0;
|
|
311
|
-
for (auto map : maps) {
|
|
191
|
+
for (auto& map : maps) {
|
|
312
192
|
map.clear();
|
|
313
193
|
}
|
|
314
194
|
}
|
|
@@ -316,94 +196,19 @@ void IndexBinaryMultiHash::reset() {
|
|
|
316
196
|
void IndexBinaryMultiHash::add(idx_t n, const uint8_t* x) {
|
|
317
197
|
storage->add(n, x);
|
|
318
198
|
// populate maps
|
|
319
|
-
uint64_t mask = ((uint64_t)1 << b) - 1;
|
|
320
|
-
|
|
321
199
|
for (idx_t i = 0; i < n; i++) {
|
|
322
200
|
const uint8_t* xi = x + i * code_size;
|
|
323
|
-
|
|
201
|
+
BitstringReader br(xi, code_size);
|
|
324
202
|
for (int h = 0; h < nhash; h++) {
|
|
325
|
-
uint64_t hash =
|
|
326
|
-
hash &= mask;
|
|
203
|
+
uint64_t hash = br.read(b);
|
|
327
204
|
maps[h][hash].push_back(i + ntotal);
|
|
328
|
-
ho += b;
|
|
329
205
|
}
|
|
330
206
|
}
|
|
331
207
|
ntotal += n;
|
|
332
208
|
}
|
|
333
209
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
template <class HammingComputer, class SearchResults>
|
|
337
|
-
static void verify_shortlist(
|
|
338
|
-
const IndexBinaryFlat* index,
|
|
339
|
-
const uint8_t* q,
|
|
340
|
-
const std::unordered_set<idx_t>& shortlist,
|
|
341
|
-
SearchResults& res) {
|
|
342
|
-
size_t code_size = index->code_size;
|
|
343
|
-
|
|
344
|
-
HammingComputer hc(q, code_size);
|
|
345
|
-
const uint8_t* codes = index->xb.data();
|
|
346
|
-
|
|
347
|
-
for (auto i : shortlist) {
|
|
348
|
-
int dis = hc.hamming(codes + i * code_size);
|
|
349
|
-
res.add(dis, i);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
struct Run_verify_shortlist {
|
|
354
|
-
using T = void;
|
|
355
|
-
template <class HammingComputer, class... Types>
|
|
356
|
-
void f(Types... args) {
|
|
357
|
-
verify_shortlist<HammingComputer>(args...);
|
|
358
|
-
}
|
|
359
|
-
};
|
|
360
|
-
|
|
361
|
-
template <class SearchResults>
|
|
362
|
-
void search_1_query_multihash(
|
|
363
|
-
const IndexBinaryMultiHash& index,
|
|
364
|
-
const uint8_t* xi,
|
|
365
|
-
SearchResults& res,
|
|
366
|
-
size_t& n0,
|
|
367
|
-
size_t& nlist,
|
|
368
|
-
size_t& ndis) {
|
|
369
|
-
std::unordered_set<idx_t> shortlist;
|
|
370
|
-
int b = index.b;
|
|
371
|
-
uint64_t mask = ((uint64_t)1 << b) - 1;
|
|
372
|
-
|
|
373
|
-
int ho = 0;
|
|
374
|
-
for (int h = 0; h < index.nhash; h++) {
|
|
375
|
-
uint64_t qhash = *(uint64_t*)(xi + (ho >> 3)) >> (ho & 7);
|
|
376
|
-
qhash &= mask;
|
|
377
|
-
const IndexBinaryMultiHash::Map& map = index.maps[h];
|
|
378
|
-
|
|
379
|
-
FlipEnumerator fe(index.b, index.nflip);
|
|
380
|
-
// loop over neighbors that are at most at nflip bits
|
|
381
|
-
do {
|
|
382
|
-
uint64_t hash = qhash ^ fe.x;
|
|
383
|
-
auto it = map.find(hash);
|
|
384
|
-
|
|
385
|
-
if (it != map.end()) {
|
|
386
|
-
const std::vector<idx_t>& v = it->second;
|
|
387
|
-
for (auto i : v) {
|
|
388
|
-
shortlist.insert(i);
|
|
389
|
-
}
|
|
390
|
-
nlist++;
|
|
391
|
-
} else {
|
|
392
|
-
n0++;
|
|
393
|
-
}
|
|
394
|
-
} while (fe.next());
|
|
395
|
-
|
|
396
|
-
ho += b;
|
|
397
|
-
}
|
|
398
|
-
ndis += shortlist.size();
|
|
399
|
-
|
|
400
|
-
// verify shortlist
|
|
401
|
-
Run_verify_shortlist r;
|
|
402
|
-
dispatch_HammingComputer(
|
|
403
|
-
index.code_size, r, index.storage, xi, shortlist, res);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
} // anonymous namespace
|
|
210
|
+
// verify_shortlist and search_1_query_multihash are now in
|
|
211
|
+
// impl/binary_hamming/IndexBinaryHash_impl.h (compiled per-ISA)
|
|
407
212
|
|
|
408
213
|
void IndexBinaryMultiHash::range_search(
|
|
409
214
|
idx_t n,
|
|
@@ -422,10 +227,12 @@ void IndexBinaryMultiHash::range_search(
|
|
|
422
227
|
#pragma omp for
|
|
423
228
|
for (idx_t i = 0; i < n; i++) { // loop queries
|
|
424
229
|
RangeQueryResult& qres = pres.new_result(i);
|
|
425
|
-
RangeSearchResults res = {radius, qres};
|
|
426
230
|
const uint8_t* q = x + i * code_size;
|
|
427
231
|
|
|
428
|
-
|
|
232
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
233
|
+
binary_multihash_range_search_fixSL<SL>(
|
|
234
|
+
*this, q, radius, qres, n0, nlist, ndis);
|
|
235
|
+
});
|
|
429
236
|
}
|
|
430
237
|
pres.finalize();
|
|
431
238
|
}
|
|
@@ -455,10 +262,12 @@ void IndexBinaryMultiHash::search(
|
|
|
455
262
|
idx_t* idxi = labels + k * i;
|
|
456
263
|
|
|
457
264
|
heap_heapify<HeapForL2>(k, simi, idxi);
|
|
458
|
-
KnnSearchResults res = {k, simi, idxi};
|
|
459
265
|
const uint8_t* q = x + i * code_size;
|
|
460
266
|
|
|
461
|
-
|
|
267
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
268
|
+
binary_multihash_knn_search_fixSL<SL>(
|
|
269
|
+
*this, q, k, simi, idxi, n0, nlist, ndis);
|
|
270
|
+
});
|
|
462
271
|
|
|
463
272
|
heap_reorder<HeapForL2>(k, simi, idxi);
|
|
464
273
|
}
|
|
@@ -470,7 +279,7 @@ void IndexBinaryMultiHash::search(
|
|
|
470
279
|
|
|
471
280
|
size_t IndexBinaryMultiHash::hashtable_size() const {
|
|
472
281
|
size_t tot = 0;
|
|
473
|
-
for (auto map : maps) {
|
|
282
|
+
for (const auto& map : maps) {
|
|
474
283
|
tot += map.size();
|
|
475
284
|
}
|
|
476
285
|
|
|
@@ -66,10 +66,10 @@ struct IndexBinaryHash : IndexBinary {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
struct IndexBinaryHashStats {
|
|
69
|
-
size_t nq;
|
|
70
|
-
size_t n0;
|
|
71
|
-
size_t nlist;
|
|
72
|
-
size_t ndis
|
|
69
|
+
size_t nq = 0; // nb of queries run
|
|
70
|
+
size_t n0 = 0; // nb of empty lists
|
|
71
|
+
size_t nlist = 0; // nb of non-empty inverted lists scanned
|
|
72
|
+
size_t ndis = 0; // nb of distances computed
|
|
73
73
|
|
|
74
74
|
IndexBinaryHashStats() {
|
|
75
75
|
reset();
|
|
@@ -82,8 +82,8 @@ FAISS_API extern IndexBinaryHashStats indexBinaryHash_stats;
|
|
|
82
82
|
/** just uses the b first bits as a hash value */
|
|
83
83
|
struct IndexBinaryMultiHash : IndexBinary {
|
|
84
84
|
// where the vectors are actually stored
|
|
85
|
-
IndexBinaryFlat* storage;
|
|
86
|
-
bool own_fields;
|
|
85
|
+
IndexBinaryFlat* storage = nullptr;
|
|
86
|
+
bool own_fields = false;
|
|
87
87
|
|
|
88
88
|
// maps hash values to the ids that hash to them
|
|
89
89
|
using Map = std::unordered_map<idx_t, std::vector<idx_t>>;
|