Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,7 @@
*.out
*.app

# VS Code
.vscode

/build
78 changes: 78 additions & 0 deletions results/diskann_results.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
Parameters set: C=750, L=100, R=64, alpha=1.2, pruning_rule=0
Reading bin file /nvmessd1/fbv4/prec1M.fbin ...Metadata: #pts = 1010812, #dims = 384, aligned_dim = 384... done.
Initialized Vamana Object with 1010812 points, dim=384.
Starting vamana build with listSize L=100, degree bound R=64, and alpha=1.2
Medoid identified as 121334

0% of build completed...
10% of build completed...
20% of build completed...
30% of build completed...
40% of build completed...
50% of build completed...
60% of build completed...
70% of build completed...
80% of build completed...
90% of build completed...
100% of build completed...
Starting final cleanup..done.
Percentile Out Degree In Degree
=======================================================
0 1 0
10 5 4
20 14 13
30 33 25
40 57 34
50 64 41
60 64 48
70 64 57
80 64 69
90 64 91
100 64 1853
0.159% points are unreachable and 121334 is the most popular in-degree node.
Average degree 46.1
Total build time: 176s
Writing bin: /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_data.bin
bin: #pts = 1010812, #dims = 384, size = 1552607240B
Finished writing bin.
Writing bin: /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_tags.bin
bin: #pts = 1010812, #dims = 1, size = 4043256B
Finished writing bin.
Reading bin file /nvmessd1/fbv4/queries.fbin ...Metadata: #pts = 13265, #dims = 384, aligned_dim = 384... done.
Stat(/nvmessd1/fbv4/prec1M_gt100.bin) returned: 0
Opened: /nvmessd1/fbv4/prec1M_gt100.bin, size: 10612008, cache_size: 10612008
Reading truthset file /nvmessd1/fbv4/prec1M_gt100.bin ...
Metadata: #pts = 13265, #dims = 100...
Initialized Empty Vamana Object.
Reading bin file /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_data.bin ...Metadata: #pts = 1010812, #dims = 384, aligned_dim = 384... done.
Reading bin file /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_tags.bin ...
Metadata: #pts = 1010812, #dims = 1.
Stat(/nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_labels.txt) returned: -1
Stat(/nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_universal_label.txt) returned: -1
Stat(/nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2_labels_to_medoids.txt) returned: -1
Loading vamana index /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2.....done. Vamana has 1010812 nodes and 46618450 out-edges
Average out degree: 46.12
Vamana loaded
Ls QPS Mean Latency (mus) 99.9% Latency Recall@50 Mean Cmps. Mean Hops 99.9% Cmps. 99.9% Hops
=========================================================================================================================
50 541.45 1846.24 9149.36 63.40 3206.93 61.64 5830.00 109.00
75 436.28 2292.00 3844.28 70.03 4332.75 85.89 7265.00 139.00
100 346.48 2886.06 4673.74 74.36 5427.74 110.27 8551.00 165.00
150 248.03 4031.63 6059.32 79.82 7554.02 159.32 11098.00 213.00
200 192.08 5206.02 7170.83 83.23 9619.01 208.68 13168.00 255.00
Done searching. Now saving results
Writing bin: /diskann_results_50_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /diskann_results_75_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /diskann_results_100_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /diskann_results_150_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /diskann_results_200_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
94 changes: 94 additions & 0 deletions results/hnsw_results.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
Reading bin file /nvmessd1/fbv4/prec1M.fbin ...Metadata: #pts = 1010812, #dims = 384, aligned_dim = 384... done.
Initialized HNSW Object with 1010812 points, dim=384.
Writing bin: /tmp/temp_data
bin: #pts = 101209, #dims = 384, size = 155457032B
Finished writing bin.
Reading bin file /tmp/temp_data ...Metadata: #pts = 101209, #dims = 384, aligned_dim = 384... done.
Initialized HNSW Object with 101209 points, dim=384.
Starting hnsw build with listSize L=100, degree bound R=64, and alpha=1 on HNSW level 0
Medoid identified as 66687
10% of build completed
20% of build completed
30% of build completed
40% of build completed
50% of build completed
60% of build completed
70% of build completed
80% of build completed
90% of build completed
100% of build completed
110% of build completed
Starting final cleanup..done.
Total build time: 7.71948s
Average out degree: 25.5526
Starting hnsw build with listSize L=100, degree bound R=64, and alpha=1 on HNSW level 1
Medoid identified as 121334
10% of build completed
20% of build completed
30% of build completed
40% of build completed
50% of build completed
60% of build completed
70% of build completed
80% of build completed
90% of build completed
100% of build completed
110% of build completed
Starting final cleanup..done.
Total build time: 216.582s
Average out degree: 30.0825
Writing bin: /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_0_data.bin
bin: #pts = 101209, #dims = 384, size = 155457032B
Finished writing bin.
Writing bin: /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_0_tags.bin
bin: #pts = 101209, #dims = 1, size = 404844B
Finished writing bin.
Writing bin: /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_1_data.bin
bin: #pts = 1010812, #dims = 384, size = 1552607240B
Finished writing bin.
Writing bin: /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_1_tags.bin
bin: #pts = 1010812, #dims = 1, size = 4043256B
Finished writing bin.
Reading bin file /nvmessd1/fbv4/queries.fbin ...Metadata: #pts = 13265, #dims = 384, aligned_dim = 384... done.
Stat(/nvmessd1/fbv4/prec1M_gt100.bin) returned: 0
Opened: /nvmessd1/fbv4/prec1M_gt100.bin, size: 10612008, cache_size: 10612008
Reading truthset file /nvmessd1/fbv4/prec1M_gt100.bin ...
Metadata: #pts = 13265, #dims = 100...
Initialized Empty HNSW Object at level 0
Initialized Empty HNSW Object at level 1
Reading bin file /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_0_data.bin ...Metadata: #pts = 101209, #dims = 384, aligned_dim = 384... done.
Reading bin file /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_0_tags.bin ...
Metadata: #pts = 101209, #dims = 1.
Stat(/nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_0_labels.txt) returned: -1
Stat(/nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_0_universal_label.txt) returned: -1
Loading hnsw index /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2.....done. HNSW has 101209 nodes and 2586154 out-edgesAverage out degree: 25.55
Reading bin file /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_1_data.bin ...Metadata: #pts = 1010812, #dims = 384, aligned_dim = 384... done.
Reading bin file /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_1_tags.bin ...
Metadata: #pts = 1010812, #dims = 1.
Stat(/nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_1_labels.txt) returned: -1
Stat(/nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2_1_universal_label.txt) returned: -1
Loading hnsw index /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2.....done. HNSW has 1010812 nodes and 30407802 out-edgesAverage out degree: 30.08
HNSW loaded
Ls QPS Mean Latency (mus) 99.9% Latency Recall@50 Mean Cmps. Mean Hops 99.9% Cmps. 99.9% Hops
=========================================================================================================================
50 414.68 2410.85 10848.68 60.12 4371.73 107.99 5964.00 137.00
75 319.63 3128.54 4045.87 67.64 6164.12 156.81 7805.00 182.00
100 244.31 4093.08 5202.52 72.54 7913.30 206.06 9744.00 228.00
150 170.24 5874.00 7300.73 78.75 11289.65 305.20 13669.00 323.00
200 130.21 7679.69 9555.61 82.60 14530.51 404.75 17512.00 422.00
Done searching. Now saving results
Writing bin: /hnsw_results_50_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /hnsw_results_75_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /hnsw_results_100_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /hnsw_results_150_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
Writing bin: /hnsw_results_200_idx_uint32.bin
bin: #pts = 13265, #dims = 50, size = 2653008B
Finished writing bin.
9 changes: 9 additions & 0 deletions run-script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# HNSW
cd build/tests
./build_hnsw float l2 /nvmessd1/fbv4/prec1M.fbin /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2 64 100 0 0.1 2 48 >> ../../results/hnsw_results.txt
./search_hnsw float l2 /nvmessd1/fbv4/avarhade/grann/hnsw_prec1M_L100_R64_a1.2 2 1 /nvmessd1/fbv4/queries.fbin /nvmessd1/fbv4/prec1M_gt100.bin 50 /hnsw_results 50 75 100 150 200 >> ../../results/hnsw_results.txt

