faiss 0.6.0 → 0.6.2
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 +8 -0
- data/ext/faiss/extconf.rb +2 -1
- data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
- data/ext/faiss/index_binary.cpp +1 -1
- data/ext/faiss/kmeans.cpp +1 -1
- data/ext/faiss/pca_matrix.cpp +1 -1
- data/ext/faiss/product_quantizer.cpp +1 -1
- data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +93 -80
- data/vendor/faiss/faiss/Clustering.cpp +39 -240
- data/vendor/faiss/faiss/Clustering.h +6 -0
- data/vendor/faiss/faiss/IVFlib.cpp +41 -21
- data/vendor/faiss/faiss/Index.cpp +6 -5
- data/vendor/faiss/faiss/Index.h +5 -5
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +5 -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 +88 -97
- 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 +89 -417
- data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
- data/vendor/faiss/faiss/IndexFastScan.h +25 -23
- data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
- data/vendor/faiss/faiss/IndexFlat.h +21 -18
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
- data/vendor/faiss/faiss/IndexHNSW.cpp +374 -206
- data/vendor/faiss/faiss/IndexHNSW.h +16 -2
- data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +467 -364
- data/vendor/faiss/faiss/IndexIVF.h +33 -12
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +79 -76
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
- data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +39 -69
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +56 -33
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +73 -846
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -20
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +30 -52
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
- data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
- data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +38 -23
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
- data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
- 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 +11 -36
- data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
- 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 +150 -20
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
- data/vendor/faiss/faiss/IndexShards.cpp +10 -9
- 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 +14 -7
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
- data/vendor/faiss/faiss/VectorTransform.h +16 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +48 -47
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
- 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/Level2-neon-inl.h +902 -12
- 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/sa_decode/PQ-neon-inl.h +702 -10
- data/vendor/faiss/faiss/factory_tools.cpp +9 -0
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +15 -16
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +5 -4
- 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/MetalDistance.h +87 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +58 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +181 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +111 -0
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -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/gpu_metal/impl/MetalIVFFlat.h +193 -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 +29 -25
- 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 -0
- 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 +16 -16
- data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +639 -507
- data/vendor/faiss/faiss/impl/HNSW.h +61 -44
- 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 +82 -77
- data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +53 -32
- data/vendor/faiss/faiss/impl/NSG.h +4 -4
- data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
- data/vendor/faiss/faiss/impl/Panorama.h +269 -87
- 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 +46 -32
- 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 +55 -25
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +302 -283
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +100 -75
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +318 -7
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +77 -1
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +10 -10
- data/vendor/faiss/faiss/impl/VisitedTable.h +70 -28
- 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 +8 -3
- 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 +270 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
- 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 -356
- 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} +282 -134
- 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 +83 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +113 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +150 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +142 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1227 -79
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
- data/vendor/faiss/faiss/impl/index_write.cpp +96 -13
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +58 -16
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
- data/vendor/faiss/faiss/impl/platform_macros.h +15 -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 +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +45 -107
- 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 +274 -5
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +10 -7
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +70 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +9 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +419 -19
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +387 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +559 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +341 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +425 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +290 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +337 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +157 -66
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
- 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 +270 -218
- 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 +90 -18
- data/vendor/faiss/faiss/index_io.h +40 -0
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +28 -15
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +170 -86
- data/vendor/faiss/faiss/invlists/InvertedLists.h +88 -25
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- 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 +142 -21
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +33 -7
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +77 -27
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +10 -4
- data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
- 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/bf16.h +34 -0
- data/vendor/faiss/faiss/utils/distances.cpp +390 -560
- data/vendor/faiss/faiss/utils/distances.h +20 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
- 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 +5 -178
- data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
- data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
- 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 +16 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.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 +210 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -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 -989
- 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 +2 -2
- 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 +57 -536
- 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 +5 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
- 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 +2 -1
- 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 +1031 -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_avx512_spr.cpp +343 -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 +29 -7
- data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +5 -5
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +129 -34
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
- 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 -235
- 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 -449
- 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 -365
- /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
|
@@ -44,8 +44,9 @@ IndexSVSVamanaLeanVec::IndexSVSVamanaLeanVec(
|
|
|
44
44
|
size_t degree,
|
|
45
45
|
MetricType metric,
|
|
46
46
|
size_t leanvec_dims,
|
|
47
|
-
SVSStorageKind storage_kind
|
|
48
|
-
|
|
47
|
+
SVSStorageKind storage_kind,
|
|
48
|
+
bool is_static)
|
|
49
|
+
: IndexSVSVamana(d, degree, metric, storage_kind, is_static) {
|
|
49
50
|
is_trained = false;
|
|
50
51
|
leanvec_d = leanvec_dims == 0 ? d / 2 : leanvec_dims;
|
|
51
52
|
}
|
|
@@ -56,7 +57,7 @@ IndexSVSVamanaLeanVec::~IndexSVSVamanaLeanVec() {
|
|
|
56
57
|
FAISS_ASSERT(status.ok());
|
|
57
58
|
training_data = nullptr;
|
|
58
59
|
}
|
|
59
|
-
|
|
60
|
+
// Base class destructor handles impl cleanup
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
void IndexSVSVamanaLeanVec::add(idx_t n, const float* x) {
|
|
@@ -66,10 +67,10 @@ void IndexSVSVamanaLeanVec::add(idx_t n, const float* x) {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
void IndexSVSVamanaLeanVec::train(idx_t n, const float* x) {
|
|
69
|
-
|
|
70
|
+
train_with_queries(n, x, 0, nullptr);
|
|
70
71
|
}
|
|
71
72
|
|
|
72
|
-
void IndexSVSVamanaLeanVec::
|
|
73
|
+
void IndexSVSVamanaLeanVec::train_with_queries(
|
|
73
74
|
idx_t n,
|
|
74
75
|
const float* x,
|
|
75
76
|
idx_t n_train_q,
|
|
@@ -91,6 +92,15 @@ void IndexSVSVamanaLeanVec::train(
|
|
|
91
92
|
is_trained = true;
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
void IndexSVSVamanaLeanVec::reset() {
|
|
96
|
+
if (training_data) {
|
|
97
|
+
auto status = svs_runtime::LeanVecTrainingData::destroy(training_data);
|
|
98
|
+
FAISS_ASSERT(status.ok());
|
|
99
|
+
training_data = nullptr;
|
|
100
|
+
}
|
|
101
|
+
IndexSVSVamana::reset();
|
|
102
|
+
}
|
|
103
|
+
|
|
94
104
|
void IndexSVSVamanaLeanVec::serialize_training_data(std::ostream& out) const {
|
|
95
105
|
FAISS_THROW_IF_NOT_MSG(
|
|
96
106
|
training_data, "Cannot serialize: Training data not initialized.");
|
|
@@ -111,7 +121,8 @@ void IndexSVSVamanaLeanVec::deserialize_training_data(std::istream& in) {
|
|
|
111
121
|
training_data = tdata;
|
|
112
122
|
}
|
|
113
123
|
|
|
114
|
-
void IndexSVSVamanaLeanVec::create_impl() {
|
|
124
|
+
void IndexSVSVamanaLeanVec::create_impl(idx_t n, const float* x) {
|
|
125
|
+
FAISS_THROW_IF_NOT(!impl);
|
|
115
126
|
ntotal = 0;
|
|
116
127
|
auto svs_metric = to_svs_metric(metric_type);
|
|
117
128
|
auto svs_storage_kind = to_svs_storage_kind(storage_kind);
|
|
@@ -127,29 +138,68 @@ void IndexSVSVamanaLeanVec::create_impl() {
|
|
|
127
138
|
.search_window_size = search_window_size,
|
|
128
139
|
.search_buffer_capacity = search_buffer_capacity,
|
|
129
140
|
};
|
|
141
|
+
|
|
130
142
|
auto status = svs_runtime::Status_Ok;
|
|
131
|
-
if (
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
143
|
+
if (is_static) {
|
|
144
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
145
|
+
n > 0 && x != nullptr,
|
|
146
|
+
"Static Vamana LeanVec index requires data at build time.");
|
|
147
|
+
if (training_data) {
|
|
148
|
+
status = svs_runtime::VamanaIndexLeanVec::build(
|
|
149
|
+
&impl,
|
|
150
|
+
d,
|
|
151
|
+
svs_metric,
|
|
152
|
+
svs_storage_kind,
|
|
153
|
+
training_data,
|
|
154
|
+
build_params,
|
|
155
|
+
search_params);
|
|
156
|
+
} else {
|
|
157
|
+
status = svs_runtime::VamanaIndexLeanVec::build(
|
|
158
|
+
&impl,
|
|
159
|
+
d,
|
|
160
|
+
svs_metric,
|
|
161
|
+
svs_storage_kind,
|
|
162
|
+
leanvec_d,
|
|
163
|
+
build_params,
|
|
164
|
+
search_params);
|
|
165
|
+
}
|
|
166
|
+
if (!status.ok()) {
|
|
167
|
+
FAISS_THROW_MSG(status.message());
|
|
168
|
+
}
|
|
169
|
+
FAISS_THROW_IF_NOT(impl);
|
|
170
|
+
// Populate the static index with the full dataset (one-shot add).
|
|
171
|
+
status = impl->add(static_cast<size_t>(n), x);
|
|
172
|
+
if (!status.ok()) {
|
|
173
|
+
auto destroy_status = svs_runtime::VamanaIndex::destroy(impl);
|
|
174
|
+
FAISS_ASSERT(destroy_status.ok());
|
|
175
|
+
impl = nullptr;
|
|
176
|
+
FAISS_THROW_MSG(status.message());
|
|
177
|
+
}
|
|
140
178
|
} else {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
179
|
+
svs_runtime::DynamicVamanaIndex* dyn_impl = nullptr;
|
|
180
|
+
if (training_data) {
|
|
181
|
+
status = svs_runtime::DynamicVamanaIndexLeanVec::build(
|
|
182
|
+
&dyn_impl,
|
|
183
|
+
d,
|
|
184
|
+
svs_metric,
|
|
185
|
+
svs_storage_kind,
|
|
186
|
+
training_data,
|
|
187
|
+
build_params,
|
|
188
|
+
search_params);
|
|
189
|
+
} else {
|
|
190
|
+
status = svs_runtime::DynamicVamanaIndexLeanVec::build(
|
|
191
|
+
&dyn_impl,
|
|
192
|
+
d,
|
|
193
|
+
svs_metric,
|
|
194
|
+
svs_storage_kind,
|
|
195
|
+
leanvec_d,
|
|
196
|
+
build_params,
|
|
197
|
+
search_params);
|
|
198
|
+
}
|
|
199
|
+
if (!status.ok()) {
|
|
200
|
+
FAISS_THROW_MSG(status.message());
|
|
201
|
+
}
|
|
202
|
+
impl = dyn_impl;
|
|
153
203
|
}
|
|
154
204
|
FAISS_THROW_IF_NOT(impl);
|
|
155
205
|
}
|
|
@@ -35,7 +35,8 @@ struct IndexSVSVamanaLeanVec : IndexSVSVamana {
|
|
|
35
35
|
size_t degree,
|
|
36
36
|
MetricType metric = METRIC_L2,
|
|
37
37
|
size_t leanvec_dims = 0,
|
|
38
|
-
SVSStorageKind storage = SVSStorageKind::SVS_LeanVec4x4
|
|
38
|
+
SVSStorageKind storage = SVSStorageKind::SVS_LeanVec4x4,
|
|
39
|
+
bool is_static = false);
|
|
39
40
|
|
|
40
41
|
~IndexSVSVamanaLeanVec() override;
|
|
41
42
|
|
|
@@ -49,8 +50,13 @@ struct IndexSVSVamanaLeanVec : IndexSVSVamana {
|
|
|
49
50
|
* sampled from different distributions (e.g., cross-modal). More details in
|
|
50
51
|
* the original publication, arXiv:2312.16335.
|
|
51
52
|
*/
|
|
52
|
-
void
|
|
53
|
-
|
|
53
|
+
void train_with_queries(
|
|
54
|
+
idx_t n,
|
|
55
|
+
const float* x,
|
|
56
|
+
idx_t n_train_q,
|
|
57
|
+
const float* xq_train) override;
|
|
58
|
+
|
|
59
|
+
void reset() override;
|
|
54
60
|
|
|
55
61
|
void serialize_training_data(std::ostream& out) const;
|
|
56
62
|
void deserialize_training_data(std::istream& in);
|
|
@@ -61,7 +67,7 @@ struct IndexSVSVamanaLeanVec : IndexSVSVamana {
|
|
|
61
67
|
svs_runtime::LeanVecTrainingData* training_data{nullptr};
|
|
62
68
|
|
|
63
69
|
protected:
|
|
64
|
-
void create_impl() override;
|
|
70
|
+
void create_impl(idx_t n, const float* x) override;
|
|
65
71
|
};
|
|
66
72
|
|
|
67
73
|
} // namespace faiss
|
|
@@ -17,7 +17,7 @@ namespace faiss {
|
|
|
17
17
|
template <typename C>
|
|
18
18
|
void HeapArray<C>::heapify() {
|
|
19
19
|
#pragma omp parallel for
|
|
20
|
-
for (int64_t j = 0; j < nh; j++) {
|
|
20
|
+
for (int64_t j = 0; j < static_cast<int64_t>(nh); j++) {
|
|
21
21
|
heap_heapify<C>(k, val + j * k, ids + j * k);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
@@ -25,7 +25,7 @@ void HeapArray<C>::heapify() {
|
|
|
25
25
|
template <typename C>
|
|
26
26
|
void HeapArray<C>::reorder() {
|
|
27
27
|
#pragma omp parallel for
|
|
28
|
-
for (int64_t j = 0; j < nh; j++) {
|
|
28
|
+
for (int64_t j = 0; j < static_cast<int64_t>(nh); j++) {
|
|
29
29
|
heap_reorder<C>(k, val + j * k, ids + j * k);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -37,7 +37,7 @@ void HeapArray<C>::addn(size_t nj, const T* vin, TI j0, size_t i0, int64_t ni) {
|
|
|
37
37
|
}
|
|
38
38
|
assert(i0 >= 0 && i0 + ni <= nh);
|
|
39
39
|
#pragma omp parallel for if (ni * nj > 100000)
|
|
40
|
-
for (int64_t i = i0; i < i0 + ni; i++) {
|
|
40
|
+
for (int64_t i = i0; i < static_cast<int64_t>(i0) + ni; i++) {
|
|
41
41
|
T* __restrict simi = get_val(i);
|
|
42
42
|
TI* __restrict idxi = get_ids(i);
|
|
43
43
|
const T* ip_line = vin + (i - i0) * nj;
|
|
@@ -68,7 +68,7 @@ void HeapArray<C>::addn_with_ids(
|
|
|
68
68
|
}
|
|
69
69
|
assert(i0 >= 0 && i0 + ni <= nh);
|
|
70
70
|
#pragma omp parallel for if (ni * nj > 100000)
|
|
71
|
-
for (int64_t i = i0; i < i0 + ni; i++) {
|
|
71
|
+
for (int64_t i = i0; i < static_cast<int64_t>(i0) + ni; i++) {
|
|
72
72
|
T* __restrict simi = get_val(i);
|
|
73
73
|
TI* __restrict idxi = get_ids(i);
|
|
74
74
|
const T* ip_line = vin + (i - i0) * nj;
|
|
@@ -96,7 +96,7 @@ void HeapArray<C>::addn_query_subset_with_ids(
|
|
|
96
96
|
id_stride = nj;
|
|
97
97
|
}
|
|
98
98
|
#pragma omp parallel for if (nsubset * nj > 100000)
|
|
99
|
-
for (int64_t si = 0; si < nsubset; si++) {
|
|
99
|
+
for (int64_t si = 0; si < static_cast<int64_t>(nsubset); si++) {
|
|
100
100
|
TI i = subset[si];
|
|
101
101
|
T* __restrict simi = get_val(i);
|
|
102
102
|
TI* __restrict idxi = get_ids(i);
|
|
@@ -115,7 +115,7 @@ void HeapArray<C>::addn_query_subset_with_ids(
|
|
|
115
115
|
template <typename C>
|
|
116
116
|
void HeapArray<C>::per_line_extrema(T* out_val, TI* out_ids) const {
|
|
117
117
|
#pragma omp parallel for if (nh * k > 100000)
|
|
118
|
-
for (int64_t j = 0; j < nh; j++) {
|
|
118
|
+
for (int64_t j = 0; j < static_cast<int64_t>(nh); j++) {
|
|
119
119
|
int64_t imin = -1;
|
|
120
120
|
typename C::T xval = C::Crev::neutral();
|
|
121
121
|
const typename C::T* x_ = val + j * k;
|
|
@@ -187,7 +187,7 @@ void merge_knn_results(
|
|
|
187
187
|
std::vector<distance_t> buf2(nshard);
|
|
188
188
|
distance_t* heap_vals = buf2.data();
|
|
189
189
|
#pragma omp for
|
|
190
|
-
for (long i = 0; i < n; i++) {
|
|
190
|
+
for (long i = 0; i < static_cast<long>(n); i++) {
|
|
191
191
|
// the heap maps values to the shard where they are
|
|
192
192
|
// produced.
|
|
193
193
|
const distance_t* D_in = all_distances + i * k;
|
|
@@ -195,7 +195,7 @@ void merge_knn_results(
|
|
|
195
195
|
int heap_size = 0;
|
|
196
196
|
|
|
197
197
|
// push the first element of each shard (if not -1)
|
|
198
|
-
for (long s = 0; s < nshard; s++) {
|
|
198
|
+
for (long s = 0; s < static_cast<long>(nshard); s++) {
|
|
199
199
|
pointer[s] = 0;
|
|
200
200
|
if (I_in[stride * s] >= 0) {
|
|
201
201
|
heap_push<C>(
|
|
@@ -210,7 +210,7 @@ void merge_knn_results(
|
|
|
210
210
|
distance_t* D = distances + i * k;
|
|
211
211
|
idx_t* I = labels + i * k;
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
size_t j;
|
|
214
214
|
for (j = 0; j < k && heap_size > 0; j++) {
|
|
215
215
|
// pop element from best shard
|
|
216
216
|
int s = shard_ids[0]; // top of heap
|
|
@@ -221,7 +221,7 @@ void merge_knn_results(
|
|
|
221
221
|
// pop from shard, advance pointer for this shard
|
|
222
222
|
heap_pop<C>(heap_size--, heap_vals, shard_ids);
|
|
223
223
|
p++;
|
|
224
|
-
if (p < k && I_in[stride * s + p] >= 0) {
|
|
224
|
+
if (static_cast<size_t>(p) < k && I_in[stride * s + p] >= 0) {
|
|
225
225
|
heap_push<C>(
|
|
226
226
|
++heap_size,
|
|
227
227
|
heap_vals,
|
|
@@ -80,12 +80,12 @@ template struct Tensor2DTemplate<int32_t>;
|
|
|
80
80
|
* Layers implementation
|
|
81
81
|
*************************************************************/
|
|
82
82
|
|
|
83
|
-
Linear::Linear(size_t
|
|
84
|
-
: in_features(
|
|
85
|
-
out_features(
|
|
86
|
-
weight(
|
|
87
|
-
if (
|
|
88
|
-
this->bias.resize(
|
|
83
|
+
Linear::Linear(size_t in_features_in, size_t out_features_in, bool bias_in)
|
|
84
|
+
: in_features(in_features_in),
|
|
85
|
+
out_features(out_features_in),
|
|
86
|
+
weight(in_features_in * out_features_in) {
|
|
87
|
+
if (bias_in) {
|
|
88
|
+
this->bias.resize(out_features_in);
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -123,9 +123,9 @@ Tensor2D Linear::operator()(const Tensor2D& x) const {
|
|
|
123
123
|
return output;
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
Embedding::Embedding(size_t
|
|
127
|
-
: num_embeddings(
|
|
128
|
-
weight.resize(
|
|
126
|
+
Embedding::Embedding(size_t num_embeddings_in, size_t embedding_dim_in)
|
|
127
|
+
: num_embeddings(num_embeddings_in), embedding_dim(embedding_dim_in) {
|
|
128
|
+
weight.resize(num_embeddings_in * embedding_dim_in);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
Tensor2D Embedding::operator()(const Int32Tensor2D& code) const {
|
|
@@ -181,8 +181,13 @@ Tensor2D FFN::operator()(const Tensor2D& x_in) const {
|
|
|
181
181
|
|
|
182
182
|
using namespace nn;
|
|
183
183
|
|
|
184
|
-
QINCoStep::QINCoStep(int
|
|
185
|
-
: d(
|
|
184
|
+
QINCoStep::QINCoStep(int d_in, int K_in, int L_in, int h_in)
|
|
185
|
+
: d(d_in),
|
|
186
|
+
K(K_in),
|
|
187
|
+
L(L_in),
|
|
188
|
+
h(h_in),
|
|
189
|
+
codebook(K_in, d_in),
|
|
190
|
+
MLPconcat(2 * d_in, d_in) {
|
|
186
191
|
for (int i = 0; i < L; i++) {
|
|
187
192
|
residual_blocks.emplace_back(d, h);
|
|
188
193
|
}
|
|
@@ -208,7 +213,8 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
|
208
213
|
nn::Tensor2D* residuals) const {
|
|
209
214
|
size_t n = xhat.shape[0];
|
|
210
215
|
FAISS_THROW_IF_NOT(
|
|
211
|
-
n == x.shape[0] && xhat.shape[1] == d &&
|
|
216
|
+
n == x.shape[0] && xhat.shape[1] == static_cast<size_t>(d) &&
|
|
217
|
+
x.shape[1] == static_cast<size_t>(d));
|
|
212
218
|
|
|
213
219
|
// repeated codebook
|
|
214
220
|
Tensor2D zqs_r(n * K, d); // size n, K, d
|
|
@@ -226,7 +232,7 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
|
226
232
|
|
|
227
233
|
// manual broadcasting
|
|
228
234
|
for (size_t i = 0; i < n; i++) {
|
|
229
|
-
for (size_t j = 0; j < K; j++) {
|
|
235
|
+
for (size_t j = 0; j < static_cast<size_t>(K); j++) {
|
|
230
236
|
copy_row(zqs_r, i * K + j, 0, codebook.data() + j * d);
|
|
231
237
|
copy_row(cc, i * K + j, 0, codebook.data() + j * d);
|
|
232
238
|
copy_row(cc, i * K + j, d, xhat.data() + i * d);
|
|
@@ -244,8 +250,8 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
|
244
250
|
for (size_t i = 0; i < n; i++) {
|
|
245
251
|
float* zqs_r_row = zqs_r.data() + i * K * d;
|
|
246
252
|
const float* xhat_row = xhat.data() + i * d;
|
|
247
|
-
for (size_t l = 0; l < K; l++) {
|
|
248
|
-
for (size_t j = 0; j < d; j++) {
|
|
253
|
+
for (size_t l = 0; l < static_cast<size_t>(K); l++) {
|
|
254
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
249
255
|
zqs_r_row[j] += xhat_row[j];
|
|
250
256
|
}
|
|
251
257
|
zqs_r_row += d;
|
|
@@ -257,17 +263,18 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
|
257
263
|
float* res = nullptr;
|
|
258
264
|
if (residuals) {
|
|
259
265
|
FAISS_THROW_IF_NOT(
|
|
260
|
-
residuals->shape[0] == n &&
|
|
266
|
+
residuals->shape[0] == n &&
|
|
267
|
+
residuals->shape[1] == static_cast<size_t>(d));
|
|
261
268
|
res = residuals->data();
|
|
262
269
|
}
|
|
263
270
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
for (size_t j = 0; j < K; j++) {
|
|
271
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
272
|
+
for (size_t i = 0; i < n; i++) {
|
|
273
|
+
const float* q = x.data() + i * d;
|
|
274
|
+
const float* db = zqs_r.data() + i * K * d;
|
|
275
|
+
float dis_min = HUGE_VALF;
|
|
276
|
+
int64_t idx = -1;
|
|
277
|
+
for (size_t j = 0; j < static_cast<size_t>(K); j++) {
|
|
271
278
|
float dis = fvec_L2sqr<SL>(q, db, d);
|
|
272
279
|
if (dis < dis_min) {
|
|
273
280
|
dis_min = dis;
|
|
@@ -275,17 +282,17 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
|
275
282
|
}
|
|
276
283
|
db += d;
|
|
277
284
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
+
codes.v[i] = idx;
|
|
286
|
+
if (res) {
|
|
287
|
+
const float* xhat_row = xhat.data() + i * d;
|
|
288
|
+
const float* xhat_next_row = zqs_r.data() + (i * K + idx) * d;
|
|
289
|
+
for (size_t j = 0; j < static_cast<size_t>(d); j++) {
|
|
290
|
+
res[j] = xhat_next_row[j] - xhat_row[j];
|
|
291
|
+
}
|
|
292
|
+
res += d;
|
|
285
293
|
}
|
|
286
|
-
res += d;
|
|
287
294
|
}
|
|
288
|
-
}
|
|
295
|
+
});
|
|
289
296
|
return codes;
|
|
290
297
|
}
|
|
291
298
|
|
|
@@ -293,15 +300,19 @@ nn::Int32Tensor2D QINCoStep::encode(
|
|
|
293
300
|
* QINCo implementation
|
|
294
301
|
*************************************************************/
|
|
295
302
|
|
|
296
|
-
QINCo::QINCo(int
|
|
297
|
-
: NeuralNetCodec(
|
|
303
|
+
QINCo::QINCo(int d_in, int K_in, int L_in, int M_in, int h_in)
|
|
304
|
+
: NeuralNetCodec(d_in, M_in),
|
|
305
|
+
K(K_in),
|
|
306
|
+
L(L_in),
|
|
307
|
+
h(h_in),
|
|
308
|
+
codebook0(K_in, d_in) {
|
|
298
309
|
for (int i = 1; i < M; i++) {
|
|
299
310
|
steps.emplace_back(d, K, L, h);
|
|
300
311
|
}
|
|
301
312
|
}
|
|
302
313
|
|
|
303
314
|
nn::Tensor2D QINCo::decode(const nn::Int32Tensor2D& codes) const {
|
|
304
|
-
FAISS_THROW_IF_NOT(codes.shape[1] == M);
|
|
315
|
+
FAISS_THROW_IF_NOT(codes.shape[1] == static_cast<size_t>(M));
|
|
305
316
|
Tensor2D xhat = codebook0(codes.column(0));
|
|
306
317
|
for (int i = 1; i < M; i++) {
|
|
307
318
|
xhat += steps[i - 1].decode(xhat, codes.column(i));
|
|
@@ -310,7 +321,7 @@ nn::Tensor2D QINCo::decode(const nn::Int32Tensor2D& codes) const {
|
|
|
310
321
|
}
|
|
311
322
|
|
|
312
323
|
nn::Int32Tensor2D QINCo::encode(const nn::Tensor2D& x) const {
|
|
313
|
-
FAISS_THROW_IF_NOT(x.shape[1] == d);
|
|
324
|
+
FAISS_THROW_IF_NOT(x.shape[1] == static_cast<size_t>(d));
|
|
314
325
|
size_t n = x.shape[0];
|
|
315
326
|
Int32Tensor2D codes(n, M);
|
|
316
327
|
Tensor2D xhat(n, d);
|
|
@@ -118,7 +118,7 @@ struct QINCoStep {
|
|
|
118
118
|
struct NeuralNetCodec {
|
|
119
119
|
int d, M;
|
|
120
120
|
|
|
121
|
-
NeuralNetCodec(int
|
|
121
|
+
NeuralNetCodec(int d_in, int M_in) : d(d_in), M(M_in) {}
|
|
122
122
|
|
|
123
123
|
virtual nn::Tensor2D decode(const nn::Int32Tensor2D& codes) const = 0;
|
|
124
124
|
virtual nn::Int32Tensor2D encode(const nn::Tensor2D& x) const = 0;
|
|
@@ -11,12 +11,17 @@
|
|
|
11
11
|
#include <limits>
|
|
12
12
|
#include <utility>
|
|
13
13
|
|
|
14
|
+
#include <faiss/impl/simdlib/simdlib_dispatch.h>
|
|
14
15
|
#include <faiss/utils/Heap.h>
|
|
15
|
-
#include <faiss/utils/simdlib.h>
|
|
16
16
|
|
|
17
17
|
namespace faiss {
|
|
18
18
|
|
|
19
|
-
//
|
|
19
|
+
// Explicit SIMD-level aliases for this file (no global bare aliases).
|
|
20
|
+
using simd8uint32 = simd8uint32_tpl<SINGLE_SIMD_LEVEL_256>;
|
|
21
|
+
using simd16uint16 = simd16uint16_tpl<SINGLE_SIMD_LEVEL_256>;
|
|
22
|
+
|
|
23
|
+
// HeapWithBucketsForHamming32 uses simd8uint32 under the
|
|
24
|
+
// hood.
|
|
20
25
|
|
|
21
26
|
template <typename C, uint32_t NBUCKETS, uint32_t N, typename HammingComputerT>
|
|
22
27
|
struct HeapWithBucketsForHamming32 {
|
|
@@ -197,8 +202,9 @@ struct HeapWithBucketsForHamming32<
|
|
|
197
202
|
}
|
|
198
203
|
};
|
|
199
204
|
|
|
200
|
-
// HeapWithBucketsForHamming16 uses simd16uint16 under
|
|
201
|
-
// Less registers needed in total, so higher values of NBUCKETS/N can
|
|
205
|
+
// HeapWithBucketsForHamming16 uses simd16uint16 under
|
|
206
|
+
// the hood. Less registers needed in total, so higher values of NBUCKETS/N can
|
|
207
|
+
// be used,
|
|
202
208
|
// but somewhat slower.
|
|
203
209
|
// No more than 32K elements currently, but it can be reorganized a bit
|
|
204
210
|
// to be limited to 32K elements per beam.
|
|
@@ -7,8 +7,13 @@
|
|
|
7
7
|
|
|
8
8
|
#pragma once
|
|
9
9
|
|
|
10
|
+
#include <cstddef>
|
|
10
11
|
#include <cstdint>
|
|
11
12
|
|
|
13
|
+
#if defined(__AVX512F__) || defined(__AVX512BF16__)
|
|
14
|
+
#include <immintrin.h>
|
|
15
|
+
#endif
|
|
16
|
+
|
|
12
17
|
namespace faiss {
|
|
13
18
|
|
|
14
19
|
namespace {
|
|
@@ -33,4 +38,33 @@ inline float decode_bf16(const uint16_t v) {
|
|
|
33
38
|
return fp.as_f32;
|
|
34
39
|
}
|
|
35
40
|
|
|
41
|
+
inline void encode_bf16_simd(const float* src, uint16_t* dst, size_t n) {
|
|
42
|
+
size_t i = 0;
|
|
43
|
+
#ifdef __AVX512BF16__
|
|
44
|
+
for (; i + 16 <= n; i += 16) {
|
|
45
|
+
__m512 v = _mm512_loadu_ps(src + i);
|
|
46
|
+
__m256bh encoded = _mm512_cvtneps_pbh(v);
|
|
47
|
+
_mm256_storeu_epi16(dst + i, (__m256i)encoded);
|
|
48
|
+
}
|
|
49
|
+
#endif
|
|
50
|
+
for (; i < n; i++) {
|
|
51
|
+
dst[i] = encode_bf16(src[i]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
inline void decode_bf16_simd(const uint16_t* src, float* dst, size_t n) {
|
|
56
|
+
size_t i = 0;
|
|
57
|
+
#if defined(__AVX512F__)
|
|
58
|
+
for (; i + 16 <= n; i += 16) {
|
|
59
|
+
__m256i v = _mm256_loadu_si256((const __m256i*)(src + i));
|
|
60
|
+
__m512i w = _mm512_cvtepu16_epi32(v);
|
|
61
|
+
w = _mm512_slli_epi32(w, 16);
|
|
62
|
+
_mm512_storeu_ps(dst + i, _mm512_castsi512_ps(w));
|
|
63
|
+
}
|
|
64
|
+
#endif
|
|
65
|
+
for (; i < n; i++) {
|
|
66
|
+
dst[i] = decode_bf16(src[i]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
36
70
|
} // namespace faiss
|