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
|
@@ -7,16 +7,16 @@
|
|
|
7
7
|
|
|
8
8
|
#pragma once
|
|
9
9
|
|
|
10
|
+
#include <memory>
|
|
10
11
|
#include <vector>
|
|
11
12
|
|
|
12
13
|
#include <faiss/IndexFastScan.h>
|
|
13
14
|
#include <faiss/IndexRaBitQ.h>
|
|
14
|
-
#include <faiss/impl/RaBitQStats.h>
|
|
15
15
|
#include <faiss/impl/RaBitQUtils.h>
|
|
16
16
|
#include <faiss/impl/RaBitQuantizer.h>
|
|
17
|
-
#include <faiss/impl/simd_result_handlers.h>
|
|
17
|
+
#include <faiss/impl/fast_scan/simd_result_handlers.h>
|
|
18
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
18
19
|
#include <faiss/utils/Heap.h>
|
|
19
|
-
#include <faiss/utils/simdlib.h>
|
|
20
20
|
|
|
21
21
|
namespace faiss {
|
|
22
22
|
|
|
@@ -43,17 +43,6 @@ struct IndexRaBitQFastScan : IndexFastScan {
|
|
|
43
43
|
/// Center of all points (same as IndexRaBitQ)
|
|
44
44
|
std::vector<float> center;
|
|
45
45
|
|
|
46
|
-
/// Per-vector auxiliary data (1-bit codes stored separately in `codes`)
|
|
47
|
-
///
|
|
48
|
-
/// 1-bit codes (sign bits) are stored in the inherited `codes` array from
|
|
49
|
-
/// IndexFastScan in packed FastScan format for SIMD processing.
|
|
50
|
-
///
|
|
51
|
-
/// This flat_storage holds per-vector factors and refinement-bit codes:
|
|
52
|
-
/// Layout for 1-bit: [SignBitFactors (8 bytes)]
|
|
53
|
-
/// Layout for multi-bit: [SignBitFactorsWithError
|
|
54
|
-
/// (12B)][ref_codes][ExtraBitsFactors (8B)]
|
|
55
|
-
std::vector<uint8_t> flat_storage;
|
|
56
|
-
|
|
57
46
|
/// Default number of bits to quantize a query with
|
|
58
47
|
uint8_t qb = 8;
|
|
59
48
|
|
|
@@ -77,7 +66,7 @@ struct IndexRaBitQFastScan : IndexFastScan {
|
|
|
77
66
|
|
|
78
67
|
void compute_codes(uint8_t* codes, idx_t n, const float* x) const override;
|
|
79
68
|
|
|
80
|
-
/// Compute
|
|
69
|
+
/// Compute per-vector auxiliary data size in block aux region
|
|
81
70
|
size_t compute_per_vector_storage_size() const;
|
|
82
71
|
|
|
83
72
|
void compute_float_LUT(
|
|
@@ -88,6 +77,16 @@ struct IndexRaBitQFastScan : IndexFastScan {
|
|
|
88
77
|
|
|
89
78
|
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
90
79
|
|
|
80
|
+
/// Packed code size: (d + 7) / 8 bytes (1-bit-per-dimension sign bits,
|
|
81
|
+
/// excluding factors)
|
|
82
|
+
size_t fast_scan_code_size() const override;
|
|
83
|
+
|
|
84
|
+
/// Return CodePackerRaBitQ with enlarged block size
|
|
85
|
+
CodePacker* get_CodePacker() const override;
|
|
86
|
+
|
|
87
|
+
/// Remove vectors and compact both PQ4 codes and auxiliary data
|
|
88
|
+
size_t remove_ids(const IDSelector& sel) override;
|
|
89
|
+
|
|
91
90
|
void search(
|
|
92
91
|
idx_t n,
|
|
93
92
|
const float* x,
|
|
@@ -96,17 +95,17 @@ struct IndexRaBitQFastScan : IndexFastScan {
|
|
|
96
95
|
idx_t* labels,
|
|
97
96
|
const SearchParameters* params = nullptr) const override;
|
|
98
97
|
|
|
99
|
-
///
|
|
100
|
-
|
|
98
|
+
/// RaBitQ scanner wired through rabitq_make_knn_scanner
|
|
99
|
+
std::unique_ptr<FastScanCodeScanner> make_knn_scanner(
|
|
101
100
|
bool is_max,
|
|
102
|
-
int /*impl*/,
|
|
103
101
|
idx_t n,
|
|
104
102
|
idx_t k,
|
|
105
|
-
size_t
|
|
103
|
+
size_t ntotal,
|
|
106
104
|
float* distances,
|
|
107
105
|
idx_t* labels,
|
|
108
106
|
const IDSelector* sel,
|
|
109
|
-
|
|
107
|
+
int impl = 0,
|
|
108
|
+
const FastScanDistancePostProcessing& context = {}) const override;
|
|
110
109
|
};
|
|
111
110
|
|
|
112
111
|
/** SIMD result handler for RaBitQ FastScan that applies distance corrections
|
|
@@ -126,21 +125,33 @@ struct IndexRaBitQFastScan : IndexFastScan {
|
|
|
126
125
|
*
|
|
127
126
|
* @tparam C Comparator type (CMin/CMax) for heap operations
|
|
128
127
|
* @tparam with_id_map Whether to use id mapping (similar to HeapHandler)
|
|
128
|
+
* @tparam SL SIMD level for per-TU template instantiation
|
|
129
129
|
*/
|
|
130
|
-
template <
|
|
130
|
+
template <
|
|
131
|
+
class C,
|
|
132
|
+
bool with_id_map = false,
|
|
133
|
+
SIMDLevel SL = SINGLE_SIMD_LEVEL_256>
|
|
131
134
|
struct RaBitQHeapHandler
|
|
132
|
-
: simd_result_handlers::ResultHandlerCompare<C, with_id_map> {
|
|
133
|
-
using RHC = simd_result_handlers::ResultHandlerCompare<C, with_id_map>;
|
|
135
|
+
: simd_result_handlers::ResultHandlerCompare<C, with_id_map, SL> {
|
|
136
|
+
using RHC = simd_result_handlers::ResultHandlerCompare<C, with_id_map, SL>;
|
|
134
137
|
using RHC::normalizers;
|
|
138
|
+
static constexpr SIMDLevel SL256 = simd256_level_selector<SL>::value;
|
|
139
|
+
using simd16uint16 = simd16uint16_tpl<SL256>;
|
|
135
140
|
|
|
136
141
|
const IndexRaBitQFastScan* rabitq_index;
|
|
137
142
|
float* heap_distances; // [nq * k]
|
|
138
143
|
int64_t* heap_labels; // [nq * k]
|
|
139
144
|
const size_t nq, k;
|
|
140
|
-
const FastScanDistancePostProcessing
|
|
145
|
+
const FastScanDistancePostProcessing*
|
|
141
146
|
context; // Processing context with query offset
|
|
142
147
|
const bool is_multi_bit; // Runtime flag for multi-bit mode
|
|
143
148
|
|
|
149
|
+
// Cached block-layout constants (invariant for handler lifetime)
|
|
150
|
+
const size_t storage_size;
|
|
151
|
+
const size_t packed_block_size;
|
|
152
|
+
const size_t full_block_size;
|
|
153
|
+
std::vector<uint8_t> unpack_buf; // sign bits scratch buffer
|
|
154
|
+
|
|
144
155
|
// Use float-based comparator for heap operations
|
|
145
156
|
using Cfloat = typename std::conditional<
|
|
146
157
|
C::is_max,
|
|
@@ -154,22 +165,169 @@ struct RaBitQHeapHandler
|
|
|
154
165
|
float* distances,
|
|
155
166
|
int64_t* labels,
|
|
156
167
|
const IDSelector* sel_in,
|
|
157
|
-
const FastScanDistancePostProcessing
|
|
158
|
-
bool multi_bit)
|
|
168
|
+
const FastScanDistancePostProcessing* ctx,
|
|
169
|
+
bool multi_bit)
|
|
170
|
+
: RHC(nq_val, index->ntotal, sel_in),
|
|
171
|
+
rabitq_index(index),
|
|
172
|
+
heap_distances(distances),
|
|
173
|
+
heap_labels(labels),
|
|
174
|
+
nq(nq_val),
|
|
175
|
+
k(k_val),
|
|
176
|
+
context(ctx),
|
|
177
|
+
is_multi_bit(multi_bit),
|
|
178
|
+
storage_size(index->compute_per_vector_storage_size()),
|
|
179
|
+
packed_block_size(((index->M2 + 1) / 2) * index->bbs),
|
|
180
|
+
full_block_size(index->get_block_stride()),
|
|
181
|
+
unpack_buf((index->d + 7) / 8) {
|
|
182
|
+
#pragma omp parallel for if (nq > 100)
|
|
183
|
+
for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
|
|
184
|
+
float* heap_dis = heap_distances + q * k;
|
|
185
|
+
int64_t* heap_ids = heap_labels + q * k;
|
|
186
|
+
heap_heapify<Cfloat>(k, heap_dis, heap_ids);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final {
|
|
191
|
+
ALIGNED(32) uint16_t d32tab[32];
|
|
192
|
+
d0.store(d32tab);
|
|
193
|
+
d1.store(d32tab + 16);
|
|
194
|
+
|
|
195
|
+
float* const heap_dis = heap_distances + q * k;
|
|
196
|
+
int64_t* const heap_ids = heap_labels + q * k;
|
|
197
|
+
|
|
198
|
+
rabitq_utils::QueryFactorsData query_factors_data = {};
|
|
199
|
+
if (context && context->query_factors != nullptr) {
|
|
200
|
+
query_factors_data = context->query_factors[q];
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const float one_a = normalizers ? (1.0f / normalizers[2 * q]) : 1.0f;
|
|
204
|
+
const float bias = normalizers ? normalizers[2 * q + 1] : 0.0f;
|
|
205
|
+
|
|
206
|
+
const size_t base_db_idx = this->j0 + b * 32;
|
|
207
|
+
const size_t max_vectors = (base_db_idx < rabitq_index->ntotal)
|
|
208
|
+
? std::min<size_t>(32, rabitq_index->ntotal - base_db_idx)
|
|
209
|
+
: 0;
|
|
210
|
+
|
|
211
|
+
const size_t block_idx = base_db_idx / rabitq_index->bbs;
|
|
212
|
+
const uint8_t* aux_base = rabitq_index->codes.get() +
|
|
213
|
+
block_idx * full_block_size + packed_block_size;
|
|
159
214
|
|
|
160
|
-
|
|
215
|
+
for (size_t i = 0; i < max_vectors; i++) {
|
|
216
|
+
const size_t db_idx = base_db_idx + i;
|
|
217
|
+
const float normalized_distance = d32tab[i] * one_a + bias;
|
|
218
|
+
const uint8_t* base_ptr = aux_base + i * storage_size;
|
|
161
219
|
|
|
162
|
-
|
|
220
|
+
if (is_multi_bit) {
|
|
221
|
+
const SignBitFactorsWithError& full_factors =
|
|
222
|
+
*reinterpret_cast<const SignBitFactorsWithError*>(
|
|
223
|
+
base_ptr);
|
|
163
224
|
|
|
164
|
-
|
|
225
|
+
float dist_1bit = rabitq_utils::compute_1bit_adjusted_distance(
|
|
226
|
+
normalized_distance,
|
|
227
|
+
full_factors,
|
|
228
|
+
query_factors_data,
|
|
229
|
+
rabitq_index->centered,
|
|
230
|
+
rabitq_index->qb,
|
|
231
|
+
rabitq_index->d);
|
|
232
|
+
|
|
233
|
+
const bool is_similarity = rabitq_index->metric_type ==
|
|
234
|
+
MetricType::METRIC_INNER_PRODUCT;
|
|
235
|
+
bool should_refine = rabitq_utils::should_refine_candidate(
|
|
236
|
+
dist_1bit,
|
|
237
|
+
full_factors.f_error,
|
|
238
|
+
context && context->query_factors
|
|
239
|
+
? context->query_factors[q].g_error
|
|
240
|
+
: 0.0f,
|
|
241
|
+
heap_dis[0],
|
|
242
|
+
is_similarity);
|
|
243
|
+
|
|
244
|
+
if (should_refine) {
|
|
245
|
+
float dist_full = compute_full_multibit_distance(db_idx, q);
|
|
246
|
+
|
|
247
|
+
if (Cfloat::cmp(heap_dis[0], dist_full)) {
|
|
248
|
+
heap_replace_top<Cfloat>(
|
|
249
|
+
k, heap_dis, heap_ids, dist_full, db_idx);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
const rabitq_utils::SignBitFactors& db_factors =
|
|
254
|
+
*reinterpret_cast<const rabitq_utils::SignBitFactors*>(
|
|
255
|
+
base_ptr);
|
|
256
|
+
|
|
257
|
+
float adjusted_distance =
|
|
258
|
+
rabitq_utils::compute_1bit_adjusted_distance(
|
|
259
|
+
normalized_distance,
|
|
260
|
+
db_factors,
|
|
261
|
+
query_factors_data,
|
|
262
|
+
rabitq_index->centered,
|
|
263
|
+
rabitq_index->qb,
|
|
264
|
+
rabitq_index->d);
|
|
265
|
+
|
|
266
|
+
if (Cfloat::cmp(heap_dis[0], adjusted_distance)) {
|
|
267
|
+
heap_replace_top<Cfloat>(
|
|
268
|
+
k, heap_dis, heap_ids, adjusted_distance, db_idx);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
void begin(const float* norms) override {
|
|
275
|
+
normalizers = norms;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
void end() override {
|
|
279
|
+
#pragma omp parallel for if (nq > 100)
|
|
280
|
+
for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
|
|
281
|
+
float* heap_dis = heap_distances + q * k;
|
|
282
|
+
int64_t* heap_ids = heap_labels + q * k;
|
|
283
|
+
heap_reorder<Cfloat>(k, heap_dis, heap_ids);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
165
286
|
|
|
166
287
|
private:
|
|
167
|
-
|
|
168
|
-
|
|
288
|
+
float compute_full_multibit_distance(size_t db_idx, size_t q) {
|
|
289
|
+
const size_t ex_bits = rabitq_index->rabitq.nb_bits - 1;
|
|
290
|
+
const size_t dim = rabitq_index->d;
|
|
291
|
+
|
|
292
|
+
const uint8_t* base_ptr = rabitq_utils::get_block_aux_ptr(
|
|
293
|
+
rabitq_index->codes.get(),
|
|
294
|
+
db_idx,
|
|
295
|
+
rabitq_index->bbs,
|
|
296
|
+
packed_block_size,
|
|
297
|
+
full_block_size,
|
|
298
|
+
storage_size);
|
|
299
|
+
|
|
300
|
+
const size_t ex_code_size = (dim * ex_bits + 7) / 8;
|
|
301
|
+
const uint8_t* ex_code = base_ptr + sizeof(SignBitFactorsWithError);
|
|
302
|
+
const ExtraBitsFactors& ex_fac =
|
|
303
|
+
*reinterpret_cast<const ExtraBitsFactors*>(
|
|
304
|
+
base_ptr + sizeof(SignBitFactorsWithError) +
|
|
305
|
+
ex_code_size);
|
|
306
|
+
|
|
307
|
+
const rabitq_utils::QueryFactorsData& query_factors =
|
|
308
|
+
context->query_factors[q];
|
|
309
|
+
|
|
310
|
+
rabitq_utils::unpack_sign_bits_from_packed(
|
|
311
|
+
rabitq_index->codes.get(),
|
|
312
|
+
rabitq_index->bbs,
|
|
313
|
+
rabitq_index->M2,
|
|
314
|
+
db_idx,
|
|
315
|
+
full_block_size,
|
|
316
|
+
unpack_buf.data());
|
|
317
|
+
const uint8_t* sign_bits = unpack_buf.data();
|
|
169
318
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
319
|
+
return rabitq_utils::compute_full_multibit_distance(
|
|
320
|
+
sign_bits,
|
|
321
|
+
ex_code,
|
|
322
|
+
ex_fac,
|
|
323
|
+
query_factors.rotated_q.data(),
|
|
324
|
+
(rabitq_index->metric_type == MetricType::METRIC_INNER_PRODUCT)
|
|
325
|
+
? query_factors.q_dot_c
|
|
326
|
+
: query_factors.qr_to_c_L2sqr,
|
|
327
|
+
dim,
|
|
328
|
+
ex_bits,
|
|
329
|
+
rabitq_index->metric_type);
|
|
330
|
+
}
|
|
173
331
|
};
|
|
174
332
|
|
|
175
333
|
} // namespace faiss
|
|
@@ -18,10 +18,10 @@ namespace faiss {
|
|
|
18
18
|
* IndexRefine
|
|
19
19
|
***************************************************/
|
|
20
20
|
|
|
21
|
-
IndexRefine::IndexRefine(Index*
|
|
22
|
-
: Index(
|
|
23
|
-
base_index(
|
|
24
|
-
refine_index(
|
|
21
|
+
IndexRefine::IndexRefine(Index* base_index_in, Index* refine_index_in)
|
|
22
|
+
: Index(base_index_in->d, base_index_in->metric_type),
|
|
23
|
+
base_index(base_index_in),
|
|
24
|
+
refine_index(refine_index_in) {
|
|
25
25
|
own_fields = own_refine_index = false;
|
|
26
26
|
if (refine_index != nullptr) {
|
|
27
27
|
FAISS_THROW_IF_NOT(base_index->d == refine_index->d);
|
|
@@ -58,36 +58,6 @@ void IndexRefine::reset() {
|
|
|
58
58
|
ntotal = 0;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
namespace {
|
|
62
|
-
|
|
63
|
-
using idx_t = faiss::idx_t;
|
|
64
|
-
|
|
65
|
-
template <class C>
|
|
66
|
-
static void reorder_2_heaps(
|
|
67
|
-
idx_t n,
|
|
68
|
-
idx_t k,
|
|
69
|
-
idx_t* __restrict labels,
|
|
70
|
-
float* __restrict distances,
|
|
71
|
-
idx_t k_base,
|
|
72
|
-
const idx_t* __restrict base_labels,
|
|
73
|
-
const float* __restrict base_distances) {
|
|
74
|
-
#pragma omp parallel for if (n > 1)
|
|
75
|
-
for (idx_t i = 0; i < n; i++) {
|
|
76
|
-
idx_t* idxo = labels + i * k;
|
|
77
|
-
float* diso = distances + i * k;
|
|
78
|
-
const idx_t* idxi = base_labels + i * k_base;
|
|
79
|
-
const float* disi = base_distances + i * k_base;
|
|
80
|
-
|
|
81
|
-
heap_heapify<C>(k, diso, idxo, disi, idxi, k);
|
|
82
|
-
if (k_base != k) { // add remaining elements
|
|
83
|
-
heap_addn<C>(k, diso, idxo, disi + k, idxi + k, k_base - k);
|
|
84
|
-
}
|
|
85
|
-
heap_reorder<C>(k, diso, idxo);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
} // anonymous namespace
|
|
90
|
-
|
|
91
61
|
void IndexRefine::search(
|
|
92
62
|
idx_t n,
|
|
93
63
|
const float* x,
|
|
@@ -114,6 +84,8 @@ void IndexRefine::search(
|
|
|
114
84
|
|
|
115
85
|
FAISS_THROW_IF_NOT(k > 0);
|
|
116
86
|
FAISS_THROW_IF_NOT(is_trained);
|
|
87
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
88
|
+
n <= INT64_MAX / k_base, "n * k_base would overflow int64");
|
|
117
89
|
idx_t* base_labels = labels;
|
|
118
90
|
float* base_distances = distances;
|
|
119
91
|
std::unique_ptr<idx_t[]> del1;
|
|
@@ -129,8 +101,8 @@ void IndexRefine::search(
|
|
|
129
101
|
base_index->search(
|
|
130
102
|
n, x, k_base, base_distances, base_labels, base_index_params);
|
|
131
103
|
|
|
132
|
-
for (
|
|
133
|
-
|
|
104
|
+
for (idx_t i = 0; i < n * k_base; i++) {
|
|
105
|
+
FAISS_THROW_IF_NOT(base_labels[i] >= -1 && base_labels[i] < ntotal);
|
|
134
106
|
}
|
|
135
107
|
|
|
136
108
|
// parallelize over queries
|
|
@@ -155,12 +127,12 @@ void IndexRefine::search(
|
|
|
155
127
|
|
|
156
128
|
// sort and store result
|
|
157
129
|
if (metric_type == METRIC_L2) {
|
|
158
|
-
|
|
130
|
+
using C = CMax<float, idx_t>;
|
|
159
131
|
reorder_2_heaps<C>(
|
|
160
132
|
n, k, labels, distances, k_base, base_labels, base_distances);
|
|
161
133
|
|
|
162
134
|
} else if (metric_type == METRIC_INNER_PRODUCT) {
|
|
163
|
-
|
|
135
|
+
using C = CMin<float, idx_t>;
|
|
164
136
|
reorder_2_heaps<C>(
|
|
165
137
|
n, k, labels, distances, k_base, base_labels, base_distances);
|
|
166
138
|
} else {
|
|
@@ -221,7 +193,7 @@ void IndexRefine::sa_encode(idx_t n, const float* x, uint8_t* bytes) const {
|
|
|
221
193
|
base_index->sa_encode(n, x, tmp1.get());
|
|
222
194
|
std::unique_ptr<uint8_t[]> tmp2(new uint8_t[n * cs2]);
|
|
223
195
|
refine_index->sa_encode(n, x, tmp2.get());
|
|
224
|
-
for (
|
|
196
|
+
for (idx_t i = 0; i < n; i++) {
|
|
225
197
|
uint8_t* b = bytes + i * (cs1 + cs2);
|
|
226
198
|
memcpy(b, tmp1.get() + cs1 * i, cs1);
|
|
227
199
|
memcpy(b + cs1, tmp2.get() + cs2 * i, cs2);
|
|
@@ -230,10 +202,9 @@ void IndexRefine::sa_encode(idx_t n, const float* x, uint8_t* bytes) const {
|
|
|
230
202
|
|
|
231
203
|
void IndexRefine::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
|
|
232
204
|
size_t cs1 = base_index->sa_code_size(), cs2 = refine_index->sa_code_size();
|
|
233
|
-
std::unique_ptr<uint8_t[]> tmp2(
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
memcpy(tmp2.get() + i * cs2, bytes + i * (cs1 + cs2), cs2);
|
|
205
|
+
std::unique_ptr<uint8_t[]> tmp2(new uint8_t[n * cs2]);
|
|
206
|
+
for (idx_t i = 0; i < n; i++) {
|
|
207
|
+
memcpy(tmp2.get() + i * cs2, bytes + i * (cs1 + cs2) + cs1, cs2);
|
|
237
208
|
}
|
|
238
209
|
|
|
239
210
|
refine_index->sa_decode(n, tmp2.get(), x);
|
|
@@ -252,10 +223,10 @@ IndexRefine::~IndexRefine() {
|
|
|
252
223
|
* IndexRefineFlat
|
|
253
224
|
***************************************************/
|
|
254
225
|
|
|
255
|
-
IndexRefineFlat::IndexRefineFlat(Index*
|
|
226
|
+
IndexRefineFlat::IndexRefineFlat(Index* base_index_in)
|
|
256
227
|
: IndexRefine(
|
|
257
|
-
|
|
258
|
-
new IndexFlat(
|
|
228
|
+
base_index_in,
|
|
229
|
+
new IndexFlat(base_index_in->d, base_index_in->metric_type)) {
|
|
259
230
|
is_trained = base_index->is_trained;
|
|
260
231
|
own_refine_index = true;
|
|
261
232
|
FAISS_THROW_IF_NOT_MSG(
|
|
@@ -263,8 +234,8 @@ IndexRefineFlat::IndexRefineFlat(Index* base_index)
|
|
|
263
234
|
"base_index should be empty in the beginning");
|
|
264
235
|
}
|
|
265
236
|
|
|
266
|
-
IndexRefineFlat::IndexRefineFlat(Index*
|
|
267
|
-
: IndexRefine(
|
|
237
|
+
IndexRefineFlat::IndexRefineFlat(Index* base_index_in, const float* xb)
|
|
238
|
+
: IndexRefine(base_index_in, nullptr) {
|
|
268
239
|
is_trained = base_index->is_trained;
|
|
269
240
|
refine_index = new IndexFlat(base_index->d, base_index->metric_type);
|
|
270
241
|
own_refine_index = true;
|
|
@@ -301,6 +272,8 @@ void IndexRefineFlat::search(
|
|
|
301
272
|
|
|
302
273
|
FAISS_THROW_IF_NOT(k > 0);
|
|
303
274
|
FAISS_THROW_IF_NOT(is_trained);
|
|
275
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
276
|
+
n <= INT64_MAX / k_base, "n * k_base would overflow int64");
|
|
304
277
|
idx_t* base_labels = labels;
|
|
305
278
|
float* base_distances = distances;
|
|
306
279
|
std::unique_ptr<idx_t[]> del1;
|
|
@@ -316,8 +289,8 @@ void IndexRefineFlat::search(
|
|
|
316
289
|
base_index->search(
|
|
317
290
|
n, x, k_base, base_distances, base_labels, base_index_params);
|
|
318
291
|
|
|
319
|
-
for (
|
|
320
|
-
|
|
292
|
+
for (idx_t i = 0; i < n * k_base; i++) {
|
|
293
|
+
FAISS_THROW_IF_NOT(base_labels[i] >= -1 && base_labels[i] < ntotal);
|
|
321
294
|
}
|
|
322
295
|
|
|
323
296
|
// compute refined distances
|
|
@@ -328,12 +301,12 @@ void IndexRefineFlat::search(
|
|
|
328
301
|
|
|
329
302
|
// sort and store result
|
|
330
303
|
if (metric_type == METRIC_L2) {
|
|
331
|
-
|
|
304
|
+
using C = CMax<float, idx_t>;
|
|
332
305
|
reorder_2_heaps<C>(
|
|
333
306
|
n, k, labels, distances, k_base, base_labels, base_distances);
|
|
334
307
|
|
|
335
308
|
} else if (metric_type == METRIC_INNER_PRODUCT) {
|
|
336
|
-
|
|
309
|
+
using C = CMin<float, idx_t>;
|
|
337
310
|
reorder_2_heaps<C>(
|
|
338
311
|
n, k, labels, distances, k_base, base_labels, base_distances);
|
|
339
312
|
} else {
|
|
@@ -356,7 +329,7 @@ void IndexRefinePanorama::search(
|
|
|
356
329
|
if (params_in) {
|
|
357
330
|
params = dynamic_cast<const IndexRefineSearchParameters*>(params_in);
|
|
358
331
|
FAISS_THROW_IF_NOT_MSG(
|
|
359
|
-
params, "
|
|
332
|
+
params, "IndexRefinePanorama params have incorrect type");
|
|
360
333
|
}
|
|
361
334
|
|
|
362
335
|
idx_t k_base = (params != nullptr) ? idx_t(k * params->k_factor)
|
|
@@ -371,6 +344,8 @@ void IndexRefinePanorama::search(
|
|
|
371
344
|
|
|
372
345
|
FAISS_THROW_IF_NOT(k > 0);
|
|
373
346
|
FAISS_THROW_IF_NOT(is_trained);
|
|
347
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
348
|
+
n <= INT64_MAX / k_base, "n * k_base would overflow int64");
|
|
374
349
|
|
|
375
350
|
std::unique_ptr<idx_t[]> del1;
|
|
376
351
|
std::unique_ptr<float[]> del2;
|
|
@@ -382,8 +357,8 @@ void IndexRefinePanorama::search(
|
|
|
382
357
|
base_index->search(
|
|
383
358
|
n, x, k_base, base_distances, base_labels, base_index_params);
|
|
384
359
|
|
|
385
|
-
for (
|
|
386
|
-
|
|
360
|
+
for (idx_t i = 0; i < n * k_base; i++) {
|
|
361
|
+
FAISS_THROW_IF_NOT(base_labels[i] >= -1 && base_labels[i] < ntotal);
|
|
387
362
|
}
|
|
388
363
|
|
|
389
364
|
refine_index->search_subset(
|
|
@@ -28,8 +28,8 @@ struct IndexRefine : Index {
|
|
|
28
28
|
/// refinement index
|
|
29
29
|
Index* refine_index;
|
|
30
30
|
|
|
31
|
-
bool own_fields; ///< should the base index be deallocated?
|
|
32
|
-
bool own_refine_index; ///< same with the refinement index
|
|
31
|
+
bool own_fields = false; ///< should the base index be deallocated?
|
|
32
|
+
bool own_refine_index = false; ///< same with the refinement index
|
|
33
33
|
|
|
34
34
|
/// factor between k requested in search and the k requested from
|
|
35
35
|
/// the base_index (should be >= 1)
|
|
@@ -98,8 +98,8 @@ struct IndexRefineFlat : IndexRefine {
|
|
|
98
98
|
/** Version where the search calls search_subset, allowing for Panorama
|
|
99
99
|
* refinement. */
|
|
100
100
|
struct IndexRefinePanorama : IndexRefine {
|
|
101
|
-
explicit IndexRefinePanorama(Index*
|
|
102
|
-
: IndexRefine(
|
|
101
|
+
explicit IndexRefinePanorama(Index* base_index_in, Index* refine_index_in)
|
|
102
|
+
: IndexRefine(base_index_in, refine_index_in) {}
|
|
103
103
|
|
|
104
104
|
IndexRefinePanorama() : IndexRefine() {}
|
|
105
105
|
|
|
@@ -16,7 +16,7 @@ namespace {
|
|
|
16
16
|
|
|
17
17
|
// IndexBinary needs to update the code_size when d is set...
|
|
18
18
|
|
|
19
|
-
void sync_d(Index* index) {}
|
|
19
|
+
void sync_d(Index* /*index*/) {}
|
|
20
20
|
|
|
21
21
|
void sync_d(IndexBinary* index) {
|
|
22
22
|
FAISS_THROW_IF_NOT(index->d % 8 == 0);
|
|
@@ -30,14 +30,14 @@ IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(bool threaded)
|
|
|
30
30
|
: ThreadedIndex<IndexT>(threaded) {}
|
|
31
31
|
|
|
32
32
|
template <typename IndexT>
|
|
33
|
-
IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(idx_t
|
|
34
|
-
: ThreadedIndex<IndexT>(
|
|
33
|
+
IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(idx_t d_in, bool threaded)
|
|
34
|
+
: ThreadedIndex<IndexT>(static_cast<int>(d_in), threaded) {
|
|
35
35
|
sync_d(this);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
template <typename IndexT>
|
|
39
|
-
IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(int
|
|
40
|
-
: ThreadedIndex<IndexT>(
|
|
39
|
+
IndexReplicasTemplate<IndexT>::IndexReplicasTemplate(int d_in, bool threaded)
|
|
40
|
+
: ThreadedIndex<IndexT>(d_in, threaded) {
|
|
41
41
|
sync_d(this);
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -71,7 +71,7 @@ void IndexReplicasTemplate<IndexT>::onAfterAddIndex(IndexT* index) {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
template <typename IndexT>
|
|
74
|
-
void IndexReplicasTemplate<IndexT>::onAfterRemoveIndex(IndexT* index) {
|
|
74
|
+
void IndexReplicasTemplate<IndexT>::onAfterRemoveIndex(IndexT* /*index*/) {
|
|
75
75
|
syncWithSubIndexes();
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -162,10 +162,10 @@ void sa_decode_impl(
|
|
|
162
162
|
|
|
163
163
|
// allocate tmp buffers
|
|
164
164
|
std::vector<uint8_t> tmp(
|
|
165
|
-
(chunk_size < n_input
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
(chunk_size < static_cast<size_t>(n_input)
|
|
166
|
+
? chunk_size
|
|
167
|
+
: static_cast<size_t>(n_input)) *
|
|
168
|
+
old_code_size);
|
|
169
169
|
// all the elements to process
|
|
170
170
|
size_t n_left = n_input;
|
|
171
171
|
|
|
@@ -226,7 +226,7 @@ void train_inplace_impl(
|
|
|
226
226
|
std::vector<StorageMinMaxT> minmax(n);
|
|
227
227
|
|
|
228
228
|
// normalize
|
|
229
|
-
#pragma omp for
|
|
229
|
+
#pragma omp parallel for
|
|
230
230
|
for (idx_t i = 0; i < n; i++) {
|
|
231
231
|
// compute min & max values
|
|
232
232
|
float minv = std::numeric_limits<float>::max();
|
|
@@ -264,6 +264,7 @@ void train_inplace_impl(
|
|
|
264
264
|
sub_index->train(n, x);
|
|
265
265
|
|
|
266
266
|
// rescale data back
|
|
267
|
+
#pragma omp parallel for
|
|
267
268
|
for (idx_t i = 0; i < n; i++) {
|
|
268
269
|
float scaler = 0;
|
|
269
270
|
float minv = 0;
|
|
@@ -289,7 +290,7 @@ void train_impl(IndexRowwiseMinMaxBase* const index, idx_t n, const float* x) {
|
|
|
289
290
|
// temp buffer
|
|
290
291
|
std::vector<float> tmp(n * d);
|
|
291
292
|
|
|
292
|
-
#pragma omp for
|
|
293
|
+
#pragma omp parallel for
|
|
293
294
|
for (idx_t i = 0; i < n; i++) {
|
|
294
295
|
// compute min & max values
|
|
295
296
|
float minv = std::numeric_limits<float>::max();
|
|
@@ -304,7 +305,7 @@ void train_impl(IndexRowwiseMinMaxBase* const index, idx_t n, const float* x) {
|
|
|
304
305
|
const float scaler = maxv - minv;
|
|
305
306
|
|
|
306
307
|
// save the coefficients
|
|
307
|
-
StorageMinMaxT storage;
|
|
308
|
+
StorageMinMaxT storage = {};
|
|
308
309
|
storage.from_floats(scaler, minv);
|
|
309
310
|
|
|
310
311
|
// and load them back, because the coefficients might
|
|
@@ -339,9 +340,9 @@ int rowwise_minmax_sa_decode_bs = 16384;
|
|
|
339
340
|
* IndexRowwiseMinMaxBase implementation
|
|
340
341
|
********************************************************/
|
|
341
342
|
|
|
342
|
-
IndexRowwiseMinMaxBase::IndexRowwiseMinMaxBase(Index*
|
|
343
|
-
: Index(
|
|
344
|
-
index{
|
|
343
|
+
IndexRowwiseMinMaxBase::IndexRowwiseMinMaxBase(Index* index_in)
|
|
344
|
+
: Index(index_in->d, index_in->metric_type),
|
|
345
|
+
index{index_in},
|
|
345
346
|
own_fields{false} {}
|
|
346
347
|
|
|
347
348
|
IndexRowwiseMinMaxBase::IndexRowwiseMinMaxBase()
|
|
@@ -376,8 +377,8 @@ void IndexRowwiseMinMaxBase::reset() {
|
|
|
376
377
|
* IndexRowwiseMinMaxFP16 implementation
|
|
377
378
|
********************************************************/
|
|
378
379
|
|
|
379
|
-
IndexRowwiseMinMaxFP16::IndexRowwiseMinMaxFP16(Index*
|
|
380
|
-
: IndexRowwiseMinMaxBase(
|
|
380
|
+
IndexRowwiseMinMaxFP16::IndexRowwiseMinMaxFP16(Index* index_in)
|
|
381
|
+
: IndexRowwiseMinMaxBase(index_in) {}
|
|
381
382
|
|
|
382
383
|
IndexRowwiseMinMaxFP16::IndexRowwiseMinMaxFP16() : IndexRowwiseMinMaxBase() {}
|
|
383
384
|
|
|
@@ -411,8 +412,8 @@ void IndexRowwiseMinMaxFP16::train_inplace(idx_t n, float* x) {
|
|
|
411
412
|
* IndexRowwiseMinMax implementation
|
|
412
413
|
********************************************************/
|
|
413
414
|
|
|
414
|
-
IndexRowwiseMinMax::IndexRowwiseMinMax(Index*
|
|
415
|
-
: IndexRowwiseMinMaxBase(
|
|
415
|
+
IndexRowwiseMinMax::IndexRowwiseMinMax(Index* index_in)
|
|
416
|
+
: IndexRowwiseMinMaxBase(index_in) {}
|
|
416
417
|
|
|
417
418
|
IndexRowwiseMinMax::IndexRowwiseMinMax() : IndexRowwiseMinMaxBase() {}
|
|
418
419
|
|