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
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @file dispatching.h
|
|
12
|
+
* @brief Per-SIMD TU dispatch template for fast scan.
|
|
13
|
+
*
|
|
14
|
+
* This header is included once per SIMD TU with THE_LEVEL_TO_DISPATCH
|
|
15
|
+
* set to the desired SIMDLevel. It provides:
|
|
16
|
+
* - ScannerMixIn: wraps a handler + calls kernel at the TU's SIMD level
|
|
17
|
+
* - make_fast_scan_scanner_impl<SL>: factory specialization
|
|
18
|
+
*
|
|
19
|
+
* Usage (in a per-SIMD .cpp file):
|
|
20
|
+
* #define THE_LEVEL_TO_DISPATCH SIMDLevel::AVX2
|
|
21
|
+
* #include <faiss/impl/fast_scan/dispatching.h>
|
|
22
|
+
*
|
|
23
|
+
* Kernel helpers come from accumulate_loops.h (search_1 multi-BB path
|
|
24
|
+
* and QBS 256-bit path) and accumulate_loops_512.h (QBS 512-bit path,
|
|
25
|
+
* AVX512 TU only).
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
#ifndef THE_LEVEL_TO_DISPATCH
|
|
29
|
+
#error "Define THE_LEVEL_TO_DISPATCH before including this header"
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
#include <memory>
|
|
33
|
+
|
|
34
|
+
#include <faiss/impl/fast_scan/accumulate_loops.h>
|
|
35
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
36
|
+
|
|
37
|
+
#if defined(COMPILE_SIMD_AVX512) && defined(__AVX512F__)
|
|
38
|
+
#include <faiss/impl/fast_scan/accumulate_loops_512.h>
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
namespace faiss {
|
|
42
|
+
|
|
43
|
+
using namespace simd_result_handlers;
|
|
44
|
+
|
|
45
|
+
/***************************************************************
|
|
46
|
+
* ScannerMixIn: wraps a concrete handler + calls accumulation
|
|
47
|
+
* kernels. Lives behind the virtual FastScanCodeScanner interface
|
|
48
|
+
* so callers don't need to know the handler type.
|
|
49
|
+
***************************************************************/
|
|
50
|
+
|
|
51
|
+
template <class Handler>
|
|
52
|
+
struct ScannerMixIn : FastScanCodeScanner {
|
|
53
|
+
Handler handler_;
|
|
54
|
+
|
|
55
|
+
template <typename... Args>
|
|
56
|
+
explicit ScannerMixIn(Args&&... args)
|
|
57
|
+
: handler_(std::forward<Args>(args)...) {}
|
|
58
|
+
|
|
59
|
+
SIMDResultHandlerToFloat* handler() override {
|
|
60
|
+
return &handler_;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void accumulate_loop(
|
|
64
|
+
int nq,
|
|
65
|
+
size_t nb,
|
|
66
|
+
int bbs,
|
|
67
|
+
int nsq,
|
|
68
|
+
const uint8_t* codes,
|
|
69
|
+
const uint8_t* LUT,
|
|
70
|
+
int pq2x4_scale,
|
|
71
|
+
size_t block_stride) override {
|
|
72
|
+
if (pq2x4_scale) {
|
|
73
|
+
NormTableScaler<THE_LEVEL_TO_DISPATCH> scaler(pq2x4_scale);
|
|
74
|
+
pq4_accumulate_loop_fixed_scaler<THE_LEVEL_TO_DISPATCH>(
|
|
75
|
+
nq,
|
|
76
|
+
nb,
|
|
77
|
+
bbs,
|
|
78
|
+
nsq,
|
|
79
|
+
codes,
|
|
80
|
+
LUT,
|
|
81
|
+
handler_,
|
|
82
|
+
scaler,
|
|
83
|
+
block_stride);
|
|
84
|
+
} else {
|
|
85
|
+
DummyScaler<THE_LEVEL_TO_DISPATCH> dummy;
|
|
86
|
+
pq4_accumulate_loop_fixed_scaler<THE_LEVEL_TO_DISPATCH>(
|
|
87
|
+
nq,
|
|
88
|
+
nb,
|
|
89
|
+
bbs,
|
|
90
|
+
nsq,
|
|
91
|
+
codes,
|
|
92
|
+
LUT,
|
|
93
|
+
handler_,
|
|
94
|
+
dummy,
|
|
95
|
+
block_stride);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
void accumulate_loop_qbs(
|
|
100
|
+
int qbs,
|
|
101
|
+
size_t nb,
|
|
102
|
+
int nsq,
|
|
103
|
+
const uint8_t* codes,
|
|
104
|
+
const uint8_t* LUT,
|
|
105
|
+
int pq2x4_scale,
|
|
106
|
+
size_t block_stride) override {
|
|
107
|
+
#if defined(COMPILE_SIMD_AVX512) && defined(__AVX512F__)
|
|
108
|
+
constexpr bool use_avx512_qbs =
|
|
109
|
+
(THE_LEVEL_TO_DISPATCH == SIMDLevel::AVX512 ||
|
|
110
|
+
THE_LEVEL_TO_DISPATCH == SIMDLevel::AVX512_SPR);
|
|
111
|
+
#else
|
|
112
|
+
constexpr bool use_avx512_qbs = false;
|
|
113
|
+
#endif
|
|
114
|
+
if constexpr (use_avx512_qbs) {
|
|
115
|
+
// Use 512-bit QBS kernels with properly-leveled scalers.
|
|
116
|
+
if (pq2x4_scale) {
|
|
117
|
+
NormTableScaler<THE_LEVEL_TO_DISPATCH> scaler(pq2x4_scale);
|
|
118
|
+
pq4_accumulate_loop_qbs_fixed_scaler_512(
|
|
119
|
+
qbs,
|
|
120
|
+
nb,
|
|
121
|
+
nsq,
|
|
122
|
+
codes,
|
|
123
|
+
LUT,
|
|
124
|
+
handler_,
|
|
125
|
+
scaler,
|
|
126
|
+
block_stride);
|
|
127
|
+
} else {
|
|
128
|
+
DummyScaler<THE_LEVEL_TO_DISPATCH> dummy;
|
|
129
|
+
pq4_accumulate_loop_qbs_fixed_scaler_512(
|
|
130
|
+
qbs,
|
|
131
|
+
nb,
|
|
132
|
+
nsq,
|
|
133
|
+
codes,
|
|
134
|
+
LUT,
|
|
135
|
+
handler_,
|
|
136
|
+
dummy,
|
|
137
|
+
block_stride);
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
if (pq2x4_scale) {
|
|
141
|
+
NormTableScaler<THE_LEVEL_TO_DISPATCH> scaler(pq2x4_scale);
|
|
142
|
+
pq4_accumulate_loop_qbs_fixed_scaler_256<THE_LEVEL_TO_DISPATCH>(
|
|
143
|
+
qbs,
|
|
144
|
+
nb,
|
|
145
|
+
nsq,
|
|
146
|
+
codes,
|
|
147
|
+
LUT,
|
|
148
|
+
handler_,
|
|
149
|
+
scaler,
|
|
150
|
+
block_stride);
|
|
151
|
+
} else {
|
|
152
|
+
DummyScaler<THE_LEVEL_TO_DISPATCH> dummy;
|
|
153
|
+
pq4_accumulate_loop_qbs_fixed_scaler_256<THE_LEVEL_TO_DISPATCH>(
|
|
154
|
+
qbs,
|
|
155
|
+
nb,
|
|
156
|
+
nsq,
|
|
157
|
+
codes,
|
|
158
|
+
LUT,
|
|
159
|
+
handler_,
|
|
160
|
+
dummy,
|
|
161
|
+
block_stride);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/***************************************************************
|
|
168
|
+
* Factory specialization for this SIMD level.
|
|
169
|
+
*
|
|
170
|
+
* Combinatorial dispatch: is_max × with_id_map × handler type
|
|
171
|
+
* k == 1: SingleResultHandler
|
|
172
|
+
* impl even: HeapHandler
|
|
173
|
+
* impl odd: ReservoirHandler (capacity = 2*k)
|
|
174
|
+
***************************************************************/
|
|
175
|
+
|
|
176
|
+
template <>
|
|
177
|
+
std::unique_ptr<FastScanCodeScanner> make_fast_scan_scanner_impl<
|
|
178
|
+
THE_LEVEL_TO_DISPATCH>(
|
|
179
|
+
bool is_max,
|
|
180
|
+
int impl,
|
|
181
|
+
size_t nq,
|
|
182
|
+
size_t ntotal,
|
|
183
|
+
int64_t k,
|
|
184
|
+
float* distances,
|
|
185
|
+
int64_t* ids,
|
|
186
|
+
const IDSelector* sel,
|
|
187
|
+
bool with_id_map) {
|
|
188
|
+
// Helper lambda: given comparator C and with_id_map W, select handler
|
|
189
|
+
auto make = [&]<class C, bool W>() -> std::unique_ptr<FastScanCodeScanner> {
|
|
190
|
+
if (k == 1) {
|
|
191
|
+
using H = SingleResultHandler<C, W, THE_LEVEL_TO_DISPATCH>;
|
|
192
|
+
return std::make_unique<ScannerMixIn<H>>(
|
|
193
|
+
nq, ntotal, distances, ids, sel);
|
|
194
|
+
} else if (impl % 2 == 0) {
|
|
195
|
+
using H = HeapHandler<C, W, THE_LEVEL_TO_DISPATCH>;
|
|
196
|
+
return std::make_unique<ScannerMixIn<H>>(
|
|
197
|
+
nq, ntotal, k, distances, ids, sel);
|
|
198
|
+
} else {
|
|
199
|
+
using H = ReservoirHandler<C, W, THE_LEVEL_TO_DISPATCH>;
|
|
200
|
+
return std::make_unique<ScannerMixIn<H>>(
|
|
201
|
+
nq, ntotal, size_t(k), size_t(2 * k), distances, ids, sel);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
if (is_max) {
|
|
206
|
+
if (with_id_map) {
|
|
207
|
+
return make.template operator()<CMax<uint16_t, int64_t>, true>();
|
|
208
|
+
} else {
|
|
209
|
+
return make.template operator()<CMax<uint16_t, int>, false>();
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
if (with_id_map) {
|
|
213
|
+
return make.template operator()<CMin<uint16_t, int64_t>, true>();
|
|
214
|
+
} else {
|
|
215
|
+
return make.template operator()<CMin<uint16_t, int>, false>();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/***************************************************************
|
|
221
|
+
* Range search scanner factories.
|
|
222
|
+
***************************************************************/
|
|
223
|
+
|
|
224
|
+
template <>
|
|
225
|
+
std::unique_ptr<FastScanCodeScanner> make_range_scanner_impl<
|
|
226
|
+
THE_LEVEL_TO_DISPATCH>(
|
|
227
|
+
bool is_max,
|
|
228
|
+
RangeSearchResult& rres,
|
|
229
|
+
float radius,
|
|
230
|
+
size_t ntotal,
|
|
231
|
+
const IDSelector* sel) {
|
|
232
|
+
if (is_max) {
|
|
233
|
+
using C = CMax<uint16_t, int64_t>;
|
|
234
|
+
return std::make_unique<
|
|
235
|
+
ScannerMixIn<RangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
|
|
236
|
+
rres, radius, ntotal, sel);
|
|
237
|
+
} else {
|
|
238
|
+
using C = CMin<uint16_t, int64_t>;
|
|
239
|
+
return std::make_unique<
|
|
240
|
+
ScannerMixIn<RangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
|
|
241
|
+
rres, radius, ntotal, sel);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
template <>
|
|
246
|
+
std::unique_ptr<FastScanCodeScanner> make_partial_range_scanner_impl<
|
|
247
|
+
THE_LEVEL_TO_DISPATCH>(
|
|
248
|
+
bool is_max,
|
|
249
|
+
RangeSearchPartialResult& pres,
|
|
250
|
+
float radius,
|
|
251
|
+
size_t ntotal,
|
|
252
|
+
size_t q0,
|
|
253
|
+
size_t q1,
|
|
254
|
+
const IDSelector* sel) {
|
|
255
|
+
if (is_max) {
|
|
256
|
+
using C = CMax<uint16_t, int64_t>;
|
|
257
|
+
return std::make_unique<ScannerMixIn<
|
|
258
|
+
PartialRangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
|
|
259
|
+
pres, radius, ntotal, q0, q1, sel);
|
|
260
|
+
} else {
|
|
261
|
+
using C = CMin<uint16_t, int64_t>;
|
|
262
|
+
return std::make_unique<ScannerMixIn<
|
|
263
|
+
PartialRangeHandler<C, true, THE_LEVEL_TO_DISPATCH>>>(
|
|
264
|
+
pres, radius, ntotal, q0, q1, sel);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
} // namespace faiss
|
|
@@ -6,8 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
#include <faiss/impl/FaissAssert.h>
|
|
9
|
-
#include <faiss/impl/
|
|
10
|
-
#include <faiss/impl/
|
|
9
|
+
#include <faiss/impl/fast_scan/LookupTableScaler.h>
|
|
10
|
+
#include <faiss/impl/fast_scan/decompose_qbs.h>
|
|
11
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
12
|
+
#include <faiss/impl/fast_scan/simd_result_handlers.h>
|
|
13
|
+
#include <faiss/impl/simd_dispatch.h>
|
|
11
14
|
|
|
12
15
|
#include <array>
|
|
13
16
|
|
|
@@ -111,7 +114,8 @@ void pq4_pack_codes_range(
|
|
|
111
114
|
size_t bbs,
|
|
112
115
|
size_t nsq,
|
|
113
116
|
uint8_t* blocks,
|
|
114
|
-
size_t code_stride
|
|
117
|
+
size_t code_stride,
|
|
118
|
+
size_t block_stride) {
|
|
115
119
|
// Determine stride: use custom if provided, otherwise use legacy
|
|
116
120
|
// calculation
|
|
117
121
|
size_t actual_stride = (code_stride == 0) ? (M + 1) / 2 : code_stride;
|
|
@@ -136,7 +140,7 @@ void pq4_pack_codes_range(
|
|
|
136
140
|
size_t block1 = ((i1 - 1) / bbs) + 1;
|
|
137
141
|
|
|
138
142
|
for (size_t b = block0; b < block1; b++) {
|
|
139
|
-
uint8_t* codes2 = blocks + b *
|
|
143
|
+
uint8_t* codes2 = blocks + b * block_stride;
|
|
140
144
|
int64_t i_base = b * bbs - i0;
|
|
141
145
|
for (int sq = 0; sq < nsq; sq += 2) {
|
|
142
146
|
for (size_t i = 0; i < bbs; i += 32) {
|
|
@@ -272,6 +276,10 @@ void CodePackerPQ4::unpack_1(
|
|
|
272
276
|
}
|
|
273
277
|
}
|
|
274
278
|
|
|
279
|
+
CodePacker* CodePackerPQ4::clone() const {
|
|
280
|
+
return new CodePackerPQ4(*this);
|
|
281
|
+
}
|
|
282
|
+
|
|
275
283
|
/***************************************************************
|
|
276
284
|
* Packing functions for Look-Up Tables (LUT)
|
|
277
285
|
***************************************************************/
|
|
@@ -345,4 +353,168 @@ int pq4_pack_LUT_qbs_q_map(
|
|
|
345
353
|
return i0;
|
|
346
354
|
}
|
|
347
355
|
|
|
356
|
+
int pq4_qbs_to_nq(int qbs) {
|
|
357
|
+
int i0 = 0;
|
|
358
|
+
int qi = qbs;
|
|
359
|
+
while (qi) {
|
|
360
|
+
int nq = qi & 15;
|
|
361
|
+
qi >>= 4;
|
|
362
|
+
i0 += nq;
|
|
363
|
+
}
|
|
364
|
+
return i0;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
int pq4_preferred_qbs(int n) {
|
|
368
|
+
// from timings in P141901742, P141902828
|
|
369
|
+
static int map[12] = {
|
|
370
|
+
0, 1, 2, 3, 0x13, 0x23, 0x33, 0x223, 0x233, 0x333, 0x2233, 0x2333};
|
|
371
|
+
if (n <= 11) {
|
|
372
|
+
return map[n];
|
|
373
|
+
} else if (n <= 24) {
|
|
374
|
+
// override qbs: all first stages with 3 steps
|
|
375
|
+
// then 1 stage with the rest
|
|
376
|
+
int nbit = 4 * (n / 3); // nbits with only 3s
|
|
377
|
+
int qbs = 0x33333333 & ((1 << nbit) - 1);
|
|
378
|
+
qbs |= (n % 3) << nbit;
|
|
379
|
+
return qbs;
|
|
380
|
+
} else {
|
|
381
|
+
FAISS_THROW_FMT("number of queries %d too large", n);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
} // namespace faiss
|
|
386
|
+
|
|
387
|
+
/***************************************************************
|
|
388
|
+
* FastScanCodeScanner: NONE specialization + dispatch wrapper.
|
|
389
|
+
*
|
|
390
|
+
* The NONE specialization provides the scalar fallback.
|
|
391
|
+
* Per-SIMD specializations (AVX2, AVX512, ARM_NEON) are in
|
|
392
|
+
* impl-avx2.cpp, impl-avx512.cpp, impl-neon.cpp respectively.
|
|
393
|
+
***************************************************************/
|
|
394
|
+
|
|
395
|
+
#define THE_LEVEL_TO_DISPATCH SIMDLevel::NONE
|
|
396
|
+
#include <faiss/impl/fast_scan/dispatching.h> // IWYU pragma: keep
|
|
397
|
+
#include <faiss/impl/fast_scan/rabitq_dispatching.h> // IWYU pragma: keep
|
|
398
|
+
#undef THE_LEVEL_TO_DISPATCH
|
|
399
|
+
|
|
400
|
+
namespace faiss {
|
|
401
|
+
|
|
402
|
+
using namespace simd_result_handlers;
|
|
403
|
+
|
|
404
|
+
/***************************************************************
|
|
405
|
+
* accumulate_to_mem: NONE specialization + runtime dispatch.
|
|
406
|
+
***************************************************************/
|
|
407
|
+
|
|
408
|
+
template <>
|
|
409
|
+
void accumulate_to_mem_impl<SIMDLevel::NONE>(
|
|
410
|
+
int nq,
|
|
411
|
+
size_t ntotal2,
|
|
412
|
+
int nsq,
|
|
413
|
+
const uint8_t* codes,
|
|
414
|
+
const uint8_t* LUT,
|
|
415
|
+
uint16_t* accu) {
|
|
416
|
+
StoreResultHandler<SIMDLevel::NONE> handler(accu, ntotal2);
|
|
417
|
+
DummyScaler<SIMDLevel::NONE> scaler;
|
|
418
|
+
accumulate<SIMDLevel::NONE>(
|
|
419
|
+
nq, ntotal2, nsq, codes, LUT, handler, scaler, 32 * nsq / 2);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
void accumulate_to_mem(
|
|
423
|
+
int nq,
|
|
424
|
+
size_t ntotal2,
|
|
425
|
+
int nsq,
|
|
426
|
+
const uint8_t* codes,
|
|
427
|
+
const uint8_t* LUT,
|
|
428
|
+
uint16_t* accu) {
|
|
429
|
+
FAISS_THROW_IF_NOT(ntotal2 % 32 == 0);
|
|
430
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
431
|
+
accumulate_to_mem_impl<SL>(nq, ntotal2, nsq, codes, LUT, accu);
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
} // namespace faiss
|
|
436
|
+
|
|
437
|
+
namespace faiss {
|
|
438
|
+
|
|
439
|
+
std::unique_ptr<FastScanCodeScanner> make_fast_scan_knn_scanner(
|
|
440
|
+
bool is_max,
|
|
441
|
+
int impl,
|
|
442
|
+
size_t nq,
|
|
443
|
+
size_t ntotal,
|
|
444
|
+
int64_t k,
|
|
445
|
+
float* distances,
|
|
446
|
+
int64_t* ids,
|
|
447
|
+
const IDSelector* sel,
|
|
448
|
+
bool with_id_map) {
|
|
449
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
450
|
+
return make_fast_scan_scanner_impl<SL>(
|
|
451
|
+
is_max, impl, nq, ntotal, k, distances, ids, sel, with_id_map);
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
std::unique_ptr<FastScanCodeScanner> make_range_scanner(
|
|
456
|
+
bool is_max,
|
|
457
|
+
RangeSearchResult& rres,
|
|
458
|
+
float radius,
|
|
459
|
+
size_t ntotal,
|
|
460
|
+
const IDSelector* sel) {
|
|
461
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
462
|
+
return make_range_scanner_impl<SL>(is_max, rres, radius, ntotal, sel);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
std::unique_ptr<FastScanCodeScanner> make_partial_range_scanner(
|
|
467
|
+
bool is_max,
|
|
468
|
+
RangeSearchPartialResult& pres,
|
|
469
|
+
float radius,
|
|
470
|
+
size_t ntotal,
|
|
471
|
+
size_t q0,
|
|
472
|
+
size_t q1,
|
|
473
|
+
const IDSelector* sel) {
|
|
474
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
475
|
+
return make_partial_range_scanner_impl<SL>(
|
|
476
|
+
is_max, pres, radius, ntotal, q0, q1, sel);
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
std::unique_ptr<FastScanCodeScanner> rabitq_make_knn_scanner(
|
|
481
|
+
const IndexRaBitQFastScan* index,
|
|
482
|
+
bool is_max,
|
|
483
|
+
size_t nq,
|
|
484
|
+
int64_t k,
|
|
485
|
+
float* distances,
|
|
486
|
+
int64_t* ids,
|
|
487
|
+
const IDSelector* sel,
|
|
488
|
+
const FastScanDistancePostProcessing& context,
|
|
489
|
+
bool is_multi_bit) {
|
|
490
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
491
|
+
return rabitq_make_knn_scanner_impl<SL>(
|
|
492
|
+
index,
|
|
493
|
+
is_max,
|
|
494
|
+
nq,
|
|
495
|
+
k,
|
|
496
|
+
distances,
|
|
497
|
+
ids,
|
|
498
|
+
sel,
|
|
499
|
+
context,
|
|
500
|
+
is_multi_bit);
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
std::unique_ptr<FastScanCodeScanner> rabitq_ivf_make_knn_scanner(
|
|
505
|
+
bool is_max,
|
|
506
|
+
const IndexIVFRaBitQFastScan* index,
|
|
507
|
+
size_t nq,
|
|
508
|
+
size_t k,
|
|
509
|
+
float* distances,
|
|
510
|
+
int64_t* ids,
|
|
511
|
+
const IDSelector* sel,
|
|
512
|
+
const FastScanDistancePostProcessing* context,
|
|
513
|
+
bool multi_bit) {
|
|
514
|
+
return with_simd_level([&]<SIMDLevel SL>() {
|
|
515
|
+
return rabitq_ivf_make_knn_scanner_impl<SL>(
|
|
516
|
+
is_max, index, nq, k, distances, ids, sel, context, multi_bit);
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
|
|
348
520
|
} // namespace faiss
|