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
|
@@ -54,11 +54,11 @@ double PermutationObjective::cost_update(const int* perm, int iw, int jw)
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
SimulatedAnnealingOptimizer::SimulatedAnnealingOptimizer(
|
|
57
|
-
PermutationObjective*
|
|
57
|
+
PermutationObjective* obj_in,
|
|
58
58
|
const SimulatedAnnealingParameters& p)
|
|
59
59
|
: SimulatedAnnealingParameters(p),
|
|
60
|
-
obj(
|
|
61
|
-
n(
|
|
60
|
+
obj(obj_in),
|
|
61
|
+
n(obj_in->n),
|
|
62
62
|
logfile(nullptr) {
|
|
63
63
|
rnd = new RandomGenerator(p.seed);
|
|
64
64
|
FAISS_THROW_IF_NOT(n < 100000 && n >= 0);
|
|
@@ -165,7 +165,7 @@ double SimulatedAnnealingOptimizer::optimize(int* perm) {
|
|
|
165
165
|
****************************************************/
|
|
166
166
|
|
|
167
167
|
static inline int hamming_dis(uint64_t a, uint64_t b) {
|
|
168
|
-
return
|
|
168
|
+
return popcount64(a ^ b);
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
namespace {
|
|
@@ -260,10 +260,10 @@ struct ReproduceWithHammingObjective : PermutationObjective {
|
|
|
260
260
|
}
|
|
261
261
|
|
|
262
262
|
ReproduceWithHammingObjective(
|
|
263
|
-
int
|
|
263
|
+
int nbits_in,
|
|
264
264
|
const std::vector<double>& dis_table,
|
|
265
|
-
double
|
|
266
|
-
: nbits(
|
|
265
|
+
double dis_weight_factor_in)
|
|
266
|
+
: nbits(nbits_in), dis_weight_factor(dis_weight_factor_in) {
|
|
267
267
|
n = 1 << nbits;
|
|
268
268
|
FAISS_THROW_IF_NOT(dis_table.size() == n * n);
|
|
269
269
|
set_affine_target_dis(dis_table);
|
|
@@ -373,12 +373,12 @@ double ReproduceDistancesObjective::cost_update(const int* perm, int iw, int jw)
|
|
|
373
373
|
}
|
|
374
374
|
|
|
375
375
|
ReproduceDistancesObjective::ReproduceDistancesObjective(
|
|
376
|
-
int
|
|
376
|
+
int n_in,
|
|
377
377
|
const double* source_dis_in,
|
|
378
378
|
const double* target_dis_in,
|
|
379
|
-
double
|
|
380
|
-
: dis_weight_factor(
|
|
381
|
-
this->n =
|
|
379
|
+
double dis_weight_factor_in)
|
|
380
|
+
: dis_weight_factor(dis_weight_factor_in), target_dis(target_dis_in) {
|
|
381
|
+
this->n = n_in;
|
|
382
382
|
set_affine_target_dis(source_dis_in);
|
|
383
383
|
}
|
|
384
384
|
|
|
@@ -388,7 +388,7 @@ void ReproduceDistancesObjective::compute_mean_stdev(
|
|
|
388
388
|
double* mean_out,
|
|
389
389
|
double* stddev_out) {
|
|
390
390
|
double sum = 0, sum2 = 0;
|
|
391
|
-
for (
|
|
391
|
+
for (size_t i = 0; i < n2; i++) {
|
|
392
392
|
sum += tab[i];
|
|
393
393
|
sum2 += tab[i] * tab[i];
|
|
394
394
|
}
|
|
@@ -668,18 +668,18 @@ struct RankingScore2 : Score3Computer<float, double> {
|
|
|
668
668
|
const float* gt_distances;
|
|
669
669
|
|
|
670
670
|
RankingScore2(
|
|
671
|
-
int
|
|
672
|
-
int
|
|
673
|
-
int
|
|
674
|
-
const uint32_t*
|
|
675
|
-
const uint32_t*
|
|
676
|
-
const float*
|
|
677
|
-
: nbits(
|
|
678
|
-
nq(
|
|
679
|
-
nb(
|
|
680
|
-
qcodes(
|
|
681
|
-
bcodes(
|
|
682
|
-
gt_distances(
|
|
671
|
+
int nbits_in,
|
|
672
|
+
int nq_in,
|
|
673
|
+
int nb_in,
|
|
674
|
+
const uint32_t* qcodes_in,
|
|
675
|
+
const uint32_t* bcodes_in,
|
|
676
|
+
const float* gt_distances_in)
|
|
677
|
+
: nbits(nbits_in),
|
|
678
|
+
nq(nq_in),
|
|
679
|
+
nb(nb_in),
|
|
680
|
+
qcodes(qcodes_in),
|
|
681
|
+
bcodes(bcodes_in),
|
|
682
|
+
gt_distances(gt_distances_in) {
|
|
683
683
|
n = nc = 1 << nbits;
|
|
684
684
|
n_gt.resize(nc * nc * nc);
|
|
685
685
|
init_n_gt();
|
|
@@ -796,7 +796,7 @@ void PolysemousTraining::optimize_reproduce_distances(
|
|
|
796
796
|
}
|
|
797
797
|
|
|
798
798
|
#pragma omp parallel for num_threads(nt)
|
|
799
|
-
for (int m = 0; m < pq.M; m++) {
|
|
799
|
+
for (int m = 0; m < static_cast<int>(pq.M); m++) {
|
|
800
800
|
std::vector<double> dis_table;
|
|
801
801
|
|
|
802
802
|
// printf ("Optimizing quantizer %d\n", m);
|
|
@@ -823,7 +823,14 @@ void PolysemousTraining::optimize_reproduce_distances(
|
|
|
823
823
|
|
|
824
824
|
if (log_pattern.size()) {
|
|
825
825
|
char fname[256];
|
|
826
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
827
|
+
#pragma GCC diagnostic push
|
|
828
|
+
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
|
829
|
+
#endif
|
|
826
830
|
snprintf(fname, 256, log_pattern.c_str(), m);
|
|
831
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
832
|
+
#pragma GCC diagnostic pop
|
|
833
|
+
#endif
|
|
827
834
|
printf("opening log file %s\n", fname);
|
|
828
835
|
optim.logfile = fopen(fname, "w");
|
|
829
836
|
FAISS_THROW_IF_NOT_MSG(optim.logfile, "could not open logfile");
|
|
@@ -872,21 +879,21 @@ void PolysemousTraining::optimize_ranking(
|
|
|
872
879
|
}
|
|
873
880
|
|
|
874
881
|
#pragma omp parallel for
|
|
875
|
-
for (int m = 0; m < pq.M; m++) {
|
|
882
|
+
for (int m = 0; m < static_cast<int>(pq.M); m++) {
|
|
876
883
|
size_t nq, nb;
|
|
877
884
|
std::vector<uint32_t> codes; // query codes, then db codes
|
|
878
885
|
std::vector<float> gt_distances; // nq * nb matrix of distances
|
|
879
886
|
|
|
880
887
|
if (n > 0) {
|
|
881
888
|
std::vector<float> xtrain(n * dsub);
|
|
882
|
-
for (
|
|
889
|
+
for (size_t i = 0; i < n; i++) {
|
|
883
890
|
memcpy(xtrain.data() + i * dsub,
|
|
884
891
|
x + i * pq.d + m * dsub,
|
|
885
892
|
sizeof(float) * dsub);
|
|
886
893
|
}
|
|
887
894
|
|
|
888
895
|
codes.resize(n);
|
|
889
|
-
for (
|
|
896
|
+
for (size_t i = 0; i < n; i++) {
|
|
890
897
|
codes[i] = all_codes[i * pq.code_size + m];
|
|
891
898
|
}
|
|
892
899
|
|
|
@@ -901,8 +908,8 @@ void PolysemousTraining::optimize_ranking(
|
|
|
901
908
|
} else {
|
|
902
909
|
nq = nb = pq.ksub;
|
|
903
910
|
codes.resize(2 * nq);
|
|
904
|
-
for (
|
|
905
|
-
codes[i] = codes[i + nq] = i;
|
|
911
|
+
for (size_t i = 0; i < nq; i++) {
|
|
912
|
+
codes[i] = codes[i + nq] = static_cast<uint32_t>(i);
|
|
906
913
|
}
|
|
907
914
|
|
|
908
915
|
gt_distances.resize(nq * nb);
|
|
@@ -935,7 +942,14 @@ void PolysemousTraining::optimize_ranking(
|
|
|
935
942
|
|
|
936
943
|
if (log_pattern.size()) {
|
|
937
944
|
char fname[256];
|
|
945
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
946
|
+
#pragma GCC diagnostic push
|
|
947
|
+
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
|
948
|
+
#endif
|
|
938
949
|
snprintf(fname, 256, log_pattern.c_str(), m);
|
|
950
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
951
|
+
#pragma GCC diagnostic pop
|
|
952
|
+
#endif
|
|
939
953
|
printf("opening log file %s\n", fname);
|
|
940
954
|
optim.logfile = fopen(fname, "w");
|
|
941
955
|
FAISS_THROW_IF_NOT_FMT(
|
|
@@ -957,11 +971,11 @@ void PolysemousTraining::optimize_ranking(
|
|
|
957
971
|
float* centroids = pq.get_centroids(m, 0);
|
|
958
972
|
|
|
959
973
|
std::vector<float> centroids_copy;
|
|
960
|
-
for (
|
|
974
|
+
for (size_t i = 0; i < dsub * pq.ksub; i++) {
|
|
961
975
|
centroids_copy.push_back(centroids[i]);
|
|
962
976
|
}
|
|
963
977
|
|
|
964
|
-
for (
|
|
978
|
+
for (size_t i = 0; i < pq.ksub; i++) {
|
|
965
979
|
memcpy(centroids + perm[i] * dsub,
|
|
966
980
|
centroids_copy.data() + i * dsub,
|
|
967
981
|
dsub * sizeof(centroids[0]));
|
|
@@ -70,10 +70,10 @@ struct ReproduceDistancesObjective : PermutationObjective {
|
|
|
70
70
|
double cost_update(const int* perm, int iw, int jw) const override;
|
|
71
71
|
|
|
72
72
|
ReproduceDistancesObjective(
|
|
73
|
-
int
|
|
73
|
+
int n_in,
|
|
74
74
|
const double* source_dis_in,
|
|
75
75
|
const double* target_dis_in,
|
|
76
|
-
double
|
|
76
|
+
double dis_weight_factor_in);
|
|
77
77
|
|
|
78
78
|
static void compute_mean_stdev(
|
|
79
79
|
const double* tab,
|
|
@@ -95,7 +95,7 @@ struct SimulatedAnnealingOptimizer : SimulatedAnnealingParameters {
|
|
|
95
95
|
FILE* logfile; /// logs values of the cost function
|
|
96
96
|
|
|
97
97
|
SimulatedAnnealingOptimizer(
|
|
98
|
-
PermutationObjective*
|
|
98
|
+
PermutationObjective* obj_in,
|
|
99
99
|
const SimulatedAnnealingParameters& p);
|
|
100
100
|
RandomGenerator* rnd;
|
|
101
101
|
|
|
@@ -42,22 +42,22 @@ int sgemm_(
|
|
|
42
42
|
namespace faiss {
|
|
43
43
|
|
|
44
44
|
ProductAdditiveQuantizer::ProductAdditiveQuantizer(
|
|
45
|
-
size_t
|
|
45
|
+
size_t d_,
|
|
46
46
|
const std::vector<AdditiveQuantizer*>& aqs,
|
|
47
|
-
Search_type_t
|
|
48
|
-
init(
|
|
47
|
+
Search_type_t search_type_) {
|
|
48
|
+
init(d_, aqs, search_type_);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
ProductAdditiveQuantizer::ProductAdditiveQuantizer()
|
|
52
52
|
: ProductAdditiveQuantizer(0, {}) {}
|
|
53
53
|
|
|
54
54
|
void ProductAdditiveQuantizer::init(
|
|
55
|
-
size_t
|
|
55
|
+
size_t d_in,
|
|
56
56
|
const std::vector<AdditiveQuantizer*>& aqs,
|
|
57
|
-
Search_type_t
|
|
57
|
+
Search_type_t search_type_in) {
|
|
58
58
|
// AdditiveQuantizer constructor
|
|
59
|
-
this->d =
|
|
60
|
-
this->search_type =
|
|
59
|
+
this->d = d_in;
|
|
60
|
+
this->search_type = search_type_in;
|
|
61
61
|
M = 0;
|
|
62
62
|
for (const auto& q : aqs) {
|
|
63
63
|
M += q->M;
|
|
@@ -98,7 +98,7 @@ void ProductAdditiveQuantizer::train(size_t n, const float* x) {
|
|
|
98
98
|
xt.resize(q->d * n);
|
|
99
99
|
|
|
100
100
|
#pragma omp parallel for if (n > 1000)
|
|
101
|
-
for (idx_t i = 0; i < n; i++) {
|
|
101
|
+
for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
|
|
102
102
|
memcpy(xt.data() + i * q->d,
|
|
103
103
|
x + i * d + offset_d,
|
|
104
104
|
q->d * sizeof(*x));
|
|
@@ -153,7 +153,7 @@ void ProductAdditiveQuantizer::compute_unpacked_codes(
|
|
|
153
153
|
const float* x,
|
|
154
154
|
int32_t* unpacked_codes,
|
|
155
155
|
size_t n,
|
|
156
|
-
const float* centroids) const {
|
|
156
|
+
const float* /*centroids*/) const {
|
|
157
157
|
/// TODO: actually we do not need to unpack and pack
|
|
158
158
|
size_t offset_d = 0, offset_m = 0;
|
|
159
159
|
std::vector<float> xsub;
|
|
@@ -165,7 +165,7 @@ void ProductAdditiveQuantizer::compute_unpacked_codes(
|
|
|
165
165
|
codes.resize(n * q->code_size);
|
|
166
166
|
|
|
167
167
|
#pragma omp parallel for if (n > 1000)
|
|
168
|
-
for (idx_t i = 0; i < n; i++) {
|
|
168
|
+
for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
|
|
169
169
|
memcpy(xsub.data() + i * q->d,
|
|
170
170
|
x + i * d + offset_d,
|
|
171
171
|
q->d * sizeof(float));
|
|
@@ -175,7 +175,7 @@ void ProductAdditiveQuantizer::compute_unpacked_codes(
|
|
|
175
175
|
|
|
176
176
|
// unpack
|
|
177
177
|
#pragma omp parallel for if (n > 1000)
|
|
178
|
-
for (idx_t i = 0; i < n; i++) {
|
|
178
|
+
for (idx_t i = 0; i < static_cast<idx_t>(n); i++) {
|
|
179
179
|
uint8_t* code = codes.data() + i * q->code_size;
|
|
180
180
|
BitstringReader bsr(code, q->code_size);
|
|
181
181
|
|
|
@@ -204,7 +204,7 @@ void ProductAdditiveQuantizer::decode_unpacked(
|
|
|
204
204
|
|
|
205
205
|
// product additive quantizer decoding
|
|
206
206
|
#pragma omp parallel for if (n > 1000)
|
|
207
|
-
for (int64_t i = 0; i < n; i++) {
|
|
207
|
+
for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
|
|
208
208
|
const int32_t* codesi = codes + i * ld_codes;
|
|
209
209
|
|
|
210
210
|
size_t offset_m = 0, offset_d = 0;
|
|
@@ -212,7 +212,7 @@ void ProductAdditiveQuantizer::decode_unpacked(
|
|
|
212
212
|
const auto q = quantizers[s];
|
|
213
213
|
float* xi = x + i * d + offset_d;
|
|
214
214
|
|
|
215
|
-
for (
|
|
215
|
+
for (size_t m = 0; m < q->M; m++) {
|
|
216
216
|
int idx = codesi[offset_m + m];
|
|
217
217
|
const float* c = codebooks.data() +
|
|
218
218
|
q->d * (codebook_offsets[offset_m + m] + idx);
|
|
@@ -235,7 +235,7 @@ void ProductAdditiveQuantizer::decode(const uint8_t* codes, float* x, size_t n)
|
|
|
235
235
|
is_trained, "The product additive quantizer is not trained yet.");
|
|
236
236
|
|
|
237
237
|
#pragma omp parallel for if (n > 1000)
|
|
238
|
-
for (int64_t i = 0; i < n; i++) {
|
|
238
|
+
for (int64_t i = 0; i < static_cast<int64_t>(n); i++) {
|
|
239
239
|
BitstringReader bsr(codes + i * code_size, code_size);
|
|
240
240
|
|
|
241
241
|
size_t offset_m = 0, offset_d = 0;
|
|
@@ -243,7 +243,7 @@ void ProductAdditiveQuantizer::decode(const uint8_t* codes, float* x, size_t n)
|
|
|
243
243
|
const auto q = quantizers[s];
|
|
244
244
|
float* xi = x + i * d + offset_d;
|
|
245
245
|
|
|
246
|
-
for (
|
|
246
|
+
for (size_t m = 0; m < q->M; m++) {
|
|
247
247
|
int idx = bsr.read(q->nbits[m]);
|
|
248
248
|
const float* c = codebooks.data() +
|
|
249
249
|
q->d * (codebook_offsets[offset_m + m] + idx);
|
|
@@ -315,24 +315,24 @@ void ProductAdditiveQuantizer::compute_LUT(
|
|
|
315
315
|
************************************/
|
|
316
316
|
|
|
317
317
|
ProductLocalSearchQuantizer::ProductLocalSearchQuantizer(
|
|
318
|
-
size_t
|
|
319
|
-
size_t
|
|
318
|
+
size_t d_,
|
|
319
|
+
size_t nsplits_,
|
|
320
320
|
size_t Msub,
|
|
321
|
-
size_t
|
|
322
|
-
Search_type_t
|
|
321
|
+
size_t nbits_,
|
|
322
|
+
Search_type_t search_type_) {
|
|
323
323
|
std::vector<AdditiveQuantizer*> aqs;
|
|
324
324
|
|
|
325
|
-
if (
|
|
326
|
-
FAISS_THROW_IF_NOT(
|
|
327
|
-
size_t dsub =
|
|
325
|
+
if (nsplits_ > 0) {
|
|
326
|
+
FAISS_THROW_IF_NOT(d_ % nsplits_ == 0);
|
|
327
|
+
size_t dsub = d_ / nsplits_;
|
|
328
328
|
|
|
329
|
-
for (size_t i = 0; i <
|
|
329
|
+
for (size_t i = 0; i < nsplits_; i++) {
|
|
330
330
|
auto lsq =
|
|
331
|
-
new LocalSearchQuantizer(dsub, Msub,
|
|
331
|
+
new LocalSearchQuantizer(dsub, Msub, nbits_, ST_decompress);
|
|
332
332
|
aqs.push_back(lsq);
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
|
-
init(
|
|
335
|
+
init(d_, aqs, search_type_);
|
|
336
336
|
for (auto& q : aqs) {
|
|
337
337
|
delete q;
|
|
338
338
|
}
|
|
@@ -346,23 +346,23 @@ ProductLocalSearchQuantizer::ProductLocalSearchQuantizer()
|
|
|
346
346
|
************************************/
|
|
347
347
|
|
|
348
348
|
ProductResidualQuantizer::ProductResidualQuantizer(
|
|
349
|
-
size_t
|
|
350
|
-
size_t
|
|
349
|
+
size_t d_,
|
|
350
|
+
size_t nsplits_,
|
|
351
351
|
size_t Msub,
|
|
352
|
-
size_t
|
|
353
|
-
Search_type_t
|
|
352
|
+
size_t nbits_,
|
|
353
|
+
Search_type_t search_type_) {
|
|
354
354
|
std::vector<AdditiveQuantizer*> aqs;
|
|
355
355
|
|
|
356
|
-
if (
|
|
357
|
-
FAISS_THROW_IF_NOT(
|
|
358
|
-
size_t dsub =
|
|
356
|
+
if (nsplits_ > 0) {
|
|
357
|
+
FAISS_THROW_IF_NOT(d_ % nsplits_ == 0);
|
|
358
|
+
size_t dsub = d_ / nsplits_;
|
|
359
359
|
|
|
360
|
-
for (size_t i = 0; i <
|
|
361
|
-
auto rq = new ResidualQuantizer(dsub, Msub,
|
|
360
|
+
for (size_t i = 0; i < nsplits_; i++) {
|
|
361
|
+
auto rq = new ResidualQuantizer(dsub, Msub, nbits_, ST_decompress);
|
|
362
362
|
aqs.push_back(rq);
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
|
-
init(
|
|
365
|
+
init(d_, aqs, search_type_);
|
|
366
366
|
for (auto& q : aqs) {
|
|
367
367
|
delete q;
|
|
368
368
|
}
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
namespace faiss {
|
|
11
11
|
|
|
12
12
|
inline PQEncoderGeneric::PQEncoderGeneric(
|
|
13
|
-
uint8_t*
|
|
14
|
-
int
|
|
15
|
-
uint8_t
|
|
16
|
-
: code(
|
|
13
|
+
uint8_t* code_in,
|
|
14
|
+
int nbits_in,
|
|
15
|
+
uint8_t offset_in)
|
|
16
|
+
: code(code_in), offset(offset_in), nbits(nbits_in), reg(0) {
|
|
17
17
|
assert(nbits <= 64);
|
|
18
18
|
if (offset > 0) {
|
|
19
19
|
reg = (*code & ((1 << offset) - 1));
|
|
@@ -45,28 +45,30 @@ inline PQEncoderGeneric::~PQEncoderGeneric() {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
inline PQEncoder8::PQEncoder8(uint8_t*
|
|
49
|
-
assert(8 ==
|
|
48
|
+
inline PQEncoder8::PQEncoder8(uint8_t* code_in, int nbits_in) : code(code_in) {
|
|
49
|
+
assert(8 == nbits_in);
|
|
50
|
+
(void)nbits_in;
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
inline void PQEncoder8::encode(uint64_t x) {
|
|
53
54
|
*code++ = (uint8_t)x;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
inline PQEncoder16::PQEncoder16(uint8_t*
|
|
57
|
-
: code((uint16_t*)
|
|
58
|
-
assert(16 ==
|
|
57
|
+
inline PQEncoder16::PQEncoder16(uint8_t* code_in, int nbits_in)
|
|
58
|
+
: code((uint16_t*)code_in) {
|
|
59
|
+
assert(16 == nbits_in);
|
|
60
|
+
(void)nbits_in;
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
inline void PQEncoder16::encode(uint64_t x) {
|
|
62
64
|
*code++ = (uint16_t)x;
|
|
63
65
|
}
|
|
64
66
|
|
|
65
|
-
inline PQDecoderGeneric::PQDecoderGeneric(const uint8_t*
|
|
66
|
-
: code(
|
|
67
|
+
inline PQDecoderGeneric::PQDecoderGeneric(const uint8_t* code_in, int nbits_in)
|
|
68
|
+
: code(code_in),
|
|
67
69
|
offset(0),
|
|
68
|
-
nbits(
|
|
69
|
-
mask((1ull <<
|
|
70
|
+
nbits(nbits_in),
|
|
71
|
+
mask((1ull << nbits_in) - 1),
|
|
70
72
|
reg(0) {
|
|
71
73
|
assert(nbits <= 64);
|
|
72
74
|
}
|
|
@@ -98,17 +100,20 @@ inline uint64_t PQDecoderGeneric::decode() {
|
|
|
98
100
|
return c & mask;
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
inline PQDecoder8::PQDecoder8(const uint8_t*
|
|
103
|
+
inline PQDecoder8::PQDecoder8(const uint8_t* code_in, int nbits_in)
|
|
104
|
+
: code(code_in) {
|
|
102
105
|
assert(8 == nbits_in);
|
|
106
|
+
(void)nbits_in;
|
|
103
107
|
}
|
|
104
108
|
|
|
105
109
|
inline uint64_t PQDecoder8::decode() {
|
|
106
110
|
return (uint64_t)(*code++);
|
|
107
111
|
}
|
|
108
112
|
|
|
109
|
-
inline PQDecoder16::PQDecoder16(const uint8_t*
|
|
110
|
-
: code((uint16_t*)
|
|
113
|
+
inline PQDecoder16::PQDecoder16(const uint8_t* code_in, int nbits_in)
|
|
114
|
+
: code((uint16_t*)code_in) {
|
|
111
115
|
assert(16 == nbits_in);
|
|
116
|
+
(void)nbits_in;
|
|
112
117
|
}
|
|
113
118
|
|
|
114
119
|
inline uint64_t PQDecoder16::decode() {
|
|
@@ -48,8 +48,8 @@ namespace faiss {
|
|
|
48
48
|
* PQ implementation
|
|
49
49
|
*********************************************/
|
|
50
50
|
|
|
51
|
-
ProductQuantizer::ProductQuantizer(size_t
|
|
52
|
-
: Quantizer(
|
|
51
|
+
ProductQuantizer::ProductQuantizer(size_t d_in, size_t M_in, size_t nbits_in)
|
|
52
|
+
: Quantizer(d_in, 0), M(M_in), nbits(nbits_in), assign_index(nullptr) {
|
|
53
53
|
set_derived_values();
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -139,8 +139,8 @@ void ProductQuantizer::train(size_t n, const float* x) {
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
std::unique_ptr<float[]> xslice(new float[n * dsub]);
|
|
142
|
-
for (
|
|
143
|
-
for (
|
|
142
|
+
for (size_t m = 0; m < M; m++) {
|
|
143
|
+
for (size_t j = 0; j < n; j++)
|
|
144
144
|
memcpy(xslice.get() + j * dsub,
|
|
145
145
|
x + j * d + m * dsub,
|
|
146
146
|
dsub * sizeof(float));
|
|
@@ -179,7 +179,7 @@ void ProductQuantizer::train(size_t n, const float* x) {
|
|
|
179
179
|
|
|
180
180
|
if (verbose) {
|
|
181
181
|
clus.verbose = true;
|
|
182
|
-
printf("Training PQ slice %
|
|
182
|
+
printf("Training PQ slice %zd/%zd\n", m, M);
|
|
183
183
|
}
|
|
184
184
|
IndexFlatL2 index(dsub);
|
|
185
185
|
clus.train(n, xslice.get(), assign_index ? *assign_index : index);
|
|
@@ -197,7 +197,7 @@ void ProductQuantizer::train(size_t n, const float* x) {
|
|
|
197
197
|
IndexFlatL2 index(dsub);
|
|
198
198
|
|
|
199
199
|
clus.train(n * M, x, assign_index ? *assign_index : index);
|
|
200
|
-
for (
|
|
200
|
+
for (size_t m = 0; m < M; m++) {
|
|
201
201
|
set_params(clus.centroids.data(), m);
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -322,8 +322,9 @@ void ProductQuantizer::decode(const uint8_t* code, float* x) const {
|
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
void ProductQuantizer::decode(const uint8_t* code, float* x, size_t n) const {
|
|
325
|
+
int64_t n_signed = n;
|
|
325
326
|
#pragma omp parallel for if (n > 100)
|
|
326
|
-
for (int64_t i = 0; i <
|
|
327
|
+
for (int64_t i = 0; i < n_signed; i++) {
|
|
327
328
|
this->decode(code + code_size * i, x + d * i);
|
|
328
329
|
}
|
|
329
330
|
}
|
|
@@ -353,7 +354,8 @@ void ProductQuantizer::compute_codes_with_assign_index(
|
|
|
353
354
|
const float* x,
|
|
354
355
|
uint8_t* codes,
|
|
355
356
|
size_t n) {
|
|
356
|
-
FAISS_THROW_IF_NOT(
|
|
357
|
+
FAISS_THROW_IF_NOT(
|
|
358
|
+
assign_index && static_cast<size_t>(assign_index->d) == dsub);
|
|
357
359
|
|
|
358
360
|
for (size_t m = 0; m < M; m++) {
|
|
359
361
|
assign_index->reset();
|
|
@@ -415,10 +417,11 @@ void ProductQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
|
|
|
415
417
|
return;
|
|
416
418
|
}
|
|
417
419
|
|
|
420
|
+
int64_t n_signed = n;
|
|
418
421
|
if (dsub < 16) { // simple direct computation
|
|
419
422
|
|
|
420
423
|
#pragma omp parallel for
|
|
421
|
-
for (int64_t i = 0; i <
|
|
424
|
+
for (int64_t i = 0; i < n_signed; i++)
|
|
422
425
|
compute_code(x + i * d, codes + i * code_size);
|
|
423
426
|
|
|
424
427
|
} else { // worthwhile to use BLAS
|
|
@@ -426,7 +429,7 @@ void ProductQuantizer::compute_codes(const float* x, uint8_t* codes, size_t n)
|
|
|
426
429
|
compute_distance_tables(n, x, dis_tables.get());
|
|
427
430
|
|
|
428
431
|
#pragma omp parallel for
|
|
429
|
-
for (int64_t i = 0; i <
|
|
432
|
+
for (int64_t i = 0; i < n_signed; i++) {
|
|
430
433
|
uint8_t* code = codes + i * code_size;
|
|
431
434
|
const float* tab = dis_tables.get() + i * ksub * M;
|
|
432
435
|
compute_code_from_distance_table(tab, code);
|
|
@@ -482,7 +485,8 @@ void ProductQuantizer::compute_distance_tables(
|
|
|
482
485
|
size_t nx,
|
|
483
486
|
const float* x,
|
|
484
487
|
float* dis_tables) const {
|
|
485
|
-
|
|
488
|
+
int64_t nx_signed = nx;
|
|
489
|
+
#if defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_ARM_NEON)
|
|
486
490
|
if (dsub == 2 && nbits < 8) { // interesting for a narrow range of settings
|
|
487
491
|
compute_PQ_dis_tables_dsub2(
|
|
488
492
|
d, ksub, centroids.data(), nx, x, false, dis_tables);
|
|
@@ -491,13 +495,13 @@ void ProductQuantizer::compute_distance_tables(
|
|
|
491
495
|
if (dsub < 16) {
|
|
492
496
|
|
|
493
497
|
#pragma omp parallel for if (nx > 1)
|
|
494
|
-
for (int64_t i = 0; i <
|
|
498
|
+
for (int64_t i = 0; i < nx_signed; i++) {
|
|
495
499
|
compute_distance_table(x + i * d, dis_tables + i * ksub * M);
|
|
496
500
|
}
|
|
497
501
|
|
|
498
502
|
} else { // use BLAS
|
|
499
503
|
|
|
500
|
-
for (
|
|
504
|
+
for (size_t m = 0; m < M; m++) {
|
|
501
505
|
pairwise_L2sqr(
|
|
502
506
|
dsub,
|
|
503
507
|
nx,
|
|
@@ -516,7 +520,8 @@ void ProductQuantizer::compute_inner_prod_tables(
|
|
|
516
520
|
size_t nx,
|
|
517
521
|
const float* x,
|
|
518
522
|
float* dis_tables) const {
|
|
519
|
-
|
|
523
|
+
int64_t nx_signed = nx;
|
|
524
|
+
#if defined(COMPILE_SIMD_AVX2) || defined(COMPILE_SIMD_ARM_NEON)
|
|
520
525
|
if (dsub == 2 && nbits < 8) {
|
|
521
526
|
compute_PQ_dis_tables_dsub2(
|
|
522
527
|
d, ksub, centroids.data(), nx, x, true, dis_tables);
|
|
@@ -525,14 +530,14 @@ void ProductQuantizer::compute_inner_prod_tables(
|
|
|
525
530
|
if (dsub < 16) {
|
|
526
531
|
|
|
527
532
|
#pragma omp parallel for if (nx > 1)
|
|
528
|
-
for (int64_t i = 0; i <
|
|
533
|
+
for (int64_t i = 0; i < nx_signed; i++) {
|
|
529
534
|
compute_inner_prod_table(x + i * d, dis_tables + i * ksub * M);
|
|
530
535
|
}
|
|
531
536
|
|
|
532
537
|
} else { // use BLAS
|
|
533
538
|
|
|
534
539
|
// compute distance tables
|
|
535
|
-
for (
|
|
540
|
+
for (size_t m = 0; m < M; m++) {
|
|
536
541
|
FINTEGER ldc = ksub * M, nxi = nx, ksubi = ksub, dsubi = dsub,
|
|
537
542
|
di = d;
|
|
538
543
|
float one = 1.0, zero = 0;
|
|
@@ -576,7 +581,7 @@ void pq_estimators_from_tables_Mmul4(
|
|
|
576
581
|
float dis = 0;
|
|
577
582
|
const float* dt = dis_table;
|
|
578
583
|
|
|
579
|
-
for (
|
|
584
|
+
for (int m = 0; m < M; m += 4) {
|
|
580
585
|
float dism = 0;
|
|
581
586
|
dism = dt[*codes++];
|
|
582
587
|
dt += ksub;
|
|
@@ -648,7 +653,7 @@ void pq_estimators_from_tables(
|
|
|
648
653
|
for (size_t j = 0; j < ncodes; j++) {
|
|
649
654
|
float dis = 0;
|
|
650
655
|
const float* __restrict dt = dis_table;
|
|
651
|
-
for (
|
|
656
|
+
for (size_t m = 0; m < M; m++) {
|
|
652
657
|
dis += dt[*codes++];
|
|
653
658
|
dt += ksub;
|
|
654
659
|
}
|
|
@@ -696,10 +701,11 @@ void pq_knn_search_with_tables(
|
|
|
696
701
|
HeapArray<C>* res,
|
|
697
702
|
bool init_finalize_heap) {
|
|
698
703
|
size_t k = res->k, nx = res->nh;
|
|
704
|
+
int64_t nx_signed = nx;
|
|
699
705
|
size_t ksub = pq.ksub, M = pq.M;
|
|
700
706
|
|
|
701
707
|
#pragma omp parallel for if (nx > 1)
|
|
702
|
-
for (int64_t i = 0; i <
|
|
708
|
+
for (int64_t i = 0; i < nx_signed; i++) {
|
|
703
709
|
/* query preparation for asymmetric search: compute look-up tables */
|
|
704
710
|
const float* dis_table = dis_tables + i * ksub * M;
|
|
705
711
|
|
|
@@ -797,7 +803,7 @@ void ProductQuantizer::compute_sdc_table() {
|
|
|
797
803
|
if (dsub < 4) {
|
|
798
804
|
with_simd_level([&]<SIMDLevel SL>() {
|
|
799
805
|
#pragma omp parallel for
|
|
800
|
-
for (
|
|
806
|
+
for (int64_t mk = 0; mk < static_cast<int64_t>(M * ksub); mk++) {
|
|
801
807
|
// allow omp to schedule in a more fine-grained way
|
|
802
808
|
// `collapse` is not supported in OpenMP 2.x
|
|
803
809
|
int m = mk / ksub;
|
|
@@ -812,7 +818,7 @@ void ProductQuantizer::compute_sdc_table() {
|
|
|
812
818
|
// NOTE: it would disable the omp loop in pairwise_L2sqr
|
|
813
819
|
// but still accelerate especially when M >= 4
|
|
814
820
|
#pragma omp parallel for
|
|
815
|
-
for (
|
|
821
|
+
for (int64_t m = 0; m < static_cast<int64_t>(M); m++) {
|
|
816
822
|
const float* cents = centroids.data() + m * ksub * dsub;
|
|
817
823
|
float* dis_tab = sdc_table.data() + m * ksub * ksub;
|
|
818
824
|
pairwise_L2sqr(
|
|
@@ -831,9 +837,10 @@ void ProductQuantizer::search_sdc(
|
|
|
831
837
|
FAISS_THROW_IF_NOT(sdc_table.size() == M * ksub * ksub);
|
|
832
838
|
FAISS_THROW_IF_NOT(nbits == 8);
|
|
833
839
|
size_t k = res->k;
|
|
840
|
+
int64_t nq_signed = nq;
|
|
834
841
|
|
|
835
842
|
#pragma omp parallel for
|
|
836
|
-
for (int64_t i = 0; i <
|
|
843
|
+
for (int64_t i = 0; i < nq_signed; i++) {
|
|
837
844
|
/* Compute distances and keep smallest values */
|
|
838
845
|
idx_t* heap_ids = res->ids + i * k;
|
|
839
846
|
float* heap_dis = res->val + i * k;
|
|
@@ -846,7 +853,7 @@ void ProductQuantizer::search_sdc(
|
|
|
846
853
|
for (size_t j = 0; j < nb; j++) {
|
|
847
854
|
float dis = 0;
|
|
848
855
|
const float* tab = sdc_table.data();
|
|
849
|
-
for (
|
|
856
|
+
for (size_t m = 0; m < M; m++) {
|
|
850
857
|
dis += tab[bcode[m] + qcode[m] * ksub];
|
|
851
858
|
tab += ksub * ksub;
|
|
852
859
|
}
|
|
@@ -16,8 +16,8 @@ struct Quantizer {
|
|
|
16
16
|
size_t d; ///< size of the input vectors
|
|
17
17
|
size_t code_size; ///< bytes per indexed vector
|
|
18
18
|
|
|
19
|
-
explicit Quantizer(size_t
|
|
20
|
-
: d(
|
|
19
|
+
explicit Quantizer(size_t d_in = 0, size_t code_size_in = 0)
|
|
20
|
+
: d(d_in), code_size(code_size_in) {}
|
|
21
21
|
|
|
22
22
|
/** Train the quantizer
|
|
23
23
|
*
|