13 #include <gtest/gtest.h>
15 #include <faiss/IndexIVFPQ.h>
16 #include <faiss/IndexFlat.h>
17 #include <faiss/index_io.h>
19 TEST(IVFPQ, accuracy) {
47 std::vector <float> trainvecs (nt * d);
48 for (
size_t i = 0; i < nt * d; i++) {
49 trainvecs[i] = drand48();
52 index.train (nt, trainvecs.data());
57 std::vector <float> database (nb * d);
58 for (
size_t i = 0; i < nb * d; i++) {
59 database[i] = drand48();
62 index.add (nb, database.data());
63 index_gt.add (nb, database.data());
71 std::vector <float> queries (nq * d);
72 for (
size_t i = 0; i < nq * d; i++) {
73 queries[i] = drand48();
76 std::vector<faiss::Index::idx_t> gt_nns (nq);
77 std::vector<float> gt_dis (nq);
79 index_gt.search (nq, queries.data(), 1,
80 gt_dis.data(), gt_nns.data());
84 std::vector<faiss::Index::idx_t> nns (k * nq);
85 std::vector<float> dis (k * nq);
87 index.search (nq, queries.data(), k, dis.data(), nns.data());
90 for (
int q = 0; q < nq; q++) {
92 for (
int i = 0; i < k; i++)
93 if (nns[q * k + i] == gt_nns[q])
96 EXPECT_GT(n_ok, nq * 0.4);