mirror of https://github.com/CGAL/cgal
An initial benchmark program
This commit is contained in:
parent
2dcfd2e49c
commit
679933b028
|
|
@ -2935,6 +2935,7 @@ SearchStructures/doc_tex/SearchStructures_ref/segment_ex2.gif -text svneol=unset
|
||||||
SearchStructures/doc_tex/SearchStructures_ref/segment_ex2.pdf -text svneol=unset#application/pdf
|
SearchStructures/doc_tex/SearchStructures_ref/segment_ex2.pdf -text svneol=unset#application/pdf
|
||||||
SearchStructures/doc_tex/SearchStructures_ref/segment_ex4.gif -text svneol=unset#image/gif
|
SearchStructures/doc_tex/SearchStructures_ref/segment_ex4.gif -text svneol=unset#image/gif
|
||||||
SearchStructures/doc_tex/SearchStructures_ref/segment_ex4.pdf -text svneol=unset#application/pdf
|
SearchStructures/doc_tex/SearchStructures_ref/segment_ex4.pdf -text svneol=unset#application/pdf
|
||||||
|
Segment_Delaunay_graph_2/benchmark/Segment_Delaunay_graph_2/data/norway.cin -text
|
||||||
Segment_Delaunay_graph_2/doc_tex/Segment_Delaunay_graph_2/fig/norway.png -text
|
Segment_Delaunay_graph_2/doc_tex/Segment_Delaunay_graph_2/fig/norway.png -text
|
||||||
Segment_Delaunay_graph_2/doc_tex/Segment_Delaunay_graph_2/fig/svd.png -text
|
Segment_Delaunay_graph_2/doc_tex/Segment_Delaunay_graph_2/fig/svd.png -text
|
||||||
Segment_Delaunay_graph_2/doc_tex/Segment_Delaunay_graph_2/sdg-rep.fig -text svneol=unset#application/octet-stream
|
Segment_Delaunay_graph_2/doc_tex/Segment_Delaunay_graph_2/sdg-rep.fig -text svneol=unset#application/octet-stream
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Created by the script cgal_create_cmake_script
|
||||||
|
# This is the CMake script for compiling a CGAL application.
|
||||||
|
|
||||||
|
|
||||||
|
project( Segment_Delaunay_graph_2_example )
|
||||||
|
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5)
|
||||||
|
|
||||||
|
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
|
||||||
|
|
||||||
|
if ( COMMAND cmake_policy )
|
||||||
|
cmake_policy( SET CMP0003 NEW )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(CGAL QUIET COMPONENTS Core )
|
||||||
|
|
||||||
|
if ( CGAL_FOUND )
|
||||||
|
|
||||||
|
include( ${CGAL_USE_FILE} )
|
||||||
|
|
||||||
|
include( CGAL_CreateSingleSourceCGALProgram )
|
||||||
|
|
||||||
|
# include_directories (BEFORE ../../include)
|
||||||
|
|
||||||
|
create_single_source_cgal_program( "benchmark.cpp" )
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
message(STATUS "This program requires the CGAL library, and will not be compiled.")
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
@ -0,0 +1,230 @@
|
||||||
|
|
||||||
|
// standard includes
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#define USE_FILTERED_TRAITS
|
||||||
|
//#define USE_HIERARCHY
|
||||||
|
//#undef CGAL_USE_CORE
|
||||||
|
|
||||||
|
// choose the kernel
|
||||||
|
#include <CGAL/Simple_cartesian.h>
|
||||||
|
#include <CGAL/Timer.h>
|
||||||
|
|
||||||
|
#ifdef CGAL_USE_CORE
|
||||||
|
# include <CGAL/CORE_Expr.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef CGAL::Simple_cartesian<double> K;
|
||||||
|
typedef K::Point_2 Point_2;
|
||||||
|
|
||||||
|
// typedefs for the traits and the algorithm
|
||||||
|
#include <CGAL/Segment_Delaunay_graph_hierarchy_2.h>
|
||||||
|
#include <CGAL/Segment_Delaunay_graph_filtered_traits_2.h>
|
||||||
|
|
||||||
|
#ifdef USE_FILTERED_TRAITS
|
||||||
|
#ifdef CGAL_USE_CORE
|
||||||
|
typedef CGAL::Field_with_sqrt_tag MTag;
|
||||||
|
typedef CGAL::Field_with_sqrt_tag EMTag;
|
||||||
|
typedef CGAL::Simple_cartesian<CORE::Expr> EK;
|
||||||
|
typedef CGAL::Segment_Delaunay_graph_filtered_traits_2<K, MTag, EK, EMTag> Gt;
|
||||||
|
#else
|
||||||
|
typedef CGAL::Segment_Delaunay_graph_filtered_traits_2<K> Gt;
|
||||||
|
//typedef CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2<K> Gt;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
typedef CGAL::Segment_Delaunay_graph_traits_2<K,CGAL::Field_tag>Gt;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_HIERARCHY
|
||||||
|
typedef CGAL::Segment_Delaunay_graph_hierarchy_2<Gt> SDG2;
|
||||||
|
#else
|
||||||
|
typedef CGAL::Segment_Delaunay_graph_2<Gt> SDG2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef std::vector<Point_2> Points_container;
|
||||||
|
|
||||||
|
typedef Points_container::size_type Index_type;
|
||||||
|
typedef std::pair<Index_type,Index_type> Constraint;
|
||||||
|
|
||||||
|
typedef std::vector<Constraint> Constraints_container;
|
||||||
|
Points_container points;
|
||||||
|
Constraints_container constraints;
|
||||||
|
SDG2 sdg;
|
||||||
|
|
||||||
|
std::vector<SDG2::Site_2> sites;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <typename Kernel, typename Iterator>
|
||||||
|
struct Sort_traits_2 {
|
||||||
|
Kernel k;
|
||||||
|
Sort_traits_2 (const Kernel &kernel = Kernel())
|
||||||
|
: k (kernel)
|
||||||
|
{}
|
||||||
|
|
||||||
|
typedef Iterator Point_2;
|
||||||
|
|
||||||
|
struct Less_x_2 {
|
||||||
|
Kernel k;
|
||||||
|
Less_x_2 (const Kernel &kernel = Kernel())
|
||||||
|
: k (kernel)
|
||||||
|
{}
|
||||||
|
bool operator() (const Point_2 &p, const Point_2 &q) const
|
||||||
|
{
|
||||||
|
return k.less_x_2_object() (*p, *q);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Less_x_2
|
||||||
|
less_x_2_object() const
|
||||||
|
{
|
||||||
|
return Less_x_2(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Less_y_2 {
|
||||||
|
Kernel k;
|
||||||
|
Less_y_2 (const Kernel &kernel = Kernel())
|
||||||
|
: k (kernel)
|
||||||
|
{}
|
||||||
|
bool operator() (const Point_2 &p, const Point_2 &q) const
|
||||||
|
{
|
||||||
|
return k.less_y_2_object() (*p, *q);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Less_y_2
|
||||||
|
less_y_2_object() const
|
||||||
|
{
|
||||||
|
return Less_y_2(k);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <typename SDG>
|
||||||
|
void
|
||||||
|
insert_constraints_using_spatial_sort(SDG& sdg)
|
||||||
|
{
|
||||||
|
typedef typename Points_container::const_iterator Points_iterator;
|
||||||
|
typedef std::vector<Points_iterator> Indices;
|
||||||
|
typedef std::vector<typename SDG::Vertex_handle> Vertices;
|
||||||
|
|
||||||
|
Sort_traits_2<K, Points_iterator> sort_traits;
|
||||||
|
|
||||||
|
Indices indices;
|
||||||
|
indices.reserve(points.size());
|
||||||
|
for(Points_iterator it = points.begin(); it != points.end(); ++it) {
|
||||||
|
indices.push_back(it);
|
||||||
|
}
|
||||||
|
std::random_shuffle(indices.begin(), indices.end());
|
||||||
|
CGAL::spatial_sort(indices.begin(), indices.end(),
|
||||||
|
sort_traits);
|
||||||
|
|
||||||
|
std::cerr << "Inserting points...";
|
||||||
|
CGAL::Timer timer;
|
||||||
|
timer.start();
|
||||||
|
Vertices vertices;
|
||||||
|
vertices.resize(points.size());
|
||||||
|
typename SDG::Vertex_handle hint;
|
||||||
|
for(typename Indices::const_iterator
|
||||||
|
pt_it_it = indices.begin(), end = indices.end();
|
||||||
|
pt_it_it != end; ++pt_it_it) {
|
||||||
|
typename SDG::Vertex_handle vh = sdg.insert(**pt_it_it, hint);
|
||||||
|
hint = vh;
|
||||||
|
vertices[*pt_it_it - points.begin()] = vh;
|
||||||
|
}
|
||||||
|
timer.stop();
|
||||||
|
std::cerr << " done (" << timer.time() << "s)\n";
|
||||||
|
|
||||||
|
std::cerr << "Inserting constraints...\n";
|
||||||
|
|
||||||
|
timer.reset();
|
||||||
|
timer.start();
|
||||||
|
for(typename Constraints_container::const_iterator
|
||||||
|
cit = constraints.begin(), end = constraints.end();
|
||||||
|
cit != end; ++cit) {
|
||||||
|
const typename SDG::Vertex_handle& v1 = vertices[cit->first];
|
||||||
|
const typename SDG::Vertex_handle& v2 = vertices[cit->second];
|
||||||
|
if(v1 != v2)
|
||||||
|
sdg.insert(v1, v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
timer.stop();
|
||||||
|
std::cerr << " done (" << timer.time() << "s)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
load_cin_file(std::istream& ifs) {
|
||||||
|
std::cerr << "Loading file... ";
|
||||||
|
CGAL::Timer timer;
|
||||||
|
timer.start();
|
||||||
|
bool not_first = false;
|
||||||
|
int n;
|
||||||
|
ifs >> n;
|
||||||
|
if(!ifs.good())
|
||||||
|
return false;
|
||||||
|
Point_2 p, q, qold;
|
||||||
|
char c;
|
||||||
|
int point_counter = 0;
|
||||||
|
while(ifs >> c >> p >> q) {
|
||||||
|
if(not_first && p == q) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(p == qold) {
|
||||||
|
points.push_back(q);
|
||||||
|
constraints.push_back(std::make_pair(point_counter-1, point_counter));
|
||||||
|
++point_counter;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
points.push_back(p);
|
||||||
|
points.push_back(q);
|
||||||
|
constraints.push_back(std::make_pair(point_counter, point_counter+1));
|
||||||
|
point_counter += 2;
|
||||||
|
}
|
||||||
|
qold = q;
|
||||||
|
not_first = true;
|
||||||
|
}
|
||||||
|
std::cerr << "done (" << timer.time() << "s)" << std::endl;
|
||||||
|
insert_constraints_using_spatial_sort(sdg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
load_sites(std::istream& ifs)
|
||||||
|
{
|
||||||
|
std::cerr << "Loading file... ";
|
||||||
|
SDG2::Site_2 site;
|
||||||
|
int n;
|
||||||
|
std::cin >> n;
|
||||||
|
// read the sites and insert them in the segment Delaunay graph
|
||||||
|
while ( std::cin >> site ) {
|
||||||
|
sites.push_back(site);
|
||||||
|
}
|
||||||
|
CGAL::Timer timer;
|
||||||
|
timer.start();
|
||||||
|
for(int i=0; i < sites.size(); i++){
|
||||||
|
sdg.insert(sites[i]);
|
||||||
|
}
|
||||||
|
timer.stop();
|
||||||
|
std::cerr << timer.time() << " sec.\nvalidity test:" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
load_cin_file(std::cin);
|
||||||
|
// load_sites(std::cin);
|
||||||
|
if(! sdg.is_valid(true, 1) ){
|
||||||
|
std::cerr << "invalid data structure" << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cerr << "valid data structure" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
norway
|
||||||
|
17.5 sec Core, Filtered traits, hierarchy, intersections
|
||||||
|
8 sec Filtered traits, no hierarchy, spatial sort, intersections
|
||||||
|
|
||||||
|
It gets slower when I use the traits class without intersections,
|
||||||
|
probably because I don't know which kernel to choose.
|
||||||
Loading…
Reference in New Issue