# DiskANN
# cd build/tests
# ./build_vamana float l2 /nvmessd1/fbv4/prec1M.fbin 0 /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2 64 100 1.2 48 >> ../../results/diskann_results.txt
# ./search_vamana float l2 /nvmessd1/fbv4/avarhade/grann/diskann_prec1M_L100_R64_a1.2 1 /nvmessd1/fbv4/queries.fbin /nvmessd1/fbv4/prec1M_gt100.bin 50 /diskann_results 0 50 75 100 150 200 >> ../../results/diskann_results.txt
2 changes: 1 addition & 1 deletion src/aux_compute_groundtruth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ inline void save_groundtruth_as_one_file(const std::string filename,
}

template<typename T>
int aux_main(int argv, char **argc) {
int aux_main([[maybe_unused]] int argv, char **argc) {
size_t npoints, nqueries, dim;
std::string base_file(argc[2]);
std::string query_file(argc[3]);
Expand Down
15 changes: 13 additions & 2 deletions src/hnsw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,14 @@ namespace grann {
<< this->_num_points << " points. " << std::endl;
return;
}
_u64 total_out_degree = 0;
for (const auto& neighbors : this->_out_nbrs) {
total_out_degree += neighbors.size();
}
double avg_out_degree = static_cast<double>(total_out_degree) / this->_num_points;

std::cout << "..done. HNSW has " << nodes << " nodes and " << cc
<< " out-edges" << std::endl;
<< " out-edges" << "Average out degree: " << avg_out_degree << std::endl;
}

/**************************************************************
Expand Down Expand Up @@ -254,6 +259,11 @@ namespace grann {
this->_out_nbrs[node].emplace_back(id);
}
}
_u64 total_out_degree = 0;
for (const auto& neighbors : this->_out_nbrs) {
total_out_degree += neighbors.size();
}
double avg_out_degree = static_cast<double>(total_out_degree) / this->_num_points;

std::cout << "done." << std::endl;
this->_has_built = true;
Expand All @@ -262,13 +272,14 @@ namespace grann {
std::cout << "Total build time: "
<< ((double) build_timer.elapsed() / (double) 1000000) << "s"
<< std::endl;
std::cout << "Average out degree: " << avg_out_degree << std::endl;
}

template<typename T>
_u32 HNSW<T>::search(const T *query, _u32 res_count,
const Parameters &search_params, _u32 *indices,
float *distances, QueryStats *stats,
std::vector<label> search_filters) {
[[maybe_unused]] std::vector<label> search_filters) {
_u32 search_list_size = search_params.Get<_u32>("L");
std::vector<unsigned> init_ids;
tsl::robin_set<unsigned> visited(10 * search_list_size);
Expand Down
4 changes: 2 additions & 2 deletions src/lsh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ namespace grann {

template<typename T>
_u32 LSHIndex<T>::search(const T *query, _u32 res_count,
const Parameters &search_params, _u32 *indices,
float *distances, QueryStats *stats, std::vector<label> search_filters) {
[[maybe_unused]] const Parameters &search_params, _u32 *indices,
float *distances, QueryStats *stats, [[maybe_unused]] std::vector<label> search_filters) {
float *query_float = new float[this->_aligned_dim];
grann::convert_types(query, query_float, 1, this->_aligned_dim);

Expand Down
2 changes: 1 addition & 1 deletion src/relative_ng.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ namespace grann {
_u32 RelativeNG<T>::search(const T *query, _u32 res_count,
const Parameters &search_params, _u32 *indices,
float *distances, QueryStats *stats,
std::vector<label> search_filters) {
[[maybe_unused]] std::vector<label> search_filters) {
_u32 search_list_size = search_params.Get<_u32>("L");
std::vector<unsigned> init_ids;
tsl::robin_set<unsigned> visited(10 * search_list_size);
Expand Down
14 changes: 14 additions & 0 deletions src/vamana.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,15 @@ namespace grann {
<< this->_num_points << " points. " << std::endl;
return;
}
double total_out_degree = 0;
for (const auto& neighbors : this->_out_nbrs) {
total_out_degree += neighbors.size();
}
double average_out_degree = total_out_degree / this->_num_points;

std::cout << "..done. Vamana has " << nodes << " nodes and " << cc
<< " out-edges" << std::endl;
std::cout << "Average out degree: " << average_out_degree << std::endl;
}

/**************************************************************
Expand Down Expand Up @@ -326,11 +332,19 @@ namespace grann {
this->_out_nbrs[node].emplace_back(id);
}
}
// Calculate average out degree of neighbors
double total_out_degree = 0;
for (_u64 node = 0; node < this->_num_points; node++) {
total_out_degree += this->_out_nbrs[node].size();
}
double average_out_degree = total_out_degree / this->_num_points;

std::cout << "done." << std::endl;
this->_has_built = true;
this->update_degree_stats();

std::cout << "Average degree " << average_out_degree << std::endl;

std::cout << "Total build time: "
<< ((double) build_timer.elapsed() / (double) 1000000) << "s"
<< std::endl;
Expand Down
4 changes: 2 additions & 2 deletions tests/load_random_dist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ int main(int argc, char* argv[]) {
if(strcmp(argv[1], "gaussian") == 0) grann::load_bin<float>(argv[2], data, npts, ndim);
else grann::load_bin<float>(argv[2], data, npts, ndim);

for(int i = 0; i < npts; i++) {
for(int j = 0; j < ndim; j++) {
for(_u64 i = 0; i < npts; i++) {
for(_u64 j = 0; j < ndim; j++) {
std::cout << data[i * ndim + j] << " ";
}
std::cout << std::endl;
Expand Down
2 changes: 1 addition & 1 deletion tests/search_hnsw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ int search_index(int argc, char** argv) {

grann::HNSW<T> hnsw(metric, num_levels - 1);
hnsw.load(hnsw_prefix.c_str()); // to load Vamana Index
std::cout << "Vamana loaded" << std::endl;
std::cout << "HNSW loaded" << std::endl;
grann::Parameters search_params;

std::string recall_string = "Recall@" + std::to_string(recall_at);
Expand Down
2 changes: 1 addition & 1 deletion tests/search_lsh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
#include "utils.h"

template<typename T>
int search_index(int argc, char** argv) {
int search_index([[maybe_unused]] int argc, char** argv) {
T* query = nullptr;
unsigned* gt_ids = nullptr;
float* gt_dists = nullptr;
Expand Down