/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include #include #include #include #include TEST(IVFPQ, accuracy) { // dimension of the vectors to index int d = 64; // size of the database we plan to index size_t nb = 1000; // make a set of nt training vectors in the unit cube // (could be the database) size_t nt = 1500; // make the index object and train it faiss::IndexFlatL2 coarse_quantizer (d); // a reasonable number of cetroids to index nb vectors int ncentroids = 25; faiss::IndexIVFPQ index (&coarse_quantizer, d, ncentroids, 16, 8); // index that gives the ground-truth faiss::IndexFlatL2 index_gt (d); std::mt19937 rng; std::uniform_real_distribution<> distrib; { // training std::vector trainvecs (nt * d); for (size_t i = 0; i < nt * d; i++) { trainvecs[i] = distrib(rng); } index.verbose = true; index.train (nt, trainvecs.data()); } { // populating the database std::vector database (nb * d); for (size_t i = 0; i < nb * d; i++) { database[i] = distrib(rng); } index.add (nb, database.data()); index_gt.add (nb, database.data()); } int nq = 200; int n_ok; { // searching the database std::vector queries (nq * d); for (size_t i = 0; i < nq * d; i++) { queries[i] = distrib(rng); } std::vector gt_nns (nq); std::vector gt_dis (nq); index_gt.search (nq, queries.data(), 1, gt_dis.data(), gt_nns.data()); index.nprobe = 5; int k = 5; std::vector nns (k * nq); std::vector dis (k * nq); index.search (nq, queries.data(), k, dis.data(), nns.data()); n_ok = 0; for (int q = 0; q < nq; q++) { for (int i = 0; i < k; i++) if (nns[q * k + i] == gt_nns[q]) n_ok++; } EXPECT_GT(n_ok, nq * 0.4); } }