/* This file is part of the Gudhi Library. The Gudhi library
* (Geometric Understanding in Higher Dimensions) is a generic C++
* library for computational topology.
*
* Author(s): Vincent Rouvreau
*
* Copyright (C) 2018 Inria
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include // for numeric limits
#include
#include
std::ofstream results_csv("results.csv");
template< typename Adjacency_list, typename ForwardPointRange, typename Distance >
Adjacency_list proximity_graph_computation(const ForwardPointRange& points, double threshold, Distance distance) {
std::vector> edges;
std::vector< double > edges_fil;
std::map< int, double > vertices;
int idx_u, idx_v;
double fil;
idx_u = 0;
for (auto it_u = points.begin(); it_u != points.end(); ++it_u) {
idx_v = idx_u + 1;
for (auto it_v = it_u + 1; it_v != points.end(); ++it_v, ++idx_v) {
fil = distance(*it_u, *it_v);
if (fil <= threshold) {
edges.emplace_back(idx_u, idx_v);
edges_fil.push_back(fil);
}
}
++idx_u;
}
// Points are labeled from 0 to idx_u-1
Adjacency_list skel_graph(edges.begin(), edges.end(), edges_fil.begin(), idx_u);
auto vertex_prop = boost::get(Gudhi::vertex_filtration_t(), skel_graph);
typename boost::graph_traits::vertex_iterator vi, vi_end;
for (std::tie(vi, vi_end) = boost::vertices(skel_graph);
vi != vi_end; ++vi) {
boost::put(vertex_prop, *vi, 0.);
}
return skel_graph;
}
template
void benchmark_proximity_graph(const std::string& msg, const std::string& off_file_name) {
Gudhi::Points_off_reader> off_reader(off_file_name);
assert(off_reader.is_valid());
std::cout << "+ " << msg << std::endl;
results_csv << "\"nb_points\";"
<< "\"nb_simplices\";"
<< "\"compute proximity graph(sec.)\";"
<< "\"complex_creation_time(sec.)\";"
<< "\"" << msg << "\";" << std::endl;
Gudhi::Clock pg_compute_proximity_graph(" benchmark_proximity_graph - compute proximity graph");
pg_compute_proximity_graph.begin();
// benchmark begin
Adjacency_list proximity_graph = proximity_graph_computation(off_reader.get_point_cloud(),
std::numeric_limits::infinity(),
Gudhi::Euclidean_distance());
// benchmark end
pg_compute_proximity_graph.end();
std::cout << pg_compute_proximity_graph;
Gudhi::Simplex_tree<> complex;
Gudhi::Clock st_create_clock(" benchmark_proximity_graph - complex creation");
st_create_clock.begin();
// benchmark begin
complex.insert_graph(proximity_graph);
// benchmark end
st_create_clock.end();
std::cout << st_create_clock;
results_csv << off_reader.get_point_cloud().size() << ";" << complex.num_simplices() << ";"
<< pg_compute_proximity_graph.num_seconds() << ";"
<< st_create_clock.num_seconds() << ";" << std::endl;
std::cout << " benchmark_proximity_graph - nb simplices = " << complex.num_simplices() << std::endl;
}
int main(int argc, char * const argv[]) {
std::string off_file_name(argv[1]);
// The fastest, the less memory used
using vecSdirectedS = boost::adjacency_list,
boost::property>;
benchmark_proximity_graph("vecSdirectedS", off_file_name);
using vecSundirectedS = boost::adjacency_list,
boost::property>;
benchmark_proximity_graph("vecSundirectedS", off_file_name);
using vecSbidirectionalS = boost::adjacency_list,
boost::property>;
benchmark_proximity_graph("vecSbidirectionalS", off_file_name);
using setSdirectedS = boost::adjacency_list,
boost::property>;
benchmark_proximity_graph("setSdirectedS", off_file_name);
using setSundirectedS = boost::adjacency_list,
boost::property>;
benchmark_proximity_graph("setSundirectedS", off_file_name);
using setSbidirectionalS = boost::adjacency_list,
boost::property>;
benchmark_proximity_graph("setSbidirectionalS", off_file_name);
return 0;
}