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
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
#pragma once
|
|
9
9
|
|
|
10
10
|
#include <faiss/IndexIVF.h>
|
|
11
|
-
#include <faiss/impl/FastScanDistancePostProcessing.h>
|
|
11
|
+
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
|
|
12
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
12
13
|
#include <faiss/utils/AlignedTable.h>
|
|
13
14
|
|
|
14
15
|
namespace faiss {
|
|
15
16
|
|
|
16
|
-
struct NormTableScaler;
|
|
17
17
|
struct SIMDResultHandlerToFloat;
|
|
18
18
|
struct Quantizer;
|
|
19
19
|
|
|
@@ -41,14 +41,14 @@ struct Quantizer;
|
|
|
41
41
|
|
|
42
42
|
struct IndexIVFFastScan : IndexIVF {
|
|
43
43
|
// size of the kernel
|
|
44
|
-
int bbs; // set at build time
|
|
44
|
+
int bbs = 0; // set at build time
|
|
45
45
|
|
|
46
|
-
size_t M;
|
|
47
|
-
size_t nbits;
|
|
48
|
-
size_t ksub;
|
|
46
|
+
size_t M = 0;
|
|
47
|
+
size_t nbits = 0;
|
|
48
|
+
size_t ksub = 0;
|
|
49
49
|
|
|
50
50
|
// M rounded up to a multiple of 2
|
|
51
|
-
size_t M2;
|
|
51
|
+
size_t M2 = 0;
|
|
52
52
|
|
|
53
53
|
// search-time implementation
|
|
54
54
|
int implem = 0;
|
|
@@ -156,7 +156,7 @@ struct IndexIVFFastScan : IndexIVF {
|
|
|
156
156
|
* @param context processing context containing query factors
|
|
157
157
|
* processor
|
|
158
158
|
*/
|
|
159
|
-
void compute_LUT_uint8(
|
|
159
|
+
virtual void compute_LUT_uint8(
|
|
160
160
|
size_t n,
|
|
161
161
|
const float* x,
|
|
162
162
|
const CoarseQuantized& cq,
|
|
@@ -222,45 +222,31 @@ struct IndexIVFFastScan : IndexIVF {
|
|
|
222
222
|
RangeSearchResult* result,
|
|
223
223
|
const SearchParameters* params = nullptr) const override;
|
|
224
224
|
|
|
225
|
-
/** Create a
|
|
225
|
+
/** Create a SIMD-dispatched scanner for knn search (IVF variant).
|
|
226
226
|
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
227
|
+
* Returns a FastScanCodeScanner that bundles handler + accumulation
|
|
228
|
+
* kernel behind the SIMD dispatch boundary. ntotal is not passed
|
|
229
|
+
* because IVF sets it per-list via handler->ntotal.
|
|
230
|
+
* Derived classes override this to provide custom handlers
|
|
231
|
+
* (e.g. RaBitQ).
|
|
230
232
|
*
|
|
231
|
-
* @param is_max
|
|
232
|
-
*
|
|
233
|
-
* @param
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* @param
|
|
237
|
-
* @
|
|
238
|
-
* @param distances output array for distances (n * k), will be
|
|
239
|
-
* populated by handler
|
|
240
|
-
* @param labels output array for result IDs (n * k), will be
|
|
241
|
-
* populated by handler
|
|
242
|
-
* @param sel optional ID selector to filter results (nullptr =
|
|
243
|
-
* no filtering)
|
|
244
|
-
* @param context processing context containing additional data
|
|
245
|
-
* @param normalizers optional array of size 2*n for converting quantized
|
|
246
|
-
* uint16 distances to float.
|
|
247
|
-
*
|
|
248
|
-
* @return Allocated result handler (caller owns and must delete).
|
|
249
|
-
* Handler processes SIMD batches and populates distances/labels.
|
|
250
|
-
*
|
|
251
|
-
* @note The returned handler must be deleted by caller after use.
|
|
252
|
-
* Typical usage: handler->begin() → process batches → handler->end()
|
|
233
|
+
* @param is_max whether to use CMax comparator (true) or CMin
|
|
234
|
+
* @param n number of queries
|
|
235
|
+
* @param k number of neighbors to find
|
|
236
|
+
* @param distances output distances array
|
|
237
|
+
* @param labels output labels array
|
|
238
|
+
* @param sel optional ID selector
|
|
239
|
+
* @return scanner
|
|
253
240
|
*/
|
|
254
|
-
virtual
|
|
241
|
+
virtual std::unique_ptr<FastScanCodeScanner> make_knn_scanner(
|
|
255
242
|
bool is_max,
|
|
256
|
-
int impl,
|
|
257
243
|
idx_t n,
|
|
258
244
|
idx_t k,
|
|
259
245
|
float* distances,
|
|
260
246
|
idx_t* labels,
|
|
261
247
|
const IDSelector* sel,
|
|
262
|
-
|
|
263
|
-
const
|
|
248
|
+
int impl = 0,
|
|
249
|
+
const FastScanDistancePostProcessing& context = {}) const;
|
|
264
250
|
|
|
265
251
|
// dispatch to implementations and parallelize
|
|
266
252
|
void search_dispatch_implem(
|
|
@@ -306,16 +292,18 @@ struct IndexIVFFastScan : IndexIVF {
|
|
|
306
292
|
const IVFSearchParameters* params = nullptr) const;
|
|
307
293
|
|
|
308
294
|
// implem 10 and 12 are not multithreaded internally, so
|
|
309
|
-
// export search stats
|
|
295
|
+
// export search stats. k is required for ensure_topk_full support.
|
|
310
296
|
void search_implem_10(
|
|
311
297
|
idx_t n,
|
|
312
298
|
const float* x,
|
|
299
|
+
idx_t k,
|
|
313
300
|
SIMDResultHandlerToFloat& handler,
|
|
314
301
|
const CoarseQuantized& cq,
|
|
315
302
|
size_t* ndis_out,
|
|
316
303
|
size_t* nlist_out,
|
|
317
304
|
const FastScanDistancePostProcessing& context,
|
|
318
|
-
const IVFSearchParameters* params
|
|
305
|
+
const IVFSearchParameters* params,
|
|
306
|
+
FastScanCodeScanner& scanner) const;
|
|
319
307
|
|
|
320
308
|
void search_implem_12(
|
|
321
309
|
idx_t n,
|
|
@@ -325,7 +313,8 @@ struct IndexIVFFastScan : IndexIVF {
|
|
|
325
313
|
size_t* ndis_out,
|
|
326
314
|
size_t* nlist_out,
|
|
327
315
|
const FastScanDistancePostProcessing& context,
|
|
328
|
-
const IVFSearchParameters* params
|
|
316
|
+
const IVFSearchParameters* params,
|
|
317
|
+
FastScanCodeScanner& scanner) const;
|
|
329
318
|
|
|
330
319
|
// implem 14 is multithreaded internally across nprobes and queries
|
|
331
320
|
void search_implem_14(
|
|
@@ -359,29 +348,19 @@ struct IndexIVFFastScan : IndexIVF {
|
|
|
359
348
|
*/
|
|
360
349
|
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
361
350
|
|
|
362
|
-
|
|
363
|
-
/** Preprocess metadata from encoded vectors before packing.
|
|
364
|
-
*
|
|
365
|
-
* Called during add_with_ids after encode_vectors but before codes
|
|
366
|
-
* are packed into SIMD-friendly blocks. Subclasses can override to
|
|
367
|
-
* extract and store metadata embedded in codes or perform other
|
|
368
|
-
* pre-packing operations.
|
|
369
|
-
*
|
|
370
|
-
* Default implementation: no-op
|
|
351
|
+
/** Get the size of the code portion packed by pq4_pack_codes.
|
|
371
352
|
*
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
353
|
+
* Returns the number of bytes per vector that are interleaved into
|
|
354
|
+
* SIMD blocks by pq4_pack_codes, excluding any embedded metadata
|
|
355
|
+
* (e.g., RaBitQ factors). The meaning of these bytes depends on the
|
|
356
|
+
* quantizer: for PQ/AQ they are 4-bit sub-quantizer nibbles, for
|
|
357
|
+
* RaBitQ they are 1-bit-per-dimension sign bits packed into nibbles.
|
|
375
358
|
*
|
|
376
|
-
*
|
|
377
|
-
* @param flat_codes encoded vectors (n * code_size bytes)
|
|
378
|
-
* @param start_global_idx starting global index (ntotal before add)
|
|
359
|
+
* Must be implemented by all derived classes.
|
|
379
360
|
*/
|
|
380
|
-
virtual
|
|
381
|
-
idx_t n,
|
|
382
|
-
const uint8_t* flat_codes,
|
|
383
|
-
idx_t start_global_idx);
|
|
361
|
+
virtual size_t fast_scan_code_size() const = 0;
|
|
384
362
|
|
|
363
|
+
protected:
|
|
385
364
|
/** Get stride for interpreting codes during SIMD packing.
|
|
386
365
|
*
|
|
387
366
|
* The stride determines how to read codes when packing them into
|
|
@@ -399,6 +378,32 @@ struct IndexIVFFastScan : IndexIVF {
|
|
|
399
378
|
* - >0: use custom stride (e.g., code_size for embedded metadata)
|
|
400
379
|
*/
|
|
401
380
|
virtual size_t code_packing_stride() const;
|
|
381
|
+
|
|
382
|
+
public:
|
|
383
|
+
/** Get stride in bytes between consecutive SIMD blocks.
|
|
384
|
+
*
|
|
385
|
+
* Derived from get_CodePacker()->block_size so that there is a
|
|
386
|
+
* single source of truth for the block layout.
|
|
387
|
+
*
|
|
388
|
+
* @return stride in bytes
|
|
389
|
+
*/
|
|
390
|
+
size_t get_block_stride() const;
|
|
391
|
+
|
|
392
|
+
/** Post-process packed codes after pq4_pack_codes_range.
|
|
393
|
+
*
|
|
394
|
+
* Called during add_with_ids after codes have been packed into
|
|
395
|
+
* SIMD-friendly blocks.
|
|
396
|
+
*
|
|
397
|
+
* @param list_no inverted list number
|
|
398
|
+
* @param list_offset starting offset within the list (pre-existing size)
|
|
399
|
+
* @param n_added number of vectors added in this batch
|
|
400
|
+
* @param flat_codes encoded vectors for this batch (n_added * code_size)
|
|
401
|
+
*/
|
|
402
|
+
virtual void postprocess_packed_codes(
|
|
403
|
+
idx_t list_no,
|
|
404
|
+
size_t list_offset,
|
|
405
|
+
size_t n_added,
|
|
406
|
+
const uint8_t* flat_codes);
|
|
402
407
|
};
|
|
403
408
|
|
|
404
409
|
struct IVFFastScanStats {
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
|
|
14
14
|
#include <cinttypes>
|
|
15
15
|
#include <cstdio>
|
|
16
|
-
#include <numeric>
|
|
17
16
|
|
|
18
17
|
#include <faiss/IndexFlat.h>
|
|
19
18
|
|
|
@@ -21,8 +20,14 @@
|
|
|
21
20
|
#include <faiss/impl/IDSelector.h>
|
|
22
21
|
|
|
23
22
|
#include <faiss/impl/FaissAssert.h>
|
|
24
|
-
#include <faiss/
|
|
23
|
+
#include <faiss/impl/expanded_scanners.h>
|
|
24
|
+
#include <faiss/utils/distances_dispatch.h>
|
|
25
25
|
#include <faiss/utils/extra_distances.h>
|
|
26
|
+
|
|
27
|
+
#define THE_SIMD_LEVEL SIMDLevel::NONE
|
|
28
|
+
// NOLINTNEXTLINE(facebook-hte-InlineHeader)
|
|
29
|
+
#include <faiss/utils/simd_impl/IVFFlatScanner-inl.h>
|
|
30
|
+
|
|
26
31
|
#include <faiss/utils/utils.h>
|
|
27
32
|
|
|
28
33
|
namespace faiss {
|
|
@@ -32,18 +37,18 @@ namespace faiss {
|
|
|
32
37
|
******************************************/
|
|
33
38
|
|
|
34
39
|
IndexIVFFlat::IndexIVFFlat(
|
|
35
|
-
Index*
|
|
36
|
-
size_t
|
|
37
|
-
size_t
|
|
40
|
+
Index* quantizer_in,
|
|
41
|
+
size_t d_in,
|
|
42
|
+
size_t nlist_in,
|
|
38
43
|
MetricType metric,
|
|
39
|
-
bool
|
|
44
|
+
bool own_invlists_in)
|
|
40
45
|
: IndexIVF(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
sizeof(float) *
|
|
46
|
+
quantizer_in,
|
|
47
|
+
d_in,
|
|
48
|
+
nlist_in,
|
|
49
|
+
sizeof(float) * d_in,
|
|
45
50
|
metric,
|
|
46
|
-
|
|
51
|
+
own_invlists_in) {
|
|
47
52
|
code_size = sizeof(float) * d;
|
|
48
53
|
by_residual = false;
|
|
49
54
|
}
|
|
@@ -61,7 +66,7 @@ void IndexIVFFlat::add_core(
|
|
|
61
66
|
FAISS_THROW_IF_NOT(is_trained);
|
|
62
67
|
FAISS_THROW_IF_NOT(coarse_idx);
|
|
63
68
|
FAISS_THROW_IF_NOT(!by_residual);
|
|
64
|
-
|
|
69
|
+
FAISS_THROW_IF_NOT_MSG(invlists, "invlists not initialized");
|
|
65
70
|
direct_map.check_can_add(xids);
|
|
66
71
|
|
|
67
72
|
int64_t n_add = 0;
|
|
@@ -74,7 +79,7 @@ void IndexIVFFlat::add_core(
|
|
|
74
79
|
int rank = omp_get_thread_num();
|
|
75
80
|
|
|
76
81
|
// each thread takes care of a subset of lists
|
|
77
|
-
for (
|
|
82
|
+
for (idx_t i = 0; i < n; i++) {
|
|
78
83
|
idx_t list_no = coarse_idx[i];
|
|
79
84
|
|
|
80
85
|
if (list_no >= 0 && list_no % nt == rank) {
|
|
@@ -110,7 +115,7 @@ void IndexIVFFlat::encode_vectors(
|
|
|
110
115
|
memcpy(codes, x, code_size * n);
|
|
111
116
|
} else {
|
|
112
117
|
size_t coarse_size = coarse_code_size();
|
|
113
|
-
for (
|
|
118
|
+
for (idx_t i = 0; i < n; i++) {
|
|
114
119
|
int64_t list_no = list_nos[i];
|
|
115
120
|
uint8_t* code = codes + i * (code_size + coarse_size);
|
|
116
121
|
const float* xi = x + i * d;
|
|
@@ -129,7 +134,7 @@ void IndexIVFFlat::decode_vectors(
|
|
|
129
134
|
const uint8_t* codes,
|
|
130
135
|
const idx_t* /*listnos*/,
|
|
131
136
|
float* x) const {
|
|
132
|
-
for (
|
|
137
|
+
for (idx_t i = 0; i < n; i++) {
|
|
133
138
|
const uint8_t* code = codes + i * code_size;
|
|
134
139
|
float* xi = x + i * d;
|
|
135
140
|
memcpy(xi, code, code_size);
|
|
@@ -138,114 +143,21 @@ void IndexIVFFlat::decode_vectors(
|
|
|
138
143
|
|
|
139
144
|
void IndexIVFFlat::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
|
|
140
145
|
size_t coarse_size = coarse_code_size();
|
|
141
|
-
for (
|
|
146
|
+
for (idx_t i = 0; i < n; i++) {
|
|
142
147
|
const uint8_t* code = bytes + i * (code_size + coarse_size);
|
|
143
148
|
float* xi = x + i * d;
|
|
144
149
|
memcpy(xi, code + coarse_size, code_size);
|
|
145
150
|
}
|
|
146
151
|
}
|
|
147
152
|
|
|
148
|
-
namespace {
|
|
149
|
-
|
|
150
|
-
template <typename VectorDistance, bool use_sel>
|
|
151
|
-
struct IVFFlatScanner : InvertedListScanner {
|
|
152
|
-
VectorDistance vd;
|
|
153
|
-
using C = typename VectorDistance::C;
|
|
154
|
-
|
|
155
|
-
IVFFlatScanner(
|
|
156
|
-
const VectorDistance& vd,
|
|
157
|
-
bool store_pairs,
|
|
158
|
-
const IDSelector* sel)
|
|
159
|
-
: InvertedListScanner(store_pairs, sel), vd(vd) {
|
|
160
|
-
keep_max = vd.is_similarity;
|
|
161
|
-
code_size = vd.d * sizeof(float);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const float* xi;
|
|
165
|
-
void set_query(const float* query) override {
|
|
166
|
-
this->xi = query;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
void set_list(idx_t list_no, float /* coarse_dis */) override {
|
|
170
|
-
this->list_no = list_no;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
float distance_to_code(const uint8_t* code) const override {
|
|
174
|
-
const float* yj = (float*)code;
|
|
175
|
-
return vd(xi, yj);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
size_t scan_codes(
|
|
179
|
-
size_t list_size,
|
|
180
|
-
const uint8_t* codes,
|
|
181
|
-
const idx_t* ids,
|
|
182
|
-
float* simi,
|
|
183
|
-
idx_t* idxi,
|
|
184
|
-
size_t k) const override {
|
|
185
|
-
const float* list_vecs = (const float*)codes;
|
|
186
|
-
size_t nup = 0;
|
|
187
|
-
for (size_t j = 0; j < list_size; j++) {
|
|
188
|
-
const float* yj = list_vecs + vd.d * j;
|
|
189
|
-
if (use_sel && !sel->is_member(ids[j])) {
|
|
190
|
-
continue;
|
|
191
|
-
}
|
|
192
|
-
float dis = vd(xi, yj);
|
|
193
|
-
if (C::cmp(simi[0], dis)) {
|
|
194
|
-
int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
|
|
195
|
-
heap_replace_top<C>(k, simi, idxi, dis, id);
|
|
196
|
-
nup++;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return nup;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
void scan_codes_range(
|
|
203
|
-
size_t list_size,
|
|
204
|
-
const uint8_t* codes,
|
|
205
|
-
const idx_t* ids,
|
|
206
|
-
float radius,
|
|
207
|
-
RangeQueryResult& res) const override {
|
|
208
|
-
const float* list_vecs = (const float*)codes;
|
|
209
|
-
for (size_t j = 0; j < list_size; j++) {
|
|
210
|
-
const float* yj = list_vecs + vd.d * j;
|
|
211
|
-
if (use_sel && !sel->is_member(ids[j])) {
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
float dis = vd(xi, yj);
|
|
215
|
-
if (C::cmp(radius, dis)) {
|
|
216
|
-
int64_t id = store_pairs ? lo_build(list_no, j) : ids[j];
|
|
217
|
-
res.add(dis, id);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
struct Run_get_InvertedListScanner {
|
|
224
|
-
using T = InvertedListScanner*;
|
|
225
|
-
|
|
226
|
-
template <class VD>
|
|
227
|
-
InvertedListScanner* f(
|
|
228
|
-
VD& vd,
|
|
229
|
-
const IndexIVFFlat* ivf,
|
|
230
|
-
bool store_pairs,
|
|
231
|
-
const IDSelector* sel) {
|
|
232
|
-
if (sel) {
|
|
233
|
-
return new IVFFlatScanner<VD, true>(vd, store_pairs, sel);
|
|
234
|
-
} else {
|
|
235
|
-
return new IVFFlatScanner<VD, false>(vd, store_pairs, sel);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
|
|
240
|
-
} // anonymous namespace
|
|
241
|
-
|
|
242
153
|
InvertedListScanner* IndexIVFFlat::get_InvertedListScanner(
|
|
243
154
|
bool store_pairs,
|
|
244
155
|
const IDSelector* sel,
|
|
245
156
|
const IVFSearchParameters*) const {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
157
|
+
return with_VectorDistance(
|
|
158
|
+
d, metric_type, metric_arg, [&](auto vd) -> InvertedListScanner* {
|
|
159
|
+
return new IVFFlatScanner<decltype(vd)>(vd, store_pairs, sel);
|
|
160
|
+
});
|
|
249
161
|
}
|
|
250
162
|
|
|
251
163
|
void IndexIVFFlat::reconstruct_from_offset(
|
|
@@ -260,12 +172,17 @@ void IndexIVFFlat::reconstruct_from_offset(
|
|
|
260
172
|
******************************************/
|
|
261
173
|
|
|
262
174
|
IndexIVFFlatDedup::IndexIVFFlatDedup(
|
|
263
|
-
Index*
|
|
264
|
-
size_t
|
|
265
|
-
size_t
|
|
266
|
-
MetricType
|
|
267
|
-
bool
|
|
268
|
-
: IndexIVFFlat(
|
|
175
|
+
Index* quantizer_in,
|
|
176
|
+
size_t d_in,
|
|
177
|
+
size_t nlist_in,
|
|
178
|
+
MetricType metric_type_in,
|
|
179
|
+
bool own_invlists_in)
|
|
180
|
+
: IndexIVFFlat(
|
|
181
|
+
quantizer_in,
|
|
182
|
+
d_in,
|
|
183
|
+
nlist_in,
|
|
184
|
+
metric_type_in,
|
|
185
|
+
own_invlists_in) {}
|
|
269
186
|
|
|
270
187
|
void IndexIVFFlatDedup::train(idx_t n, const float* x) {
|
|
271
188
|
std::unordered_map<uint64_t, idx_t> map;
|
|
@@ -298,7 +215,7 @@ void IndexIVFFlatDedup::add_with_ids(
|
|
|
298
215
|
const float* x,
|
|
299
216
|
const idx_t* xids) {
|
|
300
217
|
FAISS_THROW_IF_NOT(is_trained);
|
|
301
|
-
|
|
218
|
+
FAISS_THROW_IF_NOT_MSG(invlists, "invlists not initialized");
|
|
302
219
|
FAISS_THROW_IF_NOT_MSG(
|
|
303
220
|
direct_map.no(), "IVFFlatDedup not implemented with direct_map");
|
|
304
221
|
std::unique_ptr<int64_t[]> idx(new int64_t[na]);
|
|
@@ -312,7 +229,7 @@ void IndexIVFFlatDedup::add_with_ids(
|
|
|
312
229
|
int rank = omp_get_thread_num();
|
|
313
230
|
|
|
314
231
|
// each thread takes care of a subset of lists
|
|
315
|
-
for (
|
|
232
|
+
for (idx_t i = 0; i < na; i++) {
|
|
316
233
|
int64_t list_no = idx[i];
|
|
317
234
|
|
|
318
235
|
if (list_no < 0 || list_no % nt != rank) {
|
|
@@ -371,7 +288,7 @@ void IndexIVFFlatDedup::search_preassigned(
|
|
|
371
288
|
idx_t* labels,
|
|
372
289
|
bool store_pairs,
|
|
373
290
|
const IVFSearchParameters* params,
|
|
374
|
-
IndexIVFStats* stats) const {
|
|
291
|
+
IndexIVFStats* /*stats*/) const {
|
|
375
292
|
FAISS_THROW_IF_NOT_MSG(
|
|
376
293
|
!store_pairs, "store_pairs not supported in IVFDedup");
|
|
377
294
|
|
|
@@ -452,7 +369,7 @@ size_t IndexIVFFlatDedup::remove_ids(const IDSelector& sel) {
|
|
|
452
369
|
std::vector<int64_t> toremove(nlist);
|
|
453
370
|
|
|
454
371
|
#pragma omp parallel for
|
|
455
|
-
for (
|
|
372
|
+
for (idx_t i = 0; i < static_cast<idx_t>(nlist); i++) {
|
|
456
373
|
int64_t l0 = invlists->list_size(i), l = l0, j = 0;
|
|
457
374
|
InvertedLists::ScopedIds idsi(invlists, i);
|
|
458
375
|
while (j < l) {
|
|
@@ -480,7 +397,7 @@ size_t IndexIVFFlatDedup::remove_ids(const IDSelector& sel) {
|
|
|
480
397
|
}
|
|
481
398
|
// this will not run well in parallel on ondisk because of possible shrinks
|
|
482
399
|
int64_t nremove = 0;
|
|
483
|
-
for (
|
|
400
|
+
for (idx_t i = 0; i < static_cast<idx_t>(nlist); i++) {
|
|
484
401
|
if (toremove[i] > 0) {
|
|
485
402
|
nremove += toremove[i];
|
|
486
403
|
invlists->resize(i, invlists->list_size(i) - toremove[i]);
|
|
@@ -62,6 +62,38 @@ struct IndexIVFFlat : IndexIVF {
|
|
|
62
62
|
IndexIVFFlat();
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
+
template <typename VectorDistance>
|
|
66
|
+
struct IVFFlatScanner : InvertedListScanner {
|
|
67
|
+
VectorDistance vd;
|
|
68
|
+
using C = typename VectorDistance::C;
|
|
69
|
+
|
|
70
|
+
IVFFlatScanner(
|
|
71
|
+
const VectorDistance& vd,
|
|
72
|
+
bool store_pairs,
|
|
73
|
+
const IDSelector* sel)
|
|
74
|
+
: InvertedListScanner(store_pairs, sel), vd(vd) {
|
|
75
|
+
keep_max = vd.is_similarity;
|
|
76
|
+
code_size = vd.d * sizeof(float);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const float* xi = nullptr;
|
|
80
|
+
void set_query(const float* query) override {
|
|
81
|
+
this->xi = query;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void set_list(idx_t list_no, float /* coarse_dis */) override {
|
|
85
|
+
this->list_no = list_no;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
float distance_to_code(const uint8_t* code) const final;
|
|
89
|
+
|
|
90
|
+
size_t scan_codes(
|
|
91
|
+
size_t list_size,
|
|
92
|
+
const uint8_t* codes,
|
|
93
|
+
const idx_t* ids,
|
|
94
|
+
ResultHandler& handler) const override;
|
|
95
|
+
};
|
|
96
|
+
|
|
65
97
|
struct IndexIVFFlatDedup : IndexIVFFlat {
|
|
66
98
|
/** Maps ids stored in the index to the ids of vectors that are
|
|
67
99
|
* the same. When a vector is unique, it does not appear in the
|