faiss 0.5.3 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/ext/faiss/ext.cpp +1 -1
- data/ext/faiss/extconf.rb +4 -4
- data/ext/faiss/index.cpp +63 -45
- data/ext/faiss/index_binary.cpp +37 -27
- data/ext/faiss/kmeans.cpp +9 -8
- data/ext/faiss/pca_matrix.cpp +9 -7
- data/ext/faiss/product_quantizer.cpp +13 -11
- data/ext/faiss/utils.cpp +4 -2
- data/ext/faiss/utils.h +4 -0
- data/lib/faiss/version.rb +1 -1
- data/lib/faiss.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +214 -82
- data/vendor/faiss/faiss/AutoTune.h +14 -1
- data/vendor/faiss/faiss/Clustering.cpp +97 -249
- data/vendor/faiss/faiss/Clustering.h +18 -0
- data/vendor/faiss/faiss/IVFlib.cpp +67 -44
- data/vendor/faiss/faiss/Index.cpp +25 -12
- data/vendor/faiss/faiss/Index.h +26 -4
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
- data/vendor/faiss/faiss/IndexBinary.h +4 -4
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
- data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
- data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
- data/vendor/faiss/faiss/IndexFastScan.h +35 -24
- data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
- data/vendor/faiss/faiss/IndexFlat.h +32 -14
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
- data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
- data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
- data/vendor/faiss/faiss/IndexHNSW.h +30 -14
- data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
- data/vendor/faiss/faiss/IndexIVF.h +47 -16
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
- data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
- data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
- data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
- data/vendor/faiss/faiss/IndexNSG.h +0 -2
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
- data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
- data/vendor/faiss/faiss/IndexPQ.h +3 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
- data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
- data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
- data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
- data/vendor/faiss/faiss/IndexRefine.h +4 -4
- data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
- data/vendor/faiss/faiss/IndexShards.cpp +13 -13
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
- data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
- data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
- data/vendor/faiss/faiss/MetaIndexes.h +1 -1
- data/vendor/faiss/faiss/MetricType.h +29 -6
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
- data/vendor/faiss/faiss/VectorTransform.h +39 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +55 -51
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
- data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
- data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
- data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
- data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
- data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
- data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
- data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
- data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
- data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
- data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
- data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
- data/vendor/faiss/faiss/impl/HNSW.h +21 -40
- data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
- data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
- data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
- data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
- data/vendor/faiss/faiss/impl/NSG.h +20 -10
- data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
- data/vendor/faiss/faiss/impl/Panorama.h +265 -78
- data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
- data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
- data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
- data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
- data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
- data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
- data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
- data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
- data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
- data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
- data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
- data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
- data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
- data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
- data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
- data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +33 -16
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
- data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
- data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
- data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
- data/vendor/faiss/faiss/impl/svs_io.h +8 -2
- data/vendor/faiss/faiss/index_factory.cpp +115 -28
- data/vendor/faiss/faiss/index_io.h +53 -3
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
- data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
- data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
- data/vendor/faiss/faiss/utils/Heap.h +21 -0
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
- data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
- data/vendor/faiss/faiss/utils/distances.cpp +507 -559
- data/vendor/faiss/faiss/utils/distances.h +118 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
- data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
- data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
- data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
- data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
- data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
- data/vendor/faiss/faiss/utils/hamming.h +92 -2
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
- data/vendor/faiss/faiss/utils/partitioning.h +31 -0
- data/vendor/faiss/faiss/utils/popcount.h +29 -0
- data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
- data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
- data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
- data/vendor/faiss/faiss/utils/random.cpp +6 -6
- data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
- data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
- data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
- data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
- data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +21 -14
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +156 -42
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
- data/vendor/faiss/faiss/utils/simdlib.h +0 -42
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
- /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <faiss/impl/ScalarQuantizer.h>
|
|
11
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
12
|
+
#include <faiss/utils/simd_levels.h>
|
|
13
|
+
|
|
14
|
+
namespace faiss {
|
|
15
|
+
|
|
16
|
+
namespace scalar_quantizer {
|
|
17
|
+
|
|
18
|
+
/*******************************************************************
|
|
19
|
+
* Codec: converts between values in [0, 1] and an index in a code
|
|
20
|
+
* array. The "i" parameter is the vector component index (not byte
|
|
21
|
+
* index).
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
template <SIMDLevel SL>
|
|
25
|
+
struct Codec8bit {};
|
|
26
|
+
|
|
27
|
+
template <>
|
|
28
|
+
struct Codec8bit<SIMDLevel::NONE> {
|
|
29
|
+
static FAISS_ALWAYS_INLINE void encode_component(
|
|
30
|
+
float x,
|
|
31
|
+
uint8_t* code,
|
|
32
|
+
size_t i) {
|
|
33
|
+
code[i] = (int)(255 * x);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static FAISS_ALWAYS_INLINE float decode_component(
|
|
37
|
+
const uint8_t* code,
|
|
38
|
+
size_t i) {
|
|
39
|
+
return (code[i] + 0.5f) / 255.0f;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
template <SIMDLevel SL>
|
|
44
|
+
struct Codec4bit {};
|
|
45
|
+
|
|
46
|
+
template <>
|
|
47
|
+
struct Codec4bit<SIMDLevel::NONE> {
|
|
48
|
+
static FAISS_ALWAYS_INLINE void encode_component(
|
|
49
|
+
float x,
|
|
50
|
+
uint8_t* code,
|
|
51
|
+
size_t i) {
|
|
52
|
+
code[i / 2] |= (int)(x * 15.0) << ((i & 1) << 2);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static FAISS_ALWAYS_INLINE float decode_component(
|
|
56
|
+
const uint8_t* code,
|
|
57
|
+
size_t i) {
|
|
58
|
+
return (((code[i / 2] >> ((i & 1) << 2)) & 0xf) + 0.5f) / 15.0f;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
template <SIMDLevel SL>
|
|
63
|
+
struct Codec6bit {};
|
|
64
|
+
|
|
65
|
+
template <>
|
|
66
|
+
struct Codec6bit<SIMDLevel::NONE> {
|
|
67
|
+
static FAISS_ALWAYS_INLINE void encode_component(
|
|
68
|
+
float x,
|
|
69
|
+
uint8_t* code,
|
|
70
|
+
size_t i) {
|
|
71
|
+
int bits = (int)(x * 63.0);
|
|
72
|
+
code += (i >> 2) * 3;
|
|
73
|
+
switch (i & 3) {
|
|
74
|
+
case 0:
|
|
75
|
+
code[0] |= bits;
|
|
76
|
+
break;
|
|
77
|
+
case 1:
|
|
78
|
+
code[0] |= bits << 6;
|
|
79
|
+
code[1] |= bits >> 2;
|
|
80
|
+
break;
|
|
81
|
+
case 2:
|
|
82
|
+
code[1] |= bits << 4;
|
|
83
|
+
code[2] |= bits >> 4;
|
|
84
|
+
break;
|
|
85
|
+
case 3:
|
|
86
|
+
code[2] |= bits << 2;
|
|
87
|
+
break;
|
|
88
|
+
default:
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static FAISS_ALWAYS_INLINE float decode_component(
|
|
94
|
+
const uint8_t* code,
|
|
95
|
+
size_t i) {
|
|
96
|
+
uint8_t bits = 0;
|
|
97
|
+
code += (i >> 2) * 3;
|
|
98
|
+
switch (i & 3) {
|
|
99
|
+
case 0:
|
|
100
|
+
bits = code[0] & 0x3f;
|
|
101
|
+
break;
|
|
102
|
+
case 1:
|
|
103
|
+
bits = code[0] >> 6;
|
|
104
|
+
bits |= (code[1] & 0xf) << 2;
|
|
105
|
+
break;
|
|
106
|
+
case 2:
|
|
107
|
+
bits = code[1] >> 4;
|
|
108
|
+
bits |= (code[2] & 3) << 4;
|
|
109
|
+
break;
|
|
110
|
+
case 3:
|
|
111
|
+
bits = code[2] >> 2;
|
|
112
|
+
break;
|
|
113
|
+
default:
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
return (bits + 0.5f) / 63.0f;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
} // namespace scalar_quantizer
|
|
121
|
+
} // namespace faiss
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <faiss/impl/ScalarQuantizer.h>
|
|
11
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
12
|
+
#include <faiss/utils/simd_levels.h>
|
|
13
|
+
|
|
14
|
+
namespace faiss {
|
|
15
|
+
|
|
16
|
+
namespace scalar_quantizer {
|
|
17
|
+
|
|
18
|
+
using SQDistanceComputer = ScalarQuantizer::SQDistanceComputer;
|
|
19
|
+
|
|
20
|
+
/*******************************************************************
|
|
21
|
+
* DistanceComputer: combines a similarity and a quantizer to do
|
|
22
|
+
* code-to-vector or code-to-code comparisons
|
|
23
|
+
*******************************************************************/
|
|
24
|
+
|
|
25
|
+
template <class Quantizer, class Similarity, SIMDLevel SL>
|
|
26
|
+
struct DCTemplate : SQDistanceComputer {};
|
|
27
|
+
|
|
28
|
+
template <class Quantizer, class Similarity>
|
|
29
|
+
struct DCTemplate<Quantizer, Similarity, SIMDLevel::NONE> : SQDistanceComputer {
|
|
30
|
+
using Sim = Similarity;
|
|
31
|
+
|
|
32
|
+
Quantizer quant;
|
|
33
|
+
|
|
34
|
+
DCTemplate(size_t d, const std::vector<float>& trained)
|
|
35
|
+
: quant(d, trained) {}
|
|
36
|
+
|
|
37
|
+
float compute_distance(const float* x, const uint8_t* code) const {
|
|
38
|
+
Similarity sim(x);
|
|
39
|
+
sim.begin();
|
|
40
|
+
for (size_t i = 0; i < quant.d; i++) {
|
|
41
|
+
float xi = quant.reconstruct_component(code, i);
|
|
42
|
+
sim.add_component(xi);
|
|
43
|
+
}
|
|
44
|
+
return sim.result();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
float compute_code_distance(const uint8_t* code1, const uint8_t* code2)
|
|
48
|
+
const {
|
|
49
|
+
Similarity sim(nullptr);
|
|
50
|
+
sim.begin();
|
|
51
|
+
for (size_t i = 0; i < quant.d; i++) {
|
|
52
|
+
float x1 = quant.reconstruct_component(code1, i);
|
|
53
|
+
float x2 = quant.reconstruct_component(code2, i);
|
|
54
|
+
sim.add_component_2(x1, x2);
|
|
55
|
+
}
|
|
56
|
+
return sim.result();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void set_query(const float* x) final {
|
|
60
|
+
q = x;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
float symmetric_dis(idx_t i, idx_t j) override {
|
|
64
|
+
return compute_code_distance(
|
|
65
|
+
codes + i * code_size, codes + j * code_size);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
float query_to_code(const uint8_t* code) const final {
|
|
69
|
+
return compute_distance(q, code);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/*******************************************************************
|
|
74
|
+
* DistanceComputerByte: computes distances in the integer domain
|
|
75
|
+
*******************************************************************/
|
|
76
|
+
|
|
77
|
+
template <class Similarity, SIMDLevel SL>
|
|
78
|
+
struct DistanceComputerByte : SQDistanceComputer {};
|
|
79
|
+
|
|
80
|
+
template <class Similarity>
|
|
81
|
+
struct DistanceComputerByte<Similarity, SIMDLevel::NONE> : SQDistanceComputer {
|
|
82
|
+
using Sim = Similarity;
|
|
83
|
+
|
|
84
|
+
int d;
|
|
85
|
+
std::vector<uint8_t> tmp;
|
|
86
|
+
|
|
87
|
+
DistanceComputerByte(int d_in, const std::vector<float>&)
|
|
88
|
+
: d(d_in), tmp(d_in) {}
|
|
89
|
+
|
|
90
|
+
int compute_code_distance(const uint8_t* code1, const uint8_t* code2)
|
|
91
|
+
const {
|
|
92
|
+
int accu = 0;
|
|
93
|
+
for (int i = 0; i < d; i++) {
|
|
94
|
+
if (Sim::metric_type == METRIC_INNER_PRODUCT) {
|
|
95
|
+
accu += int(code1[i]) * code2[i];
|
|
96
|
+
} else {
|
|
97
|
+
int diff = int(code1[i]) - code2[i];
|
|
98
|
+
accu += diff * diff;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return accu;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
void set_query(const float* x) final {
|
|
105
|
+
for (int i = 0; i < d; i++) {
|
|
106
|
+
tmp[i] = int(x[i]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
int compute_distance(const float* x, const uint8_t* code) {
|
|
111
|
+
set_query(x);
|
|
112
|
+
return compute_code_distance(tmp.data(), code);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
float symmetric_dis(idx_t i, idx_t j) override {
|
|
116
|
+
return compute_code_distance(
|
|
117
|
+
codes + i * code_size, codes + j * code_size);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
float query_to_code(const uint8_t* code) const final {
|
|
121
|
+
return compute_code_distance(tmp.data(), code);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/*******************************************************************
|
|
126
|
+
* Selection function
|
|
127
|
+
*******************************************************************/
|
|
128
|
+
|
|
129
|
+
template <SIMDLevel SL>
|
|
130
|
+
SQDistanceComputer* sq_select_distance_computer(
|
|
131
|
+
MetricType metric,
|
|
132
|
+
ScalarQuantizer::QuantizerType qtype,
|
|
133
|
+
size_t d,
|
|
134
|
+
const std::vector<float>& trained);
|
|
135
|
+
|
|
136
|
+
} // namespace scalar_quantizer
|
|
137
|
+
} // namespace faiss
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <algorithm>
|
|
11
|
+
|
|
12
|
+
#include <faiss/impl/FaissAssert.h>
|
|
13
|
+
#include <faiss/impl/ScalarQuantizer.h>
|
|
14
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
15
|
+
#include <faiss/utils/bf16.h>
|
|
16
|
+
#include <faiss/utils/fp16.h>
|
|
17
|
+
#include <faiss/utils/simd_levels.h>
|
|
18
|
+
|
|
19
|
+
namespace faiss {
|
|
20
|
+
|
|
21
|
+
namespace scalar_quantizer {
|
|
22
|
+
|
|
23
|
+
using QuantizerType = ScalarQuantizer::QuantizerType;
|
|
24
|
+
|
|
25
|
+
/*******************************************************************
|
|
26
|
+
* Quantizer: normalizes scalar vector components, then passes them
|
|
27
|
+
* through a codec
|
|
28
|
+
*******************************************************************/
|
|
29
|
+
|
|
30
|
+
enum class QuantizerTemplateScaling { UNIFORM = 0, NON_UNIFORM = 1 };
|
|
31
|
+
|
|
32
|
+
template <class Codec, QuantizerTemplateScaling SCALING, SIMDLevel SL>
|
|
33
|
+
struct QuantizerTemplate {};
|
|
34
|
+
|
|
35
|
+
template <class Codec>
|
|
36
|
+
struct QuantizerTemplate<
|
|
37
|
+
Codec,
|
|
38
|
+
QuantizerTemplateScaling::UNIFORM,
|
|
39
|
+
SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
|
|
40
|
+
const size_t d;
|
|
41
|
+
const float vmin, vdiff;
|
|
42
|
+
|
|
43
|
+
QuantizerTemplate(size_t d_in, const std::vector<float>& trained)
|
|
44
|
+
: d(d_in), vmin(trained[0]), vdiff(trained[1]) {}
|
|
45
|
+
|
|
46
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
47
|
+
for (size_t i = 0; i < d; i++) {
|
|
48
|
+
float xi = 0;
|
|
49
|
+
if (vdiff != 0) {
|
|
50
|
+
xi = (x[i] - vmin) / vdiff;
|
|
51
|
+
if (xi < 0) {
|
|
52
|
+
xi = 0;
|
|
53
|
+
}
|
|
54
|
+
if (xi > 1.0) {
|
|
55
|
+
xi = 1.0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
Codec::encode_component(xi, code, i);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
63
|
+
for (size_t i = 0; i < d; i++) {
|
|
64
|
+
float xi = Codec::decode_component(code, i);
|
|
65
|
+
x[i] = vmin + xi * vdiff;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
70
|
+
const uint8_t* code,
|
|
71
|
+
size_t i) const {
|
|
72
|
+
float xi = Codec::decode_component(code, i);
|
|
73
|
+
return vmin + xi * vdiff;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
template <class Codec>
|
|
78
|
+
struct QuantizerTemplate<
|
|
79
|
+
Codec,
|
|
80
|
+
QuantizerTemplateScaling::NON_UNIFORM,
|
|
81
|
+
SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
|
|
82
|
+
const size_t d;
|
|
83
|
+
const float *vmin, *vdiff;
|
|
84
|
+
|
|
85
|
+
QuantizerTemplate(size_t d_in, const std::vector<float>& trained)
|
|
86
|
+
: d(d_in), vmin(trained.data()), vdiff(trained.data() + d_in) {}
|
|
87
|
+
|
|
88
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
89
|
+
for (size_t i = 0; i < d; i++) {
|
|
90
|
+
float xi = 0;
|
|
91
|
+
if (vdiff[i] != 0) {
|
|
92
|
+
xi = (x[i] - vmin[i]) / vdiff[i];
|
|
93
|
+
if (xi < 0) {
|
|
94
|
+
xi = 0;
|
|
95
|
+
}
|
|
96
|
+
if (xi > 1.0) {
|
|
97
|
+
xi = 1.0;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
Codec::encode_component(xi, code, i);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
105
|
+
for (size_t i = 0; i < d; i++) {
|
|
106
|
+
float xi = Codec::decode_component(code, i);
|
|
107
|
+
x[i] = vmin[i] + xi * vdiff[i];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
112
|
+
const uint8_t* code,
|
|
113
|
+
size_t i) const {
|
|
114
|
+
float xi = Codec::decode_component(code, i);
|
|
115
|
+
return vmin[i] + xi * vdiff[i];
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/*******************************************************************
|
|
120
|
+
* TurboQuant MSE quantizer
|
|
121
|
+
*******************************************************************/
|
|
122
|
+
template <int NBits, SIMDLevel SL>
|
|
123
|
+
struct QuantizerTurboQuantMSE;
|
|
124
|
+
|
|
125
|
+
template <int NBits>
|
|
126
|
+
struct QuantizerTurboQuantMSE<NBits, SIMDLevel::NONE>
|
|
127
|
+
: ScalarQuantizer::SQuantizer {
|
|
128
|
+
static_assert(NBits >= 1 && NBits <= 8);
|
|
129
|
+
|
|
130
|
+
static constexpr size_t kCentroidsCount = size_t(1) << NBits;
|
|
131
|
+
static constexpr uint16_t kIndexMask =
|
|
132
|
+
static_cast<uint16_t>((1u << NBits) - 1);
|
|
133
|
+
|
|
134
|
+
const size_t d;
|
|
135
|
+
const float* centroids;
|
|
136
|
+
const float* boundaries;
|
|
137
|
+
|
|
138
|
+
QuantizerTurboQuantMSE(size_t d_in, const std::vector<float>& trained)
|
|
139
|
+
: d(d_in), centroids(nullptr), boundaries(nullptr) {
|
|
140
|
+
FAISS_THROW_IF_NOT(trained.size() == 2 * kCentroidsCount - 1);
|
|
141
|
+
centroids = trained.data();
|
|
142
|
+
boundaries = trained.data() + kCentroidsCount;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
FAISS_ALWAYS_INLINE uint8_t select_index(float x) const {
|
|
146
|
+
return static_cast<uint8_t>(
|
|
147
|
+
std::upper_bound(
|
|
148
|
+
boundaries, boundaries + (kCentroidsCount - 1), x) -
|
|
149
|
+
boundaries);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
FAISS_ALWAYS_INLINE void encode_index(uint8_t idx, uint8_t* code, size_t i)
|
|
153
|
+
const {
|
|
154
|
+
const size_t bit_offset = i * NBits;
|
|
155
|
+
const size_t byte_offset = bit_offset >> 3;
|
|
156
|
+
const size_t bit_shift = bit_offset & 7;
|
|
157
|
+
const uint16_t packed = static_cast<uint16_t>(idx & kIndexMask)
|
|
158
|
+
<< bit_shift;
|
|
159
|
+
code[byte_offset] |= packed & 0xff;
|
|
160
|
+
if (bit_shift + NBits > 8) {
|
|
161
|
+
code[byte_offset + 1] |= packed >> 8;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
FAISS_ALWAYS_INLINE uint8_t
|
|
166
|
+
decode_index(const uint8_t* code, size_t i) const {
|
|
167
|
+
const size_t bit_offset = i * NBits;
|
|
168
|
+
const size_t byte_offset = bit_offset >> 3;
|
|
169
|
+
const size_t bit_shift = bit_offset & 7;
|
|
170
|
+
|
|
171
|
+
uint16_t packed = code[byte_offset];
|
|
172
|
+
if (bit_shift + NBits > 8) {
|
|
173
|
+
packed |= static_cast<uint16_t>(code[byte_offset + 1]) << 8;
|
|
174
|
+
}
|
|
175
|
+
return static_cast<uint8_t>((packed >> bit_shift) & kIndexMask);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
179
|
+
for (size_t i = 0; i < d; i++) {
|
|
180
|
+
encode_index(select_index(x[i]), code, i);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
185
|
+
for (size_t i = 0; i < d; i++) {
|
|
186
|
+
x[i] = centroids[decode_index(code, i)];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
191
|
+
const uint8_t* code,
|
|
192
|
+
size_t i) const {
|
|
193
|
+
return centroids[decode_index(code, i)];
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
template <int NBits, SIMDLevel SL>
|
|
198
|
+
struct QuantizerTurboQuantMSE : QuantizerTurboQuantMSE<NBits, SIMDLevel::NONE> {
|
|
199
|
+
using QuantizerTurboQuantMSE<NBits, SIMDLevel::NONE>::
|
|
200
|
+
QuantizerTurboQuantMSE;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/*******************************************************************
|
|
204
|
+
* FP16 quantizer
|
|
205
|
+
*******************************************************************/
|
|
206
|
+
|
|
207
|
+
template <SIMDLevel SL>
|
|
208
|
+
struct QuantizerFP16;
|
|
209
|
+
|
|
210
|
+
template <>
|
|
211
|
+
struct QuantizerFP16<SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
|
|
212
|
+
const size_t d;
|
|
213
|
+
|
|
214
|
+
QuantizerFP16(size_t d_in, const std::vector<float>& /* unused */)
|
|
215
|
+
: d(d_in) {}
|
|
216
|
+
|
|
217
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
218
|
+
for (size_t i = 0; i < d; i++) {
|
|
219
|
+
((uint16_t*)code)[i] = encode_fp16(x[i]);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
224
|
+
for (size_t i = 0; i < d; i++) {
|
|
225
|
+
x[i] = decode_fp16(((uint16_t*)code)[i]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
230
|
+
const uint8_t* code,
|
|
231
|
+
size_t i) const {
|
|
232
|
+
return decode_fp16(((uint16_t*)code)[i]);
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
template <SIMDLevel SL>
|
|
237
|
+
struct QuantizerFP16 : QuantizerFP16<SIMDLevel::NONE> {
|
|
238
|
+
using QuantizerFP16<SIMDLevel::NONE>::QuantizerFP16;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
/*******************************************************************
|
|
242
|
+
* BF16 quantizer
|
|
243
|
+
*******************************************************************/
|
|
244
|
+
|
|
245
|
+
template <SIMDLevel SL>
|
|
246
|
+
struct QuantizerBF16;
|
|
247
|
+
|
|
248
|
+
template <>
|
|
249
|
+
struct QuantizerBF16<SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
|
|
250
|
+
const size_t d;
|
|
251
|
+
|
|
252
|
+
QuantizerBF16(size_t d_in, const std::vector<float>& /* unused */)
|
|
253
|
+
: d(d_in) {}
|
|
254
|
+
|
|
255
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
256
|
+
for (size_t i = 0; i < d; i++) {
|
|
257
|
+
((uint16_t*)code)[i] = encode_bf16(x[i]);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
262
|
+
for (size_t i = 0; i < d; i++) {
|
|
263
|
+
x[i] = decode_bf16(((uint16_t*)code)[i]);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
268
|
+
const uint8_t* code,
|
|
269
|
+
size_t i) const {
|
|
270
|
+
return decode_bf16(((uint16_t*)code)[i]);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
template <SIMDLevel SL>
|
|
275
|
+
struct QuantizerBF16 : QuantizerBF16<SIMDLevel::NONE> {
|
|
276
|
+
using QuantizerBF16<SIMDLevel::NONE>::QuantizerBF16;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
/*******************************************************************
|
|
280
|
+
* 8bit_direct quantizer
|
|
281
|
+
*******************************************************************/
|
|
282
|
+
|
|
283
|
+
template <SIMDLevel SL>
|
|
284
|
+
struct Quantizer8bitDirect;
|
|
285
|
+
|
|
286
|
+
template <>
|
|
287
|
+
struct Quantizer8bitDirect<SIMDLevel::NONE> : ScalarQuantizer::SQuantizer {
|
|
288
|
+
const size_t d;
|
|
289
|
+
|
|
290
|
+
Quantizer8bitDirect(size_t d_in, const std::vector<float>& /* unused */)
|
|
291
|
+
: d(d_in) {}
|
|
292
|
+
|
|
293
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
294
|
+
for (size_t i = 0; i < d; i++) {
|
|
295
|
+
code[i] = (uint8_t)x[i];
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
300
|
+
for (size_t i = 0; i < d; i++) {
|
|
301
|
+
x[i] = code[i];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
306
|
+
const uint8_t* code,
|
|
307
|
+
size_t i) const {
|
|
308
|
+
return code[i];
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
template <SIMDLevel SL>
|
|
313
|
+
struct Quantizer8bitDirect : Quantizer8bitDirect<SIMDLevel::NONE> {
|
|
314
|
+
using Quantizer8bitDirect<SIMDLevel::NONE>::Quantizer8bitDirect;
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
/*******************************************************************
|
|
318
|
+
* 8bit_direct_signed quantizer
|
|
319
|
+
*******************************************************************/
|
|
320
|
+
|
|
321
|
+
template <SIMDLevel SL>
|
|
322
|
+
struct Quantizer8bitDirectSigned;
|
|
323
|
+
|
|
324
|
+
template <>
|
|
325
|
+
struct Quantizer8bitDirectSigned<SIMDLevel::NONE>
|
|
326
|
+
: ScalarQuantizer::SQuantizer {
|
|
327
|
+
const size_t d;
|
|
328
|
+
|
|
329
|
+
Quantizer8bitDirectSigned(
|
|
330
|
+
size_t d_in,
|
|
331
|
+
const std::vector<float>& /* unused */)
|
|
332
|
+
: d(d_in) {}
|
|
333
|
+
|
|
334
|
+
void encode_vector(const float* x, uint8_t* code) const final {
|
|
335
|
+
for (size_t i = 0; i < d; i++) {
|
|
336
|
+
code[i] = (uint8_t)(x[i] + 128);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
void decode_vector(const uint8_t* code, float* x) const final {
|
|
341
|
+
for (size_t i = 0; i < d; i++) {
|
|
342
|
+
x[i] = code[i] - 128;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
FAISS_ALWAYS_INLINE float reconstruct_component(
|
|
347
|
+
const uint8_t* code,
|
|
348
|
+
size_t i) const {
|
|
349
|
+
return code[i] - 128;
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
template <SIMDLevel SL>
|
|
354
|
+
struct Quantizer8bitDirectSigned : Quantizer8bitDirectSigned<SIMDLevel::NONE> {
|
|
355
|
+
using Quantizer8bitDirectSigned<SIMDLevel::NONE>::Quantizer8bitDirectSigned;
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
/*******************************************************************
|
|
359
|
+
* Selection function
|
|
360
|
+
*******************************************************************/
|
|
361
|
+
|
|
362
|
+
// declare for all levels
|
|
363
|
+
template <SIMDLevel SL>
|
|
364
|
+
ScalarQuantizer::SQuantizer* sq_select_quantizer(
|
|
365
|
+
QuantizerType qtype,
|
|
366
|
+
size_t d,
|
|
367
|
+
const std::vector<float>& trained);
|
|
368
|
+
|
|
369
|
+
} // namespace scalar_quantizer
|
|
370
|
+
|
|
371
|
+
} // namespace faiss
|