faiss 0.5.3 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/ext/faiss/ext.cpp +1 -1
- data/ext/faiss/extconf.rb +4 -4
- data/ext/faiss/index.cpp +63 -45
- data/ext/faiss/index_binary.cpp +37 -27
- data/ext/faiss/kmeans.cpp +9 -8
- data/ext/faiss/pca_matrix.cpp +9 -7
- data/ext/faiss/product_quantizer.cpp +13 -11
- data/ext/faiss/utils.cpp +4 -2
- data/ext/faiss/utils.h +4 -0
- data/lib/faiss/version.rb +1 -1
- data/lib/faiss.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +214 -82
- data/vendor/faiss/faiss/AutoTune.h +14 -1
- data/vendor/faiss/faiss/Clustering.cpp +97 -249
- data/vendor/faiss/faiss/Clustering.h +18 -0
- data/vendor/faiss/faiss/IVFlib.cpp +67 -44
- data/vendor/faiss/faiss/Index.cpp +25 -12
- data/vendor/faiss/faiss/Index.h +26 -4
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +68 -61
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +6 -3
- data/vendor/faiss/faiss/IndexBinary.h +4 -4
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +92 -95
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
- data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +120 -414
- data/vendor/faiss/faiss/IndexFastScan.cpp +105 -129
- data/vendor/faiss/faiss/IndexFastScan.h +35 -24
- data/vendor/faiss/faiss/IndexFlat.cpp +216 -152
- data/vendor/faiss/faiss/IndexFlat.h +32 -14
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +88 -41
- data/vendor/faiss/faiss/IndexFlatCodes.h +7 -1
- data/vendor/faiss/faiss/IndexHNSW.cpp +299 -187
- data/vendor/faiss/faiss/IndexHNSW.h +30 -14
- data/vendor/faiss/faiss/IndexIDMap.cpp +26 -22
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +535 -405
- data/vendor/faiss/faiss/IndexIVF.h +47 -16
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +77 -74
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +105 -99
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +6 -3
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +379 -249
- data/vendor/faiss/faiss/IndexIVFFastScan.h +65 -60
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +41 -124
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +89 -138
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +77 -907
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +184 -122
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -18
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +59 -60
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +564 -416
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +269 -111
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +44 -25
- data/vendor/faiss/faiss/IndexLattice.cpp +41 -36
- data/vendor/faiss/faiss/IndexNNDescent.cpp +37 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +40 -23
- data/vendor/faiss/faiss/IndexNSG.h +0 -2
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +32 -12
- data/vendor/faiss/faiss/IndexPQ.cpp +129 -213
- data/vendor/faiss/faiss/IndexPQ.h +3 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
- data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
- data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +31 -43
- data/vendor/faiss/faiss/IndexRaBitQ.h +4 -3
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +135 -317
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +192 -34
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -55
- data/vendor/faiss/faiss/IndexRefine.h +4 -4
- data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +82 -14
- data/vendor/faiss/faiss/IndexShards.cpp +13 -13
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
- data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
- data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
- data/vendor/faiss/faiss/MetaIndexes.h +1 -1
- data/vendor/faiss/faiss/MetricType.h +29 -6
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +349 -141
- data/vendor/faiss/faiss/VectorTransform.h +39 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +55 -51
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
- data/vendor/faiss/faiss/{cppcontrib/factory_tools.cpp → factory_tools.cpp} +6 -1
- data/vendor/faiss/faiss/gpu/GpuCloner.cpp +1 -1
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +1 -1
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +9 -9
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +4 -3
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
- data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
- data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
- data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +51 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +66 -0
- data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
- data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
- data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
- data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +64 -34
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -28
- data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +367 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.h +107 -0
- data/vendor/faiss/faiss/impl/CodePacker.cpp +7 -3
- data/vendor/faiss/faiss/impl/CodePacker.h +11 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +83 -0
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.h +47 -0
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +64 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +117 -351
- data/vendor/faiss/faiss/impl/HNSW.h +21 -40
- data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
- data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
- data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +114 -102
- data/vendor/faiss/faiss/impl/NNDescent.cpp +63 -26
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +44 -26
- data/vendor/faiss/faiss/impl/NSG.h +20 -10
- data/vendor/faiss/faiss/impl/Panorama.cpp +76 -52
- data/vendor/faiss/faiss/impl/Panorama.h +265 -78
- data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
- data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +62 -37
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +99 -80
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +135 -37
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +148 -21
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +298 -301
- data/vendor/faiss/faiss/impl/RaBitQuantizer.h +3 -10
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.cpp +15 -41
- data/vendor/faiss/faiss/impl/RaBitQuantizerMultiBit.h +0 -4
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +40 -32
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +218 -113
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +119 -2362
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +27 -3
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +42 -0
- data/vendor/faiss/faiss/impl/VisitedTable.h +76 -0
- data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
- data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
- data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
- data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
- data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
- data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/expanded_scanners.h +163 -0
- data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
- data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
- data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +268 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +176 -4
- data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -348
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
- data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +290 -142
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
- data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +91 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +104 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +111 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1950 -505
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -2
- data/vendor/faiss/faiss/impl/index_write.cpp +112 -21
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +33 -16
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +81 -40
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +15 -8
- data/vendor/faiss/faiss/impl/platform_macros.h +11 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +21 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +21 -0
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx2.h → pq_code_distance/pq_code_distance-avx2.h} +43 -220
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-avx512.h → pq_code_distance/pq_code_distance-avx512.h} +25 -112
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +59 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +256 -0
- data/vendor/faiss/faiss/impl/{code_distance/code_distance-sve.h → pq_code_distance/pq_code_distance-sve.cpp} +57 -146
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +68 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +320 -483
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +121 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +137 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +371 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +190 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +94 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +603 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +597 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +388 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +630 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +311 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +387 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +54 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +173 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +274 -171
- data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +275 -217
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
- data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
- data/vendor/faiss/faiss/impl/svs_io.h +8 -2
- data/vendor/faiss/faiss/index_factory.cpp +115 -28
- data/vendor/faiss/faiss/index_io.h +53 -3
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +73 -20
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +24 -14
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +157 -73
- data/vendor/faiss/faiss/invlists/InvertedLists.h +86 -23
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +14 -14
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +9 -19
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSFlat.h +2 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +25 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +19 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +14 -0
- data/vendor/faiss/faiss/utils/Heap.cpp +56 -10
- data/vendor/faiss/faiss/utils/Heap.h +21 -0
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +54 -40
- data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
- data/vendor/faiss/faiss/utils/distances.cpp +507 -559
- data/vendor/faiss/faiss/utils/distances.h +118 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +250 -0
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
- data/vendor/faiss/faiss/utils/distances_simd.cpp +72 -3681
- data/vendor/faiss/faiss/utils/extra_distances.cpp +60 -102
- data/vendor/faiss/faiss/utils/extra_distances.h +79 -7
- data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
- data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
- data/vendor/faiss/faiss/utils/hamming.h +92 -2
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +234 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +66 -987
- data/vendor/faiss/faiss/utils/partitioning.h +31 -0
- data/vendor/faiss/faiss/utils/popcount.h +29 -0
- data/vendor/faiss/faiss/utils/pq_code_distance.h +251 -0
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
- data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
- data/vendor/faiss/faiss/utils/rabitq_simd.h +124 -343
- data/vendor/faiss/faiss/utils/random.cpp +6 -6
- data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +154 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +777 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +306 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +1431 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +1095 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +392 -0
- data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
- data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1085 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
- data/vendor/faiss/faiss/utils/simd_levels.cpp +334 -0
- data/vendor/faiss/faiss/utils/simd_levels.h +183 -0
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +21 -14
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +156 -42
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +0 -81
- data/vendor/faiss/faiss/impl/code_distance/code_distance.h +0 -186
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -216
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -224
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -228
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -450
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
- data/vendor/faiss/faiss/utils/simdlib.h +0 -42
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -296
- /data/vendor/faiss/faiss/{cppcontrib/factory_tools.h → factory_tools.h} +0 -0
|
@@ -103,10 +103,8 @@ struct RaBitQuantizer : Quantizer {
|
|
|
103
103
|
//
|
|
104
104
|
// 1. distance_to_code_1bit() - Fast 1-bit filtering using only sign bits
|
|
105
105
|
// 2. distance_to_code_full() - Accurate multi-bit refinement using all bits
|
|
106
|
-
// 3. lower_bound_distance() - Error-bounded adaptive filtering
|
|
107
|
-
// (based on 1-bit estimator)
|
|
108
106
|
//
|
|
109
|
-
// These
|
|
107
|
+
// These methods implement RaBitQ's two-stage search pattern and are
|
|
110
108
|
// shared between the quantized (Q) and non-quantized (NotQ) query variants.
|
|
111
109
|
// The intermediate class allows two-stage search code to work with both
|
|
112
110
|
// variants via a single dynamic_cast.
|
|
@@ -116,8 +114,8 @@ struct RaBitQDistanceComputer : FlatCodesDistanceComputer {
|
|
|
116
114
|
MetricType metric_type = MetricType::METRIC_L2;
|
|
117
115
|
size_t nb_bits = 1;
|
|
118
116
|
|
|
119
|
-
// Query
|
|
120
|
-
//
|
|
117
|
+
// Query error factor for bound computation (g_error in rabitq-library)
|
|
118
|
+
// Used with f_error to compute error bounds for two-stage filtering
|
|
121
119
|
float g_error = 0.0f;
|
|
122
120
|
|
|
123
121
|
float symmetric_dis(idx_t /*i*/, idx_t /*j*/) override {
|
|
@@ -131,11 +129,6 @@ struct RaBitQDistanceComputer : FlatCodesDistanceComputer {
|
|
|
131
129
|
// Compute full multi-bit distance (accurate)
|
|
132
130
|
virtual float distance_to_code_full(const uint8_t* code) = 0;
|
|
133
131
|
|
|
134
|
-
// Compute lower bound of distance using error bounds
|
|
135
|
-
// Guarantees: actual_distance >= lower_bound_distance
|
|
136
|
-
// Used for adaptive filtering in two-stage search
|
|
137
|
-
virtual float lower_bound_distance(const uint8_t* code);
|
|
138
|
-
|
|
139
132
|
// Override from FlatCodesDistanceComputer
|
|
140
133
|
// Delegates to distance_to_code_full() for multi-bit distance computation
|
|
141
134
|
float distance_to_code(const uint8_t* code) final {
|
|
@@ -180,9 +180,7 @@ void pack_multibit_codes(
|
|
|
180
180
|
*
|
|
181
181
|
* @param residual Original residual vector (data - centroid)
|
|
182
182
|
* @param centroid Centroid vector (can be nullptr for zero centroid)
|
|
183
|
-
* @param tmp_code Quantized ex-bit codes (before packing, after bit flipping)
|
|
184
183
|
* @param d Dimensionality
|
|
185
|
-
* @param ex_bits Number of extra bits
|
|
186
184
|
* @param norm L2 norm of residual
|
|
187
185
|
* @param ipnorm Unnormalized inner product between quantized and normalized
|
|
188
186
|
* residual
|
|
@@ -192,9 +190,7 @@ void pack_multibit_codes(
|
|
|
192
190
|
void compute_ex_factors(
|
|
193
191
|
const float* residual,
|
|
194
192
|
const float* centroid,
|
|
195
|
-
const int* tmp_code,
|
|
196
193
|
size_t d,
|
|
197
|
-
size_t ex_bits,
|
|
198
194
|
float norm,
|
|
199
195
|
double ipnorm,
|
|
200
196
|
ExtraBitsFactors& ex_factors,
|
|
@@ -210,45 +206,23 @@ void compute_ex_factors(
|
|
|
210
206
|
ipnorm_inv = 1.0f;
|
|
211
207
|
}
|
|
212
208
|
|
|
213
|
-
// Reconstruct xu_cb from total_code
|
|
214
|
-
// total_code was formed from: total_code[i] = (sign << ex_bits) +
|
|
215
|
-
// ex_code[i] Reconstruction: xu_cb[i] = total_code[i] + cb
|
|
216
|
-
const float cb = -(static_cast<float>(1 << ex_bits) - 0.5f);
|
|
217
|
-
std::vector<float> xu_cb(d);
|
|
218
|
-
for (size_t i = 0; i < d; i++) {
|
|
219
|
-
xu_cb[i] = static_cast<float>(tmp_code[i]) + cb;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
209
|
// Compute inner products needed for factors
|
|
223
|
-
float l2_sqr = norm * norm;
|
|
224
|
-
float ip_resi_xucb = fvec_inner_product(residual, xu_cb.data(), d);
|
|
210
|
+
float l2_sqr = norm * norm; // ||residual||^2 = ||x - c||^2
|
|
225
211
|
|
|
226
|
-
// Compute factors
|
|
227
212
|
if (metric_type == MetricType::METRIC_L2) {
|
|
228
|
-
// For L2
|
|
229
|
-
//
|
|
213
|
+
// For L2: f_add_ex = ||residual||^2
|
|
214
|
+
// No centroid correction needed in IVF setting because
|
|
215
|
+
// residual = x - centroid, distance computed in residual space
|
|
230
216
|
ex_factors.f_add_ex = l2_sqr;
|
|
231
217
|
ex_factors.f_rescale_ex = ipnorm_inv * -2.0f * norm;
|
|
232
218
|
} else {
|
|
233
|
-
// For IP
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (centroid != nullptr) {
|
|
241
|
-
ip_cent_xucb = fvec_inner_product(centroid, xu_cb.data(), d);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// When ip_resi_xucb is zero, the correction term should be zero
|
|
245
|
-
float correction_term = 0.0f;
|
|
246
|
-
if (ip_resi_xucb != 0.0f) {
|
|
247
|
-
correction_term = l2_sqr * ip_cent_xucb / ip_resi_xucb;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
ex_factors.f_add_ex = 1 - ip_resi_cent + correction_term;
|
|
251
|
-
ex_factors.f_rescale_ex = ipnorm_inv * -norm;
|
|
219
|
+
// For IP: direct dot-product formulation
|
|
220
|
+
// f_add_ex = <c, r> (dot product of centroid and residual)
|
|
221
|
+
// f_rescale_ex = ||r|| / ipnorm (positive scaling)
|
|
222
|
+
float c_dot_r =
|
|
223
|
+
centroid ? fvec_inner_product(residual, centroid, d) : 0.0f;
|
|
224
|
+
ex_factors.f_add_ex = c_dot_r;
|
|
225
|
+
ex_factors.f_rescale_ex = ipnorm_inv * norm;
|
|
252
226
|
}
|
|
253
227
|
}
|
|
254
228
|
|
|
@@ -290,12 +264,14 @@ void quantize_ex_bits(
|
|
|
290
264
|
float norm_sqr = fvec_norm_L2sqr(residual, d);
|
|
291
265
|
float norm = std::sqrt(norm_sqr);
|
|
292
266
|
|
|
293
|
-
// Handle degenerate case
|
|
267
|
+
// Handle degenerate case: residual is (near-)zero, meaning x ≈ centroid.
|
|
268
|
+
// For both L2 and IP, f_add_ex and f_rescale_ex are trivially zero:
|
|
269
|
+
// L2: ||r||² ≈ 0, IP: <c,r> ≈ 0 and ||r||/ipnorm ≈ 0
|
|
294
270
|
if (norm < 1e-10f) {
|
|
295
271
|
size_t code_size = (d * ex_bits + 7) / 8;
|
|
296
272
|
memset(ex_code, 0, code_size);
|
|
297
273
|
ex_factors.f_add_ex = 0.0f;
|
|
298
|
-
ex_factors.f_rescale_ex =
|
|
274
|
+
ex_factors.f_rescale_ex = 0.0f;
|
|
299
275
|
return;
|
|
300
276
|
}
|
|
301
277
|
|
|
@@ -349,9 +325,7 @@ void quantize_ex_bits(
|
|
|
349
325
|
compute_ex_factors(
|
|
350
326
|
residual,
|
|
351
327
|
centroid, // Pass centroid for IP metric factor computation
|
|
352
|
-
total_code.data(),
|
|
353
328
|
d,
|
|
354
|
-
ex_bits,
|
|
355
329
|
norm,
|
|
356
330
|
ipnorm,
|
|
357
331
|
ex_factors,
|
|
@@ -60,9 +60,7 @@ void pack_multibit_codes(
|
|
|
60
60
|
*
|
|
61
61
|
* @param residual Original residual vector (data - centroid)
|
|
62
62
|
* @param centroid Centroid vector (can be nullptr for zero centroid)
|
|
63
|
-
* @param tmp_code Quantized ex-bit codes (unpacked integers)
|
|
64
63
|
* @param d Dimensionality
|
|
65
|
-
* @param ex_bits Number of extra bits
|
|
66
64
|
* @param norm L2 norm of residual
|
|
67
65
|
* @param ipnorm Unnormalized inner product
|
|
68
66
|
* @param ex_factors Output factors structure
|
|
@@ -71,9 +69,7 @@ void pack_multibit_codes(
|
|
|
71
69
|
void compute_ex_factors(
|
|
72
70
|
const float* residual,
|
|
73
71
|
const float* centroid,
|
|
74
|
-
const int* tmp_code,
|
|
75
72
|
size_t d,
|
|
76
|
-
size_t ex_bits,
|
|
77
73
|
float norm,
|
|
78
74
|
double ipnorm,
|
|
79
75
|
rabitq_utils::ExtraBitsFactors& ex_factors,
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
#include <faiss/VectorTransform.h>
|
|
19
19
|
#include <faiss/impl/FaissAssert.h>
|
|
20
20
|
#include <faiss/impl/residual_quantizer_encode_steps.h>
|
|
21
|
+
#include <faiss/impl/simd_dispatch.h>
|
|
21
22
|
#include <faiss/utils/distances.h>
|
|
22
23
|
#include <faiss/utils/hamming.h>
|
|
23
24
|
#include <faiss/utils/utils.h>
|
|
@@ -69,23 +70,26 @@ ResidualQuantizer::ResidualQuantizer() {
|
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
ResidualQuantizer::ResidualQuantizer(
|
|
72
|
-
size_t
|
|
73
|
-
const std::vector<size_t>&
|
|
74
|
-
Search_type_t
|
|
73
|
+
size_t d_in,
|
|
74
|
+
const std::vector<size_t>& nbits_in,
|
|
75
|
+
Search_type_t search_type_in)
|
|
75
76
|
: ResidualQuantizer() {
|
|
76
|
-
this->search_type =
|
|
77
|
-
this->d =
|
|
78
|
-
M =
|
|
79
|
-
this->nbits =
|
|
77
|
+
this->search_type = search_type_in;
|
|
78
|
+
this->d = d_in;
|
|
79
|
+
M = nbits_in.size();
|
|
80
|
+
this->nbits = nbits_in;
|
|
80
81
|
set_derived_values();
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
ResidualQuantizer::ResidualQuantizer(
|
|
84
|
-
size_t
|
|
85
|
-
size_t
|
|
86
|
-
size_t
|
|
87
|
-
Search_type_t
|
|
88
|
-
: ResidualQuantizer(
|
|
85
|
+
size_t d_in,
|
|
86
|
+
size_t M_in,
|
|
87
|
+
size_t nbits_in,
|
|
88
|
+
Search_type_t search_type_in)
|
|
89
|
+
: ResidualQuantizer(
|
|
90
|
+
d_in,
|
|
91
|
+
std::vector<size_t>(M_in, nbits_in),
|
|
92
|
+
search_type_in) {}
|
|
89
93
|
|
|
90
94
|
void ResidualQuantizer::initialize_from(
|
|
91
95
|
const ResidualQuantizer& other,
|
|
@@ -141,7 +145,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
141
145
|
double t0 = getmillisecs();
|
|
142
146
|
double clustering_time = 0;
|
|
143
147
|
|
|
144
|
-
for (
|
|
148
|
+
for (size_t m = 0; m < M; m++) {
|
|
145
149
|
int K = 1 << nbits[m];
|
|
146
150
|
|
|
147
151
|
// on which residuals to train
|
|
@@ -156,7 +160,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
156
160
|
}
|
|
157
161
|
train_residuals = residuals1;
|
|
158
162
|
}
|
|
159
|
-
std::vector<float>
|
|
163
|
+
std::vector<float> cur_codebooks;
|
|
160
164
|
float obj = 0;
|
|
161
165
|
|
|
162
166
|
std::unique_ptr<Index> assign_index;
|
|
@@ -174,7 +178,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
174
178
|
train_residuals.size() / d,
|
|
175
179
|
train_residuals.data(),
|
|
176
180
|
*assign_index.get());
|
|
177
|
-
|
|
181
|
+
cur_codebooks.swap(clus.centroids);
|
|
178
182
|
assign_index->reset();
|
|
179
183
|
obj = clus.iteration_stats.back().obj;
|
|
180
184
|
} else { // progressive dim clustering
|
|
@@ -184,14 +188,14 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
184
188
|
train_residuals.size() / d,
|
|
185
189
|
train_residuals.data(),
|
|
186
190
|
assign_index_factory ? *assign_index_factory : default_fac);
|
|
187
|
-
|
|
191
|
+
cur_codebooks.swap(clus.centroids);
|
|
188
192
|
obj = clus.iteration_stats.back().obj;
|
|
189
193
|
}
|
|
190
194
|
clustering_time += (getmillisecs() - t1) / 1000;
|
|
191
195
|
|
|
192
196
|
memcpy(this->codebooks.data() + codebook_offsets[m] * d,
|
|
193
|
-
|
|
194
|
-
|
|
197
|
+
cur_codebooks.data(),
|
|
198
|
+
cur_codebooks.size() * sizeof(cur_codebooks[0]));
|
|
195
199
|
|
|
196
200
|
// quantize using the new codebooks
|
|
197
201
|
|
|
@@ -220,7 +224,7 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
220
224
|
beam_search_encode_step(
|
|
221
225
|
d,
|
|
222
226
|
K,
|
|
223
|
-
|
|
227
|
+
cur_codebooks.data(),
|
|
224
228
|
i1 - i0,
|
|
225
229
|
cur_beam_size,
|
|
226
230
|
residuals.data() + i0 * cur_beam_size * d,
|
|
@@ -238,16 +242,16 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
238
242
|
distances.swap(new_distances);
|
|
239
243
|
|
|
240
244
|
float sum_distances = 0;
|
|
241
|
-
for (
|
|
245
|
+
for (size_t j = 0; j < distances.size(); j++) {
|
|
242
246
|
sum_distances += distances[j];
|
|
243
247
|
}
|
|
244
248
|
|
|
245
249
|
if (verbose) {
|
|
246
|
-
printf("[%.3f s, %.3f s clustering] train stage %
|
|
250
|
+
printf("[%.3f s, %.3f s clustering] train stage %zd, %d bits, kmeans objective %g, "
|
|
247
251
|
"total distance %g, beam_size %d->%d (batch size %zd)\n",
|
|
248
252
|
(getmillisecs() - t0) / 1000,
|
|
249
253
|
clustering_time,
|
|
250
|
-
m,
|
|
254
|
+
size_t(m),
|
|
251
255
|
int(nbits[m]),
|
|
252
256
|
obj,
|
|
253
257
|
sum_distances,
|
|
@@ -274,10 +278,12 @@ void ResidualQuantizer::train(size_t n, const float* x) {
|
|
|
274
278
|
// find min and max norms
|
|
275
279
|
std::vector<float> norms(n);
|
|
276
280
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
282
|
+
for (size_t i = 0; i < n; i++) {
|
|
283
|
+
norms[i] = fvec_L2sqr<SL>(
|
|
284
|
+
x + i * d, residuals.data() + i * cur_beam_size * d, d);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
281
287
|
|
|
282
288
|
// fvec_norms_L2sqr(norms.data(), x, d, n);
|
|
283
289
|
train_norm(n, norms.data());
|
|
@@ -311,7 +317,7 @@ float ResidualQuantizer::retrain_AQ_codebook(size_t n, const float* x) {
|
|
|
311
317
|
std::vector<float> C(n * total_codebook_size);
|
|
312
318
|
for (size_t i = 0; i < n; i++) {
|
|
313
319
|
BitstringReader bsr(codes.data() + i * code_size, code_size);
|
|
314
|
-
for (
|
|
320
|
+
for (size_t m = 0; m < M; m++) {
|
|
315
321
|
int idx = bsr.read(nbits[m]);
|
|
316
322
|
C[i + (codebook_offsets[m] + idx) * n] = 1;
|
|
317
323
|
}
|
|
@@ -393,11 +399,13 @@ float ResidualQuantizer::retrain_AQ_codebook(size_t n, const float* x) {
|
|
|
393
399
|
}
|
|
394
400
|
|
|
395
401
|
float output_recons_error = 0;
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
402
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
403
|
+
for (size_t j = 0; j < d; j++) {
|
|
404
|
+
output_recons_error += fvec_norm_L2sqr<SL>(
|
|
405
|
+
xt.data() + total_codebook_size + n * j,
|
|
406
|
+
n - total_codebook_size);
|
|
407
|
+
}
|
|
408
|
+
});
|
|
401
409
|
if (verbose) {
|
|
402
410
|
printf(" output quantization error %g\n", output_recons_error);
|
|
403
411
|
}
|