faiss 0.5.3 → 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 +12 -0
- data/ext/faiss/ext.cpp +1 -1
- data/ext/faiss/extconf.rb +4 -4
- data/ext/faiss/index.cpp +63 -45
- data/ext/faiss/index_binary.cpp +37 -27
- data/ext/faiss/kmeans.cpp +9 -8
- data/ext/faiss/pca_matrix.cpp +9 -7
- data/ext/faiss/product_quantizer.cpp +13 -11
- data/ext/faiss/utils.cpp +4 -2
- data/ext/faiss/utils.h +4 -0
- data/lib/faiss/version.rb +1 -1
- data/lib/faiss.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +214 -82
- data/vendor/faiss/faiss/AutoTune.h +14 -1
- data/vendor/faiss/faiss/Clustering.cpp +97 -249
- data/vendor/faiss/faiss/Clustering.h +18 -0
- data/vendor/faiss/faiss/IVFlib.cpp +67 -44
- data/vendor/faiss/faiss/Index.cpp +25 -12
- data/vendor/faiss/faiss/Index.h +26 -4
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +6 -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 +92 -95
- 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 +120 -414
- data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
- data/vendor/faiss/faiss/IndexFastScan.h +35 -24
- data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
- data/vendor/faiss/faiss/IndexFlat.h +32 -14
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
- data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
- data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
- data/vendor/faiss/faiss/IndexHNSW.h +30 -14
- data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
- data/vendor/faiss/faiss/IndexIVF.h +47 -16
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
- data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
- data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
- data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
- data/vendor/faiss/faiss/IndexNSG.h +0 -2
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
- data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
- 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 +31 -43
- data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
- 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 +13 -13
- 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 +29 -6
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
- data/vendor/faiss/faiss/VectorTransform.h +39 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +55 -51
- 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/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
- 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 +64 -34
- 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 -28
- 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 +367 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
- data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
- data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
- data/vendor/faiss/faiss/impl/HNSW.h +21 -40
- 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 +114 -102
- data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
- data/vendor/faiss/faiss/impl/NSG.h +20 -10
- data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
- data/vendor/faiss/faiss/impl/Panorama.h +265 -78
- 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 +62 -37
- 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 +99 -80
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
- data/vendor/faiss/faiss/impl/VisitedTable.h +76 -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 +163 -0
- 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} +176 -4
- 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 -348
- 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} +290 -142
- 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 +1950 -505
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
- data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
- 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 +81 -40
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
- 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/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
- 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 +256 -0
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
- 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 +275 -217
- 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 +115 -28
- data/vendor/faiss/faiss/index_io.h +53 -3
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
- 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 +14 -14
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
- 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 +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
- data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
- data/vendor/faiss/faiss/utils/Heap.h +21 -0
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
- 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 +507 -559
- data/vendor/faiss/faiss/utils/distances.h +118 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
- 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 +72 -3681
- data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
- data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
- 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 +251 -0
- 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 +124 -343
- 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 +154 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
- 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 +392 -0
- 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 +334 -0
- data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +21 -14
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +156 -42
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
- 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 -228
- 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 -450
- 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 -296
- /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
|
@@ -12,16 +12,46 @@
|
|
|
12
12
|
#pragma once
|
|
13
13
|
|
|
14
14
|
#include <faiss/impl/AuxIndexStructures.h>
|
|
15
|
+
#include <faiss/impl/FaissAssert.h>
|
|
15
16
|
#include <faiss/impl/FaissException.h>
|
|
16
17
|
#include <faiss/impl/IDSelector.h>
|
|
18
|
+
#include <faiss/impl/InvertedListScannerStats.h>
|
|
17
19
|
#include <faiss/utils/Heap.h>
|
|
18
20
|
#include <faiss/utils/partitioning.h>
|
|
19
|
-
|
|
20
21
|
#include <algorithm>
|
|
21
22
|
#include <iostream>
|
|
22
23
|
|
|
23
24
|
namespace faiss {
|
|
24
25
|
|
|
26
|
+
/* result handlers for a single query */
|
|
27
|
+
|
|
28
|
+
template <typename T, typename TI>
|
|
29
|
+
struct ResultHandlerUnordered {
|
|
30
|
+
// if not better than threshold, then not necessary to call add_result
|
|
31
|
+
T threshold{};
|
|
32
|
+
|
|
33
|
+
// per-list scan statistics populated by inverted-list scanners
|
|
34
|
+
InvertedListScannerStats stats;
|
|
35
|
+
|
|
36
|
+
// return whether threshold was updated
|
|
37
|
+
virtual bool add_result(T dis, TI idx) = 0;
|
|
38
|
+
|
|
39
|
+
virtual ~ResultHandlerUnordered() {}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// handler for a single query
|
|
43
|
+
template <class C>
|
|
44
|
+
struct ResultHandlerT : ResultHandlerUnordered<typename C::T, typename C::TI> {
|
|
45
|
+
ResultHandlerT() {
|
|
46
|
+
this->threshold = C::neutral();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
virtual ~ResultHandlerT() {}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// generic handler for searching in float indexes
|
|
53
|
+
using ResultHandler = ResultHandlerUnordered<float, idx_t>;
|
|
54
|
+
|
|
25
55
|
/*****************************************************************
|
|
26
56
|
* The classes below are intended to be used as template arguments
|
|
27
57
|
* they handle results for batches of queries (size nq).
|
|
@@ -40,8 +70,8 @@ struct BlockResultHandler {
|
|
|
40
70
|
size_t nq; // number of queries for which we search
|
|
41
71
|
const IDSelector* sel;
|
|
42
72
|
|
|
43
|
-
explicit BlockResultHandler(size_t
|
|
44
|
-
: nq(
|
|
73
|
+
explicit BlockResultHandler(size_t nq_, const IDSelector* sel_ = nullptr)
|
|
74
|
+
: nq(nq_), sel(sel_) {
|
|
45
75
|
assert(!use_sel || sel);
|
|
46
76
|
}
|
|
47
77
|
|
|
@@ -67,16 +97,44 @@ struct BlockResultHandler {
|
|
|
67
97
|
}
|
|
68
98
|
};
|
|
69
99
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// if not better than threshold, then not necessary to call add_result
|
|
74
|
-
typename C::T threshold = C::neutral();
|
|
100
|
+
/*****************************************************************
|
|
101
|
+
* Convenience classes for float Indexes
|
|
102
|
+
*****************************************************************/
|
|
75
103
|
|
|
76
|
-
|
|
77
|
-
|
|
104
|
+
// fake BlockResultHandler for a single query
|
|
105
|
+
template <class C, bool use_sel>
|
|
106
|
+
struct SingleQueryBlockResultHandler : BlockResultHandler<C, use_sel> {
|
|
107
|
+
using T = typename C::T;
|
|
108
|
+
using TI = typename C::TI;
|
|
109
|
+
using BlockResultHandler<C, use_sel>::i0;
|
|
110
|
+
using BlockResultHandler<C, use_sel>::i1;
|
|
111
|
+
|
|
112
|
+
ResultHandler& the_handler;
|
|
113
|
+
|
|
114
|
+
explicit SingleQueryBlockResultHandler(
|
|
115
|
+
ResultHandler& the_handler_in,
|
|
116
|
+
const IDSelector* sel_in = nullptr)
|
|
117
|
+
: BlockResultHandler<C, use_sel>(1, sel_in),
|
|
118
|
+
the_handler(the_handler_in) {}
|
|
119
|
+
|
|
120
|
+
struct SingleResultHandler : ResultHandlerT<C> {
|
|
121
|
+
ResultHandler& the_handler;
|
|
122
|
+
using ResultHandlerT<C>::threshold;
|
|
123
|
+
|
|
124
|
+
explicit SingleResultHandler(SingleQueryBlockResultHandler& hr)
|
|
125
|
+
: the_handler(hr.the_handler) {}
|
|
126
|
+
|
|
127
|
+
/// begin results for query # i
|
|
128
|
+
void begin(const size_t /* qid */) {}
|
|
129
|
+
|
|
130
|
+
/// add one result for query i
|
|
131
|
+
bool add_result(T dis, TI idx) final {
|
|
132
|
+
return the_handler.add_result(dis, idx);
|
|
133
|
+
}
|
|
78
134
|
|
|
79
|
-
|
|
135
|
+
/// series of results for query i is done
|
|
136
|
+
void end() {}
|
|
137
|
+
};
|
|
80
138
|
};
|
|
81
139
|
|
|
82
140
|
/*****************************************************************
|
|
@@ -93,15 +151,15 @@ struct TopkBlockResultHandler : BlockResultHandler<C, use_sel> {
|
|
|
93
151
|
int64_t k; // number of results to keep
|
|
94
152
|
|
|
95
153
|
TopkBlockResultHandler(
|
|
96
|
-
size_t
|
|
97
|
-
T*
|
|
98
|
-
TI*
|
|
99
|
-
size_t
|
|
100
|
-
const IDSelector*
|
|
101
|
-
: BlockResultHandler<C, use_sel>(
|
|
102
|
-
dis_tab(
|
|
103
|
-
ids_tab(
|
|
104
|
-
k(
|
|
154
|
+
size_t nq_,
|
|
155
|
+
T* dis_tab_,
|
|
156
|
+
TI* ids_tab_,
|
|
157
|
+
size_t k_,
|
|
158
|
+
const IDSelector* sel_ = nullptr)
|
|
159
|
+
: BlockResultHandler<C, use_sel>(nq_, sel_),
|
|
160
|
+
dis_tab(dis_tab_),
|
|
161
|
+
ids_tab(ids_tab_),
|
|
162
|
+
k(k_) {}
|
|
105
163
|
|
|
106
164
|
~TopkBlockResultHandler() {}
|
|
107
165
|
};
|
|
@@ -120,21 +178,25 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
120
178
|
using BlockResultHandler<C, use_sel>::i1;
|
|
121
179
|
|
|
122
180
|
Top1BlockResultHandler(
|
|
123
|
-
size_t
|
|
124
|
-
T*
|
|
125
|
-
TI*
|
|
126
|
-
const IDSelector*
|
|
127
|
-
: TopkBlockResultHandler<C, use_sel>(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
181
|
+
size_t nq_,
|
|
182
|
+
T* dis_tab_,
|
|
183
|
+
TI* ids_tab_,
|
|
184
|
+
const IDSelector* sel_ = nullptr)
|
|
185
|
+
: TopkBlockResultHandler<C, use_sel>(
|
|
186
|
+
nq_,
|
|
187
|
+
dis_tab_,
|
|
188
|
+
ids_tab_,
|
|
189
|
+
1,
|
|
190
|
+
sel_) {}
|
|
191
|
+
|
|
192
|
+
struct SingleResultHandler : ResultHandlerT<C> {
|
|
131
193
|
Top1BlockResultHandler& hr;
|
|
132
|
-
using
|
|
194
|
+
using ResultHandlerT<C>::threshold;
|
|
133
195
|
|
|
134
196
|
TI min_idx;
|
|
135
197
|
size_t current_idx = 0;
|
|
136
198
|
|
|
137
|
-
explicit SingleResultHandler(Top1BlockResultHandler&
|
|
199
|
+
explicit SingleResultHandler(Top1BlockResultHandler& hr_) : hr(hr_) {}
|
|
138
200
|
|
|
139
201
|
/// begin results for query # i
|
|
140
202
|
void begin(const size_t current_idx_2) {
|
|
@@ -161,9 +223,9 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
161
223
|
};
|
|
162
224
|
|
|
163
225
|
/// begin
|
|
164
|
-
void begin_multiple(size_t
|
|
165
|
-
this->i0 =
|
|
166
|
-
this->i1 =
|
|
226
|
+
void begin_multiple(size_t i0_in, size_t i1_in) final {
|
|
227
|
+
this->i0 = i0_in;
|
|
228
|
+
this->i1 = i1_in;
|
|
167
229
|
|
|
168
230
|
for (size_t i = i0; i < i1; i++) {
|
|
169
231
|
this->dis_tab[i] = C::neutral();
|
|
@@ -172,7 +234,7 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
172
234
|
|
|
173
235
|
/// add results for query i0..i1 and j0..j1
|
|
174
236
|
void add_results(size_t j0, size_t j1, const T* dis_tab_2) final {
|
|
175
|
-
for (
|
|
237
|
+
for (size_t i = i0; i < i1; i++) {
|
|
176
238
|
const T* dis_tab_i = dis_tab_2 + (j1 - j0) * (i - i0) - j0;
|
|
177
239
|
|
|
178
240
|
auto& min_distance = this->dis_tab[i];
|
|
@@ -204,6 +266,34 @@ struct Top1BlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
204
266
|
* Heap based result handler
|
|
205
267
|
*****************************************************************/
|
|
206
268
|
|
|
269
|
+
template <class C, bool use_sel = false>
|
|
270
|
+
struct HeapResultHandler : ResultHandlerT<C> {
|
|
271
|
+
using T = typename C::T;
|
|
272
|
+
using TI = typename C::TI;
|
|
273
|
+
using ResultHandlerT<C>::threshold;
|
|
274
|
+
size_t k;
|
|
275
|
+
|
|
276
|
+
T* heap_dis;
|
|
277
|
+
TI* heap_ids;
|
|
278
|
+
|
|
279
|
+
HeapResultHandler(size_t k_, T* heap_dis_, TI* heap_ids_)
|
|
280
|
+
: k(k_), heap_dis(heap_dis_), heap_ids(heap_ids_) {
|
|
281
|
+
if (heap_dis) {
|
|
282
|
+
this->threshold = heap_dis[0];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/// add one result for query i
|
|
287
|
+
bool add_result(T dis, TI idx) final {
|
|
288
|
+
if (C::cmp(threshold, dis)) {
|
|
289
|
+
heap_replace_top<C>(k, heap_dis, heap_ids, dis, idx);
|
|
290
|
+
threshold = heap_dis[0];
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
|
|
207
297
|
template <class C, bool use_sel = false>
|
|
208
298
|
struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
209
299
|
using T = typename C::T;
|
|
@@ -213,50 +303,41 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
213
303
|
using TopkBlockResultHandler<C, use_sel>::k;
|
|
214
304
|
|
|
215
305
|
HeapBlockResultHandler(
|
|
216
|
-
size_t
|
|
217
|
-
T*
|
|
218
|
-
TI*
|
|
219
|
-
size_t
|
|
220
|
-
const IDSelector*
|
|
221
|
-
: TopkBlockResultHandler<C, use_sel>(
|
|
222
|
-
|
|
306
|
+
size_t nq_,
|
|
307
|
+
T* dis_tab_,
|
|
308
|
+
TI* ids_tab_,
|
|
309
|
+
size_t k_,
|
|
310
|
+
const IDSelector* sel_ = nullptr)
|
|
311
|
+
: TopkBlockResultHandler<C, use_sel>(
|
|
312
|
+
nq_,
|
|
313
|
+
dis_tab_,
|
|
314
|
+
ids_tab_,
|
|
315
|
+
k_,
|
|
316
|
+
sel_) {}
|
|
317
|
+
|
|
223
318
|
/******************************************************
|
|
224
319
|
* API for 1 result at a time (each SingleResultHandler is
|
|
225
320
|
* called from 1 thread)
|
|
226
321
|
*/
|
|
227
322
|
|
|
228
|
-
struct SingleResultHandler :
|
|
323
|
+
struct SingleResultHandler : HeapResultHandler<C, use_sel> {
|
|
229
324
|
HeapBlockResultHandler& hr;
|
|
230
|
-
using ResultHandler<C>::threshold;
|
|
231
|
-
size_t k;
|
|
232
|
-
|
|
233
|
-
T* heap_dis;
|
|
234
|
-
TI* heap_ids;
|
|
235
325
|
|
|
236
|
-
explicit SingleResultHandler(HeapBlockResultHandler&
|
|
237
|
-
:
|
|
326
|
+
explicit SingleResultHandler(HeapBlockResultHandler& hr_)
|
|
327
|
+
: HeapResultHandler<C, use_sel>(hr_.k, nullptr, nullptr),
|
|
328
|
+
hr(hr_) {}
|
|
238
329
|
|
|
239
330
|
/// begin results for query # i
|
|
240
331
|
void begin(size_t i) {
|
|
241
|
-
heap_dis = hr.dis_tab + i * k;
|
|
242
|
-
heap_ids = hr.ids_tab + i * k;
|
|
243
|
-
heap_heapify<C>(k, heap_dis, heap_ids);
|
|
244
|
-
threshold = heap_dis[0];
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/// add one result for query i
|
|
248
|
-
bool add_result(T dis, TI idx) final {
|
|
249
|
-
if (C::cmp(threshold, dis)) {
|
|
250
|
-
heap_replace_top<C>(k, heap_dis, heap_ids, dis, idx);
|
|
251
|
-
threshold = heap_dis[0];
|
|
252
|
-
return true;
|
|
253
|
-
}
|
|
254
|
-
return false;
|
|
332
|
+
this->heap_dis = hr.dis_tab + i * this->k;
|
|
333
|
+
this->heap_ids = hr.ids_tab + i * this->k;
|
|
334
|
+
heap_heapify<C>(this->k, this->heap_dis, this->heap_ids);
|
|
335
|
+
this->threshold = this->heap_dis[0];
|
|
255
336
|
}
|
|
256
337
|
|
|
257
338
|
/// series of results for query i is done
|
|
258
339
|
void end() {
|
|
259
|
-
heap_reorder<C>(k, heap_dis, heap_ids);
|
|
340
|
+
heap_reorder<C>(this->k, this->heap_dis, this->heap_ids);
|
|
260
341
|
}
|
|
261
342
|
};
|
|
262
343
|
|
|
@@ -275,12 +356,14 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
275
356
|
}
|
|
276
357
|
|
|
277
358
|
/// add results for query i0..i1 and j0..j1
|
|
278
|
-
void add_results(size_t j0, size_t j1, const T*
|
|
359
|
+
void add_results(size_t j0, size_t j1, const T* dis_in) final {
|
|
279
360
|
#pragma omp parallel for
|
|
280
|
-
for (int64_t i = i0; i < i1;
|
|
361
|
+
for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
|
|
362
|
+
i++) {
|
|
281
363
|
T* heap_dis = this->dis_tab + i * k;
|
|
282
364
|
TI* heap_ids = this->ids_tab + i * k;
|
|
283
|
-
const T* dis_tab_i =
|
|
365
|
+
const T* dis_tab_i =
|
|
366
|
+
dis_in + (j1 - j0) * (i - static_cast<int64_t>(i0)) - j0;
|
|
284
367
|
T thresh = heap_dis[0];
|
|
285
368
|
for (size_t j = j0; j < j1; j++) {
|
|
286
369
|
T dis = dis_tab_i[j];
|
|
@@ -294,8 +377,9 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
294
377
|
|
|
295
378
|
/// series of results for queries i0..i1 is done
|
|
296
379
|
void end_multiple() final {
|
|
297
|
-
|
|
298
|
-
for (
|
|
380
|
+
#pragma omp parallel for schedule(static) if ((i1 - i0) * k >= 1024)
|
|
381
|
+
for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
|
|
382
|
+
i++) {
|
|
299
383
|
heap_reorder<C>(k, this->dis_tab + i * k, this->ids_tab + i * k);
|
|
300
384
|
}
|
|
301
385
|
}
|
|
@@ -312,10 +396,10 @@ struct HeapBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
312
396
|
|
|
313
397
|
/// Reservoir for a single query
|
|
314
398
|
template <class C>
|
|
315
|
-
struct ReservoirTopN :
|
|
399
|
+
struct ReservoirTopN : ResultHandlerT<C> {
|
|
316
400
|
using T = typename C::T;
|
|
317
401
|
using TI = typename C::TI;
|
|
318
|
-
using
|
|
402
|
+
using ResultHandlerT<C>::threshold;
|
|
319
403
|
|
|
320
404
|
T* vals;
|
|
321
405
|
TI* ids;
|
|
@@ -326,8 +410,8 @@ struct ReservoirTopN : ResultHandler<C> {
|
|
|
326
410
|
|
|
327
411
|
ReservoirTopN() {}
|
|
328
412
|
|
|
329
|
-
ReservoirTopN(size_t
|
|
330
|
-
: vals(
|
|
413
|
+
ReservoirTopN(size_t n_, size_t capacity_, T* vals_, TI* ids_)
|
|
414
|
+
: vals(vals_), ids(ids_), i(0), n(n_), capacity(capacity_) {
|
|
331
415
|
assert(n < capacity);
|
|
332
416
|
threshold = C::neutral();
|
|
333
417
|
}
|
|
@@ -365,7 +449,7 @@ struct ReservoirTopN : ResultHandler<C> {
|
|
|
365
449
|
}
|
|
366
450
|
|
|
367
451
|
void to_result(T* heap_dis, TI* heap_ids) const {
|
|
368
|
-
for (
|
|
452
|
+
for (size_t j = 0; j < std::min(i, n); j++) {
|
|
369
453
|
heap_push<C>(j + 1, heap_dis, heap_ids, vals[j], ids[j]);
|
|
370
454
|
}
|
|
371
455
|
|
|
@@ -387,16 +471,22 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
387
471
|
using TI = typename C::TI;
|
|
388
472
|
using BlockResultHandler<C, use_sel>::i0;
|
|
389
473
|
using BlockResultHandler<C, use_sel>::i1;
|
|
474
|
+
using TopkBlockResultHandler<C, use_sel>::k;
|
|
390
475
|
|
|
391
476
|
size_t capacity; // capacity of the reservoirs
|
|
392
477
|
|
|
393
478
|
ReservoirBlockResultHandler(
|
|
394
|
-
size_t
|
|
395
|
-
T*
|
|
396
|
-
TI*
|
|
397
|
-
size_t
|
|
398
|
-
const IDSelector*
|
|
399
|
-
: TopkBlockResultHandler<C, use_sel>(
|
|
479
|
+
size_t nq_,
|
|
480
|
+
T* dis_tab_,
|
|
481
|
+
TI* ids_tab_,
|
|
482
|
+
size_t k_,
|
|
483
|
+
const IDSelector* sel_ = nullptr)
|
|
484
|
+
: TopkBlockResultHandler<C, use_sel>(
|
|
485
|
+
nq_,
|
|
486
|
+
dis_tab_,
|
|
487
|
+
ids_tab_,
|
|
488
|
+
k_,
|
|
489
|
+
sel_) {
|
|
400
490
|
// double then round up to multiple of 16 (for SIMD alignment)
|
|
401
491
|
capacity = (2 * k + 15) & ~15;
|
|
402
492
|
}
|
|
@@ -412,9 +502,9 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
412
502
|
std::vector<T> reservoir_dis;
|
|
413
503
|
std::vector<TI> reservoir_ids;
|
|
414
504
|
|
|
415
|
-
explicit SingleResultHandler(ReservoirBlockResultHandler&
|
|
416
|
-
: ReservoirTopN<C>(
|
|
417
|
-
hr(
|
|
505
|
+
explicit SingleResultHandler(ReservoirBlockResultHandler& hr_)
|
|
506
|
+
: ReservoirTopN<C>(hr_.k, hr_.capacity, nullptr, nullptr),
|
|
507
|
+
hr(hr_) {}
|
|
418
508
|
|
|
419
509
|
size_t qno;
|
|
420
510
|
|
|
@@ -462,11 +552,14 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
462
552
|
}
|
|
463
553
|
|
|
464
554
|
/// add results for query i0..i1 and j0..j1
|
|
465
|
-
void add_results(size_t j0, size_t j1, const T*
|
|
555
|
+
void add_results(size_t j0, size_t j1, const T* dis_in) {
|
|
466
556
|
#pragma omp parallel for
|
|
467
|
-
for (int64_t i = i0; i < i1;
|
|
468
|
-
|
|
469
|
-
|
|
557
|
+
for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
|
|
558
|
+
i++) {
|
|
559
|
+
ReservoirTopN<C>& reservoir =
|
|
560
|
+
reservoirs[i - static_cast<int64_t>(i0)];
|
|
561
|
+
const T* dis_tab_i =
|
|
562
|
+
dis_in + (j1 - j0) * (i - static_cast<int64_t>(i0)) - j0;
|
|
470
563
|
for (size_t j = j0; j < j1; j++) {
|
|
471
564
|
T dis = dis_tab_i[j];
|
|
472
565
|
reservoir.add_result(dis, j);
|
|
@@ -476,9 +569,10 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
476
569
|
|
|
477
570
|
/// series of results for queries i0..i1 is done
|
|
478
571
|
void end_multiple() final {
|
|
479
|
-
|
|
480
|
-
for (
|
|
481
|
-
|
|
572
|
+
#pragma omp parallel for schedule(static) if ((i1 - i0) * this->k >= 1024)
|
|
573
|
+
for (int64_t i = static_cast<int64_t>(i0); i < static_cast<int64_t>(i1);
|
|
574
|
+
i++) {
|
|
575
|
+
reservoirs[i - static_cast<int64_t>(i0)].to_result(
|
|
482
576
|
this->dis_tab + i * this->k, this->ids_tab + i * this->k);
|
|
483
577
|
}
|
|
484
578
|
}
|
|
@@ -488,6 +582,28 @@ struct ReservoirBlockResultHandler : TopkBlockResultHandler<C, use_sel> {
|
|
|
488
582
|
* Result handler for range searches
|
|
489
583
|
*****************************************************************/
|
|
490
584
|
|
|
585
|
+
template <class C, bool use_sel = false>
|
|
586
|
+
struct RangeResultHandler : ResultHandlerT<C> {
|
|
587
|
+
using T = typename C::T;
|
|
588
|
+
using TI = typename C::TI;
|
|
589
|
+
using ResultHandlerT<C>::threshold;
|
|
590
|
+
|
|
591
|
+
RangeQueryResult* qr = nullptr;
|
|
592
|
+
|
|
593
|
+
RangeResultHandler(RangeQueryResult* qr_, T threshold_) : qr(qr_) {
|
|
594
|
+
this->threshold = threshold_;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/// add one result for query i
|
|
598
|
+
bool add_result(T dis, TI idx) final {
|
|
599
|
+
if (C::cmp(threshold, dis)) {
|
|
600
|
+
qr->add(dis, idx);
|
|
601
|
+
return true;
|
|
602
|
+
}
|
|
603
|
+
return false;
|
|
604
|
+
}
|
|
605
|
+
};
|
|
606
|
+
|
|
491
607
|
template <class C, bool use_sel = false>
|
|
492
608
|
struct RangeSearchBlockResultHandler : BlockResultHandler<C, use_sel> {
|
|
493
609
|
using T = typename C::T;
|
|
@@ -499,40 +615,29 @@ struct RangeSearchBlockResultHandler : BlockResultHandler<C, use_sel> {
|
|
|
499
615
|
T radius;
|
|
500
616
|
|
|
501
617
|
RangeSearchBlockResultHandler(
|
|
502
|
-
RangeSearchResult*
|
|
503
|
-
float
|
|
504
|
-
const IDSelector*
|
|
505
|
-
: BlockResultHandler<C, use_sel>(
|
|
506
|
-
res(
|
|
507
|
-
radius(
|
|
618
|
+
RangeSearchResult* res_,
|
|
619
|
+
float radius_,
|
|
620
|
+
const IDSelector* sel_ = nullptr)
|
|
621
|
+
: BlockResultHandler<C, use_sel>(res_->nq, sel_),
|
|
622
|
+
res(res_),
|
|
623
|
+
radius(radius_) {}
|
|
508
624
|
|
|
509
625
|
/******************************************************
|
|
510
626
|
* API for 1 result at a time (each SingleResultHandler is
|
|
511
627
|
* called from 1 thread)
|
|
512
628
|
******************************************************/
|
|
513
629
|
|
|
514
|
-
struct SingleResultHandler :
|
|
630
|
+
struct SingleResultHandler : RangeResultHandler<C> {
|
|
515
631
|
// almost the same interface as RangeSearchResultHandler
|
|
516
|
-
using
|
|
632
|
+
using ResultHandlerT<C>::threshold;
|
|
517
633
|
RangeSearchPartialResult pres;
|
|
518
|
-
RangeQueryResult* qr = nullptr;
|
|
519
634
|
|
|
520
635
|
explicit SingleResultHandler(RangeSearchBlockResultHandler& rh)
|
|
521
|
-
: pres(rh.res) {
|
|
522
|
-
threshold = rh.radius;
|
|
523
|
-
}
|
|
636
|
+
: RangeResultHandler<C>(nullptr, rh.radius), pres(rh.res) {}
|
|
524
637
|
|
|
525
638
|
/// begin results for query # i
|
|
526
639
|
void begin(size_t i) {
|
|
527
|
-
qr = &pres.new_result(i);
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
/// add one result for query i
|
|
531
|
-
bool add_result(T dis, TI idx) final {
|
|
532
|
-
if (C::cmp(threshold, dis)) {
|
|
533
|
-
qr->add(dis, idx);
|
|
534
|
-
}
|
|
535
|
-
return false;
|
|
640
|
+
this->qr = &pres.new_result(i);
|
|
536
641
|
}
|
|
537
642
|
|
|
538
643
|
/// series of results for query i is done
|
|
@@ -575,7 +680,7 @@ struct RangeSearchBlockResultHandler : BlockResultHandler<C, use_sel> {
|
|
|
575
680
|
// it is a bit tricky to find the proper PartialResult structure
|
|
576
681
|
// because the inner loop is on db not on queries.
|
|
577
682
|
|
|
578
|
-
if (pr < j0s.size() && j0 == j0s[pr]) {
|
|
683
|
+
if (static_cast<size_t>(pr) < j0s.size() && j0 == j0s[pr]) {
|
|
579
684
|
pres = partial_results[pr];
|
|
580
685
|
pr++;
|
|
581
686
|
} else if (j0 == 0 && j0s.size() > 0) {
|
|
@@ -637,7 +742,7 @@ typename Consumer::T dispatch_knn_ResultHandler(
|
|
|
637
742
|
if (k == 1) { \
|
|
638
743
|
Top1BlockResultHandler<C, use_sel> res(nx, vals, ids, sel); \
|
|
639
744
|
return consumer.template f<>(res, args...); \
|
|
640
|
-
} else if (k < distance_compute_min_k_reservoir) {
|
|
745
|
+
} else if (k < static_cast<size_t>(distance_compute_min_k_reservoir)) { \
|
|
641
746
|
HeapBlockResultHandler<C, use_sel> res(nx, vals, ids, k, sel); \
|
|
642
747
|
return consumer.template f<>(res, args...); \
|
|
643
748
|
} else { \
|