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
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
#include <cstring>
|
|
19
19
|
#include <memory>
|
|
20
20
|
|
|
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/random.h>
|
|
@@ -53,11 +54,11 @@ double PermutationObjective::cost_update(const int* perm, int iw, int jw)
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
SimulatedAnnealingOptimizer::SimulatedAnnealingOptimizer(
|
|
56
|
-
PermutationObjective*
|
|
57
|
+
PermutationObjective* obj_in,
|
|
57
58
|
const SimulatedAnnealingParameters& p)
|
|
58
59
|
: SimulatedAnnealingParameters(p),
|
|
59
|
-
obj(
|
|
60
|
-
n(
|
|
60
|
+
obj(obj_in),
|
|
61
|
+
n(obj_in->n),
|
|
61
62
|
logfile(nullptr) {
|
|
62
63
|
rnd = new RandomGenerator(p.seed);
|
|
63
64
|
FAISS_THROW_IF_NOT(n < 100000 && n >= 0);
|
|
@@ -164,7 +165,7 @@ double SimulatedAnnealingOptimizer::optimize(int* perm) {
|
|
|
164
165
|
****************************************************/
|
|
165
166
|
|
|
166
167
|
static inline int hamming_dis(uint64_t a, uint64_t b) {
|
|
167
|
-
return
|
|
168
|
+
return popcount64(a ^ b);
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
namespace {
|
|
@@ -259,10 +260,10 @@ struct ReproduceWithHammingObjective : PermutationObjective {
|
|
|
259
260
|
}
|
|
260
261
|
|
|
261
262
|
ReproduceWithHammingObjective(
|
|
262
|
-
int
|
|
263
|
+
int nbits_in,
|
|
263
264
|
const std::vector<double>& dis_table,
|
|
264
|
-
double
|
|
265
|
-
: nbits(
|
|
265
|
+
double dis_weight_factor_in)
|
|
266
|
+
: nbits(nbits_in), dis_weight_factor(dis_weight_factor_in) {
|
|
266
267
|
n = 1 << nbits;
|
|
267
268
|
FAISS_THROW_IF_NOT(dis_table.size() == n * n);
|
|
268
269
|
set_affine_target_dis(dis_table);
|
|
@@ -372,12 +373,12 @@ double ReproduceDistancesObjective::cost_update(const int* perm, int iw, int jw)
|
|
|
372
373
|
}
|
|
373
374
|
|
|
374
375
|
ReproduceDistancesObjective::ReproduceDistancesObjective(
|
|
375
|
-
int
|
|
376
|
+
int n_in,
|
|
376
377
|
const double* source_dis_in,
|
|
377
378
|
const double* target_dis_in,
|
|
378
|
-
double
|
|
379
|
-
: dis_weight_factor(
|
|
380
|
-
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;
|
|
381
382
|
set_affine_target_dis(source_dis_in);
|
|
382
383
|
}
|
|
383
384
|
|
|
@@ -387,7 +388,7 @@ void ReproduceDistancesObjective::compute_mean_stdev(
|
|
|
387
388
|
double* mean_out,
|
|
388
389
|
double* stddev_out) {
|
|
389
390
|
double sum = 0, sum2 = 0;
|
|
390
|
-
for (
|
|
391
|
+
for (size_t i = 0; i < n2; i++) {
|
|
391
392
|
sum += tab[i];
|
|
392
393
|
sum2 += tab[i] * tab[i];
|
|
393
394
|
}
|
|
@@ -431,6 +432,8 @@ void ReproduceDistancesObjective::set_affine_target_dis(
|
|
|
431
432
|
* Cost functions: RankingScore
|
|
432
433
|
****************************************************/
|
|
433
434
|
|
|
435
|
+
namespace {
|
|
436
|
+
|
|
434
437
|
/// Maintains a 3D table of elementary costs.
|
|
435
438
|
/// Accumulates elements based on Hamming distance comparisons
|
|
436
439
|
template <typename Ttab, typename Taccu>
|
|
@@ -665,18 +668,18 @@ struct RankingScore2 : Score3Computer<float, double> {
|
|
|
665
668
|
const float* gt_distances;
|
|
666
669
|
|
|
667
670
|
RankingScore2(
|
|
668
|
-
int
|
|
669
|
-
int
|
|
670
|
-
int
|
|
671
|
-
const uint32_t*
|
|
672
|
-
const uint32_t*
|
|
673
|
-
const float*
|
|
674
|
-
: nbits(
|
|
675
|
-
nq(
|
|
676
|
-
nb(
|
|
677
|
-
qcodes(
|
|
678
|
-
bcodes(
|
|
679
|
-
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) {
|
|
680
683
|
n = nc = 1 << nbits;
|
|
681
684
|
n_gt.resize(nc * nc * nc);
|
|
682
685
|
init_n_gt();
|
|
@@ -756,6 +759,8 @@ struct RankingScore2 : Score3Computer<float, double> {
|
|
|
756
759
|
}
|
|
757
760
|
};
|
|
758
761
|
|
|
762
|
+
} // namespace
|
|
763
|
+
|
|
759
764
|
/*****************************************
|
|
760
765
|
* PolysemousTraining
|
|
761
766
|
******************************************/
|
|
@@ -791,19 +796,25 @@ void PolysemousTraining::optimize_reproduce_distances(
|
|
|
791
796
|
}
|
|
792
797
|
|
|
793
798
|
#pragma omp parallel for num_threads(nt)
|
|
794
|
-
for (int m = 0; m < pq.M; m++) {
|
|
799
|
+
for (int m = 0; m < static_cast<int>(pq.M); m++) {
|
|
795
800
|
std::vector<double> dis_table;
|
|
796
801
|
|
|
797
802
|
// printf ("Optimizing quantizer %d\n", m);
|
|
798
803
|
|
|
799
804
|
float* centroids = pq.get_centroids(m, 0);
|
|
800
805
|
|
|
801
|
-
|
|
802
|
-
for (int
|
|
803
|
-
|
|
804
|
-
|
|
806
|
+
auto compute_dis_table = [&]<SIMDLevel SL>() {
|
|
807
|
+
for (int i = 0; i < n; i++) {
|
|
808
|
+
for (int j = 0; j < n; j++) {
|
|
809
|
+
dis_table.push_back(
|
|
810
|
+
fvec_L2sqr<SL>(
|
|
811
|
+
centroids + i * dsub,
|
|
812
|
+
centroids + j * dsub,
|
|
813
|
+
dsub));
|
|
814
|
+
}
|
|
805
815
|
}
|
|
806
|
-
}
|
|
816
|
+
};
|
|
817
|
+
with_simd_level(compute_dis_table);
|
|
807
818
|
|
|
808
819
|
std::vector<int> perm(n);
|
|
809
820
|
ReproduceWithHammingObjective obj(nbits, dis_table, dis_weight_factor);
|
|
@@ -812,7 +823,14 @@ void PolysemousTraining::optimize_reproduce_distances(
|
|
|
812
823
|
|
|
813
824
|
if (log_pattern.size()) {
|
|
814
825
|
char fname[256];
|
|
826
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
827
|
+
#pragma GCC diagnostic push
|
|
828
|
+
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
|
829
|
+
#endif
|
|
815
830
|
snprintf(fname, 256, log_pattern.c_str(), m);
|
|
831
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
832
|
+
#pragma GCC diagnostic pop
|
|
833
|
+
#endif
|
|
816
834
|
printf("opening log file %s\n", fname);
|
|
817
835
|
optim.logfile = fopen(fname, "w");
|
|
818
836
|
FAISS_THROW_IF_NOT_MSG(optim.logfile, "could not open logfile");
|
|
@@ -861,21 +879,21 @@ void PolysemousTraining::optimize_ranking(
|
|
|
861
879
|
}
|
|
862
880
|
|
|
863
881
|
#pragma omp parallel for
|
|
864
|
-
for (int m = 0; m < pq.M; m++) {
|
|
882
|
+
for (int m = 0; m < static_cast<int>(pq.M); m++) {
|
|
865
883
|
size_t nq, nb;
|
|
866
884
|
std::vector<uint32_t> codes; // query codes, then db codes
|
|
867
885
|
std::vector<float> gt_distances; // nq * nb matrix of distances
|
|
868
886
|
|
|
869
887
|
if (n > 0) {
|
|
870
888
|
std::vector<float> xtrain(n * dsub);
|
|
871
|
-
for (
|
|
889
|
+
for (size_t i = 0; i < n; i++) {
|
|
872
890
|
memcpy(xtrain.data() + i * dsub,
|
|
873
891
|
x + i * pq.d + m * dsub,
|
|
874
892
|
sizeof(float) * dsub);
|
|
875
893
|
}
|
|
876
894
|
|
|
877
895
|
codes.resize(n);
|
|
878
|
-
for (
|
|
896
|
+
for (size_t i = 0; i < n; i++) {
|
|
879
897
|
codes[i] = all_codes[i * pq.code_size + m];
|
|
880
898
|
}
|
|
881
899
|
|
|
@@ -890,8 +908,8 @@ void PolysemousTraining::optimize_ranking(
|
|
|
890
908
|
} else {
|
|
891
909
|
nq = nb = pq.ksub;
|
|
892
910
|
codes.resize(2 * nq);
|
|
893
|
-
for (
|
|
894
|
-
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);
|
|
895
913
|
}
|
|
896
914
|
|
|
897
915
|
gt_distances.resize(nq * nb);
|
|
@@ -924,7 +942,14 @@ void PolysemousTraining::optimize_ranking(
|
|
|
924
942
|
|
|
925
943
|
if (log_pattern.size()) {
|
|
926
944
|
char fname[256];
|
|
945
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
946
|
+
#pragma GCC diagnostic push
|
|
947
|
+
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
|
948
|
+
#endif
|
|
927
949
|
snprintf(fname, 256, log_pattern.c_str(), m);
|
|
950
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
951
|
+
#pragma GCC diagnostic pop
|
|
952
|
+
#endif
|
|
928
953
|
printf("opening log file %s\n", fname);
|
|
929
954
|
optim.logfile = fopen(fname, "w");
|
|
930
955
|
FAISS_THROW_IF_NOT_FMT(
|
|
@@ -946,11 +971,11 @@ void PolysemousTraining::optimize_ranking(
|
|
|
946
971
|
float* centroids = pq.get_centroids(m, 0);
|
|
947
972
|
|
|
948
973
|
std::vector<float> centroids_copy;
|
|
949
|
-
for (
|
|
974
|
+
for (size_t i = 0; i < dsub * pq.ksub; i++) {
|
|
950
975
|
centroids_copy.push_back(centroids[i]);
|
|
951
976
|
}
|
|
952
977
|
|
|
953
|
-
for (
|
|
978
|
+
for (size_t i = 0; i < pq.ksub; i++) {
|
|
954
979
|
memcpy(centroids + perm[i] * dsub,
|
|
955
980
|
centroids_copy.data() + i * dsub,
|
|
956
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() {
|