测试3-IVFPQ.cpp
想要测试IVFSQ的命令,需要在faiss里面进行修改来帮助我理解IVFSQ的流程,目的是去理解IVFSQ如何构建索引、训练索引、添加数据,以及执行搜索操作。
编辑命令
修改了3-IVFPQ.cpp文件里面的内容,但是不需要动/tutorial/cpp/CMakeList.txt
里面的内容,只需要转到faiss-1.7.4目录下,运行如下命令:
make -C build 3-IVFPQ && ./build/tutorial/cpp/3-IVFPQ
会在/faiss-1.7.4/build/tutorial/cpp/下生成3-IVFPQ,之后直接运行gdb ./3-IVFPQ
。
如果在/tutorial/cpp/添加了3-IVFPQ-l2.cpp和修改了/tutorial/cpp/CMakeList.txt
,那么需要运行下面的命令:
faiss@node68:~/faiss-1.7.4$ make -C build test
faiss@node68:~/faiss-1.7.4$ make -C build 3-IVFPQ-l2 && ./build/demos/3-IVFPQ-l2
查看3-IVFPQ.cpp原有命令
查看3-IVFPQ.cpp原有命令,然后在此基础上进行修改,使其可以用来测试IVFSQ。最后使用
make -C build 3-IVFPQ && ./build/tutorial/cpp/3-IVFPQ
来生成可执行文件/build/tutorial/cpp/3-IVFPQ,并运行gdb ./3-IVFPQ
。
接下来查看相关的代码内容:
#include <cstdio>
#include <cstdlib>
#include <random>
#include <faiss/IndexFlat.h>
#include <faiss/IndexIVFPQ.h>
using idx_t = faiss::idx_t; //将faiss::idx_t起个别名为idx_,本质上FAISS 定义 idx_t 为 64 位整数
int main() {
int d = 64; // dimension
int nb = 100000; // database size
int nq = 10000; // nb of queries
std::mt19937 rng;
std::uniform_real_distribution<> distrib;
float* xb = new float[d * nb];
float* xq = new float[d * nq];
for (int i = 0; i < nb; i++) {
for (int j = 0; j < d; j++)
xb[d * i + j] = distrib(rng);
xb[d * i] += i / 1000.;
}
for (int i = 0; i < nq; i++) {
for (int j = 0; j < d; j++)
xq[d * i + j] = distrib(rng);
xq[d * i] += i / 1000.;
}
int nlist = 100;
int k = 4;
int m = 8; // bytes per vector
faiss::IndexFlatL2 quantizer(d); // the other index
faiss::IndexIVFPQ index(&quantizer, d, nlist, m, 8);
index.train(nb, xb);
index.add(nb, xb);
{
// sanity check
idx_t* I = new idx_t[k * 5];
float* D = new float[k * 5];
index.search(5, xb, k, D, I);
printf("I=\n");
for (int i = 0; i < 5;