summaryrefslogtreecommitdiff
path: root/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp')
-rw-r--r--src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp104
1 files changed, 72 insertions, 32 deletions
diff --git a/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp b/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp
index a2bc1c93..63c91ebc 100644
--- a/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp
+++ b/src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp
@@ -24,7 +24,7 @@ using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomolog
using Distance_matrix = std::vector<std::vector<Filtration_value>>;
void program_options(int argc, char* const argv[], double& min_persistence, double& end_thresold,
- int& dimension, int& dim_max, std::string& in_file_name, std::string& out_file_name) {
+ int& dimension, int& dim_max, std::string& csv_matrix_file, std::string& filediag) {
namespace po = boost::program_options;
po::options_description visible("Allowed options", 100);
visible.add_options()
@@ -37,9 +37,9 @@ void program_options(int argc, char* const argv[], double& min_persistence, doub
"Dimension of the manifold.")
("dim_max,k ", po::value<int>(&dim_max)->default_value(2),
"Maximum allowed dimension of the Rips complex.")
- ("input_file_name,i", po::value<std::string>(&in_file_name),
+ ("input_file_name,i", po::value<std::string>(&csv_matrix_file),
"The input file.")
- ("out_file_name,o", po::value<std::string>(&out_file_name),
+ ("filediag,o", po::value<std::string>(&filediag),
"The output file.");
po::options_description all;
@@ -88,56 +88,47 @@ class filt_edge_to_dist_matrix {
}
};
-int main(int argc, char* const argv[]) {
+void program_options(int argc, char* argv[], std::string& csv_matrix_file, std::string& filediag,
+ Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence);
+
+int main(int argc, char* argv[]) {
auto the_begin = std::chrono::high_resolution_clock::now();
- std::string out_file_name;
- std::string in_file_name;
- std::size_t number_of_points;
typedef size_t Vertex_handle;
typedef std::vector<std::tuple<Filtration_value, Vertex_handle, Vertex_handle>> Filtered_sorted_edge_list;
- int dimension;
- double end_threshold;
- double min_persistence;
+ std::string csv_matrix_file;
+ std::string filediag;
+ double threshold;
int dim_max = 2;
+ int p;
+ double min_persistence;
- program_options(argc, argv, min_persistence, end_threshold, dimension, dim_max, in_file_name,
- out_file_name);
-
- std::cout << "The current input values to run the program is: " << std::endl;
- std::cout << "min_persistence, end_threshold, dimension, max_complex_dimension, in_file_name, out_file_name"
- << std::endl;
- std::cout << min_persistence << ", " << end_threshold << ", " << dimension << ", " << dim_max
- << ", " << in_file_name << ", " << out_file_name << std::endl;
+ program_options(argc, argv, csv_matrix_file, filediag, threshold, dim_max, p, min_persistence);
Map map_empty;
Distance_matrix distances;
Distance_matrix sparse_distances;
- distances = Gudhi::read_lower_triangular_matrix_from_csv_file<Filtration_value>(in_file_name);
- number_of_points = distances.size();
+ distances = Gudhi::read_lower_triangular_matrix_from_csv_file<Filtration_value>(csv_matrix_file);
+ std::size_t number_of_points = distances.size();
std::cout << "Read the distance matrix succesfully, of size: " << number_of_points << std::endl;
-
- std::cout << "Successfully read " << number_of_points << " point_vector.\n";
-
- std::cout << "Point Set Generated." << std::endl;
-
Filtered_sorted_edge_list edge_t;
- std::cout << "Computing the one-skeleton for threshold: " << end_threshold << std::endl;
+ std::cout << "Computing the one-skeleton for threshold: " << threshold << std::endl;
- Rips_edge_list Rips_edge_list_from_file(distances, end_threshold);
+ Rips_edge_list Rips_edge_list_from_file(distances, threshold);
Rips_edge_list_from_file.create_edges(edge_t);
std::cout<< "Sorted edge list computed" << std::endl;
- std::cout << "Total number of edges before collapse are: " << edge_t.size() << std::endl;
-
+
if (edge_t.size() <= 0) {
std::cerr << "Total number of egdes are zero." << std::endl;
exit(-1);
}
+ std::cout << "Total number of edges before collapse are: " << edge_t.size() << std::endl;
+
// Now we will perform filtered edge collapse to sparsify the edge list edge_t.
std::cout << "Filtered edge collapse begins" << std::endl;
FlagComplexSpMatrix mat_filt_edge_coll(number_of_points, edge_t);
@@ -148,7 +139,7 @@ int main(int argc, char* const argv[]) {
std::cout << "Total number of vertices after collapse in the sparse matrix are: " << mat_filt_edge_coll.num_vertices()
<< std::endl;
- Rips_complex rips_complex_after_collapse(sparse_distances, end_threshold);
+ Rips_complex rips_complex_after_collapse(sparse_distances, threshold);
Simplex_tree stree;
rips_complex_after_collapse.create_complex(stree, dim_max);
@@ -164,10 +155,10 @@ int main(int argc, char* const argv[]) {
pcoh.init_coefficients(3);
pcoh.compute_persistent_cohomology(min_persistence);
- if (out_file_name.empty()) {
+ if (filediag.empty()) {
pcoh.output_diagram();
} else {
- std::ofstream out(out_file_name);
+ std::ofstream out(filediag);
pcoh.output_diagram(out);
out.close();
}
@@ -179,3 +170,52 @@ int main(int argc, char* const argv[]) {
<< std::endl;
return 0;
}
+
+void program_options(int argc, char* argv[], std::string& csv_matrix_file, std::string& filediag,
+ Filtration_value& threshold, int& dim_max, int& p, Filtration_value& min_persistence) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()(
+ "input-file", po::value<std::string>(&csv_matrix_file),
+ "Name of file containing a distance matrix. Can be square or lower triangular matrix. Separator is ';'.");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()("help,h", "produce help message")(
+ "output-file,o", po::value<std::string>(&filediag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")(
+ "max-edge-length,r",
+ po::value<Filtration_value>(&threshold)->default_value(std::numeric_limits<Filtration_value>::infinity()),
+ "Maximal length of an edge for the Rips complex construction.")(
+ "cpx-dimension,d", po::value<int>(&dim_max)->default_value(1),
+ "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.")(
+ "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");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+
+ po::options_description all;
+ all.add(visible).add(hidden);
+
+ po::variables_map vm;
+ po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm);
+ po::notify(vm);
+
+ if (vm.count("help") || !vm.count("input-file")) {
+ std::cout << std::endl;
+ std::cout << "Compute the persistent homology with coefficient field Z/pZ \n";
+ std::cout << "of a Rips complex after edge collapse defined on a set of distance matrix.\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p dim b d \n";
+ std::cout << "where dim is the dimension of the homological feature,\n";
+ std::cout << "b and d are respectively the birth and death of the feature and \n";
+ std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl;
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ exit(-1);
+ }
+}