| /* |
| * Copyright (c) Meta Platforms, Inc. and affiliates. |
| * |
| * This source code is licensed under the MIT license found in the |
| * LICENSE file in the root directory of this source tree. |
| */ |
| |
| #include <cassert> |
| #include <cstdio> |
| #include <cstdlib> |
| #include <random> |
| |
| #include <faiss/IndexHNSW.h> |
| |
| using idx_t = faiss::idx_t; |
| |
| 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 k = 4; |
| |
| faiss::IndexHNSWFlat index(d, 32); |
| index.add(nb, xb); |
| |
| { // search xq |
| idx_t* I = new idx_t[k * nq]; |
| float* D = new float[k * nq]; |
| |
| index.search(nq, xq, k, D, I); |
| |
| printf("I=\n"); |
| for (int i = nq - 5; i < nq; i++) { |
| for (int j = 0; j < k; j++) |
| printf("%5zd ", I[i * k + j]); |
| printf("\n"); |
| } |
| |
| printf("D=\n"); |
| for (int i = nq - 5; i < nq; i++) { |
| for (int j = 0; j < k; j++) |
| printf("%5f ", D[i * k + j]); |
| printf("\n"); |
| } |
| |
| delete[] I; |
| delete[] D; |
| } |
| |
| delete[] xb; |
| delete[] xq; |
| |
| return 0; |
| } |