summaryrefslogtreecommitdiff
path: root/src/Collapse
diff options
context:
space:
mode:
authorROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-06-25 18:06:41 +0200
committerROUVREAU Vincent <vincent.rouvreau@inria.fr>2020-06-25 18:06:41 +0200
commit2945af0dd22fd95e61b5757d9bb9c3de5dae0abc (patch)
tree879f76e3d64bcff8da926081b1d00ff0e591ce26 /src/Collapse
parentb522b330b10d11f0da640b8bba7ee689dea774d7 (diff)
Iterate on edge collapse for utils
Diffstat (limited to 'src/Collapse')
-rw-r--r--src/Collapse/utilities/collapse.md1
-rw-r--r--src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp49
2 files changed, 35 insertions, 15 deletions
diff --git a/src/Collapse/utilities/collapse.md b/src/Collapse/utilities/collapse.md
index a0220edb..1f41bb1f 100644
--- a/src/Collapse/utilities/collapse.md
+++ b/src/Collapse/utilities/collapse.md
@@ -31,6 +31,7 @@ where `dim` is the dimension of the homological feature, `birth` and `death` are
* `-d [ --cpx-dimension ]` (default = 1) Maximal dimension of the Rips complex we want to compute.
* `-p [ --field-charac ]` (default = 11) Characteristic p of the coefficient field Z/pZ for computing homology.
* `-m [ --min-persistence ]` (default = 0) Minimal lifetime of homology feature to be recorded. Enter a negative value to see zero length intervals.
+* `-i [ --edge-collapse-iterations ]` (default = 1) Number of iterations edge collapse is performed.
Beware: this program may use a lot of RAM and take a lot of time if `max-edge-length` is set to a large value.
diff --git a/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp b/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp
index 4e14d7a8..8522c259 100644
--- a/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp
+++ b/src/Collapse/utilities/point_cloud_edge_collapse_rips_persistence.cpp
@@ -30,13 +30,15 @@ using Point = std::vector<Filtration_value>;
using Vector_of_points = std::vector<Point>;
using Flag_complex_edge_collapser = Gudhi::collapse::Flag_complex_edge_collapser<Vertex_handle, Filtration_value>;
+using Filtered_edge = Flag_complex_edge_collapser::Filtered_edge;
using Proximity_graph = Gudhi::Proximity_graph<Flag_complex_edge_collapser>;
using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp>;
void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag,
- Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence);
+ Filtration_value& threshold, int& dim_max, int& p, int& edge_collapse_iter_nb,
+ Filtration_value& min_persistence);
int main(int argc, char* argv[]) {
std::string off_file_points;
@@ -44,9 +46,10 @@ int main(int argc, char* argv[]) {
double threshold;
int dim_max;
int p;
+ int edge_collapse_iter_nb;
double min_persistence;
- program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence);
+ program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, edge_collapse_iter_nb, min_persistence);
std::cout << "The current input values to run the program is: " << std::endl;
std::cout << "min_persistence, threshold, max_complex_dimension, off_file_points, filediag"
@@ -78,24 +81,37 @@ int main(int argc, char* argv[]) {
exit(-1);
}
- Flag_complex_edge_collapser edge_collapser(
- boost::adaptors::transform(edges(proximity_graph), [&](auto&&edge){
- return std::make_tuple(source(edge, proximity_graph),
- target(edge, proximity_graph),
- get(Gudhi::edge_filtration_t(), proximity_graph, edge));
- })
- );
+ auto edges_from_graph = boost::adaptors::transform(edges(proximity_graph), [&](auto&&edge){
+ return std::make_tuple(source(edge, proximity_graph),
+ target(edge, proximity_graph),
+ get(Gudhi::edge_filtration_t(), proximity_graph, edge));
+ });
+ std::vector<Filtered_edge> edges_list(edges_from_graph.begin(), edges_from_graph.end());
+
+ std::vector<Filtered_edge> remaining_edges;
+ for (int iter = 0; iter < edge_collapse_iter_nb; iter++) {
+ Flag_complex_edge_collapser edge_collapser(edges_list);
+ edge_collapser.process_edges(
+ [&remaining_edges](Vertex_handle u, Vertex_handle v, Filtration_value filtration) {
+ // insert the edge
+ remaining_edges.emplace_back(u, v, filtration);
+ });
+ if ((iter + 1) < edge_collapse_iter_nb) {
+ edges_list.clear();
+ std::copy(remaining_edges.begin(), remaining_edges.end(), std::back_inserter(edges_list));
+ remaining_edges.clear();
+ }
+ }
Simplex_tree stree;
for (Vertex_handle vertex = 0; static_cast<std::size_t>(vertex) < point_vector.size(); vertex++) {
// insert the vertex with a 0. filtration value just like a Rips
stree.insert_simplex({vertex}, 0.);
}
- edge_collapser.process_edges(
- [&stree](Vertex_handle u, Vertex_handle v, Filtration_value filtration) {
- // insert the edge
- stree.insert_simplex({u, v}, filtration);
- });
+
+ for (auto filtered_edge : remaining_edges) {
+ stree.insert_simplex({std::get<0>(filtered_edge), std::get<1>(filtered_edge)}, std::get<2>(filtered_edge));
+ }
stree.expansion(dim_max);
@@ -122,7 +138,8 @@ int main(int argc, char* argv[]) {
}
void program_options(int argc, char* argv[], std::string& off_file_points, std::string& filediag,
- Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence) {
+ Filtration_value& threshold, int& dim_max, int& p, int& edge_collapse_iter_nb,
+ Filtration_value& min_persistence) {
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
hidden.add_options()("input-file", po::value<std::string>(&off_file_points),
@@ -139,6 +156,8 @@ void program_options(int argc, char* argv[], std::string& off_file_points, std::
"Maximal dimension of the Rips complex we want to compute.")(
"field-charac,p", po::value<int>(&p)->default_value(11),
"Characteristic p of the coefficient field Z/pZ for computing homology.")(
+ "edge-collapse-iterations,i", po::value<int>(&edge_collapse_iter_nb)->default_value(1),
+ "Number of iterations edge collapse is performed.")(
"min-persistence,m", po::value<Filtration_value>(&min_persistence),
"Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length "
"intervals");