Faiss
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
2-IVFFlat.cpp
1 /**
2  * Copyright (c) 2015-present, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD+Patents license found in the
6  * LICENSE file in the root directory of this source tree.
7  */
8 
9 #include <cstdio>
10 #include <cstdlib>
11 #include <cassert>
12 
13 #include <faiss/IndexFlat.h>
14 #include <faiss/IndexIVFFlat.h>
15 
16 
17 int main() {
18  int d = 64; // dimension
19  int nb = 100000; // database size
20  int nq = 10000; // nb of queries
21 
22  float *xb = new float[d * nb];
23  float *xq = new float[d * nq];
24 
25  for(int i = 0; i < nb; i++) {
26  for(int j = 0; j < d; j++)
27  xb[d * i + j] = drand48();
28  xb[d * i] += i / 1000.;
29  }
30 
31  for(int i = 0; i < nq; i++) {
32  for(int j = 0; j < d; j++)
33  xq[d * i + j] = drand48();
34  xq[d * i] += i / 1000.;
35  }
36 
37 
38  int nlist = 100;
39  int k = 4;
40 
41  faiss::IndexFlatL2 quantizer(d); // the other index
42  faiss::IndexIVFFlat index(&quantizer, d, nlist, faiss::METRIC_L2);
43  // here we specify METRIC_L2, by default it performs inner-product search
44  assert(!index.is_trained);
45  index.train(nb, xb);
46  assert(index.is_trained);
47  index.add(nb, xb);
48 
49  { // search xq
50  long *I = new long[k * nq];
51  float *D = new float[k * nq];
52 
53  index.search(nq, xq, k, D, I);
54 
55  printf("I=\n");
56  for(int i = nq - 5; i < nq; i++) {
57  for(int j = 0; j < k; j++)
58  printf("%5ld ", I[i * k + j]);
59  printf("\n");
60  }
61 
62  index.nprobe = 10;
63  index.search(nq, xq, k, D, I);
64 
65  printf("I=\n");
66  for(int i = nq - 5; i < nq; i++) {
67  for(int j = 0; j < k; j++)
68  printf("%5ld ", I[i * k + j]);
69  printf("\n");
70  }
71 
72  delete [] I;
73  delete [] D;
74  }
75 
76 
77 
78  delete [] xb;
79  delete [] xq;
80 
81  return 0;
82 }