mirror of https://github.com/CGAL/cgal
Add comparison with kdtree for nearest neighbor
This commit is contained in:
parent
b1571bfa45
commit
514f937278
|
|
@ -10,7 +10,6 @@
|
||||||
#include <CGAL/Orthogonal_k_neighbor_search.h>
|
#include <CGAL/Orthogonal_k_neighbor_search.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,13 @@
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#include <CGAL/Octree.h>
|
|
||||||
|
|
||||||
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
|
||||||
|
|
||||||
|
#include <CGAL/Octree.h>
|
||||||
|
#include <CGAL/Search_traits_3.h>
|
||||||
|
#include <CGAL/Orthogonal_k_neighbor_search.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
||||||
|
|
@ -18,21 +19,30 @@ typedef Point_set::Point_map Point_map;
|
||||||
|
|
||||||
typedef CGAL::Octree<Kernel, Point_set, Point_map> Octree;
|
typedef CGAL::Octree<Kernel, Point_set, Point_map> Octree;
|
||||||
|
|
||||||
|
typedef CGAL::Search_traits_3<Kernel> Kd_tree_traits;
|
||||||
|
typedef CGAL::Orthogonal_k_neighbor_search<Kd_tree_traits> Kd_tree_search;
|
||||||
|
typedef Kd_tree_search::Tree Kdtree;
|
||||||
|
|
||||||
using std::chrono::high_resolution_clock;
|
using std::chrono::high_resolution_clock;
|
||||||
using std::chrono::duration_cast;
|
using std::chrono::duration_cast;
|
||||||
using std::chrono::microseconds;
|
using std::chrono::microseconds;
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
size_t k = 10;
|
||||||
|
|
||||||
// Set output file
|
// Set output file
|
||||||
std::ofstream file;
|
std::ofstream file;
|
||||||
file.open((argc > 1) ? argv[1] : "../nearest_neighbor_benchmark.csv");
|
file.open((argc > 1) ? argv[1] : "../nearest_neighbor_benchmark.csv");
|
||||||
|
|
||||||
// Add header for CSV
|
// Add header for CSV
|
||||||
file << "Number of Points,Search Time (ms) \n";
|
file << "Number of Points,Octree,kDTree \n";
|
||||||
|
|
||||||
// Perform tests for various dataset sizes
|
// Perform tests for various dataset sizes
|
||||||
for (size_t num_points = 10; num_points < 1000000; num_points *= 1.1) {
|
for (size_t num_points = 100; num_points < 10000000; num_points *= 1.05) {
|
||||||
|
|
||||||
|
file << num_points << ",";
|
||||||
|
std::cout << num_points << std::endl;
|
||||||
|
|
||||||
// Create a collection of the right number of points
|
// Create a collection of the right number of points
|
||||||
auto points = generate<Kernel>(num_points);
|
auto points = generate<Kernel>(num_points);
|
||||||
|
|
@ -40,22 +50,34 @@ int main(int argc, char **argv) {
|
||||||
// Create a search point
|
// Create a search point
|
||||||
auto search_point = *generate<Kernel>().points().begin();
|
auto search_point = *generate<Kernel>().points().begin();
|
||||||
|
|
||||||
|
{
|
||||||
// Build the tree (not timed)
|
// Build the tree (not timed)
|
||||||
Octree octree(points, points.point_map());
|
auto octreePoints = points;
|
||||||
|
Octree octree(octreePoints, octreePoints.point_map());
|
||||||
octree.refine();
|
octree.refine();
|
||||||
|
|
||||||
auto elapsedTime = bench<microseconds>(
|
auto octreeTime = bench<microseconds>(
|
||||||
[&] {
|
[&] {
|
||||||
// Find the nearest point to the search point
|
|
||||||
std::vector<Point> nearest_neighbors;
|
std::vector<Point> nearest_neighbors;
|
||||||
octree.nearest_neighbors(search_point, 10, std::back_inserter(nearest_neighbors));
|
octree.nearest_neighbors(search_point, k, std::back_inserter(nearest_neighbors));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
file << octreeTime.count() << ",";
|
||||||
|
}
|
||||||
|
|
||||||
file << num_points << ",";
|
{
|
||||||
file << elapsedTime.count() << "\n";
|
auto kdtreePoints = points;
|
||||||
|
Kdtree kdtree(kdtreePoints.points().begin(), kdtreePoints.points().end());
|
||||||
|
kdtree.build();
|
||||||
|
|
||||||
|
auto kdtreeTime = bench<microseconds>(
|
||||||
|
[&] {
|
||||||
|
Kd_tree_search search(kdtree, search_point, k);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
file << kdtreeTime.count() << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << num_points << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ set style data lines
|
||||||
|
|
||||||
set title 'Time to construct a tree from points'
|
set title 'Time to construct a tree from points'
|
||||||
set xlabel "Number of points"
|
set xlabel "Number of points"
|
||||||
set ylabel "Time (ms)"
|
set ylabel "Time (us)"
|
||||||
set key autotitle columnhead
|
set key autotitle columnhead
|
||||||
|
|
||||||
set datafile separator ","
|
set datafile separator ","
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
|
||||||
|
reset
|
||||||
|
|
||||||
|
set terminal png size 800,500
|
||||||
|
set output 'nearest_neighbor_benchmark.png'
|
||||||
|
|
||||||
|
set grid
|
||||||
|
set style data lines
|
||||||
|
#set logscale x
|
||||||
|
|
||||||
|
set title 'Time to find the neighbors of a point using a tree'
|
||||||
|
set xlabel "Number of points"
|
||||||
|
set ylabel "Time (us)"
|
||||||
|
set key autotitle columnhead
|
||||||
|
|
||||||
|
set datafile separator ","
|
||||||
|
plot for [col=2:3] 'nearest_neighbor_benchmark.csv' using 1:col
|
||||||
Loading…
Reference in New Issue