提交 026ab986 编写于 作者: M Marius Muja

Merge ec2-107-20-88-134.compute-1.amazonaws.com:flann

#include <flann/flann_mpi.hpp>
#include <flann/flann.hpp>
#include <flann/io/hdf5.h>
#include <stdio.h>
......@@ -48,43 +49,48 @@ int main(int argc, char** argv)
boost::mpi::environment env(argc, argv);
boost::mpi::communicator world;
int nn = 1;
int nn = 1;
// flann::Matrix<float> dataset;
flann::Matrix<float> query;
flann::Matrix<int> match;
//flann::Matrix<float> dataset;
flann::Matrix<float> query;
flann::Matrix<int> match;
flann::Matrix<float> gt_dists;
IF_RANK0 start_timer("Loading data...\n");
flann::load_from_file(query, "sift100K.h5","query");
flann::load_from_file(match, "sift100K.h5","match");
flann::Matrix<int> indices(new int[query.rows*nn], query.rows, nn);
flann::Matrix<float> dists(new float[query.rows*nn], query.rows, nn);
IF_RANK0 start_timer("Loading data...\n");
//flann::load_from_file(dataset, "sift100K.h5","dataset");
flann::load_from_file(query, "sift100K.h5","query");
flann::load_from_file(match, "sift100K.h5","match");
flann::load_from_file(gt_dists, "sift100K.h5","dists");
flann::Matrix<int> indices(new int[query.rows*nn], query.rows, nn);
flann::Matrix<float> dists(new float[query.rows*nn], query.rows, nn);
// construct an randomized kd-tree index using 4 kd-trees
flann::mpi::Index<flann::L2<float> > index("sift100K.h5", "dataset", flann::KDTreeIndexParams(4));
IF_RANK0 printf("Loading data done (%g seconds)\n", stop_timer());
// construct an randomized kd-tree index using 4 kd-trees
flann::mpi::Index<flann::L2<float> > index("sift100K.h5", "dataset", flann::KDTreeIndexParams(4));
//flann::Index<flann::L2<float> > index( dataset, flann::KDTreeIndexParams(4));
IF_RANK0 printf("Loading data done (%g seconds)\n", stop_timer());
IF_RANK0 printf("Index size: (%d,%d)\n", index.size(), index.veclen());
IF_RANK0 printf("Index size: (%d,%d)\n", index.size(), index.veclen());
start_timer("Building index...\n");
index.buildIndex();
start_timer("Building index...\n");
index.buildIndex();
printf("Building index done (%g seconds)\n", stop_timer());
world.barrier();
// do a knn search, using 128 checks
// do a knn search, using 128 checks
IF_RANK0 start_timer("Performing search...\n");
index.knnSearch(query, indices, dists, nn, flann::SearchParams(128));
IF_RANK0 printf("Search done (%g seconds)\n", stop_timer());
IF_RANK0 {
printf("Indices size: (%d,%d)\n", indices.rows, indices.cols);
printf("Checking results\n");
float precision = compute_precision(match, indices);
printf("Precision is: %g\n", precision);
}
delete[] query.data;
delete[] indices.data;
delete[] dists.data;
delete[] match.data;
return 0;
index.knnSearch(query, indices, dists, nn, flann::SearchParams(128));
IF_RANK0 printf("Search done (%g seconds)\n", stop_timer());
IF_RANK0 {
printf("Indices size: (%d,%d)\n", (int)indices.rows, (int)indices.cols);
printf("Checking results\n");
float precision = compute_precision(match, indices);
printf("Precision is: %g\n", precision);
}
delete[] query.data;
delete[] indices.data;
delete[] dists.data;
delete[] match.data;
return 0;
}
......@@ -52,6 +52,7 @@ struct SearchResults
ar& indices.rows;
ar& indices.cols;
if (Archive::is_loading::value) {
indices.stride = indices.cols;
indices.data = new int[indices.rows*indices.cols];
}
ar& boost::serialization::make_array(indices.data, indices.rows*indices.cols);
......@@ -61,6 +62,7 @@ struct SearchResults
ar& dists.rows;
ar& dists.cols;
if (Archive::is_loading::value) {
dists.stride = dists.cols;
dists.data = new DistanceType[dists.rows*dists.cols];
}
ar& boost::serialization::make_array(dists.data, dists.rows*dists.cols);
......@@ -76,12 +78,8 @@ struct ResultsMerger
SearchResults<DistanceType> operator()(SearchResults<DistanceType> a, SearchResults<DistanceType> b)
{
SearchResults<DistanceType> results;
results.indices.rows = a.indices.rows;
results.indices.cols = a.indices.cols;
results.indices.data = new int[results.indices.rows*results.indices.cols];
results.dists.rows = a.dists.rows;
results.dists.cols = a.dists.cols;
results.dists.data = new DistanceType[results.dists.rows*results.dists.cols];
results.indices = flann::Matrix<int>(new int[a.indices.rows*a.indices.cols],a.indices.rows,a.indices.cols);
results.dists = flann::Matrix<DistanceType>(new DistanceType[a.dists.rows*a.dists.cols],a.dists.rows,a.dists.cols);
for (size_t i = 0; i < results.dists.rows; ++i) {
......@@ -103,7 +101,6 @@ struct ResultsMerger
}
}
}
delete[] a.indices.data;
delete[] a.dists.data;
delete[] b.indices.data;
......
......@@ -211,13 +211,11 @@ void load_from_file(flann::Matrix<T>& dataset, const std::string& filename, cons
H5Sselect_hyperslab(space_id, H5S_SELECT_SET, offset, NULL, count, NULL);
dataset.rows = count[0];
dataset.cols = count[1];
dataset.data = new T[dataset.rows*dataset.cols];
dataset = flann::Matrix<T>(new T[count[0]*count[1]], count[0], count[1]);
plist_id = H5Pcreate(H5P_DATASET_XFER);
H5Pset_dxpl_mpio(plist_id, H5FD_MPIO_COLLECTIVE);
status = H5Dread(dataset_id, get_hdf5_type<T>(), memspace_id, space_id, plist_id, dataset.data);
status = H5Dread(dataset_id, get_hdf5_type<T>(), memspace_id, space_id, plist_id, dataset[0]);
CHECK_ERROR(status, "Error reading dataset");
H5Pclose(plist_id);
......
......@@ -146,6 +146,11 @@ def load_flann_library():
return flannlib
except Exception,e:
pass
try:
flannlib = cdll[os.path.join(root_dir,"build",libdir,libname)]
return flannlib
except Exception,e:
pass
tmp = os.path.dirname(root_dir)
if tmp == root_dir:
root_dir = None
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册