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
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
#include <memory>
|
|
11
11
|
|
|
12
|
-
#include <faiss/impl/FastScanDistancePostProcessing.h>
|
|
13
|
-
#include <faiss/impl/
|
|
12
|
+
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
|
|
13
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
14
14
|
#include <faiss/utils/utils.h>
|
|
15
15
|
|
|
16
16
|
namespace faiss {
|
|
@@ -20,25 +20,27 @@ inline size_t roundup(size_t a, size_t b) {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
IndexPQFastScan::IndexPQFastScan(
|
|
23
|
-
int
|
|
24
|
-
size_t
|
|
25
|
-
size_t
|
|
23
|
+
int d_in,
|
|
24
|
+
size_t M_in,
|
|
25
|
+
size_t nbits_in,
|
|
26
26
|
MetricType metric,
|
|
27
|
-
int
|
|
28
|
-
: pq(
|
|
29
|
-
init_fastscan(
|
|
27
|
+
int bbs_in)
|
|
28
|
+
: pq(d_in, M_in, nbits_in) {
|
|
29
|
+
init_fastscan(d_in, M_in, nbits_in, metric, bbs_in);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
IndexPQFastScan::IndexPQFastScan(const IndexPQ& orig, int
|
|
33
|
-
|
|
32
|
+
IndexPQFastScan::IndexPQFastScan(const IndexPQ& orig, int bbs_in)
|
|
33
|
+
: pq(orig.pq) {
|
|
34
|
+
init_fastscan(orig.d, pq.M, pq.nbits, orig.metric_type, bbs_in);
|
|
34
35
|
ntotal = orig.ntotal;
|
|
35
|
-
ntotal2 = roundup(ntotal,
|
|
36
|
+
ntotal2 = roundup(ntotal, bbs_in);
|
|
36
37
|
is_trained = orig.is_trained;
|
|
37
38
|
orig_codes = orig.codes.data();
|
|
38
39
|
|
|
39
40
|
// pack the codes
|
|
40
41
|
codes.resize(ntotal2 * M2 / 2);
|
|
41
|
-
pq4_pack_codes(
|
|
42
|
+
pq4_pack_codes(
|
|
43
|
+
orig.codes.data(), ntotal, M, ntotal2, bbs_in, M2, codes.get());
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
void IndexPQFastScan::train(idx_t n, const float* x) {
|
|
@@ -49,9 +51,9 @@ void IndexPQFastScan::train(idx_t n, const float* x) {
|
|
|
49
51
|
is_trained = true;
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
void IndexPQFastScan::compute_codes(uint8_t*
|
|
54
|
+
void IndexPQFastScan::compute_codes(uint8_t* out_codes, idx_t n, const float* x)
|
|
53
55
|
const {
|
|
54
|
-
pq.compute_codes(x,
|
|
56
|
+
pq.compute_codes(x, out_codes, n);
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
void IndexPQFastScan::compute_float_LUT(
|
|
@@ -70,4 +72,8 @@ void IndexPQFastScan::sa_decode(idx_t n, const uint8_t* bytes, float* x) const {
|
|
|
70
72
|
pq.decode(bytes, x, n);
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
size_t IndexPQFastScan::fast_scan_code_size() const {
|
|
76
|
+
return M2 / 2;
|
|
77
|
+
}
|
|
78
|
+
|
|
73
79
|
} // namespace faiss
|
|
@@ -52,6 +52,9 @@ struct IndexPQFastScan : IndexFastScan {
|
|
|
52
52
|
const FastScanDistancePostProcessing& context) const override;
|
|
53
53
|
|
|
54
54
|
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
55
|
+
|
|
56
|
+
/// Packed code size: M2 / 2 bytes (4-bit PQ sub-quantizer nibbles)
|
|
57
|
+
size_t fast_scan_code_size() const override;
|
|
55
58
|
};
|
|
56
59
|
|
|
57
60
|
} // namespace faiss
|
|
@@ -26,16 +26,20 @@ namespace faiss {
|
|
|
26
26
|
|
|
27
27
|
IndexPreTransform::IndexPreTransform() : index(nullptr), own_fields(false) {}
|
|
28
28
|
|
|
29
|
-
IndexPreTransform::IndexPreTransform(Index*
|
|
30
|
-
: Index(
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
IndexPreTransform::IndexPreTransform(Index* index_in)
|
|
30
|
+
: Index(index_in->d, index_in->metric_type),
|
|
31
|
+
index(index_in),
|
|
32
|
+
own_fields(false) {
|
|
33
|
+
is_trained = index_in->is_trained;
|
|
34
|
+
ntotal = index_in->ntotal;
|
|
33
35
|
}
|
|
34
36
|
|
|
35
|
-
IndexPreTransform::IndexPreTransform(VectorTransform* ltrans, Index*
|
|
36
|
-
: Index(
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
IndexPreTransform::IndexPreTransform(VectorTransform* ltrans, Index* index_in)
|
|
38
|
+
: Index(index_in->d, index_in->metric_type),
|
|
39
|
+
index(index_in),
|
|
40
|
+
own_fields(false) {
|
|
41
|
+
is_trained = index_in->is_trained;
|
|
42
|
+
ntotal = index_in->ntotal;
|
|
39
43
|
prepend_transform(ltrans);
|
|
40
44
|
}
|
|
41
45
|
|
|
@@ -48,7 +52,7 @@ void IndexPreTransform::prepend_transform(VectorTransform* ltrans) {
|
|
|
48
52
|
|
|
49
53
|
IndexPreTransform::~IndexPreTransform() {
|
|
50
54
|
if (own_fields) {
|
|
51
|
-
for (
|
|
55
|
+
for (size_t i = 0; i < chain.size(); i++) {
|
|
52
56
|
delete chain[i];
|
|
53
57
|
}
|
|
54
58
|
delete index;
|
|
@@ -58,9 +62,9 @@ IndexPreTransform::~IndexPreTransform() {
|
|
|
58
62
|
void IndexPreTransform::train(idx_t n, const float* x) {
|
|
59
63
|
int last_untrained = 0;
|
|
60
64
|
if (!index->is_trained) {
|
|
61
|
-
last_untrained = chain.size();
|
|
65
|
+
last_untrained = static_cast<int>(chain.size());
|
|
62
66
|
} else {
|
|
63
|
-
for (int i = chain.size() - 1; i >= 0; i--) {
|
|
67
|
+
for (int i = static_cast<int>(chain.size()) - 1; i >= 0; i--) {
|
|
64
68
|
if (!chain[i]->is_trained) {
|
|
65
69
|
last_untrained = i;
|
|
66
70
|
break;
|
|
@@ -76,7 +80,7 @@ void IndexPreTransform::train(idx_t n, const float* x) {
|
|
|
76
80
|
}
|
|
77
81
|
|
|
78
82
|
for (int i = 0; i <= last_untrained; i++) {
|
|
79
|
-
if (i < chain.size()) {
|
|
83
|
+
if (i < static_cast<int>(chain.size())) {
|
|
80
84
|
VectorTransform* ltrans = chain[i];
|
|
81
85
|
if (!ltrans->is_trained) {
|
|
82
86
|
if (verbose) {
|
|
@@ -119,13 +123,15 @@ const float* IndexPreTransform::apply_chain(idx_t n, const float* x) const {
|
|
|
119
123
|
const float* prev_x = x;
|
|
120
124
|
std::unique_ptr<const float[]> del;
|
|
121
125
|
|
|
122
|
-
for (
|
|
126
|
+
for (size_t i = 0; i < chain.size(); i++) {
|
|
123
127
|
float* xt = chain[i]->apply(n, prev_x);
|
|
124
128
|
std::unique_ptr<const float[]> del2(xt);
|
|
125
129
|
del2.swap(del);
|
|
126
130
|
prev_x = xt;
|
|
127
131
|
}
|
|
128
|
-
|
|
132
|
+
// Intentionally release ownership: caller takes ownership of the returned
|
|
133
|
+
// buffer
|
|
134
|
+
(void)del.release();
|
|
129
135
|
return prev_x;
|
|
130
136
|
}
|
|
131
137
|
|
|
@@ -134,7 +140,7 @@ void IndexPreTransform::reverse_chain(idx_t n, const float* xt, float* x)
|
|
|
134
140
|
const float* next_x = xt;
|
|
135
141
|
std::unique_ptr<const float[]> del;
|
|
136
142
|
|
|
137
|
-
for (int i = chain.size() - 1; i >= 0; i--) {
|
|
143
|
+
for (int i = static_cast<int>(chain.size()) - 1; i >= 0; i--) {
|
|
138
144
|
float* prev_x = (i == 0) ? x : new float[n * chain[i]->d_in];
|
|
139
145
|
std::unique_ptr<const float[]> del2((prev_x == x) ? nullptr : prev_x);
|
|
140
146
|
chain[i]->reverse_transform(n, next_x, prev_x);
|
|
@@ -305,7 +311,7 @@ void IndexPreTransform::check_compatible_for_merge(
|
|
|
305
311
|
auto other = dynamic_cast<const IndexPreTransform*>(&otherIndex);
|
|
306
312
|
FAISS_THROW_IF_NOT(other);
|
|
307
313
|
FAISS_THROW_IF_NOT(chain.size() == other->chain.size());
|
|
308
|
-
for (
|
|
314
|
+
for (size_t i = 0; i < chain.size(); i++) {
|
|
309
315
|
chain[i]->check_identical(*other->chain[i]);
|
|
310
316
|
}
|
|
311
317
|
index->check_compatible_for_merge(*other->index);
|
|
@@ -318,8 +324,9 @@ struct PreTransformDistanceComputer : DistanceComputer {
|
|
|
318
324
|
std::unique_ptr<DistanceComputer> sub_dc;
|
|
319
325
|
std::unique_ptr<const float[]> query;
|
|
320
326
|
|
|
321
|
-
explicit PreTransformDistanceComputer(const IndexPreTransform*
|
|
322
|
-
: index(
|
|
327
|
+
explicit PreTransformDistanceComputer(const IndexPreTransform* index_in)
|
|
328
|
+
: index(index_in),
|
|
329
|
+
sub_dc(index_in->index->get_distance_computer()) {}
|
|
323
330
|
|
|
324
331
|
void set_query(const float* x) override {
|
|
325
332
|
const float* xt = index->apply_chain(1, x);
|
|
@@ -26,7 +26,7 @@ struct IndexPreTransform : Index {
|
|
|
26
26
|
std::vector<VectorTransform*> chain; ///! chain of transforms
|
|
27
27
|
Index* index; ///! the sub-index
|
|
28
28
|
|
|
29
|
-
bool own_fields; ///! whether pointers are deleted in destructor
|
|
29
|
+
bool own_fields = false; ///! whether pointers are deleted in destructor
|
|
30
30
|
|
|
31
31
|
explicit IndexPreTransform(Index* index);
|
|
32
32
|
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include <faiss/IndexRaBitQ.h>
|
|
9
9
|
|
|
10
10
|
#include <faiss/impl/FaissAssert.h>
|
|
11
|
+
#include <faiss/impl/RaBitQUtils.h>
|
|
11
12
|
#include <faiss/impl/ResultHandler.h>
|
|
12
13
|
#include <memory>
|
|
13
14
|
|
|
@@ -16,10 +17,12 @@ namespace faiss {
|
|
|
16
17
|
// Forward declaration from RaBitQuantizer.cpp
|
|
17
18
|
struct RaBitQDistanceComputer;
|
|
18
19
|
|
|
20
|
+
using rabitq_utils::SignBitFactorsWithError;
|
|
21
|
+
|
|
19
22
|
IndexRaBitQ::IndexRaBitQ() = default;
|
|
20
23
|
|
|
21
|
-
IndexRaBitQ::IndexRaBitQ(idx_t
|
|
22
|
-
: IndexFlatCodes(0,
|
|
24
|
+
IndexRaBitQ::IndexRaBitQ(idx_t d_in, MetricType metric, uint8_t nb_bits_in)
|
|
25
|
+
: IndexFlatCodes(0, d_in, metric), rabitq(d_in, metric, nb_bits_in) {
|
|
23
26
|
// Update code size based on nb_bits
|
|
24
27
|
code_size = rabitq.code_size;
|
|
25
28
|
|
|
@@ -29,14 +32,14 @@ IndexRaBitQ::IndexRaBitQ(idx_t d, MetricType metric, uint8_t nb_bits_in)
|
|
|
29
32
|
void IndexRaBitQ::train(idx_t n, const float* x) {
|
|
30
33
|
// compute a centroid
|
|
31
34
|
std::vector<float> centroid(d, 0);
|
|
32
|
-
for (
|
|
33
|
-
for (size_t j = 0; j < d; j++) {
|
|
35
|
+
for (idx_t i = 0; i < n; i++) {
|
|
36
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
34
37
|
centroid[j] += x[i * d + j];
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
if (n != 0) {
|
|
39
|
-
for (size_t j = 0; j < d; j++) {
|
|
42
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
40
43
|
centroid[j] /= (float)n;
|
|
41
44
|
}
|
|
42
45
|
}
|
|
@@ -67,10 +70,10 @@ FlatCodesDistanceComputer* IndexRaBitQ::get_FlatCodesDistanceComputer() const {
|
|
|
67
70
|
}
|
|
68
71
|
|
|
69
72
|
FlatCodesDistanceComputer* IndexRaBitQ::get_quantized_distance_computer(
|
|
70
|
-
const uint8_t
|
|
71
|
-
bool
|
|
73
|
+
const uint8_t qb_in,
|
|
74
|
+
bool centered_in) const {
|
|
72
75
|
FlatCodesDistanceComputer* dc =
|
|
73
|
-
rabitq.get_distance_computer(
|
|
76
|
+
rabitq.get_distance_computer(qb_in, center.data(), centered_in);
|
|
74
77
|
dc->code_size = rabitq.code_size;
|
|
75
78
|
dc->codes = codes.data();
|
|
76
79
|
return dc;
|
|
@@ -99,19 +102,12 @@ struct Run_search_with_dc_res {
|
|
|
99
102
|
index->get_quantized_distance_computer(qb, centered));
|
|
100
103
|
SingleResultHandler resi(res);
|
|
101
104
|
#pragma omp for
|
|
102
|
-
for (int64_t q = 0; q < res.nq; q++) {
|
|
105
|
+
for (int64_t q = 0; q < static_cast<int64_t>(res.nq); q++) {
|
|
103
106
|
resi.begin(q);
|
|
104
107
|
dc_base->set_query(xq + d * q);
|
|
105
108
|
|
|
106
|
-
// Stats tracking for multi-bit two-stage search only
|
|
107
|
-
// n_1bit_evaluations: candidates evaluated using 1-bit lower
|
|
108
|
-
// bound n_multibit_evaluations: candidates requiring full
|
|
109
|
-
// multi-bit distance
|
|
110
|
-
size_t local_1bit_evaluations = 0;
|
|
111
|
-
size_t local_multibit_evaluations = 0;
|
|
112
|
-
|
|
113
109
|
if (ex_bits == 0) {
|
|
114
|
-
// 1-bit: Standard single-stage search
|
|
110
|
+
// 1-bit: Standard single-stage search
|
|
115
111
|
for (size_t i = 0; i < ntotal; i++) {
|
|
116
112
|
if (res.is_in_selection(i)) {
|
|
117
113
|
float dis = (*dc_base)(i);
|
|
@@ -130,7 +126,6 @@ struct Run_search_with_dc_res {
|
|
|
130
126
|
dc != nullptr,
|
|
131
127
|
"Failed to cast to RaBitQDistanceComputer for two-stage search");
|
|
132
128
|
|
|
133
|
-
// Use appropriate comparison based on metric type
|
|
134
129
|
bool is_similarity =
|
|
135
130
|
is_similarity_metric(index->metric_type);
|
|
136
131
|
|
|
@@ -139,24 +134,24 @@ struct Run_search_with_dc_res {
|
|
|
139
134
|
const uint8_t* code =
|
|
140
135
|
index->codes.data() + i * index->code_size;
|
|
141
136
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
137
|
+
float est_distance =
|
|
138
|
+
dc->distance_to_code_1bit(code);
|
|
139
|
+
|
|
140
|
+
size_t code_size_base = (index->d + 7) / 8;
|
|
141
|
+
const rabitq_utils::SignBitFactorsWithError*
|
|
142
|
+
base_fac = reinterpret_cast<
|
|
143
|
+
const rabitq_utils::
|
|
144
|
+
SignBitFactorsWithError*>(
|
|
145
|
+
code + code_size_base);
|
|
146
|
+
|
|
147
|
+
bool should_refine =
|
|
148
|
+
rabitq_utils::should_refine_candidate(
|
|
149
|
+
est_distance,
|
|
150
|
+
base_fac->f_error,
|
|
151
|
+
dc->g_error,
|
|
152
|
+
resi.threshold,
|
|
153
|
+
is_similarity);
|
|
157
154
|
if (should_refine) {
|
|
158
|
-
local_multibit_evaluations++;
|
|
159
|
-
// Compute full multi-bit distance
|
|
160
155
|
float dist_full =
|
|
161
156
|
dc->distance_to_code_full(code);
|
|
162
157
|
resi.add_result(dist_full, i);
|
|
@@ -165,13 +160,6 @@ struct Run_search_with_dc_res {
|
|
|
165
160
|
}
|
|
166
161
|
}
|
|
167
162
|
|
|
168
|
-
// Update global stats atomically
|
|
169
|
-
#pragma omp atomic
|
|
170
|
-
rabitq_stats.n_1bit_evaluations += local_1bit_evaluations;
|
|
171
|
-
#pragma omp atomic
|
|
172
|
-
rabitq_stats.n_multibit_evaluations +=
|
|
173
|
-
local_multibit_evaluations;
|
|
174
|
-
|
|
175
163
|
resi.end();
|
|
176
164
|
}
|
|
177
165
|
}
|
|
@@ -211,7 +199,7 @@ void IndexRaBitQ::search(
|
|
|
211
199
|
}
|
|
212
200
|
|
|
213
201
|
void IndexRaBitQ::range_search(
|
|
214
|
-
idx_t n
|
|
202
|
+
idx_t /*n*/,
|
|
215
203
|
const float* x,
|
|
216
204
|
float radius,
|
|
217
205
|
RangeSearchResult* result,
|
|
@@ -8,13 +8,12 @@
|
|
|
8
8
|
#pragma once
|
|
9
9
|
|
|
10
10
|
#include <faiss/IndexFlatCodes.h>
|
|
11
|
-
#include <faiss/impl/RaBitQStats.h>
|
|
12
11
|
#include <faiss/impl/RaBitQuantizer.h>
|
|
13
12
|
|
|
14
13
|
namespace faiss {
|
|
15
14
|
|
|
16
15
|
struct RaBitQSearchParameters : SearchParameters {
|
|
17
|
-
uint8_t qb =
|
|
16
|
+
uint8_t qb = 4;
|
|
18
17
|
bool centered = false;
|
|
19
18
|
};
|
|
20
19
|
|
|
@@ -26,7 +25,9 @@ struct IndexRaBitQ : IndexFlatCodes {
|
|
|
26
25
|
|
|
27
26
|
// the default number of bits to quantize a query with.
|
|
28
27
|
// use '0' to disable quantization and use raw fp32 values.
|
|
29
|
-
|
|
28
|
+
// Note: qb=0 is NOT supported by FastScan variants, which require
|
|
29
|
+
// quantized queries for SIMD lookup table construction.
|
|
30
|
+
uint8_t qb = 4;
|
|
30
31
|
|
|
31
32
|
// quantize the query with a zero-centered scalar quantizer.
|
|
32
33
|
bool centered = false;
|