faiss 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/ext/faiss/extconf.rb +2 -1
- data/ext/faiss/{index_rb.cpp → index.cpp} +1 -1
- data/ext/faiss/index_binary.cpp +1 -1
- data/ext/faiss/kmeans.cpp +1 -1
- data/ext/faiss/pca_matrix.cpp +1 -1
- data/ext/faiss/product_quantizer.cpp +1 -1
- data/ext/faiss/{utils_rb.cpp → utils.cpp} +1 -1
- data/lib/faiss/version.rb +1 -1
- data/vendor/faiss/faiss/AutoTune.cpp +93 -80
- data/vendor/faiss/faiss/Clustering.cpp +39 -240
- data/vendor/faiss/faiss/Clustering.h +6 -0
- data/vendor/faiss/faiss/IVFlib.cpp +41 -21
- data/vendor/faiss/faiss/Index.cpp +6 -5
- data/vendor/faiss/faiss/Index.h +5 -5
- data/vendor/faiss/faiss/Index2Layer.cpp +37 -53
- data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +49 -37
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +36 -34
- data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexBinary.cpp +5 -3
- data/vendor/faiss/faiss/IndexBinary.h +4 -4
- data/vendor/faiss/faiss/IndexBinaryFlat.cpp +1 -1
- data/vendor/faiss/faiss/IndexBinaryFlat.h +1 -1
- data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +4 -4
- data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +88 -97
- data/vendor/faiss/faiss/IndexBinaryHNSW.h +9 -3
- data/vendor/faiss/faiss/IndexBinaryHash.cpp +45 -236
- data/vendor/faiss/faiss/IndexBinaryHash.h +6 -6
- data/vendor/faiss/faiss/IndexBinaryIVF.cpp +89 -417
- data/vendor/faiss/faiss/IndexFastScan.cpp +72 -109
- data/vendor/faiss/faiss/IndexFastScan.h +25 -23
- data/vendor/faiss/faiss/IndexFlat.cpp +27 -20
- data/vendor/faiss/faiss/IndexFlat.h +21 -18
- data/vendor/faiss/faiss/IndexFlatCodes.cpp +42 -19
- data/vendor/faiss/faiss/IndexHNSW.cpp +374 -206
- data/vendor/faiss/faiss/IndexHNSW.h +16 -2
- data/vendor/faiss/faiss/IndexIDMap.cpp +25 -21
- data/vendor/faiss/faiss/IndexIDMap.h +9 -7
- data/vendor/faiss/faiss/IndexIVF.cpp +467 -364
- data/vendor/faiss/faiss/IndexIVF.h +33 -12
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +79 -76
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +96 -93
- data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -1
- data/vendor/faiss/faiss/IndexIVFFastScan.cpp +357 -238
- data/vendor/faiss/faiss/IndexIVFFastScan.h +42 -41
- data/vendor/faiss/faiss/IndexIVFFlat.cpp +39 -69
- data/vendor/faiss/faiss/IndexIVFFlat.h +32 -0
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.cpp +56 -33
- data/vendor/faiss/faiss/IndexIVFFlatPanorama.h +3 -1
- data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +18 -15
- data/vendor/faiss/faiss/IndexIVFPQ.cpp +73 -846
- data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +151 -121
- data/vendor/faiss/faiss/IndexIVFPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexIVFPQR.cpp +23 -20
- data/vendor/faiss/faiss/IndexIVFRaBitQ.cpp +30 -52
- data/vendor/faiss/faiss/IndexIVFRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.cpp +475 -476
- data/vendor/faiss/faiss/IndexIVFRaBitQFastScan.h +248 -93
- data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +41 -127
- data/vendor/faiss/faiss/IndexIVFSpectralHash.h +1 -1
- data/vendor/faiss/faiss/IndexLSH.cpp +36 -19
- data/vendor/faiss/faiss/IndexLattice.cpp +13 -13
- data/vendor/faiss/faiss/IndexNNDescent.cpp +36 -21
- data/vendor/faiss/faiss/IndexNNDescent.h +2 -2
- data/vendor/faiss/faiss/IndexNSG.cpp +38 -23
- data/vendor/faiss/faiss/IndexNeuralNetCodec.cpp +31 -11
- data/vendor/faiss/faiss/IndexPQ.cpp +128 -221
- data/vendor/faiss/faiss/IndexPQ.h +3 -2
- data/vendor/faiss/faiss/IndexPQFastScan.cpp +20 -14
- data/vendor/faiss/faiss/IndexPQFastScan.h +3 -0
- data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -18
- data/vendor/faiss/faiss/IndexPreTransform.h +1 -1
- data/vendor/faiss/faiss/IndexRaBitQ.cpp +11 -36
- data/vendor/faiss/faiss/IndexRaBitQ.h +2 -1
- data/vendor/faiss/faiss/IndexRaBitQFastScan.cpp +41 -277
- data/vendor/faiss/faiss/IndexRaBitQFastScan.h +183 -27
- data/vendor/faiss/faiss/IndexRefine.cpp +30 -25
- data/vendor/faiss/faiss/IndexRefine.h +4 -4
- data/vendor/faiss/faiss/IndexReplicas.cpp +6 -6
- data/vendor/faiss/faiss/IndexRowwiseMinMax.cpp +15 -14
- data/vendor/faiss/faiss/IndexRowwiseMinMax.h +1 -1
- data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +150 -20
- data/vendor/faiss/faiss/IndexScalarQuantizer.h +10 -0
- data/vendor/faiss/faiss/IndexShards.cpp +10 -9
- data/vendor/faiss/faiss/IndexShardsIVF.cpp +21 -15
- data/vendor/faiss/faiss/MatrixStats.cpp +5 -4
- data/vendor/faiss/faiss/MetaIndexes.cpp +19 -17
- data/vendor/faiss/faiss/MetaIndexes.h +1 -1
- data/vendor/faiss/faiss/MetricType.h +14 -7
- data/vendor/faiss/faiss/SuperKMeans.cpp +656 -0
- data/vendor/faiss/faiss/SuperKMeans.h +97 -0
- data/vendor/faiss/faiss/VectorTransform.cpp +237 -149
- data/vendor/faiss/faiss/VectorTransform.h +16 -16
- data/vendor/faiss/faiss/build.cpp +23 -0
- data/vendor/faiss/faiss/build.h +15 -0
- data/vendor/faiss/faiss/clone_index.cpp +48 -47
- data/vendor/faiss/faiss/cppcontrib/SaDecodeKernels.h +1 -1
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-avx2-inl.h +47 -47
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-inl.h +11 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/Level2-neon-inl.h +902 -12
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-avx2-inl.h +38 -38
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-inl.h +11 -0
- data/vendor/faiss/faiss/cppcontrib/sa_decode/PQ-neon-inl.h +702 -10
- data/vendor/faiss/faiss/factory_tools.cpp +9 -0
- data/vendor/faiss/faiss/gpu/GpuIndexCagra.h +6 -5
- data/vendor/faiss/faiss/gpu/GpuResources.h +3 -2
- data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +15 -16
- data/vendor/faiss/faiss/gpu/StandardGpuResources.h +5 -4
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +46 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +56 -0
- data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +78 -1
- data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +72 -0
- data/vendor/faiss/faiss/gpu/test/TestUtils.h +23 -0
- data/vendor/faiss/faiss/gpu/utils/CuvsFilterConvert.h +1 -1
- data/vendor/faiss/faiss/gpu/utils/CuvsUtils.h +21 -10
- data/vendor/faiss/faiss/gpu_metal/GpuIndexFlat.h +22 -0
- data/vendor/faiss/faiss/gpu_metal/MetalCloner.h +35 -0
- data/vendor/faiss/faiss/gpu_metal/MetalDistance.h +87 -0
- data/vendor/faiss/faiss/gpu_metal/MetalFlatKernels.h +40 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndex.h +58 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexFlat.h +65 -0
- data/vendor/faiss/faiss/gpu_metal/MetalIndexIVFFlat.h +181 -0
- data/vendor/faiss/faiss/gpu_metal/MetalKernels.h +111 -0
- data/vendor/faiss/faiss/gpu_metal/MetalPythonBridge.h +45 -0
- data/vendor/faiss/faiss/gpu_metal/MetalResources.h +79 -0
- data/vendor/faiss/faiss/gpu_metal/StandardMetalResources.h +35 -0
- data/vendor/faiss/faiss/gpu_metal/impl/MetalIVFFlat.h +193 -0
- data/vendor/faiss/faiss/impl/AdSampling.cpp +103 -0
- data/vendor/faiss/faiss/impl/AdSampling.h +35 -0
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +29 -25
- data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +1 -0
- data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +10 -9
- data/vendor/faiss/faiss/impl/AuxIndexStructures.h +3 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.cpp +244 -0
- data/vendor/faiss/faiss/impl/ClusteringHelpers.h +94 -0
- data/vendor/faiss/faiss/impl/ClusteringInitialization.cpp +16 -16
- data/vendor/faiss/faiss/impl/CodePacker.cpp +3 -3
- data/vendor/faiss/faiss/impl/CodePackerRaBitQ.cpp +1 -1
- data/vendor/faiss/faiss/impl/DistanceComputer.h +8 -8
- data/vendor/faiss/faiss/impl/FaissAssert.h +6 -3
- data/vendor/faiss/faiss/impl/FaissException.h +50 -3
- data/vendor/faiss/faiss/impl/HNSW.cpp +639 -507
- data/vendor/faiss/faiss/impl/HNSW.h +61 -44
- data/vendor/faiss/faiss/impl/IDSelector.cpp +15 -11
- data/vendor/faiss/faiss/impl/IDSelector.h +8 -8
- data/vendor/faiss/faiss/impl/InvertedListScannerStats.h +26 -0
- data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +82 -77
- data/vendor/faiss/faiss/impl/NNDescent.cpp +62 -25
- data/vendor/faiss/faiss/impl/NNDescent.h +6 -2
- data/vendor/faiss/faiss/impl/NSG.cpp +53 -32
- data/vendor/faiss/faiss/impl/NSG.h +4 -4
- data/vendor/faiss/faiss/impl/Panorama.cpp +23 -6
- data/vendor/faiss/faiss/impl/Panorama.h +269 -87
- data/vendor/faiss/faiss/impl/PdxLayout.cpp +93 -0
- data/vendor/faiss/faiss/impl/PdxLayout.h +41 -0
- data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +46 -32
- data/vendor/faiss/faiss/impl/PolysemousTraining.h +3 -3
- data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.cpp +35 -35
- data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +21 -16
- data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +55 -25
- data/vendor/faiss/faiss/impl/Quantizer.h +2 -2
- data/vendor/faiss/faiss/impl/RaBitQUtils.cpp +55 -49
- data/vendor/faiss/faiss/impl/RaBitQUtils.h +65 -0
- data/vendor/faiss/faiss/impl/RaBitQuantizer.cpp +302 -283
- data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +26 -23
- data/vendor/faiss/faiss/impl/ResidualQuantizer.h +1 -1
- data/vendor/faiss/faiss/impl/ResultHandler.h +100 -75
- data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +318 -7
- data/vendor/faiss/faiss/impl/ScalarQuantizer.h +77 -1
- data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +14 -11
- data/vendor/faiss/faiss/impl/VisitedTable.cpp +10 -10
- data/vendor/faiss/faiss/impl/VisitedTable.h +70 -28
- data/vendor/faiss/faiss/impl/approx_topk/approx_topk.h +276 -0
- data/vendor/faiss/faiss/impl/approx_topk/avx2.cpp +68 -0
- data/vendor/faiss/faiss/{utils → impl}/approx_topk/generic.h +15 -8
- data/vendor/faiss/faiss/impl/approx_topk/neon.cpp +68 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab-inl.h +169 -0
- data/vendor/faiss/faiss/impl/approx_topk/rq_beam_search_tab.h +117 -0
- data/vendor/faiss/faiss/impl/approx_topk/simdlib256-inl.h +146 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHNSW_impl.h +73 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryHash_impl.h +270 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexBinaryIVF_impl.h +460 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexIVFSpectralHash_impl.h +159 -0
- data/vendor/faiss/faiss/impl/binary_hamming/IndexPQ_impl.h +92 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx2.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/avx512.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/dispatch.h +143 -0
- data/vendor/faiss/faiss/impl/binary_hamming/neon.cpp +26 -0
- data/vendor/faiss/faiss/impl/binary_hamming/rvv.cpp +26 -0
- data/vendor/faiss/faiss/impl/expanded_scanners.h +8 -3
- data/vendor/faiss/faiss/impl/{FastScanDistancePostProcessing.h → fast_scan/FastScanDistancePostProcessing.h} +13 -6
- data/vendor/faiss/faiss/impl/{LookupTableScaler.h → fast_scan/LookupTableScaler.h} +16 -5
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops.h +237 -0
- data/vendor/faiss/faiss/impl/fast_scan/accumulate_loops_512.h +185 -0
- data/vendor/faiss/faiss/impl/fast_scan/decompose_qbs.h +229 -0
- data/vendor/faiss/faiss/impl/fast_scan/dispatching.h +270 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan.cpp → fast_scan/fast_scan.cpp} +169 -2
- data/vendor/faiss/faiss/impl/fast_scan/fast_scan.h +341 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx2.cpp +36 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-avx512.cpp +40 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-neon.cpp +120 -0
- data/vendor/faiss/faiss/impl/fast_scan/impl-riscv.cpp +104 -0
- data/vendor/faiss/faiss/impl/fast_scan/kernels_simd256.h +213 -0
- data/vendor/faiss/faiss/impl/{pq4_fast_scan_search_qbs.cpp → fast_scan/kernels_simd512.h} +26 -356
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_dispatching.h +90 -0
- data/vendor/faiss/faiss/impl/fast_scan/rabitq_result_handler.h +108 -0
- data/vendor/faiss/faiss/impl/{simd_result_handlers.h → fast_scan/simd_result_handlers.h} +282 -134
- data/vendor/faiss/faiss/impl/hnsw/LockVector.cpp +54 -0
- data/vendor/faiss/faiss/impl/hnsw/LockVector.h +64 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.cpp +83 -0
- data/vendor/faiss/faiss/impl/hnsw/MinimaxHeap.h +113 -0
- data/vendor/faiss/faiss/impl/hnsw/avx2.cpp +150 -0
- data/vendor/faiss/faiss/impl/hnsw/avx512.cpp +142 -0
- data/vendor/faiss/faiss/impl/index_read.cpp +1227 -79
- data/vendor/faiss/faiss/impl/index_read_utils.h +1 -1
- data/vendor/faiss/faiss/impl/index_write.cpp +96 -13
- data/vendor/faiss/faiss/impl/io.cpp +6 -6
- data/vendor/faiss/faiss/impl/io_macros.h +58 -16
- data/vendor/faiss/faiss/impl/kmeans1d.cpp +10 -10
- data/vendor/faiss/faiss/impl/lattice_Zn.cpp +37 -23
- data/vendor/faiss/faiss/impl/lattice_Zn.h +6 -6
- data/vendor/faiss/faiss/impl/mapped_io.cpp +6 -6
- data/vendor/faiss/faiss/impl/platform_macros.h +15 -4
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQScanner_impl.h +549 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.cpp +245 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/IVFPQ_QueryTables.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/PQDistanceComputer_impl.h +106 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx2.cpp +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/avx512.cpp +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/neon.cpp +23 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx2.cpp → pq_code_distance-avx2.h} +9 -13
- data/vendor/faiss/faiss/impl/pq_code_distance/{pq_code_distance-avx512.cpp → pq_code_distance-avx512.h} +9 -57
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.cpp +45 -107
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-generic.h +96 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-inl.h +274 -5
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_code_distance-sve.cpp +10 -7
- data/vendor/faiss/faiss/impl/pq_code_distance/pq_scan_impl.h +105 -0
- data/vendor/faiss/faiss/impl/pq_code_distance/rvv.cpp +70 -0
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +311 -477
- data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/codecs.h +1 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/distance_computers.h +9 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/quantizers.h +419 -19
- data/vendor/faiss/faiss/impl/scalar_quantizer/scanners.h +27 -1
- data/vendor/faiss/faiss/impl/scalar_quantizer/similarities.h +3 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx2.cpp +387 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-impl.h +553 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512-spr.cpp +559 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-avx512.cpp +341 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-dispatch.h +425 -3
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-neon.cpp +290 -2
- data/vendor/faiss/faiss/impl/scalar_quantizer/sq-rvv.cpp +337 -0
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.cpp +192 -8
- data/vendor/faiss/faiss/impl/scalar_quantizer/training.h +12 -0
- data/vendor/faiss/faiss/impl/simd_dispatch.h +157 -66
- data/vendor/faiss/faiss/impl/simdlib/simdlib.h +57 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_avx2.h +264 -172
- data/vendor/faiss/faiss/impl/simdlib/simdlib_avx512.h +414 -0
- data/vendor/faiss/faiss/impl/simdlib/simdlib_dispatch.h +44 -0
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_emulated.h +231 -166
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_neon.h +270 -218
- data/vendor/faiss/faiss/{utils → impl/simdlib}/simdlib_ppc64.h +201 -160
- data/vendor/faiss/faiss/impl/svs_io.cpp +12 -3
- data/vendor/faiss/faiss/impl/svs_io.h +8 -2
- data/vendor/faiss/faiss/index_factory.cpp +90 -18
- data/vendor/faiss/faiss/index_io.h +40 -0
- data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +66 -16
- data/vendor/faiss/faiss/invlists/DirectMap.cpp +28 -15
- data/vendor/faiss/faiss/invlists/DirectMap.h +4 -3
- data/vendor/faiss/faiss/invlists/InvertedLists.cpp +170 -86
- data/vendor/faiss/faiss/invlists/InvertedLists.h +88 -25
- data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +4 -4
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +13 -13
- data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFaissUtils.h +1 -1
- data/vendor/faiss/faiss/svs/IndexSVSFlat.cpp +2 -2
- data/vendor/faiss/faiss/svs/IndexSVSIVF.cpp +350 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVF.h +128 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.cpp +40 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLVQ.h +43 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.cpp +225 -0
- data/vendor/faiss/faiss/svs/IndexSVSIVFLeanVec.h +71 -0
- data/vendor/faiss/faiss/svs/IndexSVSVamana.cpp +142 -21
- data/vendor/faiss/faiss/svs/IndexSVSVamana.h +33 -7
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.cpp +3 -2
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLVQ.h +2 -1
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.cpp +77 -27
- data/vendor/faiss/faiss/svs/IndexSVSVamanaLeanVec.h +10 -4
- data/vendor/faiss/faiss/utils/Heap.cpp +10 -10
- data/vendor/faiss/faiss/utils/NeuralNet.cpp +47 -36
- data/vendor/faiss/faiss/utils/NeuralNet.h +1 -1
- data/vendor/faiss/faiss/utils/approx_topk_hamming/approx_topk_hamming.h +10 -4
- data/vendor/faiss/faiss/utils/bf16.h +34 -0
- data/vendor/faiss/faiss/utils/distances.cpp +390 -560
- data/vendor/faiss/faiss/utils/distances.h +20 -1
- data/vendor/faiss/faiss/utils/distances_dispatch.h +117 -37
- data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +8 -7
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +33 -14
- data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +12 -1
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +16 -293
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_based_neon.cpp +57 -0
- data/vendor/faiss/faiss/utils/distances_fused/simdlib_kernel-inl.h +290 -0
- data/vendor/faiss/faiss/utils/distances_simd.cpp +5 -178
- data/vendor/faiss/faiss/utils/extra_distances.cpp +9 -8
- data/vendor/faiss/faiss/utils/extra_distances.h +32 -6
- data/vendor/faiss/faiss/utils/hamming-inl.h +13 -11
- data/vendor/faiss/faiss/utils/hamming.cpp +66 -517
- data/vendor/faiss/faiss/utils/hamming.h +92 -2
- data/vendor/faiss/faiss/utils/hamming_distance/common.h +287 -10
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx2.cpp +16 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_avx512_spr.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx2.h +142 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512.h +210 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-avx512_spr.h +171 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-generic.h +368 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-neon.h +322 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer-rvv.h +39 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_computer.h +146 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_neon.cpp +15 -0
- data/vendor/faiss/faiss/utils/hamming_distance/hamming_rvv.cpp +15 -0
- data/vendor/faiss/faiss/utils/partitioning.cpp +66 -989
- data/vendor/faiss/faiss/utils/partitioning.h +31 -0
- data/vendor/faiss/faiss/utils/popcount.h +29 -0
- data/vendor/faiss/faiss/utils/pq_code_distance.h +2 -2
- data/vendor/faiss/faiss/utils/prefetch.h +2 -2
- data/vendor/faiss/faiss/utils/quantize_lut.cpp +30 -30
- data/vendor/faiss/faiss/utils/quantize_lut.h +1 -1
- data/vendor/faiss/faiss/utils/rabitq_simd.h +57 -536
- data/vendor/faiss/faiss/utils/random.cpp +6 -6
- data/vendor/faiss/faiss/utils/simd_impl/IVFFlatScanner-inl.h +51 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_aarch64.cpp +5 -1
- data/vendor/faiss/faiss/utils/simd_impl/distances_arm_sve.cpp +213 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_autovec-inl.h +163 -10
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx2.cpp +250 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_avx512.cpp +7 -4
- data/vendor/faiss/faiss/utils/simd_impl/distances_rvv.cpp +189 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_simdlib256.h +195 -0
- data/vendor/faiss/faiss/utils/simd_impl/distances_sse-inl.h +2 -1
- data/vendor/faiss/faiss/utils/{distances_fused/simdlib_based.h → simd_impl/exhaustive_L2sqr_blas_cmax.h} +5 -10
- data/vendor/faiss/faiss/utils/simd_impl/hamming_impl.h +481 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_avx2.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_neon.cpp +14 -0
- data/vendor/faiss/faiss/utils/simd_impl/partitioning_simdlib256.h +1031 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx2.cpp +355 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512.cpp +477 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_avx512_spr.cpp +343 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_neon.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/rabitq_rvv.cpp +55 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_dispatch.h +32 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels.h +43 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx2.cpp +57 -0
- data/vendor/faiss/faiss/utils/simd_impl/super_kmeans_kernels_avx512.cpp +45 -0
- data/vendor/faiss/faiss/utils/simd_levels.cpp +29 -7
- data/vendor/faiss/faiss/utils/simd_levels.h +93 -1
- data/vendor/faiss/faiss/utils/sorting.cpp +48 -36
- data/vendor/faiss/faiss/utils/utils.cpp +5 -5
- data/vendor/faiss/faiss/utils/utils.h +3 -3
- metadata +129 -34
- data/vendor/faiss/faiss/impl/RaBitQStats.cpp +0 -29
- data/vendor/faiss/faiss/impl/RaBitQStats.h +0 -56
- data/vendor/faiss/faiss/impl/pq4_fast_scan.h +0 -224
- data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +0 -230
- data/vendor/faiss/faiss/utils/approx_topk/approx_topk.h +0 -84
- data/vendor/faiss/faiss/utils/approx_topk/avx2-inl.h +0 -196
- data/vendor/faiss/faiss/utils/approx_topk/mode.h +0 -34
- data/vendor/faiss/faiss/utils/distances_fused/avx512.h +0 -36
- data/vendor/faiss/faiss/utils/extra_distances-inl.h +0 -235
- data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +0 -462
- data/vendor/faiss/faiss/utils/hamming_distance/avx512-inl.h +0 -490
- data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +0 -449
- data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +0 -87
- data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +0 -524
- data/vendor/faiss/faiss/utils/simdlib.h +0 -42
- data/vendor/faiss/faiss/utils/simdlib_avx512.h +0 -365
- /data/ext/faiss/{utils_rb.h → utils.h} +0 -0
|
@@ -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() {
|