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 <faiss/MetaIndexes.h>
|
|
19
19
|
#include <faiss/clone_index.h>
|
|
20
20
|
#include <faiss/impl/FaissAssert.h>
|
|
21
|
+
#include <faiss/impl/simd_dispatch.h>
|
|
21
22
|
#include <faiss/index_io.h>
|
|
22
23
|
#include <faiss/utils/distances.h>
|
|
23
24
|
#include <faiss/utils/hamming.h>
|
|
@@ -36,7 +37,7 @@ void check_compatible_for_merge(const Index* index0, const Index* index1) {
|
|
|
36
37
|
FAISS_THROW_IF_NOT_MSG(pt1, "both indexes should be pretransforms");
|
|
37
38
|
|
|
38
39
|
FAISS_THROW_IF_NOT(pt0->chain.size() == pt1->chain.size());
|
|
39
|
-
for (
|
|
40
|
+
for (size_t i = 0; i < pt0->chain.size(); i++) {
|
|
40
41
|
FAISS_THROW_IF_NOT(typeid(pt0->chain[i]) == typeid(pt1->chain[i]));
|
|
41
42
|
}
|
|
42
43
|
|
|
@@ -124,7 +125,7 @@ void search_centroid(
|
|
|
124
125
|
index = index_pre->index;
|
|
125
126
|
}
|
|
126
127
|
faiss::IndexIVF* index_ivf = dynamic_cast<faiss::IndexIVF*>(index);
|
|
127
|
-
|
|
128
|
+
FAISS_THROW_IF_NOT_MSG(index_ivf, "could not extract IVF index");
|
|
128
129
|
index_ivf->quantizer->assign(n, x, centroid_ids);
|
|
129
130
|
}
|
|
130
131
|
|
|
@@ -145,7 +146,7 @@ void search_and_return_centroids(
|
|
|
145
146
|
index = index_pre->index;
|
|
146
147
|
}
|
|
147
148
|
faiss::IndexIVF* index_ivf = dynamic_cast<faiss::IndexIVF*>(index);
|
|
148
|
-
|
|
149
|
+
FAISS_THROW_IF_NOT_MSG(index_ivf, "could not extract IVF index");
|
|
149
150
|
|
|
150
151
|
size_t nprobe = index_ivf->nprobe;
|
|
151
152
|
std::vector<idx_t> cent_nos(n * nprobe);
|
|
@@ -179,9 +180,9 @@ void search_and_return_centroids(
|
|
|
179
180
|
}
|
|
180
181
|
}
|
|
181
182
|
|
|
182
|
-
SlidingIndexWindow::SlidingIndexWindow(Index*
|
|
183
|
+
SlidingIndexWindow::SlidingIndexWindow(Index* index_) : index(index_) {
|
|
183
184
|
n_slice = 0;
|
|
184
|
-
IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf(
|
|
185
|
+
IndexIVF* index_ivf = const_cast<IndexIVF*>(extract_index_ivf(index_));
|
|
185
186
|
ils = dynamic_cast<ArrayInvertedLists*>(index_ivf->invlists);
|
|
186
187
|
FAISS_THROW_IF_NOT_MSG(
|
|
187
188
|
ils, "only supports indexes with ArrayInvertedLists");
|
|
@@ -248,7 +249,7 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
|
|
|
248
249
|
IndexIVF* index_ivf = extract_index_ivf(index);
|
|
249
250
|
|
|
250
251
|
if (remove_oldest && ils2) {
|
|
251
|
-
for (
|
|
252
|
+
for (size_t i = 0; i < nlist; i++) {
|
|
252
253
|
std::vector<size_t>& sizesi = sizes[i];
|
|
253
254
|
size_t amount_to_remove = sizesi[0];
|
|
254
255
|
index_ivf->ntotal += ils2->ids[i].size() - amount_to_remove;
|
|
@@ -264,7 +265,7 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
|
|
|
264
265
|
sizesi[n_slice - 1] = ils->ids[i].size();
|
|
265
266
|
}
|
|
266
267
|
} else if (ils2) {
|
|
267
|
-
for (
|
|
268
|
+
for (size_t i = 0; i < nlist; i++) {
|
|
268
269
|
index_ivf->ntotal += ils2->ids[i].size();
|
|
269
270
|
shift_and_add(ils->ids[i], 0, ils2->ids[i]);
|
|
270
271
|
shift_and_add(ils->codes[i], 0, ils2->codes[i]);
|
|
@@ -272,7 +273,7 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
|
|
|
272
273
|
}
|
|
273
274
|
n_slice++;
|
|
274
275
|
} else if (remove_oldest) {
|
|
275
|
-
for (
|
|
276
|
+
for (size_t i = 0; i < nlist; i++) {
|
|
276
277
|
size_t amount_to_remove = sizes[i][0];
|
|
277
278
|
index_ivf->ntotal -= amount_to_remove;
|
|
278
279
|
remove_from_begin(ils->ids[i], amount_to_remove);
|
|
@@ -295,7 +296,8 @@ void SlidingIndexWindow::step(const Index* sub_index, bool remove_oldest) {
|
|
|
295
296
|
ArrayInvertedLists* get_invlist_range(const Index* index, long i0, long i1) {
|
|
296
297
|
const IndexIVF* ivf = extract_index_ivf(index);
|
|
297
298
|
|
|
298
|
-
FAISS_THROW_IF_NOT(
|
|
299
|
+
FAISS_THROW_IF_NOT(
|
|
300
|
+
0 <= i0 && i0 <= i1 && static_cast<size_t>(i1) <= ivf->nlist);
|
|
299
301
|
|
|
300
302
|
const InvertedLists* src = ivf->invlists;
|
|
301
303
|
|
|
@@ -318,12 +320,14 @@ void set_invlist_range(
|
|
|
318
320
|
ArrayInvertedLists* src) {
|
|
319
321
|
IndexIVF* ivf = extract_index_ivf(index);
|
|
320
322
|
|
|
321
|
-
FAISS_THROW_IF_NOT(
|
|
323
|
+
FAISS_THROW_IF_NOT(
|
|
324
|
+
0 <= i0 && i0 <= i1 && static_cast<size_t>(i1) <= ivf->nlist);
|
|
322
325
|
|
|
323
326
|
ArrayInvertedLists* dst = dynamic_cast<ArrayInvertedLists*>(ivf->invlists);
|
|
324
327
|
FAISS_THROW_IF_NOT_MSG(dst, "only ArrayInvertedLists supported");
|
|
325
328
|
FAISS_THROW_IF_NOT(
|
|
326
|
-
src->nlist == i1 - i0 &&
|
|
329
|
+
src->nlist == static_cast<size_t>(i1 - i0) &&
|
|
330
|
+
dst->code_size == src->code_size);
|
|
327
331
|
|
|
328
332
|
size_t ntotal = index->ntotal;
|
|
329
333
|
for (long i = i0; i < i1; i++) {
|
|
@@ -341,7 +345,7 @@ static size_t count_ndis(
|
|
|
341
345
|
const idx_t* Iq) {
|
|
342
346
|
size_t nb_dis = 0;
|
|
343
347
|
const InvertedLists* il = index_ivf->invlists;
|
|
344
|
-
for (
|
|
348
|
+
for (size_t i = 0; i < n_list_scan; i++) {
|
|
345
349
|
if (Iq[i] >= 0) {
|
|
346
350
|
nb_dis += il->list_size(Iq[i]);
|
|
347
351
|
}
|
|
@@ -456,12 +460,12 @@ void range_search_with_parameters(
|
|
|
456
460
|
IndexIVFResidualQuantizer* ivf_residual_from_quantizer(
|
|
457
461
|
const ResidualQuantizer& rq,
|
|
458
462
|
int nlevel) {
|
|
459
|
-
FAISS_THROW_IF_NOT(nlevel > 0 && nlevel + 1 < rq.M);
|
|
463
|
+
FAISS_THROW_IF_NOT(nlevel > 0 && static_cast<size_t>(nlevel + 1) < rq.M);
|
|
460
464
|
|
|
461
465
|
std::vector<size_t> nbits(nlevel);
|
|
462
466
|
std::copy(rq.nbits.begin(), rq.nbits.begin() + nlevel, nbits.begin());
|
|
463
467
|
std::unique_ptr<ResidualCoarseQuantizer> rcq(
|
|
464
|
-
new ResidualCoarseQuantizer(rq.d, nbits));
|
|
468
|
+
new ResidualCoarseQuantizer(static_cast<int>(rq.d), nbits));
|
|
465
469
|
|
|
466
470
|
// set the coarse quantizer from the 2 first quantizers
|
|
467
471
|
rcq->rq.initialize_from(rq);
|
|
@@ -476,7 +480,7 @@ IndexIVFResidualQuantizer* ivf_residual_from_quantizer(
|
|
|
476
480
|
|
|
477
481
|
// build a IVFResidualQuantizer from that
|
|
478
482
|
std::vector<size_t> nbits_refined;
|
|
479
|
-
for (
|
|
483
|
+
for (size_t i = nlevel; i < rq.M; i++) {
|
|
480
484
|
nbits_refined.push_back(rq.nbits[i]);
|
|
481
485
|
}
|
|
482
486
|
std::unique_ptr<IndexIVFResidualQuantizer> index(
|
|
@@ -488,7 +492,8 @@ IndexIVFResidualQuantizer* ivf_residual_from_quantizer(
|
|
|
488
492
|
faiss::METRIC_L2,
|
|
489
493
|
rq.search_type));
|
|
490
494
|
index->own_fields = true;
|
|
491
|
-
|
|
495
|
+
// Ownership transferred to index via own_fields = true
|
|
496
|
+
(void)rcq.release();
|
|
492
497
|
index->by_residual = true;
|
|
493
498
|
index->rq.initialize_from(rq, nlevel);
|
|
494
499
|
index->is_trained = true;
|
|
@@ -512,39 +517,43 @@ void ivf_residual_add_from_flat_codes(
|
|
|
512
517
|
const ResidualQuantizer& rq = index->rq;
|
|
513
518
|
|
|
514
519
|
// populate inverted lists
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
520
|
+
with_simd_level([&]<SIMDLevel SL>() {
|
|
521
|
+
#pragma omp parallel
|
|
522
|
+
{
|
|
523
|
+
std::vector<uint8_t> tmp_code(index->rq.code_size);
|
|
524
|
+
std::vector<float> tmp(rq.d);
|
|
525
|
+
int nt = omp_get_num_threads();
|
|
526
|
+
int rank = omp_get_thread_num();
|
|
521
527
|
|
|
522
528
|
#pragma omp for
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
529
|
+
for (idx_t i = 0; i < static_cast<idx_t>(nb); i++) {
|
|
530
|
+
const uint8_t* code = &raw_codes[i * code_size];
|
|
531
|
+
BitstringReader rd(code, code_size);
|
|
532
|
+
idx_t list_no = rd.read(static_cast<int>(rcq->rq.tot_bits));
|
|
533
|
+
|
|
534
|
+
if (list_no % nt ==
|
|
535
|
+
rank) { // each thread takes care of 1/nt of the invlists
|
|
536
|
+
// copy AQ indexes one by one
|
|
537
|
+
BitstringWriter wr(tmp_code.data(), tmp_code.size());
|
|
538
|
+
for (size_t j = 0; j < rq.M; j++) {
|
|
539
|
+
int nbit = static_cast<int>(rq.nbits[j]);
|
|
540
|
+
wr.write(rd.read(nbit), nbit);
|
|
541
|
+
}
|
|
542
|
+
// we need to recompute the norm
|
|
543
|
+
// decode first, does not use the norm component, so that's
|
|
544
|
+
// ok
|
|
545
|
+
index->rq.decode(tmp_code.data(), tmp.data(), 1);
|
|
546
|
+
float norm = fvec_norm_L2sqr<SL>(tmp.data(), rq.d);
|
|
547
|
+
wr.write(
|
|
548
|
+
rq.encode_norm(norm),
|
|
549
|
+
static_cast<int>(rq.norm_bits));
|
|
550
|
+
|
|
551
|
+
// add code to the inverted list
|
|
552
|
+
invlists.add_entry(list_no, i, tmp_code.data());
|
|
535
553
|
}
|
|
536
|
-
// we need to recompute the norm
|
|
537
|
-
// decode first, does not use the norm component, so that's
|
|
538
|
-
// ok
|
|
539
|
-
index->rq.decode(tmp_code.data(), tmp.data(), 1);
|
|
540
|
-
float norm = fvec_norm_L2sqr(tmp.data(), rq.d);
|
|
541
|
-
wr.write(rq.encode_norm(norm), rq.norm_bits);
|
|
542
|
-
|
|
543
|
-
// add code to the inverted list
|
|
544
|
-
invlists.add_entry(list_no, i, tmp_code.data());
|
|
545
554
|
}
|
|
546
555
|
}
|
|
547
|
-
}
|
|
556
|
+
});
|
|
548
557
|
index->ntotal += nb;
|
|
549
558
|
}
|
|
550
559
|
|
|
@@ -595,7 +604,14 @@ void handle_ivf(
|
|
|
595
604
|
sharded_centroids[i].data());
|
|
596
605
|
}
|
|
597
606
|
char fname[256];
|
|
607
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
608
|
+
#pragma GCC diagnostic push
|
|
609
|
+
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
|
610
|
+
#endif
|
|
598
611
|
snprintf(fname, 256, filename_template.c_str(), i);
|
|
612
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
613
|
+
#pragma GCC diagnostic pop
|
|
614
|
+
#endif
|
|
599
615
|
faiss::write_index(sharded_index, fname);
|
|
600
616
|
delete sharded_index;
|
|
601
617
|
}
|
|
@@ -646,7 +662,14 @@ void handle_binary_ivf(
|
|
|
646
662
|
sharded_centroids[i].data());
|
|
647
663
|
}
|
|
648
664
|
char fname[256];
|
|
665
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
666
|
+
#pragma GCC diagnostic push
|
|
667
|
+
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
|
668
|
+
#endif
|
|
649
669
|
snprintf(fname, 256, filename_template.c_str(), i);
|
|
670
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
671
|
+
#pragma GCC diagnostic pop
|
|
672
|
+
#endif
|
|
650
673
|
faiss::write_index_binary(sharded_index, fname);
|
|
651
674
|
delete sharded_index;
|
|
652
675
|
}
|
|
@@ -24,12 +24,20 @@ void Index::train(idx_t /*n*/, const float* /*x*/) {
|
|
|
24
24
|
// does nothing by default
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
void Index::train_with_queries(
|
|
28
|
+
idx_t /*n*/,
|
|
29
|
+
const float* /*x*/,
|
|
30
|
+
idx_t /*n_train_q*/,
|
|
31
|
+
const float* /*xq_train*/) {
|
|
32
|
+
// does nothing by default
|
|
33
|
+
}
|
|
34
|
+
|
|
27
35
|
void Index::range_search(
|
|
28
36
|
idx_t,
|
|
29
37
|
const float*,
|
|
30
38
|
float,
|
|
31
39
|
RangeSearchResult*,
|
|
32
|
-
const SearchParameters* params) const {
|
|
40
|
+
const SearchParameters* /*params*/) const {
|
|
33
41
|
FAISS_THROW_MSG("range search not implemented");
|
|
34
42
|
}
|
|
35
43
|
|
|
@@ -47,7 +55,7 @@ void Index::add_with_ids(
|
|
|
47
55
|
|
|
48
56
|
size_t Index::remove_ids(const IDSelector& /*sel*/) {
|
|
49
57
|
FAISS_THROW_MSG("remove_ids not implemented for this type of index");
|
|
50
|
-
return -1;
|
|
58
|
+
return static_cast<size_t>(-1);
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
void Index::reconstruct(idx_t, float*) const {
|
|
@@ -105,19 +113,23 @@ void Index::search_and_reconstruct(
|
|
|
105
113
|
}
|
|
106
114
|
|
|
107
115
|
void Index::search_subset(
|
|
108
|
-
idx_t n
|
|
109
|
-
const float* x
|
|
110
|
-
idx_t k_base
|
|
111
|
-
const idx_t* base_labels
|
|
112
|
-
idx_t k
|
|
113
|
-
float* distances
|
|
114
|
-
idx_t* labels) const {
|
|
116
|
+
idx_t /*n*/,
|
|
117
|
+
const float* /*x*/,
|
|
118
|
+
idx_t /*k_base*/,
|
|
119
|
+
const idx_t* /*base_labels*/,
|
|
120
|
+
idx_t /*k*/,
|
|
121
|
+
float* /*distances*/,
|
|
122
|
+
idx_t* /*labels*/) const {
|
|
115
123
|
FAISS_THROW_MSG("search_subset not implemented for this type of index");
|
|
116
124
|
}
|
|
117
125
|
|
|
126
|
+
void Index::search1(const float*, ResultHandler&, SearchParameters*) const {
|
|
127
|
+
FAISS_THROW_MSG("search1 not implemented for this type of index");
|
|
128
|
+
}
|
|
129
|
+
|
|
118
130
|
void Index::compute_residual(const float* x, float* residual, idx_t key) const {
|
|
119
131
|
reconstruct(key, residual);
|
|
120
|
-
for (
|
|
132
|
+
for (int i = 0; i < d; i++) {
|
|
121
133
|
residual[i] = x[i] - residual[i];
|
|
122
134
|
}
|
|
123
135
|
}
|
|
@@ -156,9 +168,10 @@ struct GenericDistanceComputer : DistanceComputer {
|
|
|
156
168
|
size_t d;
|
|
157
169
|
const Index& storage;
|
|
158
170
|
std::vector<float> buf;
|
|
159
|
-
const float* q;
|
|
171
|
+
const float* q = nullptr;
|
|
160
172
|
|
|
161
|
-
explicit GenericDistanceComputer(const Index&
|
|
173
|
+
explicit GenericDistanceComputer(const Index& storage_in)
|
|
174
|
+
: storage(storage_in) {
|
|
162
175
|
d = storage.d;
|
|
163
176
|
buf.resize(d * 2);
|
|
164
177
|
}
|
data/vendor/faiss/faiss/Index.h
CHANGED
|
@@ -14,10 +14,9 @@
|
|
|
14
14
|
#include <faiss/impl/FaissAssert.h>
|
|
15
15
|
|
|
16
16
|
#include <cstdio>
|
|
17
|
-
#include <sstream>
|
|
18
17
|
|
|
19
18
|
#define FAISS_VERSION_MAJOR 1
|
|
20
|
-
#define FAISS_VERSION_MINOR
|
|
19
|
+
#define FAISS_VERSION_MINOR 14
|
|
21
20
|
#define FAISS_VERSION_PATCH 2
|
|
22
21
|
|
|
23
22
|
// Macro to combine the version components into a single string
|
|
@@ -55,6 +54,9 @@ namespace faiss {
|
|
|
55
54
|
struct IDSelector;
|
|
56
55
|
struct RangeSearchResult;
|
|
57
56
|
struct DistanceComputer;
|
|
57
|
+
template <typename T, typename TI>
|
|
58
|
+
struct ResultHandlerUnordered;
|
|
59
|
+
using ResultHandler = ResultHandlerUnordered<float, idx_t>;
|
|
58
60
|
|
|
59
61
|
enum NumericType {
|
|
60
62
|
Float32,
|
|
@@ -112,8 +114,8 @@ struct Index {
|
|
|
112
114
|
MetricType metric_type;
|
|
113
115
|
float metric_arg; ///< argument of the metric type
|
|
114
116
|
|
|
115
|
-
explicit Index(idx_t
|
|
116
|
-
: d(
|
|
117
|
+
explicit Index(idx_t d_in = 0, MetricType metric = METRIC_L2)
|
|
118
|
+
: d(static_cast<int>(d_in)),
|
|
117
119
|
ntotal(0),
|
|
118
120
|
verbose(false),
|
|
119
121
|
is_trained(true),
|
|
@@ -129,6 +131,20 @@ struct Index {
|
|
|
129
131
|
*/
|
|
130
132
|
virtual void train(idx_t n, const float* x);
|
|
131
133
|
|
|
134
|
+
/** Perform training on a representative set of vectors and a representative
|
|
135
|
+
* set of queries
|
|
136
|
+
*
|
|
137
|
+
* @param n nb of training vectors
|
|
138
|
+
* @param x training vectors, size n * d
|
|
139
|
+
* @param n_train_q nb of training queries
|
|
140
|
+
* @param xq_train training queries, size n_train_q * d
|
|
141
|
+
*/
|
|
142
|
+
virtual void train_with_queries(
|
|
143
|
+
idx_t n,
|
|
144
|
+
const float* x,
|
|
145
|
+
idx_t n_train_q,
|
|
146
|
+
const float* xq_train);
|
|
147
|
+
|
|
132
148
|
virtual void train_ex(idx_t n, const void* x, NumericType numeric_type) {
|
|
133
149
|
if (numeric_type == NumericType::Float32) {
|
|
134
150
|
train(n, static_cast<const float*>(x));
|
|
@@ -216,6 +232,12 @@ struct Index {
|
|
|
216
232
|
}
|
|
217
233
|
}
|
|
218
234
|
|
|
235
|
+
/** search one vector with a custom result handler */
|
|
236
|
+
virtual void search1(
|
|
237
|
+
const float* x,
|
|
238
|
+
ResultHandler& handler,
|
|
239
|
+
SearchParameters* params = nullptr) const;
|
|
240
|
+
|
|
219
241
|
/** query n vectors of dimension d to the index.
|
|
220
242
|
*
|
|
221
243
|
* return all vectors with distance < radius. Note that many
|
|
@@ -13,10 +13,6 @@
|
|
|
13
13
|
#include <cstdint>
|
|
14
14
|
#include <cstdio>
|
|
15
15
|
|
|
16
|
-
#ifdef __SSE3__
|
|
17
|
-
#include <immintrin.h>
|
|
18
|
-
#endif
|
|
19
|
-
|
|
20
16
|
#include <algorithm>
|
|
21
17
|
|
|
22
18
|
#include <faiss/IndexIVFPQ.h>
|
|
@@ -138,12 +134,13 @@ struct Distance2Level : DistanceComputer {
|
|
|
138
134
|
size_t d;
|
|
139
135
|
const Index2Layer& storage;
|
|
140
136
|
std::vector<float> buf;
|
|
141
|
-
const float* q;
|
|
137
|
+
const float* q = nullptr;
|
|
142
138
|
|
|
143
|
-
const float
|
|
139
|
+
const float* pq_l1_tab = nullptr;
|
|
140
|
+
const float* pq_l2_tab = nullptr;
|
|
144
141
|
|
|
145
|
-
explicit Distance2Level(const Index2Layer&
|
|
146
|
-
d =
|
|
142
|
+
explicit Distance2Level(const Index2Layer& storage_) : storage(storage_) {
|
|
143
|
+
d = storage_.d;
|
|
147
144
|
FAISS_ASSERT(storage.pq.dsub == 4);
|
|
148
145
|
pq_l2_tab = storage.pq.centroids.data();
|
|
149
146
|
buf.resize(2 * d);
|
|
@@ -162,46 +159,40 @@ struct Distance2Level : DistanceComputer {
|
|
|
162
159
|
|
|
163
160
|
// well optimized for xNN+PQNN
|
|
164
161
|
struct DistanceXPQ4 : Distance2Level {
|
|
165
|
-
int M
|
|
162
|
+
int M = 0;
|
|
163
|
+
int k = 0;
|
|
166
164
|
|
|
167
|
-
explicit DistanceXPQ4(const Index2Layer&
|
|
168
|
-
: Distance2Level(
|
|
165
|
+
explicit DistanceXPQ4(const Index2Layer& storage_)
|
|
166
|
+
: Distance2Level(storage_) {
|
|
169
167
|
const IndexFlat* quantizer =
|
|
170
168
|
dynamic_cast<IndexFlat*>(storage.q1.quantizer);
|
|
171
169
|
|
|
172
170
|
FAISS_ASSERT(quantizer);
|
|
173
|
-
M = storage.pq.M;
|
|
171
|
+
M = static_cast<int>(storage.pq.M);
|
|
174
172
|
pq_l1_tab = quantizer->get_xb();
|
|
175
173
|
}
|
|
176
174
|
|
|
177
175
|
float operator()(idx_t i) override {
|
|
178
|
-
#ifdef __SSE3__
|
|
179
176
|
const uint8_t* code = storage.codes.data() + i * storage.code_size;
|
|
180
177
|
idx_t key = 0;
|
|
181
178
|
memcpy(&key, code, storage.code_size_1);
|
|
182
179
|
code += storage.code_size_1;
|
|
183
180
|
|
|
184
|
-
// walking pointers
|
|
185
181
|
const float* qa = q;
|
|
186
|
-
const
|
|
187
|
-
const
|
|
188
|
-
|
|
182
|
+
const float* l1 = pq_l1_tab + d * key;
|
|
183
|
+
const float* l2 = pq_l2_tab;
|
|
184
|
+
float accu = 0;
|
|
189
185
|
|
|
190
186
|
for (int m = 0; m < M; m++) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
187
|
+
for (int j = 0; j < 4; j++) {
|
|
188
|
+
float diff = qa[j] - (l1[m * 4 + j] + l2[*code * 4 + j]);
|
|
189
|
+
accu += diff * diff;
|
|
190
|
+
}
|
|
191
|
+
code++;
|
|
192
|
+
l2 += 256 * 4;
|
|
196
193
|
qa += 4;
|
|
197
194
|
}
|
|
198
|
-
|
|
199
|
-
accu = _mm_hadd_ps(accu, accu);
|
|
200
|
-
accu = _mm_hadd_ps(accu, accu);
|
|
201
|
-
return _mm_cvtss_f32(accu);
|
|
202
|
-
#else
|
|
203
|
-
FAISS_THROW_MSG("not implemented for non-x64 platforms");
|
|
204
|
-
#endif
|
|
195
|
+
return accu;
|
|
205
196
|
}
|
|
206
197
|
};
|
|
207
198
|
|
|
@@ -209,15 +200,15 @@ struct DistanceXPQ4 : Distance2Level {
|
|
|
209
200
|
struct Distance2xXPQ4 : Distance2Level {
|
|
210
201
|
int M_2, mi_nbits;
|
|
211
202
|
|
|
212
|
-
explicit Distance2xXPQ4(const Index2Layer&
|
|
213
|
-
: Distance2Level(
|
|
203
|
+
explicit Distance2xXPQ4(const Index2Layer& storage_)
|
|
204
|
+
: Distance2Level(storage_) {
|
|
214
205
|
const MultiIndexQuantizer* mi =
|
|
215
206
|
dynamic_cast<MultiIndexQuantizer*>(storage.q1.quantizer);
|
|
216
207
|
|
|
217
208
|
FAISS_ASSERT(mi);
|
|
218
209
|
FAISS_ASSERT(storage.pq.M % 2 == 0);
|
|
219
|
-
M_2 = storage.pq.M / 2;
|
|
220
|
-
mi_nbits = mi->pq.nbits;
|
|
210
|
+
M_2 = static_cast<int>(storage.pq.M / 2);
|
|
211
|
+
mi_nbits = static_cast<int>(mi->pq.nbits);
|
|
221
212
|
pq_l1_tab = mi->pq.centroids.data();
|
|
222
213
|
}
|
|
223
214
|
|
|
@@ -226,42 +217,36 @@ struct Distance2xXPQ4 : Distance2Level {
|
|
|
226
217
|
int64_t key01 = 0;
|
|
227
218
|
memcpy(&key01, code, storage.code_size_1);
|
|
228
219
|
code += storage.code_size_1;
|
|
229
|
-
#ifdef __SSE3__
|
|
230
220
|
|
|
231
|
-
// walking pointers
|
|
232
221
|
const float* qa = q;
|
|
233
|
-
const
|
|
234
|
-
const
|
|
235
|
-
|
|
222
|
+
const float* l1 = pq_l1_tab;
|
|
223
|
+
const float* l2 = pq_l2_tab;
|
|
224
|
+
float accu = 0;
|
|
236
225
|
|
|
237
226
|
for (int mi_m = 0; mi_m < 2; mi_m++) {
|
|
238
227
|
int64_t l1_idx = key01 & (((int64_t)1 << mi_nbits) - 1);
|
|
239
|
-
const
|
|
228
|
+
const float* l1_sub = l1 + M_2 * l1_idx * 4;
|
|
240
229
|
|
|
241
230
|
for (int m = 0; m < M_2; m++) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
231
|
+
for (int j = 0; j < 4; j++) {
|
|
232
|
+
float diff =
|
|
233
|
+
qa[j] - (l1_sub[m * 4 + j] + l2[*code * 4 + j]);
|
|
234
|
+
accu += diff * diff;
|
|
235
|
+
}
|
|
236
|
+
code++;
|
|
237
|
+
l2 += 256 * 4;
|
|
247
238
|
qa += 4;
|
|
248
239
|
}
|
|
249
|
-
|
|
240
|
+
l1 += (M_2 << mi_nbits) * 4;
|
|
250
241
|
key01 >>= mi_nbits;
|
|
251
242
|
}
|
|
252
|
-
|
|
253
|
-
accu = _mm_hadd_ps(accu, accu);
|
|
254
|
-
return _mm_cvtss_f32(accu);
|
|
255
|
-
#else
|
|
256
|
-
FAISS_THROW_MSG("not implemented for non-x64 platforms");
|
|
257
|
-
#endif
|
|
243
|
+
return accu;
|
|
258
244
|
}
|
|
259
245
|
};
|
|
260
246
|
|
|
261
247
|
} // namespace
|
|
262
248
|
|
|
263
249
|
DistanceComputer* Index2Layer::get_distance_computer() const {
|
|
264
|
-
#ifdef __SSE3__
|
|
265
250
|
const MultiIndexQuantizer* mi =
|
|
266
251
|
dynamic_cast<MultiIndexQuantizer*>(q1.quantizer);
|
|
267
252
|
|
|
@@ -274,7 +259,6 @@ DistanceComputer* Index2Layer::get_distance_computer() const {
|
|
|
274
259
|
if (fl && pq.dsub == 4) {
|
|
275
260
|
return new DistanceXPQ4(*this);
|
|
276
261
|
}
|
|
277
|
-
#endif
|
|
278
262
|
|
|
279
263
|
return Index::get_distance_computer();
|
|
280
264
|
}
|