faiss 0.6.0 → 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 +4 -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 +84 -92
- 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 +87 -415
- 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 +283 -145
- 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 +465 -362
- data/vendor/faiss/faiss/IndexIVF.h +33 -12
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- 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 +36 -68
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +53 -30
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +71 -843
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +21 -17
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +26 -39
- 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 +39 -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 +82 -14
- 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/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/factory_tools.cpp +5 -0
- 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 +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 +92 -317
- data/vendor/faiss/faiss/impl/HNSW.h +13 -34
- 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 +38 -21
- 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 +258 -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 +30 -23
- 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 +296 -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 +99 -75
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +52 -4
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -1
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.h +7 -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 +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 +268 -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 +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 +1132 -45
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
- data/vendor/faiss/faiss/impl/index_write.cpp +95 -13
- 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 +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 +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/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 +29 -111
- 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 +238 -5
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +5 -7
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -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 +3 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +102 -11
- 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 +148 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +167 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +59 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +163 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -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 +100 -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 +86 -18
- data/vendor/faiss/faiss/index_io.h +24 -0
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
- 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 +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 +25 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +18 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +12 -3
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +7 -2
- 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/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 -177
- 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 +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 +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 +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 +17 -5
- 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 +119 -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
|
@@ -0,0 +1,244 @@
|
|
|
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
|
+
#include <faiss/impl/ClusteringHelpers.h>
|
|
9
|
+
|
|
10
|
+
#include <cassert>
|
|
11
|
+
#include <chrono>
|
|
12
|
+
#include <cinttypes>
|
|
13
|
+
#include <cstdint>
|
|
14
|
+
#include <cstdio>
|
|
15
|
+
#include <cstring>
|
|
16
|
+
#include <limits>
|
|
17
|
+
#include <vector>
|
|
18
|
+
|
|
19
|
+
#include <omp.h>
|
|
20
|
+
|
|
21
|
+
#include <faiss/Index.h>
|
|
22
|
+
#include <faiss/impl/FaissAssert.h>
|
|
23
|
+
#include <faiss/utils/random.h>
|
|
24
|
+
|
|
25
|
+
namespace faiss {
|
|
26
|
+
namespace detail {
|
|
27
|
+
|
|
28
|
+
uint64_t get_actual_rng_seed(const int seed) {
|
|
29
|
+
return (seed >= 0)
|
|
30
|
+
? seed
|
|
31
|
+
: static_cast<uint64_t>(std::chrono::high_resolution_clock::now()
|
|
32
|
+
.time_since_epoch()
|
|
33
|
+
.count());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
idx_t subsample_training_set(
|
|
37
|
+
const Clustering& clus,
|
|
38
|
+
idx_t nx,
|
|
39
|
+
const uint8_t* x,
|
|
40
|
+
size_t line_size,
|
|
41
|
+
const float* weights,
|
|
42
|
+
uint8_t** x_out,
|
|
43
|
+
float** weights_out) {
|
|
44
|
+
FAISS_THROW_IF_NOT(clus.k > 0 && clus.max_points_per_centroid > 0);
|
|
45
|
+
if (clus.verbose) {
|
|
46
|
+
printf("Sampling a subset of %zd / %" PRId64 " for training\n",
|
|
47
|
+
clus.k * clus.max_points_per_centroid,
|
|
48
|
+
nx);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const uint64_t actual_seed = get_actual_rng_seed(clus.seed);
|
|
52
|
+
|
|
53
|
+
std::vector<idx_t> perm;
|
|
54
|
+
if (clus.use_faster_subsampling) {
|
|
55
|
+
SplitMix64RandomGenerator rng(actual_seed);
|
|
56
|
+
|
|
57
|
+
const idx_t new_nx = clus.k * clus.max_points_per_centroid;
|
|
58
|
+
perm.resize(new_nx);
|
|
59
|
+
assert(!perm.empty());
|
|
60
|
+
for (idx_t i = 0; i < new_nx; i++) {
|
|
61
|
+
perm[i] = rng.rand_int64() % nx;
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
FAISS_THROW_IF_NOT_FMT(
|
|
65
|
+
nx <= static_cast<idx_t>(std::numeric_limits<int>::max()),
|
|
66
|
+
"Dataset too large (%" PRId64
|
|
67
|
+
") for standard subsampling; "
|
|
68
|
+
"set use_faster_subsampling=true",
|
|
69
|
+
nx);
|
|
70
|
+
std::vector<int> int_perm(nx);
|
|
71
|
+
rand_perm(int_perm.data(), nx, actual_seed);
|
|
72
|
+
perm.assign(int_perm.begin(), int_perm.end());
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
nx = clus.k * clus.max_points_per_centroid;
|
|
76
|
+
FAISS_THROW_IF_NOT_FMT(
|
|
77
|
+
perm.size() >= static_cast<size_t>(nx),
|
|
78
|
+
"subsample_training_set: perm size %zu < required nx %" PRId64,
|
|
79
|
+
perm.size(),
|
|
80
|
+
nx);
|
|
81
|
+
assert(!perm.empty());
|
|
82
|
+
|
|
83
|
+
uint8_t* x_new = new uint8_t[nx * line_size];
|
|
84
|
+
*x_out = x_new;
|
|
85
|
+
|
|
86
|
+
for (idx_t i = 0; i < nx; i++) {
|
|
87
|
+
memcpy(x_new + i * line_size, x + perm[i] * line_size, line_size);
|
|
88
|
+
}
|
|
89
|
+
if (weights) {
|
|
90
|
+
float* weights_new = new float[nx];
|
|
91
|
+
for (idx_t i = 0; i < nx; i++) {
|
|
92
|
+
weights_new[i] = weights[perm[i]];
|
|
93
|
+
}
|
|
94
|
+
*weights_out = weights_new;
|
|
95
|
+
} else {
|
|
96
|
+
*weights_out = nullptr;
|
|
97
|
+
}
|
|
98
|
+
return nx;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
void compute_centroids(
|
|
102
|
+
size_t d,
|
|
103
|
+
size_t k,
|
|
104
|
+
size_t n,
|
|
105
|
+
size_t k_frozen,
|
|
106
|
+
const uint8_t* x,
|
|
107
|
+
const Index* codec,
|
|
108
|
+
const int64_t* assign,
|
|
109
|
+
const float* weights,
|
|
110
|
+
float* hassign,
|
|
111
|
+
float* centroids) {
|
|
112
|
+
k -= k_frozen;
|
|
113
|
+
centroids += k_frozen * d;
|
|
114
|
+
|
|
115
|
+
memset(centroids, 0, sizeof(*centroids) * d * k);
|
|
116
|
+
|
|
117
|
+
size_t line_size = codec ? codec->sa_code_size() : d * sizeof(float);
|
|
118
|
+
|
|
119
|
+
#pragma omp parallel
|
|
120
|
+
{
|
|
121
|
+
int nt = omp_get_num_threads();
|
|
122
|
+
int rank = omp_get_thread_num();
|
|
123
|
+
|
|
124
|
+
// this thread is taking care of centroids c0:c1
|
|
125
|
+
size_t c0 = (k * rank) / nt;
|
|
126
|
+
size_t c1 = (k * (rank + 1)) / nt;
|
|
127
|
+
std::vector<float> decode_buffer(d);
|
|
128
|
+
|
|
129
|
+
for (size_t i = 0; i < n; i++) {
|
|
130
|
+
int64_t ci = assign[i];
|
|
131
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
132
|
+
ci >= 0 && ci < k + k_frozen, "invalid cluster assignment");
|
|
133
|
+
ci -= k_frozen;
|
|
134
|
+
if (ci >= static_cast<int64_t>(c0) &&
|
|
135
|
+
ci < static_cast<int64_t>(c1)) {
|
|
136
|
+
float* c = centroids + ci * d;
|
|
137
|
+
const float* xi;
|
|
138
|
+
if (!codec) {
|
|
139
|
+
xi = reinterpret_cast<const float*>(x + i * line_size);
|
|
140
|
+
} else {
|
|
141
|
+
float* xif = decode_buffer.data();
|
|
142
|
+
codec->sa_decode(1, x + i * line_size, xif);
|
|
143
|
+
xi = xif;
|
|
144
|
+
}
|
|
145
|
+
if (weights) {
|
|
146
|
+
float w = weights[i];
|
|
147
|
+
hassign[ci] += w;
|
|
148
|
+
for (size_t j = 0; j < d; j++) {
|
|
149
|
+
c[j] += xi[j] * w;
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
hassign[ci] += 1.0;
|
|
153
|
+
for (size_t j = 0; j < d; j++) {
|
|
154
|
+
c[j] += xi[j];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
#pragma omp parallel for
|
|
162
|
+
for (idx_t ci = 0; ci < static_cast<idx_t>(k); ci++) {
|
|
163
|
+
if (hassign[ci] == 0) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
float norm = 1 / hassign[ci];
|
|
167
|
+
float* c = centroids + ci * d;
|
|
168
|
+
for (size_t j = 0; j < d; j++) {
|
|
169
|
+
c[j] *= norm;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// a bit above machine epsilon for float16
|
|
175
|
+
static constexpr float EPS = 1.f / 1024.f;
|
|
176
|
+
|
|
177
|
+
int split_clusters(
|
|
178
|
+
size_t d,
|
|
179
|
+
size_t k,
|
|
180
|
+
size_t n,
|
|
181
|
+
size_t k_frozen,
|
|
182
|
+
float* hassign,
|
|
183
|
+
float* centroids) {
|
|
184
|
+
k -= k_frozen;
|
|
185
|
+
centroids += k_frozen * d;
|
|
186
|
+
FAISS_THROW_IF_NOT_MSG(
|
|
187
|
+
n > k,
|
|
188
|
+
"split_clusters: n must exceed k to find a non-empty donor centroid");
|
|
189
|
+
|
|
190
|
+
size_t nsplit = 0;
|
|
191
|
+
RandomGenerator rng(1234);
|
|
192
|
+
for (size_t ci = 0; ci < k; ci++) {
|
|
193
|
+
if (hassign[ci] == 0) {
|
|
194
|
+
// Probabilistic donor pick weighted by hassign; deterministic
|
|
195
|
+
// fallback to the largest cluster if too many iterations pass.
|
|
196
|
+
size_t cj;
|
|
197
|
+
size_t max_tries = 10 * k;
|
|
198
|
+
size_t n_tries = 0;
|
|
199
|
+
bool found = false;
|
|
200
|
+
for (cj = 0; n_tries < max_tries; cj = (cj + 1) % k) {
|
|
201
|
+
float p = (hassign[cj] - 1.0) / (float)(n - k);
|
|
202
|
+
float r = rng.rand_float();
|
|
203
|
+
if (r < p) {
|
|
204
|
+
found = true;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
n_tries++;
|
|
208
|
+
}
|
|
209
|
+
if (!found) {
|
|
210
|
+
// Deterministic fallback: split the largest cluster.
|
|
211
|
+
cj = 0;
|
|
212
|
+
for (size_t j = 1; j < k; j++) {
|
|
213
|
+
if (hassign[j] > hassign[cj]) {
|
|
214
|
+
cj = j;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
memcpy(centroids + ci * d,
|
|
219
|
+
centroids + cj * d,
|
|
220
|
+
sizeof(*centroids) * d);
|
|
221
|
+
|
|
222
|
+
/* small symmetric perturbation */
|
|
223
|
+
for (size_t j = 0; j < d; j++) {
|
|
224
|
+
if (j % 2 == 0) {
|
|
225
|
+
centroids[ci * d + j] *= 1 + EPS;
|
|
226
|
+
centroids[cj * d + j] *= 1 - EPS;
|
|
227
|
+
} else {
|
|
228
|
+
centroids[ci * d + j] *= 1 - EPS;
|
|
229
|
+
centroids[cj * d + j] *= 1 + EPS;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* assume even split of the cluster */
|
|
234
|
+
hassign[ci] = hassign[cj] / 2;
|
|
235
|
+
hassign[cj] -= hassign[ci];
|
|
236
|
+
nsplit++;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return static_cast<int>(nsplit);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
} // namespace detail
|
|
244
|
+
} // namespace faiss
|
|
@@ -0,0 +1,94 @@
|
|
|
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 <cstddef>
|
|
11
|
+
#include <cstdint>
|
|
12
|
+
|
|
13
|
+
#include <faiss/Clustering.h>
|
|
14
|
+
#include <faiss/Index.h>
|
|
15
|
+
|
|
16
|
+
namespace faiss {
|
|
17
|
+
namespace detail {
|
|
18
|
+
|
|
19
|
+
/** Resolve the actual RNG seed for clustering helpers.
|
|
20
|
+
*
|
|
21
|
+
* If `seed >= 0`, returns `seed`. Otherwise returns a high-resolution
|
|
22
|
+
* timestamp so that callers get a non-deterministic seed.
|
|
23
|
+
*
|
|
24
|
+
* @param seed user-provided seed; negative values request a time-based seed
|
|
25
|
+
* @return the resolved seed
|
|
26
|
+
*/
|
|
27
|
+
uint64_t get_actual_rng_seed(const int seed);
|
|
28
|
+
|
|
29
|
+
/** Subsample a training set down to `clus.k * clus.max_points_per_centroid`
|
|
30
|
+
* rows.
|
|
31
|
+
*
|
|
32
|
+
* Allocates `*x_out` (and `*weights_out` when `weights` is non-null) with
|
|
33
|
+
* `new[]`; ownership is transferred to the caller.
|
|
34
|
+
*
|
|
35
|
+
* @param clus clustering parameters (reads `k`,
|
|
36
|
+
* `max_points_per_centroid`, `use_faster_subsampling`, `seed`, `verbose`)
|
|
37
|
+
* @param nx number of input training rows
|
|
38
|
+
* @param x input training data, row-major, `nx * line_size` bytes
|
|
39
|
+
* @param line_size bytes per training row
|
|
40
|
+
* @param weights optional per-row weights (length `nx`), or null
|
|
41
|
+
* @param x_out output: newly allocated subsampled rows
|
|
42
|
+
* @param weights_out output: newly allocated subsampled weights, or null
|
|
43
|
+
* @return number of rows in the subsampled set
|
|
44
|
+
*/
|
|
45
|
+
idx_t subsample_training_set(
|
|
46
|
+
const Clustering& clus,
|
|
47
|
+
idx_t nx,
|
|
48
|
+
const uint8_t* x,
|
|
49
|
+
size_t line_size,
|
|
50
|
+
const float* weights,
|
|
51
|
+
uint8_t** x_out,
|
|
52
|
+
float** weights_out);
|
|
53
|
+
|
|
54
|
+
/** compute centroids as (weighted) sum of training points
|
|
55
|
+
*
|
|
56
|
+
* @param x training vectors, size n * code_size (from codec)
|
|
57
|
+
* @param codec how to decode the vectors (if NULL then cast to float*)
|
|
58
|
+
* @param weights per-training vector weight, size n (or NULL)
|
|
59
|
+
* @param assign nearest centroid for each training vector, size n
|
|
60
|
+
* @param k_frozen do not update the k_frozen first centroids
|
|
61
|
+
* @param centroids centroid vectors (output only), size k * d
|
|
62
|
+
* @param hassign histogram of assignments per centroid (size k),
|
|
63
|
+
* should be 0 on input
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
void compute_centroids(
|
|
67
|
+
size_t d,
|
|
68
|
+
size_t k,
|
|
69
|
+
size_t n,
|
|
70
|
+
size_t k_frozen,
|
|
71
|
+
const uint8_t* x,
|
|
72
|
+
const Index* codec,
|
|
73
|
+
const int64_t* assign,
|
|
74
|
+
const float* weights,
|
|
75
|
+
float* hassign,
|
|
76
|
+
float* centroids);
|
|
77
|
+
|
|
78
|
+
/** Handle empty clusters by splitting larger ones.
|
|
79
|
+
*
|
|
80
|
+
* It works by slightly changing the centroids to make 2 clusters from
|
|
81
|
+
* a single one. Takes the same arguments as compute_centroids.
|
|
82
|
+
*
|
|
83
|
+
* @return nb of splitting operations (larger is worse)
|
|
84
|
+
*/
|
|
85
|
+
int split_clusters(
|
|
86
|
+
size_t d,
|
|
87
|
+
size_t k,
|
|
88
|
+
size_t n,
|
|
89
|
+
size_t k_frozen,
|
|
90
|
+
float* hassign,
|
|
91
|
+
float* centroids);
|
|
92
|
+
|
|
93
|
+
} // namespace detail
|
|
94
|
+
} // namespace faiss
|
|
@@ -142,8 +142,8 @@ size_t sample_from_cumsum(
|
|
|
142
142
|
|
|
143
143
|
} // namespace
|
|
144
144
|
|
|
145
|
-
ClusteringInitialization::ClusteringInitialization(size_t
|
|
146
|
-
: d(
|
|
145
|
+
ClusteringInitialization::ClusteringInitialization(size_t d_in, size_t k_in)
|
|
146
|
+
: d(d_in), k(k_in) {}
|
|
147
147
|
|
|
148
148
|
void ClusteringInitialization::init_centroids(
|
|
149
149
|
size_t n,
|
|
@@ -221,27 +221,27 @@ void ClusteringInitialization::init_kmeans_plus_plus(
|
|
|
221
221
|
std::vector<double> cumsum(n);
|
|
222
222
|
|
|
223
223
|
// Select remaining centroids using D² sampling
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
224
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
225
|
+
for (size_t c = result.first_new_centroid_idx; c < k; c++) {
|
|
226
|
+
// Compute cumulative sum
|
|
227
|
+
cumsum[0] = min_distances[0];
|
|
228
|
+
for (size_t i = 1; i < n; i++) {
|
|
229
|
+
cumsum[i] = cumsum[i - 1] + min_distances[i];
|
|
230
|
+
}
|
|
230
231
|
|
|
231
|
-
|
|
232
|
-
|
|
232
|
+
// Sample using precomputed cumsum
|
|
233
|
+
size_t next_idx = sample_from_cumsum(cumsum, rng);
|
|
233
234
|
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
float* new_centroid = centroids + c * d;
|
|
236
|
+
std::memcpy(new_centroid, x + next_idx * d, d * sizeof(float));
|
|
236
237
|
|
|
237
|
-
|
|
238
|
-
with_simd_level([&]<SIMDLevel SL>() {
|
|
238
|
+
// Update min distances incrementally
|
|
239
239
|
for (size_t i = 0; i < n; i++) {
|
|
240
240
|
double dist = fvec_L2sqr<SL>(x + i * d, new_centroid, d);
|
|
241
241
|
min_distances[i] = std::min(min_distances[i], dist);
|
|
242
242
|
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
245
|
}
|
|
246
246
|
|
|
247
247
|
void ClusteringInitialization::init_afkmc2(
|
|
@@ -33,10 +33,10 @@ void CodePacker::unpack_all(const uint8_t* block, uint8_t* flat_codes) const {
|
|
|
33
33
|
* CodePackerFlat
|
|
34
34
|
*/
|
|
35
35
|
|
|
36
|
-
CodePackerFlat::CodePackerFlat(size_t
|
|
37
|
-
this->code_size =
|
|
36
|
+
CodePackerFlat::CodePackerFlat(size_t code_size_in) {
|
|
37
|
+
this->code_size = code_size_in;
|
|
38
38
|
nvec = 1;
|
|
39
|
-
block_size =
|
|
39
|
+
block_size = code_size_in;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
void CodePackerFlat::pack_all(const uint8_t* flat_codes, uint8_t* block) const {
|
|
@@ -66,8 +66,8 @@ struct NegativeDistanceComputer : DistanceComputer {
|
|
|
66
66
|
/// owned by this
|
|
67
67
|
DistanceComputer* basedis;
|
|
68
68
|
|
|
69
|
-
explicit NegativeDistanceComputer(DistanceComputer*
|
|
70
|
-
: basedis(
|
|
69
|
+
explicit NegativeDistanceComputer(DistanceComputer* basedis_)
|
|
70
|
+
: basedis(basedis_) {}
|
|
71
71
|
|
|
72
72
|
void set_query(const float* x) override {
|
|
73
73
|
basedis->set_query(x);
|
|
@@ -116,13 +116,13 @@ struct FlatCodesDistanceComputer : DistanceComputer {
|
|
|
116
116
|
const float* q = nullptr; // not used in all distance computers
|
|
117
117
|
|
|
118
118
|
FlatCodesDistanceComputer(
|
|
119
|
-
const uint8_t*
|
|
120
|
-
size_t
|
|
121
|
-
const float*
|
|
122
|
-
: codes(
|
|
119
|
+
const uint8_t* codes_,
|
|
120
|
+
size_t code_size_,
|
|
121
|
+
const float* q_ = nullptr)
|
|
122
|
+
: codes(codes_), code_size(code_size_), q(q_) {}
|
|
123
123
|
|
|
124
|
-
explicit FlatCodesDistanceComputer(const float*
|
|
125
|
-
: codes(nullptr), code_size(0), q(
|
|
124
|
+
explicit FlatCodesDistanceComputer(const float* q_)
|
|
125
|
+
: codes(nullptr), code_size(0), q(q_) {}
|
|
126
126
|
|
|
127
127
|
FlatCodesDistanceComputer() : codes(nullptr), code_size(0), q(nullptr) {}
|
|
128
128
|
|
|
@@ -78,9 +78,12 @@
|
|
|
78
78
|
do { \
|
|
79
79
|
std::string __s; \
|
|
80
80
|
int __size = snprintf(nullptr, 0, FMT, __VA_ARGS__); \
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
if (__size > 0) { \
|
|
82
|
+
__s.resize(static_cast<size_t>(__size) + 1); \
|
|
83
|
+
snprintf(&__s[0], __s.size(), FMT, __VA_ARGS__); \
|
|
84
|
+
__s.resize(static_cast<size_t>(__size)); \
|
|
85
|
+
} \
|
|
86
|
+
throw faiss::FaissException( \
|
|
84
87
|
__s, __PRETTY_FUNCTION__, __FILE__, __LINE__); \
|
|
85
88
|
} while (false)
|
|
86
89
|
|
|
@@ -46,9 +46,8 @@ void handleExceptions(
|
|
|
46
46
|
struct TransformedVectors {
|
|
47
47
|
const float* x;
|
|
48
48
|
bool own_x;
|
|
49
|
-
TransformedVectors(const float* x_orig, const float*
|
|
50
|
-
|
|
51
|
-
}
|
|
49
|
+
TransformedVectors(const float* x_orig, const float* x_in)
|
|
50
|
+
: x(x_in), own_x(x_orig != x_in) {}
|
|
52
51
|
|
|
53
52
|
~TransformedVectors() {
|
|
54
53
|
if (own_x) {
|
|
@@ -60,6 +59,54 @@ struct TransformedVectors {
|
|
|
60
59
|
/// make typeids more readable
|
|
61
60
|
std::string demangle_cpp_symbol(const char* name);
|
|
62
61
|
|
|
62
|
+
/// Capture the current exception into `ex` if no prior exception has been
|
|
63
|
+
/// recorded. Call from a catch block inside an OpenMP parallel region.
|
|
64
|
+
/// Uses `#pragma omp critical` to serialize access to `ex`.
|
|
65
|
+
///
|
|
66
|
+
/// The optional `cleanup` callable runs inside the critical section
|
|
67
|
+
/// alongside the exception capture, so that side-effects visible to
|
|
68
|
+
/// other threads (e.g. setting an interrupt flag) are serialized with
|
|
69
|
+
/// the exception_ptr write.
|
|
70
|
+
///
|
|
71
|
+
/// Usage:
|
|
72
|
+
/// std::exception_ptr ex;
|
|
73
|
+
/// bool interrupt = false;
|
|
74
|
+
/// #pragma omp parallel
|
|
75
|
+
/// {
|
|
76
|
+
/// try { ... } catch (...) {
|
|
77
|
+
/// omp_capture_exception(ex, [&] { interrupt = true; });
|
|
78
|
+
/// }
|
|
79
|
+
/// }
|
|
80
|
+
/// omp_rethrow_if_exception(ex);
|
|
81
|
+
inline void omp_capture_exception(std::exception_ptr& ex) {
|
|
82
|
+
#pragma omp critical(faiss_omp_exception)
|
|
83
|
+
{
|
|
84
|
+
if (!ex) {
|
|
85
|
+
ex = std::current_exception();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// Overload with cleanup that runs inside the critical section.
|
|
91
|
+
template <typename Cleanup>
|
|
92
|
+
inline void omp_capture_exception(std::exception_ptr& ex, Cleanup&& cleanup) {
|
|
93
|
+
#pragma omp critical(faiss_omp_exception)
|
|
94
|
+
{
|
|
95
|
+
cleanup();
|
|
96
|
+
if (!ex) {
|
|
97
|
+
ex = std::current_exception();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Rethrow the captured exception, if any. Call on the main thread
|
|
103
|
+
/// after the parallel region completes.
|
|
104
|
+
inline void omp_rethrow_if_exception(std::exception_ptr& ex) {
|
|
105
|
+
if (ex) {
|
|
106
|
+
std::rethrow_exception(ex);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
63
110
|
} // namespace faiss
|
|
64
111
|
|
|
65
112
|
#endif
|