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,26 @@
|
|
|
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
|
+
#ifdef COMPILE_SIMD_AVX2
|
|
9
|
+
|
|
10
|
+
#define THE_SIMD_LEVEL SIMDLevel::AVX2
|
|
11
|
+
|
|
12
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
13
|
+
#include <faiss/utils/hamming_distance/hamming_computer-avx2.h>
|
|
14
|
+
|
|
15
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
16
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
|
|
17
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
18
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
|
|
19
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
20
|
+
#include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
|
|
21
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
22
|
+
#include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
|
|
23
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
24
|
+
#include <faiss/impl/binary_hamming/IndexPQ_impl.h>
|
|
25
|
+
|
|
26
|
+
#endif // COMPILE_SIMD_AVX2
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
#ifdef COMPILE_SIMD_AVX512
|
|
9
|
+
|
|
10
|
+
#define THE_SIMD_LEVEL SIMDLevel::AVX512
|
|
11
|
+
|
|
12
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
13
|
+
#include <faiss/utils/hamming_distance/hamming_computer-avx512.h>
|
|
14
|
+
|
|
15
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
16
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
|
|
17
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
18
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
|
|
19
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
20
|
+
#include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
|
|
21
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
22
|
+
#include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
|
|
23
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
24
|
+
#include <faiss/impl/binary_hamming/IndexPQ_impl.h>
|
|
25
|
+
|
|
26
|
+
#endif // COMPILE_SIMD_AVX512
|
|
@@ -0,0 +1,143 @@
|
|
|
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
|
+
#include <faiss/utils/simd_levels.h>
|
|
11
|
+
|
|
12
|
+
#include <cstddef>
|
|
13
|
+
#include <cstdint>
|
|
14
|
+
|
|
15
|
+
namespace faiss {
|
|
16
|
+
|
|
17
|
+
// Forward declarations
|
|
18
|
+
struct DistanceComputer;
|
|
19
|
+
struct InvertedListScanner;
|
|
20
|
+
struct BinaryInvertedListScanner;
|
|
21
|
+
struct IndexBinaryFlat;
|
|
22
|
+
struct IndexBinaryHash;
|
|
23
|
+
struct IndexBinaryMultiHash;
|
|
24
|
+
struct IndexBinaryIVF;
|
|
25
|
+
struct IndexIVFSpectralHash;
|
|
26
|
+
struct IndexPQ;
|
|
27
|
+
struct SearchParametersIVF;
|
|
28
|
+
using IVFSearchParameters = SearchParametersIVF;
|
|
29
|
+
struct RangeQueryResult;
|
|
30
|
+
using idx_t = int64_t;
|
|
31
|
+
|
|
32
|
+
/** @name IndexBinaryHNSW dispatch
|
|
33
|
+
* @{ */
|
|
34
|
+
template <SIMDLevel SL>
|
|
35
|
+
DistanceComputer* make_binary_hnsw_distance_computer_fixSL(
|
|
36
|
+
int code_size,
|
|
37
|
+
IndexBinaryFlat* flat_storage);
|
|
38
|
+
/** @} */
|
|
39
|
+
|
|
40
|
+
/** @name IndexBinaryIVF dispatch
|
|
41
|
+
* @{ */
|
|
42
|
+
template <SIMDLevel SL>
|
|
43
|
+
BinaryInvertedListScanner* make_binary_ivf_scanner_fixSL(
|
|
44
|
+
size_t code_size,
|
|
45
|
+
bool store_pairs);
|
|
46
|
+
|
|
47
|
+
template <SIMDLevel SL>
|
|
48
|
+
void search_knn_hamming_per_invlist_fixSL(
|
|
49
|
+
int code_size,
|
|
50
|
+
const IndexBinaryIVF* ivf,
|
|
51
|
+
size_t n,
|
|
52
|
+
const uint8_t* x,
|
|
53
|
+
idx_t k,
|
|
54
|
+
const idx_t* keys_in,
|
|
55
|
+
const int32_t* coarse_dis,
|
|
56
|
+
int32_t* distances,
|
|
57
|
+
idx_t* labels,
|
|
58
|
+
bool store_pairs,
|
|
59
|
+
const IVFSearchParameters* params);
|
|
60
|
+
|
|
61
|
+
template <SIMDLevel SL>
|
|
62
|
+
void search_knn_hamming_count_fixSL(
|
|
63
|
+
int code_size,
|
|
64
|
+
bool store_pairs,
|
|
65
|
+
const IndexBinaryIVF* ivf,
|
|
66
|
+
size_t nx,
|
|
67
|
+
const uint8_t* x,
|
|
68
|
+
const idx_t* keys,
|
|
69
|
+
int k,
|
|
70
|
+
int32_t* distances,
|
|
71
|
+
idx_t* labels,
|
|
72
|
+
const IVFSearchParameters* params);
|
|
73
|
+
/** @} */
|
|
74
|
+
|
|
75
|
+
/** @name IndexBinaryHash dispatch
|
|
76
|
+
* @{ */
|
|
77
|
+
template <SIMDLevel SL>
|
|
78
|
+
void binary_hash_knn_search_fixSL(
|
|
79
|
+
const IndexBinaryHash& index,
|
|
80
|
+
const uint8_t* q,
|
|
81
|
+
idx_t k,
|
|
82
|
+
int32_t* heap_sim,
|
|
83
|
+
idx_t* heap_ids,
|
|
84
|
+
size_t& n0,
|
|
85
|
+
size_t& nlist,
|
|
86
|
+
size_t& ndis);
|
|
87
|
+
|
|
88
|
+
template <SIMDLevel SL>
|
|
89
|
+
void binary_hash_range_search_fixSL(
|
|
90
|
+
const IndexBinaryHash& index,
|
|
91
|
+
const uint8_t* q,
|
|
92
|
+
int radius,
|
|
93
|
+
RangeQueryResult& qres,
|
|
94
|
+
size_t& n0,
|
|
95
|
+
size_t& nlist,
|
|
96
|
+
size_t& ndis);
|
|
97
|
+
|
|
98
|
+
template <SIMDLevel SL>
|
|
99
|
+
void binary_multihash_knn_search_fixSL(
|
|
100
|
+
const IndexBinaryMultiHash& index,
|
|
101
|
+
const uint8_t* q,
|
|
102
|
+
idx_t k,
|
|
103
|
+
int32_t* heap_sim,
|
|
104
|
+
idx_t* heap_ids,
|
|
105
|
+
size_t& n0,
|
|
106
|
+
size_t& nlist,
|
|
107
|
+
size_t& ndis);
|
|
108
|
+
|
|
109
|
+
template <SIMDLevel SL>
|
|
110
|
+
void binary_multihash_range_search_fixSL(
|
|
111
|
+
const IndexBinaryMultiHash& index,
|
|
112
|
+
const uint8_t* q,
|
|
113
|
+
int radius,
|
|
114
|
+
RangeQueryResult& qres,
|
|
115
|
+
size_t& n0,
|
|
116
|
+
size_t& nlist,
|
|
117
|
+
size_t& ndis);
|
|
118
|
+
/** @} */
|
|
119
|
+
|
|
120
|
+
/** @name IndexIVFSpectralHash dispatch
|
|
121
|
+
* @{ */
|
|
122
|
+
template <SIMDLevel SL>
|
|
123
|
+
InvertedListScanner* make_spectral_hash_scanner_fixSL(
|
|
124
|
+
int code_size,
|
|
125
|
+
const IndexIVFSpectralHash* index,
|
|
126
|
+
bool store_pairs);
|
|
127
|
+
/** @} */
|
|
128
|
+
|
|
129
|
+
/** @name IndexPQ polysemous dispatch
|
|
130
|
+
* @{ */
|
|
131
|
+
template <SIMDLevel SL>
|
|
132
|
+
size_t polysemous_inner_loop_fixSL(
|
|
133
|
+
int code_size,
|
|
134
|
+
const IndexPQ* index,
|
|
135
|
+
const float* dis_table_qi,
|
|
136
|
+
const uint8_t* q_code,
|
|
137
|
+
size_t k,
|
|
138
|
+
float* heap_dis,
|
|
139
|
+
int64_t* heap_ids,
|
|
140
|
+
int ht);
|
|
141
|
+
/** @} */
|
|
142
|
+
|
|
143
|
+
} // namespace faiss
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
#ifdef COMPILE_SIMD_ARM_NEON
|
|
9
|
+
|
|
10
|
+
#define THE_SIMD_LEVEL SIMDLevel::ARM_NEON
|
|
11
|
+
|
|
12
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
13
|
+
#include <faiss/utils/hamming_distance/hamming_computer-neon.h>
|
|
14
|
+
|
|
15
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
16
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
|
|
17
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
18
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
|
|
19
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
20
|
+
#include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
|
|
21
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
22
|
+
#include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
|
|
23
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
24
|
+
#include <faiss/impl/binary_hamming/IndexPQ_impl.h>
|
|
25
|
+
|
|
26
|
+
#endif // COMPILE_SIMD_ARM_NEON
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
#ifdef COMPILE_SIMD_RISCV_RVV
|
|
9
|
+
|
|
10
|
+
#define THE_SIMD_LEVEL SIMDLevel::RISCV_RVV
|
|
11
|
+
|
|
12
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
13
|
+
#include <faiss/utils/hamming_distance/hamming_computer-rvv.h>
|
|
14
|
+
|
|
15
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
16
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h>
|
|
17
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
18
|
+
#include <faiss/impl/binary_hamming/IndexBinaryHash_impl.h>
|
|
19
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
20
|
+
#include <faiss/impl/binary_hamming/IndexBinaryIVF_impl.h>
|
|
21
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
22
|
+
#include <faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h>
|
|
23
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
24
|
+
#include <faiss/impl/binary_hamming/IndexPQ_impl.h>
|
|
25
|
+
|
|
26
|
+
#endif // COMPILE_SIMD_RISCV_RVV
|
|
@@ -0,0 +1,163 @@
|
|
|
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
|
+
#include <cstdio>
|
|
11
|
+
|
|
12
|
+
#include <faiss/IndexIVF.h>
|
|
13
|
+
#include <faiss/impl/InvertedListScannerStats.h>
|
|
14
|
+
#include <faiss/impl/ResultHandler.h>
|
|
15
|
+
|
|
16
|
+
/* This is the inner loop of the inverted list scanners. The default version
|
|
17
|
+
* that is defined in IndexIVF.cpp works fine but it cannot inline the distance
|
|
18
|
+
* computation code by calling one or another of the run_scan_codes_* variants
|
|
19
|
+
* with the exact ScannerType and by setting distance_to_code to be a final
|
|
20
|
+
* function, the code can be inlined. The speed difference matters for very
|
|
21
|
+
* small distance computations (eg. SQ or Flat) */
|
|
22
|
+
|
|
23
|
+
namespace faiss {
|
|
24
|
+
|
|
25
|
+
namespace {
|
|
26
|
+
|
|
27
|
+
template <class ScannerType, typename C, bool store_pairs, bool use_sel>
|
|
28
|
+
size_t run_scan_codes1(
|
|
29
|
+
const ScannerType& scanner,
|
|
30
|
+
size_t list_size,
|
|
31
|
+
const uint8_t* codes,
|
|
32
|
+
const idx_t* ids,
|
|
33
|
+
ResultHandler& handler) {
|
|
34
|
+
size_t nup = 0;
|
|
35
|
+
size_t list_no = scanner.list_no;
|
|
36
|
+
size_t code_size = scanner.code_size;
|
|
37
|
+
const IDSelector* sel = scanner.sel;
|
|
38
|
+
float threshold = handler.threshold;
|
|
39
|
+
for (size_t j = 0; j < list_size; j++) {
|
|
40
|
+
if (use_sel) {
|
|
41
|
+
int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
|
|
42
|
+
// skip code without computing distance
|
|
43
|
+
if (!sel->is_member(id)) {
|
|
44
|
+
codes += code_size;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// post-IDSelector: distance is about to be computed for this code.
|
|
50
|
+
handler.stats.scan_cnt++;
|
|
51
|
+
float dis = scanner.distance_to_code(codes); // will be inlined if final
|
|
52
|
+
if (C::cmp(threshold, dis)) {
|
|
53
|
+
int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
|
|
54
|
+
if (handler.add_result(dis, id)) {
|
|
55
|
+
handler.stats.nheap_updates++;
|
|
56
|
+
nup++;
|
|
57
|
+
threshold = handler.threshold;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
codes += code_size;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return nup;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*****************************************************************************
|
|
67
|
+
* The following functions dispatch runtime parameters to templates, with
|
|
68
|
+
* possibly some already-fixed templates.
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
template <bool store_pairs, bool use_sel, class ScannerType>
|
|
72
|
+
size_t run_scan_codes_fix_store_pairs_fix_use_sel(
|
|
73
|
+
const ScannerType& scanner,
|
|
74
|
+
size_t list_size,
|
|
75
|
+
const uint8_t* codes,
|
|
76
|
+
const idx_t* ids,
|
|
77
|
+
ResultHandler& handler) {
|
|
78
|
+
if (scanner.keep_max) {
|
|
79
|
+
return run_scan_codes1<
|
|
80
|
+
ScannerType,
|
|
81
|
+
CMin<float, idx_t>,
|
|
82
|
+
store_pairs,
|
|
83
|
+
use_sel>(scanner, list_size, codes, ids, handler);
|
|
84
|
+
} else {
|
|
85
|
+
return run_scan_codes1<
|
|
86
|
+
ScannerType,
|
|
87
|
+
CMax<float, idx_t>,
|
|
88
|
+
store_pairs,
|
|
89
|
+
use_sel>(scanner, list_size, codes, ids, handler);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
template <class C, bool use_sel, class ScannerType>
|
|
94
|
+
size_t run_scan_codes_fix_C_fix_use_sel(
|
|
95
|
+
const ScannerType& scanner,
|
|
96
|
+
size_t list_size,
|
|
97
|
+
const uint8_t* codes,
|
|
98
|
+
const idx_t* ids,
|
|
99
|
+
ResultHandler& handler) {
|
|
100
|
+
if (scanner.store_pairs) {
|
|
101
|
+
return run_scan_codes1<ScannerType, C, true, use_sel>(
|
|
102
|
+
scanner, list_size, codes, ids, handler);
|
|
103
|
+
} else {
|
|
104
|
+
return run_scan_codes1<ScannerType, C, false, use_sel>(
|
|
105
|
+
scanner, list_size, codes, ids, handler);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
template <class C, class ScannerType>
|
|
110
|
+
size_t run_scan_codes_fix_C(
|
|
111
|
+
const ScannerType& scanner,
|
|
112
|
+
size_t list_size,
|
|
113
|
+
const uint8_t* codes,
|
|
114
|
+
const idx_t* ids,
|
|
115
|
+
ResultHandler& handler) {
|
|
116
|
+
if (scanner.sel) {
|
|
117
|
+
if (scanner.store_pairs) {
|
|
118
|
+
return run_scan_codes1<ScannerType, C, true, true>(
|
|
119
|
+
scanner, list_size, codes, ids, handler);
|
|
120
|
+
} else {
|
|
121
|
+
return run_scan_codes1<ScannerType, C, false, true>(
|
|
122
|
+
scanner, list_size, codes, ids, handler);
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
if (scanner.store_pairs) {
|
|
126
|
+
return run_scan_codes1<ScannerType, C, true, false>(
|
|
127
|
+
scanner, list_size, codes, ids, handler);
|
|
128
|
+
} else {
|
|
129
|
+
return run_scan_codes1<ScannerType, C, false, false>(
|
|
130
|
+
scanner, list_size, codes, ids, handler);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
template <class ScannerType>
|
|
136
|
+
size_t run_scan_codes(
|
|
137
|
+
const ScannerType& scanner,
|
|
138
|
+
size_t list_size,
|
|
139
|
+
const uint8_t* codes,
|
|
140
|
+
const idx_t* ids,
|
|
141
|
+
ResultHandler& handler) {
|
|
142
|
+
if (scanner.sel == nullptr) {
|
|
143
|
+
if (scanner.store_pairs) {
|
|
144
|
+
return run_scan_codes_fix_store_pairs_fix_use_sel<true, false>(
|
|
145
|
+
scanner, list_size, codes, ids, handler);
|
|
146
|
+
} else {
|
|
147
|
+
return run_scan_codes_fix_store_pairs_fix_use_sel<false, false>(
|
|
148
|
+
scanner, list_size, codes, ids, handler);
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
if (scanner.store_pairs) {
|
|
152
|
+
return run_scan_codes_fix_store_pairs_fix_use_sel<true, true>(
|
|
153
|
+
scanner, list_size, codes, ids, handler);
|
|
154
|
+
} else {
|
|
155
|
+
return run_scan_codes_fix_store_pairs_fix_use_sel<false, true>(
|
|
156
|
+
scanner, list_size, codes, ids, handler);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
} // anonymous namespace
|
|
162
|
+
|
|
163
|
+
} // namespace faiss
|
|
@@ -11,9 +11,6 @@
|
|
|
11
11
|
|
|
12
12
|
namespace faiss {
|
|
13
13
|
|
|
14
|
-
// Forward declarations
|
|
15
|
-
struct NormTableScaler;
|
|
16
|
-
|
|
17
14
|
namespace rabitq_utils {
|
|
18
15
|
struct QueryFactorsData;
|
|
19
16
|
}
|
|
@@ -22,8 +19,10 @@ struct QueryFactorsData;
|
|
|
22
19
|
* Simple context object that holds processors for FastScan operations.
|
|
23
20
|
* */
|
|
24
21
|
struct FastScanDistancePostProcessing {
|
|
25
|
-
/// Norm scaling processor for Additive Quantizers
|
|
26
|
-
|
|
22
|
+
/// Norm scaling processor for Additive Quantizers.
|
|
23
|
+
/// The scale is encoded in a 2x4 bit PQ table, then scaled by this int.
|
|
24
|
+
/// Set to 0 if unused.
|
|
25
|
+
int pq2x4_scale = 0;
|
|
27
26
|
|
|
28
27
|
/// Query factors data pointer for RaBitQ (nullptr if not needed)
|
|
29
28
|
/// This pointer should point to the beginning of the relevant
|
|
@@ -36,12 +35,20 @@ struct FastScanDistancePostProcessing {
|
|
|
36
35
|
/// Set to 0 to use index->nprobe as fallback.
|
|
37
36
|
size_t nprobe = 0;
|
|
38
37
|
|
|
38
|
+
/// RaBitQ query quantization bits override.
|
|
39
|
+
/// Set to 0 to use the index default (index->qb).
|
|
40
|
+
uint8_t qb = 0;
|
|
41
|
+
|
|
42
|
+
/// RaBitQ centered scalar quantizer override.
|
|
43
|
+
/// Only used when qb > 0 (i.e., when params are overridden).
|
|
44
|
+
bool centered = false;
|
|
45
|
+
|
|
39
46
|
/// Default constructor - no processing
|
|
40
47
|
FastScanDistancePostProcessing() = default;
|
|
41
48
|
|
|
42
49
|
/// Check if norm scaling is enabled
|
|
43
50
|
bool has_norm_scaling() const {
|
|
44
|
-
return
|
|
51
|
+
return pq2x4_scale != 0;
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
/// Check if query factors processing is enabled
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
#include <cstdint>
|
|
11
11
|
#include <cstdlib>
|
|
12
12
|
|
|
13
|
-
#include <faiss/
|
|
13
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
14
14
|
|
|
15
15
|
/*******************************************
|
|
16
16
|
* The Scaler objects are used to specialize the handling of the
|
|
@@ -20,8 +20,15 @@
|
|
|
20
20
|
namespace faiss {
|
|
21
21
|
|
|
22
22
|
/// no-op handler
|
|
23
|
+
template <SIMDLevel SL = SINGLE_SIMD_LEVEL>
|
|
23
24
|
struct DummyScaler {
|
|
24
25
|
static constexpr int nscale = 0;
|
|
26
|
+
static constexpr SIMDLevel SL256 = simd256_level_selector<SL>::value;
|
|
27
|
+
static constexpr SIMDLevel SL512 = simd512_level_selector<SL>::value;
|
|
28
|
+
using simd32uint8 = simd32uint8_tpl<SL256>;
|
|
29
|
+
using simd16uint16 = simd16uint16_tpl<SL256>;
|
|
30
|
+
using simd64uint8 = simd64uint8_tpl<SL512>;
|
|
31
|
+
using simd32uint16 = simd32uint16_tpl<SL512>;
|
|
25
32
|
|
|
26
33
|
inline simd32uint8 lookup(const simd32uint8&, const simd32uint8&) const {
|
|
27
34
|
FAISS_THROW_MSG("DummyScaler::lookup should not be called.");
|
|
@@ -38,7 +45,6 @@ struct DummyScaler {
|
|
|
38
45
|
return simd16uint16(0);
|
|
39
46
|
}
|
|
40
47
|
|
|
41
|
-
#ifdef __AVX512F__
|
|
42
48
|
inline simd64uint8 lookup(const simd64uint8&, const simd64uint8&) const {
|
|
43
49
|
FAISS_THROW_MSG("DummyScaler::lookup should not be called.");
|
|
44
50
|
return simd64uint8(0);
|
|
@@ -53,7 +59,6 @@ struct DummyScaler {
|
|
|
53
59
|
FAISS_THROW_MSG("DummyScaler::scale_hi should not be called.");
|
|
54
60
|
return simd32uint16(0);
|
|
55
61
|
}
|
|
56
|
-
#endif
|
|
57
62
|
|
|
58
63
|
template <class dist_t>
|
|
59
64
|
inline dist_t scale_one(const dist_t&) const {
|
|
@@ -64,8 +69,16 @@ struct DummyScaler {
|
|
|
64
69
|
|
|
65
70
|
/// consumes 2x4 bits to encode a norm as a scalar additive quantizer
|
|
66
71
|
/// the norm is scaled because its range is larger than other components
|
|
72
|
+
template <SIMDLevel SL = SINGLE_SIMD_LEVEL>
|
|
67
73
|
struct NormTableScaler {
|
|
68
74
|
static constexpr int nscale = 2;
|
|
75
|
+
static constexpr SIMDLevel SL256 = simd256_level_selector<SL>::value;
|
|
76
|
+
static constexpr SIMDLevel SL512 = simd512_level_selector<SL>::value;
|
|
77
|
+
using simd32uint8 = simd32uint8_tpl<SL256>;
|
|
78
|
+
using simd16uint16 = simd16uint16_tpl<SL256>;
|
|
79
|
+
using simd64uint8 = simd64uint8_tpl<SL512>;
|
|
80
|
+
using simd32uint16 = simd32uint16_tpl<SL512>;
|
|
81
|
+
|
|
69
82
|
int scale_int;
|
|
70
83
|
simd16uint16 scale_simd;
|
|
71
84
|
|
|
@@ -84,7 +97,6 @@ struct NormTableScaler {
|
|
|
84
97
|
return (simd16uint16(res) >> 8) * scale_simd;
|
|
85
98
|
}
|
|
86
99
|
|
|
87
|
-
#ifdef __AVX512F__
|
|
88
100
|
inline simd64uint8 lookup(const simd64uint8& lut, const simd64uint8& c)
|
|
89
101
|
const {
|
|
90
102
|
return lut.lookup_4_lanes(c);
|
|
@@ -99,7 +111,6 @@ struct NormTableScaler {
|
|
|
99
111
|
auto scale_simd_wide = simd32uint16(scale_simd, scale_simd);
|
|
100
112
|
return (simd32uint16(res) >> 8) * scale_simd_wide;
|
|
101
113
|
}
|
|
102
|
-
#endif
|
|
103
114
|
|
|
104
115
|
// for non-SIMD implem 2, 3, 4
|
|
105
116
|
template <class dist_t>
|