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,13 +8,12 @@
|
|
|
8
8
|
#include <faiss/IndexAdditiveQuantizer.h>
|
|
9
9
|
|
|
10
10
|
#include <algorithm>
|
|
11
|
-
#include <cmath>
|
|
12
11
|
#include <cstring>
|
|
13
12
|
|
|
14
13
|
#include <faiss/impl/FaissAssert.h>
|
|
15
14
|
#include <faiss/impl/ResidualQuantizer.h>
|
|
16
15
|
#include <faiss/impl/ResultHandler.h>
|
|
17
|
-
#include <faiss/utils/
|
|
16
|
+
#include <faiss/utils/distances_dispatch.h>
|
|
18
17
|
#include <faiss/utils/extra_distances.h>
|
|
19
18
|
|
|
20
19
|
namespace faiss {
|
|
@@ -24,10 +23,10 @@ namespace faiss {
|
|
|
24
23
|
**************************************************************************************/
|
|
25
24
|
|
|
26
25
|
IndexAdditiveQuantizer::IndexAdditiveQuantizer(
|
|
27
|
-
idx_t
|
|
28
|
-
AdditiveQuantizer*
|
|
26
|
+
idx_t d_,
|
|
27
|
+
AdditiveQuantizer* aq_,
|
|
29
28
|
MetricType metric)
|
|
30
|
-
: IndexFlatCodes(
|
|
29
|
+
: IndexFlatCodes(aq_->code_size, d_, metric), aq(aq_) {
|
|
31
30
|
FAISS_THROW_IF_NOT(metric == METRIC_INNER_PRODUCT || metric == METRIC_L2);
|
|
32
31
|
}
|
|
33
32
|
|
|
@@ -46,14 +45,14 @@ struct AQDistanceComputerDecompress : FlatCodesDistanceComputer {
|
|
|
46
45
|
|
|
47
46
|
AQDistanceComputerDecompress(
|
|
48
47
|
const IndexAdditiveQuantizer& iaq,
|
|
49
|
-
VectorDistance
|
|
48
|
+
VectorDistance vd_)
|
|
50
49
|
: FlatCodesDistanceComputer(iaq.codes.data(), iaq.code_size),
|
|
51
50
|
tmp(iaq.d * 2),
|
|
52
51
|
aq(*iaq.aq),
|
|
53
|
-
vd(
|
|
52
|
+
vd(vd_),
|
|
54
53
|
d(iaq.d) {}
|
|
55
54
|
|
|
56
|
-
const float* q;
|
|
55
|
+
const float* q = nullptr;
|
|
57
56
|
void set_query(const float* x) final {
|
|
58
57
|
q = x;
|
|
59
58
|
}
|
|
@@ -84,7 +83,7 @@ struct AQDistanceComputerLUT : FlatCodesDistanceComputer {
|
|
|
84
83
|
aq(*iaq.aq),
|
|
85
84
|
d(iaq.d) {}
|
|
86
85
|
|
|
87
|
-
float bias;
|
|
86
|
+
float bias = 0.0f;
|
|
88
87
|
void set_query(const float* x) final {
|
|
89
88
|
q = x;
|
|
90
89
|
// this is quite sub-optimal for multiple queries
|
|
@@ -129,7 +128,7 @@ void search_with_decompress(
|
|
|
129
128
|
typename BlockResultHandler::SingleResultHandler;
|
|
130
129
|
|
|
131
130
|
#pragma omp parallel for if (res.nq > 100)
|
|
132
|
-
for (int64_t q = 0; q < res.nq; q++) {
|
|
131
|
+
for (int64_t q = 0; q < static_cast<int64_t>(res.nq); q++) {
|
|
133
132
|
SingleResultHandler resi(res);
|
|
134
133
|
resi.begin(q);
|
|
135
134
|
std::vector<float> tmp(ir.d);
|
|
@@ -165,7 +164,7 @@ void search_with_LUT(
|
|
|
165
164
|
aq.compute_LUT(nq, xq, LUT.get());
|
|
166
165
|
|
|
167
166
|
#pragma omp parallel for if (nq > 100)
|
|
168
|
-
for (int64_t q = 0; q < nq; q++) {
|
|
167
|
+
for (int64_t q = 0; q < static_cast<int64_t>(nq); q++) {
|
|
169
168
|
SingleResultHandler resi(res);
|
|
170
169
|
resi.begin(q);
|
|
171
170
|
std::vector<float> tmp(aq.d);
|
|
@@ -189,17 +188,14 @@ void search_with_LUT(
|
|
|
189
188
|
FlatCodesDistanceComputer* IndexAdditiveQuantizer::
|
|
190
189
|
get_FlatCodesDistanceComputer() const {
|
|
191
190
|
if (aq->search_type == AdditiveQuantizer::ST_decompress) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
} else {
|
|
201
|
-
FAISS_THROW_MSG("unsupported metric");
|
|
202
|
-
}
|
|
191
|
+
return with_VectorDistance(
|
|
192
|
+
d,
|
|
193
|
+
metric_type,
|
|
194
|
+
metric_arg,
|
|
195
|
+
[&](auto vd) -> FlatCodesDistanceComputer* {
|
|
196
|
+
return new AQDistanceComputerDecompress<decltype(vd)>(
|
|
197
|
+
*this, vd);
|
|
198
|
+
});
|
|
203
199
|
} else {
|
|
204
200
|
if (metric_type == METRIC_INNER_PRODUCT) {
|
|
205
201
|
return new AQDistanceComputerLUT<
|
|
@@ -242,17 +238,17 @@ void IndexAdditiveQuantizer::search(
|
|
|
242
238
|
!params, "search params not supported for this index");
|
|
243
239
|
|
|
244
240
|
if (aq->search_type == AdditiveQuantizer::ST_decompress) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}
|
|
241
|
+
with_VectorDistance(d, metric_type, metric_arg, [&](auto vd) {
|
|
242
|
+
if constexpr (decltype(vd)::is_similarity) {
|
|
243
|
+
HeapBlockResultHandler<CMin<float, idx_t>> rh(
|
|
244
|
+
n, distances, labels, k);
|
|
245
|
+
search_with_decompress(*this, x, vd, rh);
|
|
246
|
+
} else {
|
|
247
|
+
HeapBlockResultHandler<CMax<float, idx_t>> rh(
|
|
248
|
+
n, distances, labels, k);
|
|
249
|
+
search_with_decompress(*this, x, vd, rh);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
256
252
|
} else {
|
|
257
253
|
if (metric_type == METRIC_INNER_PRODUCT) {
|
|
258
254
|
HeapBlockResultHandler<CMin<float, idx_t>> rh(
|
|
@@ -303,23 +299,23 @@ void IndexAdditiveQuantizer::sa_decode(idx_t n, const uint8_t* bytes, float* x)
|
|
|
303
299
|
**************************************************************************************/
|
|
304
300
|
|
|
305
301
|
IndexResidualQuantizer::IndexResidualQuantizer(
|
|
306
|
-
int
|
|
302
|
+
int d_, ///< dimensionality of the input vectors
|
|
307
303
|
size_t M, ///< number of subquantizers
|
|
308
304
|
size_t nbits, ///< number of bit per subvector index
|
|
309
305
|
MetricType metric,
|
|
310
306
|
Search_type_t search_type)
|
|
311
307
|
: IndexResidualQuantizer(
|
|
312
|
-
|
|
308
|
+
d_,
|
|
313
309
|
std::vector<size_t>(M, nbits),
|
|
314
310
|
metric,
|
|
315
311
|
search_type) {}
|
|
316
312
|
|
|
317
313
|
IndexResidualQuantizer::IndexResidualQuantizer(
|
|
318
|
-
int
|
|
314
|
+
int d_,
|
|
319
315
|
const std::vector<size_t>& nbits,
|
|
320
316
|
MetricType metric,
|
|
321
317
|
Search_type_t search_type)
|
|
322
|
-
: IndexAdditiveQuantizer(
|
|
318
|
+
: IndexAdditiveQuantizer(d_, &rq, metric), rq(d_, nbits, search_type) {
|
|
323
319
|
code_size = rq.code_size;
|
|
324
320
|
is_trained = false;
|
|
325
321
|
}
|
|
@@ -337,13 +333,13 @@ void IndexResidualQuantizer::train(idx_t n, const float* x) {
|
|
|
337
333
|
**************************************************************************************/
|
|
338
334
|
|
|
339
335
|
IndexLocalSearchQuantizer::IndexLocalSearchQuantizer(
|
|
340
|
-
int
|
|
336
|
+
int d_,
|
|
341
337
|
size_t M, ///< number of subquantizers
|
|
342
338
|
size_t nbits, ///< number of bit per subvector index
|
|
343
339
|
MetricType metric,
|
|
344
340
|
Search_type_t search_type)
|
|
345
|
-
: IndexAdditiveQuantizer(
|
|
346
|
-
lsq(
|
|
341
|
+
: IndexAdditiveQuantizer(d_, &lsq, metric),
|
|
342
|
+
lsq(d_, M, nbits, search_type) {
|
|
347
343
|
code_size = lsq.code_size;
|
|
348
344
|
is_trained = false;
|
|
349
345
|
}
|
|
@@ -361,14 +357,14 @@ void IndexLocalSearchQuantizer::train(idx_t n, const float* x) {
|
|
|
361
357
|
**************************************************************************************/
|
|
362
358
|
|
|
363
359
|
IndexProductResidualQuantizer::IndexProductResidualQuantizer(
|
|
364
|
-
int
|
|
360
|
+
int d_, ///< dimensionality of the input vectors
|
|
365
361
|
size_t nsplits, ///< number of residual quantizers
|
|
366
362
|
size_t Msub, ///< number of subquantizers per RQ
|
|
367
363
|
size_t nbits, ///< number of bit per subvector index
|
|
368
364
|
MetricType metric,
|
|
369
365
|
Search_type_t search_type)
|
|
370
|
-
: IndexAdditiveQuantizer(
|
|
371
|
-
prq(
|
|
366
|
+
: IndexAdditiveQuantizer(d_, &prq, metric),
|
|
367
|
+
prq(d_, nsplits, Msub, nbits, search_type) {
|
|
372
368
|
code_size = prq.code_size;
|
|
373
369
|
is_trained = false;
|
|
374
370
|
}
|
|
@@ -386,14 +382,14 @@ void IndexProductResidualQuantizer::train(idx_t n, const float* x) {
|
|
|
386
382
|
**************************************************************************************/
|
|
387
383
|
|
|
388
384
|
IndexProductLocalSearchQuantizer::IndexProductLocalSearchQuantizer(
|
|
389
|
-
int
|
|
385
|
+
int d_, ///< dimensionality of the input vectors
|
|
390
386
|
size_t nsplits, ///< number of local search quantizers
|
|
391
387
|
size_t Msub, ///< number of subquantizers per LSQ
|
|
392
388
|
size_t nbits, ///< number of bit per subvector index
|
|
393
389
|
MetricType metric,
|
|
394
390
|
Search_type_t search_type)
|
|
395
|
-
: IndexAdditiveQuantizer(
|
|
396
|
-
plsq(
|
|
391
|
+
: IndexAdditiveQuantizer(d_, &plsq, metric),
|
|
392
|
+
plsq(d_, nsplits, Msub, nbits, search_type) {
|
|
397
393
|
code_size = plsq.code_size;
|
|
398
394
|
is_trained = false;
|
|
399
395
|
}
|
|
@@ -411,10 +407,10 @@ void IndexProductLocalSearchQuantizer::train(idx_t n, const float* x) {
|
|
|
411
407
|
**************************************************************************************/
|
|
412
408
|
|
|
413
409
|
AdditiveCoarseQuantizer::AdditiveCoarseQuantizer(
|
|
414
|
-
idx_t
|
|
415
|
-
AdditiveQuantizer*
|
|
410
|
+
idx_t d_,
|
|
411
|
+
AdditiveQuantizer* aq_,
|
|
416
412
|
MetricType metric)
|
|
417
|
-
: Index(
|
|
413
|
+
: Index(d_, metric), aq(aq_) {}
|
|
418
414
|
|
|
419
415
|
void AdditiveCoarseQuantizer::add(idx_t, const float*) {
|
|
420
416
|
FAISS_THROW_MSG("not applicable");
|
|
@@ -468,7 +464,8 @@ void AdditiveCoarseQuantizer::search(
|
|
|
468
464
|
if (metric_type == METRIC_INNER_PRODUCT) {
|
|
469
465
|
aq->knn_centroids_inner_product(n, x, k, distances, labels);
|
|
470
466
|
} else if (metric_type == METRIC_L2) {
|
|
471
|
-
FAISS_THROW_IF_NOT(
|
|
467
|
+
FAISS_THROW_IF_NOT(
|
|
468
|
+
centroid_norms.size() == static_cast<size_t>(ntotal));
|
|
472
469
|
aq->knn_centroids_L2(n, x, k, distances, labels, centroid_norms.data());
|
|
473
470
|
}
|
|
474
471
|
}
|
|
@@ -478,20 +475,20 @@ void AdditiveCoarseQuantizer::search(
|
|
|
478
475
|
**************************************************************************************/
|
|
479
476
|
|
|
480
477
|
ResidualCoarseQuantizer::ResidualCoarseQuantizer(
|
|
481
|
-
int
|
|
478
|
+
int d_, ///< dimensionality of the input vectors
|
|
482
479
|
const std::vector<size_t>& nbits,
|
|
483
480
|
MetricType metric)
|
|
484
|
-
: AdditiveCoarseQuantizer(
|
|
481
|
+
: AdditiveCoarseQuantizer(d_, &rq, metric), rq(d_, nbits) {
|
|
485
482
|
FAISS_THROW_IF_NOT(rq.tot_bits <= 63);
|
|
486
483
|
is_trained = false;
|
|
487
484
|
}
|
|
488
485
|
|
|
489
486
|
ResidualCoarseQuantizer::ResidualCoarseQuantizer(
|
|
490
|
-
int
|
|
487
|
+
int d_,
|
|
491
488
|
size_t M, ///< number of subquantizers
|
|
492
489
|
size_t nbits, ///< number of bit per subvector index
|
|
493
490
|
MetricType metric)
|
|
494
|
-
: ResidualCoarseQuantizer(
|
|
491
|
+
: ResidualCoarseQuantizer(d_, std::vector<size_t>(M, nbits), metric) {}
|
|
495
492
|
|
|
496
493
|
ResidualCoarseQuantizer::ResidualCoarseQuantizer()
|
|
497
494
|
: ResidualCoarseQuantizer(0, 0, 0) {}
|
|
@@ -509,7 +506,8 @@ void ResidualCoarseQuantizer::set_beam_factor(float new_beam_factor) {
|
|
|
509
506
|
// Does not use the cross_products
|
|
510
507
|
rq.codebook_cross_products.resize(0);
|
|
511
508
|
// but the centroid norms are necessary!
|
|
512
|
-
if (metric_type == METRIC_L2 &&
|
|
509
|
+
if (metric_type == METRIC_L2 &&
|
|
510
|
+
static_cast<size_t>(ntotal) != centroid_norms.size()) {
|
|
513
511
|
if (verbose) {
|
|
514
512
|
printf("AdditiveCoarseQuantizer::train: computing centroid norms for %zd centroids\n",
|
|
515
513
|
size_t(ntotal));
|
|
@@ -545,7 +543,7 @@ void ResidualCoarseQuantizer::search(
|
|
|
545
543
|
|
|
546
544
|
int beam_size = int(k * actual_beam_factor);
|
|
547
545
|
if (beam_size > ntotal) {
|
|
548
|
-
beam_size = ntotal;
|
|
546
|
+
beam_size = static_cast<int>(ntotal);
|
|
549
547
|
}
|
|
550
548
|
size_t memory_per_point = rq.memory_per_point(beam_size);
|
|
551
549
|
|
|
@@ -578,8 +576,17 @@ void ResidualCoarseQuantizer::search(
|
|
|
578
576
|
return;
|
|
579
577
|
}
|
|
580
578
|
|
|
581
|
-
|
|
582
|
-
|
|
579
|
+
size_t codes_size = mul_no_overflow(
|
|
580
|
+
mul_no_overflow(
|
|
581
|
+
static_cast<size_t>(beam_size), rq.M, "beam_size * M"),
|
|
582
|
+
static_cast<size_t>(n),
|
|
583
|
+
"beam_size * M * n");
|
|
584
|
+
size_t beam_dist_size = mul_no_overflow(
|
|
585
|
+
static_cast<size_t>(n),
|
|
586
|
+
static_cast<size_t>(beam_size),
|
|
587
|
+
"n * beam_size");
|
|
588
|
+
std::vector<int32_t> codes(codes_size);
|
|
589
|
+
std::vector<float> beam_distances(beam_dist_size);
|
|
583
590
|
|
|
584
591
|
rq.refine_beam(
|
|
585
592
|
n, 1, x, beam_size, codes.data(), nullptr, beam_distances.data());
|
|
@@ -595,7 +602,7 @@ void ResidualCoarseQuantizer::search(
|
|
|
595
602
|
for (idx_t j = 0; j < k; j++) {
|
|
596
603
|
idx_t l = 0;
|
|
597
604
|
int shift = 0;
|
|
598
|
-
for (
|
|
605
|
+
for (size_t m = 0; m < rq.M; m++) {
|
|
599
606
|
l |= (*codes_i++) << shift;
|
|
600
607
|
shift += rq.nbits[m];
|
|
601
608
|
}
|
|
@@ -618,11 +625,11 @@ void ResidualCoarseQuantizer::initialize_from(
|
|
|
618
625
|
**************************************************************************************/
|
|
619
626
|
|
|
620
627
|
LocalSearchCoarseQuantizer::LocalSearchCoarseQuantizer(
|
|
621
|
-
int
|
|
628
|
+
int d_, ///< dimensionality of the input vectors
|
|
622
629
|
size_t M, ///< number of subquantizers
|
|
623
630
|
size_t nbits, ///< number of bit per subvector index
|
|
624
631
|
MetricType metric)
|
|
625
|
-
: AdditiveCoarseQuantizer(
|
|
632
|
+
: AdditiveCoarseQuantizer(d_, &lsq, metric), lsq(d_, M, nbits) {
|
|
626
633
|
FAISS_THROW_IF_NOT(lsq.tot_bits <= 63);
|
|
627
634
|
is_trained = false;
|
|
628
635
|
}
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
#include <memory>
|
|
12
12
|
|
|
13
13
|
#include <faiss/impl/FaissAssert.h>
|
|
14
|
-
#include <faiss/impl/FastScanDistancePostProcessing.h>
|
|
15
14
|
#include <faiss/impl/LocalSearchQuantizer.h>
|
|
16
|
-
#include <faiss/impl/LookupTableScaler.h>
|
|
17
15
|
#include <faiss/impl/ResidualQuantizer.h>
|
|
18
|
-
#include <faiss/impl/
|
|
16
|
+
#include <faiss/impl/fast_scan/FastScanDistancePostProcessing.h>
|
|
17
|
+
#include <faiss/impl/fast_scan/fast_scan.h>
|
|
19
18
|
#include <faiss/utils/quantize_lut.h>
|
|
20
19
|
#include <faiss/utils/utils.h>
|
|
21
20
|
|
|
@@ -26,16 +25,16 @@ inline size_t roundup(size_t a, size_t b) {
|
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan(
|
|
29
|
-
AdditiveQuantizer*
|
|
28
|
+
AdditiveQuantizer* aq_,
|
|
30
29
|
MetricType metric,
|
|
31
|
-
int
|
|
32
|
-
init(
|
|
30
|
+
int bbs_) {
|
|
31
|
+
init(aq_, metric, bbs_);
|
|
33
32
|
}
|
|
34
33
|
|
|
35
34
|
void IndexAdditiveQuantizerFastScan::init(
|
|
36
35
|
AdditiveQuantizer* aq_init,
|
|
37
36
|
MetricType metric,
|
|
38
|
-
int
|
|
37
|
+
int bbs_) {
|
|
39
38
|
FAISS_THROW_IF_NOT(aq_init != nullptr);
|
|
40
39
|
FAISS_THROW_IF_NOT(!aq_init->nbits.empty());
|
|
41
40
|
FAISS_THROW_IF_NOT(aq_init->nbits[0] == 4);
|
|
@@ -57,7 +56,7 @@ void IndexAdditiveQuantizerFastScan::init(
|
|
|
57
56
|
} else {
|
|
58
57
|
M = aq_init->M;
|
|
59
58
|
}
|
|
60
|
-
init_fastscan(aq_init->d, M, 4, metric,
|
|
59
|
+
init_fastscan(static_cast<int>(aq_init->d), M, 4, metric, bbs_);
|
|
61
60
|
|
|
62
61
|
max_train_points = 1024 * ksub * M;
|
|
63
62
|
}
|
|
@@ -70,8 +69,8 @@ IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan()
|
|
|
70
69
|
|
|
71
70
|
IndexAdditiveQuantizerFastScan::IndexAdditiveQuantizerFastScan(
|
|
72
71
|
const IndexAdditiveQuantizer& orig,
|
|
73
|
-
int
|
|
74
|
-
init(orig.aq, orig.metric_type,
|
|
72
|
+
int bbs_) {
|
|
73
|
+
init(orig.aq, orig.metric_type, bbs_);
|
|
75
74
|
|
|
76
75
|
ntotal = orig.ntotal;
|
|
77
76
|
is_trained = orig.is_trained;
|
|
@@ -202,9 +201,8 @@ void IndexAdditiveQuantizerFastScan::search(
|
|
|
202
201
|
return;
|
|
203
202
|
}
|
|
204
203
|
|
|
205
|
-
NormTableScaler scaler(norm_scale);
|
|
206
204
|
FastScanDistancePostProcessing context;
|
|
207
|
-
context.
|
|
205
|
+
context.pq2x4_scale = norm_scale;
|
|
208
206
|
if (metric_type == METRIC_L2) {
|
|
209
207
|
search_dispatch_implem<true>(n, x, k, distances, labels, context);
|
|
210
208
|
} else {
|
|
@@ -219,19 +217,23 @@ void IndexAdditiveQuantizerFastScan::sa_decode(
|
|
|
219
217
|
aq->decode(bytes, x, n);
|
|
220
218
|
}
|
|
221
219
|
|
|
220
|
+
size_t IndexAdditiveQuantizerFastScan::fast_scan_code_size() const {
|
|
221
|
+
return M2 / 2;
|
|
222
|
+
}
|
|
223
|
+
|
|
222
224
|
/**************************************************************************************
|
|
223
225
|
* IndexResidualQuantizerFastScan
|
|
224
226
|
**************************************************************************************/
|
|
225
227
|
|
|
226
228
|
IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan(
|
|
227
|
-
int
|
|
228
|
-
size_t
|
|
229
|
-
size_t
|
|
229
|
+
int d_, ///< dimensionality of the input vectors
|
|
230
|
+
size_t M_, ///< number of subquantizers
|
|
231
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
230
232
|
MetricType metric,
|
|
231
233
|
Search_type_t search_type,
|
|
232
|
-
int
|
|
233
|
-
: rq(
|
|
234
|
-
init(&rq, metric,
|
|
234
|
+
int bbs_)
|
|
235
|
+
: rq(d_, M_, nbits_, search_type) {
|
|
236
|
+
init(&rq, metric, bbs_);
|
|
235
237
|
}
|
|
236
238
|
|
|
237
239
|
IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan() {
|
|
@@ -243,14 +245,14 @@ IndexResidualQuantizerFastScan::IndexResidualQuantizerFastScan() {
|
|
|
243
245
|
**************************************************************************************/
|
|
244
246
|
|
|
245
247
|
IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan(
|
|
246
|
-
int
|
|
247
|
-
size_t
|
|
248
|
-
size_t
|
|
248
|
+
int d_,
|
|
249
|
+
size_t M_, ///< number of subquantizers
|
|
250
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
249
251
|
MetricType metric,
|
|
250
252
|
Search_type_t search_type,
|
|
251
|
-
int
|
|
252
|
-
: lsq(
|
|
253
|
-
init(&lsq, metric,
|
|
253
|
+
int bbs_)
|
|
254
|
+
: lsq(d_, M_, nbits_, search_type) {
|
|
255
|
+
init(&lsq, metric, bbs_);
|
|
254
256
|
}
|
|
255
257
|
|
|
256
258
|
IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan() {
|
|
@@ -262,15 +264,15 @@ IndexLocalSearchQuantizerFastScan::IndexLocalSearchQuantizerFastScan() {
|
|
|
262
264
|
**************************************************************************************/
|
|
263
265
|
|
|
264
266
|
IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan(
|
|
265
|
-
int
|
|
267
|
+
int d_, ///< dimensionality of the input vectors
|
|
266
268
|
size_t nsplits, ///< number of residual quantizers
|
|
267
269
|
size_t Msub, ///< number of subquantizers per RQ
|
|
268
|
-
size_t
|
|
270
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
269
271
|
MetricType metric,
|
|
270
272
|
Search_type_t search_type,
|
|
271
|
-
int
|
|
272
|
-
: prq(
|
|
273
|
-
init(&prq, metric,
|
|
273
|
+
int bbs_)
|
|
274
|
+
: prq(d_, nsplits, Msub, nbits_, search_type) {
|
|
275
|
+
init(&prq, metric, bbs_);
|
|
274
276
|
}
|
|
275
277
|
|
|
276
278
|
IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan() {
|
|
@@ -283,15 +285,15 @@ IndexProductResidualQuantizerFastScan::IndexProductResidualQuantizerFastScan() {
|
|
|
283
285
|
|
|
284
286
|
IndexProductLocalSearchQuantizerFastScan::
|
|
285
287
|
IndexProductLocalSearchQuantizerFastScan(
|
|
286
|
-
int
|
|
288
|
+
int d_, ///< dimensionality of the input vectors
|
|
287
289
|
size_t nsplits, ///< number of local search quantizers
|
|
288
290
|
size_t Msub, ///< number of subquantizers per LSQ
|
|
289
|
-
size_t
|
|
291
|
+
size_t nbits_, ///< number of bit per subvector index
|
|
290
292
|
MetricType metric,
|
|
291
293
|
Search_type_t search_type,
|
|
292
|
-
int
|
|
293
|
-
: plsq(
|
|
294
|
-
init(&plsq, metric,
|
|
294
|
+
int bbs_)
|
|
295
|
+
: plsq(d_, nsplits, Msub, nbits_, search_type) {
|
|
296
|
+
init(&plsq, metric, bbs_);
|
|
295
297
|
}
|
|
296
298
|
|
|
297
299
|
IndexProductLocalSearchQuantizerFastScan::
|
|
@@ -28,7 +28,7 @@ namespace faiss {
|
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
30
|
struct IndexAdditiveQuantizerFastScan : IndexFastScan {
|
|
31
|
-
AdditiveQuantizer* aq;
|
|
31
|
+
AdditiveQuantizer* aq = nullptr;
|
|
32
32
|
using Search_type_t = AdditiveQuantizer::Search_type_t;
|
|
33
33
|
|
|
34
34
|
bool rescale_norm = true;
|
|
@@ -86,6 +86,9 @@ struct IndexAdditiveQuantizerFastScan : IndexFastScan {
|
|
|
86
86
|
* @param x output vectors, size n * d
|
|
87
87
|
*/
|
|
88
88
|
void sa_decode(idx_t n, const uint8_t* bytes, float* x) const override;
|
|
89
|
+
|
|
90
|
+
/// Packed code size: M2 / 2 bytes (4-bit AQ sub-quantizer nibbles)
|
|
91
|
+
size_t fast_scan_code_size() const override;
|
|
89
92
|
};
|
|
90
93
|
|
|
91
94
|
/** Index based on a residual quantizer. Stored vectors are
|
|
@@ -12,12 +12,15 @@
|
|
|
12
12
|
|
|
13
13
|
#include <cinttypes>
|
|
14
14
|
#include <cstring>
|
|
15
|
+
#include <typeinfo>
|
|
15
16
|
|
|
16
17
|
namespace faiss {
|
|
17
18
|
|
|
18
|
-
IndexBinary::IndexBinary(idx_t
|
|
19
|
-
: d(
|
|
20
|
-
|
|
19
|
+
IndexBinary::IndexBinary(idx_t d_, MetricType metric)
|
|
20
|
+
: d(static_cast<int>(d_)),
|
|
21
|
+
code_size(static_cast<int>(d_ / 8)),
|
|
22
|
+
metric_type(metric) {
|
|
23
|
+
FAISS_THROW_IF_NOT(d_ % 8 == 0);
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
IndexBinary::~IndexBinary() = default;
|
|
@@ -58,7 +58,7 @@ struct IndexBinary {
|
|
|
58
58
|
} else {
|
|
59
59
|
FAISS_THROW_MSG("IndexBinary::train: unsupported numeric type");
|
|
60
60
|
}
|
|
61
|
-
}
|
|
61
|
+
}
|
|
62
62
|
|
|
63
63
|
/** Add n vectors of dimension d to the index.
|
|
64
64
|
*
|
|
@@ -72,7 +72,7 @@ struct IndexBinary {
|
|
|
72
72
|
} else {
|
|
73
73
|
FAISS_THROW_MSG("IndexBinary::add: unsupported numeric type");
|
|
74
74
|
}
|
|
75
|
-
}
|
|
75
|
+
}
|
|
76
76
|
|
|
77
77
|
/** Same as add, but stores xids instead of sequential ids.
|
|
78
78
|
*
|
|
@@ -93,7 +93,7 @@ struct IndexBinary {
|
|
|
93
93
|
FAISS_THROW_MSG(
|
|
94
94
|
"IndexBinary::add_with_ids: unsupported numeric type");
|
|
95
95
|
}
|
|
96
|
-
}
|
|
96
|
+
}
|
|
97
97
|
|
|
98
98
|
/** Query n vectors of dimension d to the index.
|
|
99
99
|
*
|
|
@@ -129,7 +129,7 @@ struct IndexBinary {
|
|
|
129
129
|
} else {
|
|
130
130
|
FAISS_THROW_MSG("IndexBinary::search: unsupported numeric type");
|
|
131
131
|
}
|
|
132
|
-
}
|
|
132
|
+
}
|
|
133
133
|
|
|
134
134
|
/** Query n vectors of dimension d to the index.
|
|
135
135
|
*
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
namespace faiss {
|
|
20
20
|
|
|
21
|
-
IndexBinaryFlat::IndexBinaryFlat(idx_t
|
|
21
|
+
IndexBinaryFlat::IndexBinaryFlat(idx_t d_) : IndexBinary(d_) {}
|
|
22
22
|
|
|
23
23
|
void IndexBinaryFlat::add(idx_t n, const uint8_t* x) {
|
|
24
24
|
xb.insert(xb.end(), x, x + n * code_size);
|
|
@@ -18,10 +18,10 @@ namespace faiss {
|
|
|
18
18
|
|
|
19
19
|
IndexBinaryFromFloat::IndexBinaryFromFloat() = default;
|
|
20
20
|
|
|
21
|
-
IndexBinaryFromFloat::IndexBinaryFromFloat(Index*
|
|
22
|
-
: IndexBinary(
|
|
23
|
-
is_trained =
|
|
24
|
-
ntotal =
|
|
21
|
+
IndexBinaryFromFloat::IndexBinaryFromFloat(Index* index_)
|
|
22
|
+
: IndexBinary(index_->d), index(index_), own_fields(false) {
|
|
23
|
+
is_trained = index_->is_trained;
|
|
24
|
+
ntotal = index_->ntotal;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
IndexBinaryFromFloat::~IndexBinaryFromFloat() {
|