From 112599d10b356a63e1ee4e955083d02093ac7559 Mon Sep 17 00:00:00 2001 From: ROUVREAU Vincent Date: Thu, 19 Mar 2020 23:51:57 +0100 Subject: Same test for point cloud and distance matrix. Collapse distance matrix to use the same args as rips_distance_matrix_persistence utility --- ...tance_matrix_edge_collapse_rips_persistence.cpp | 104 ++++++++++++++------- 1 file changed, 72 insertions(+), 32 deletions(-) (limited to 'src/Collapse/utilities/distance_matrix_edge_collapse_rips_persistence.cpp') 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>; 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(&dim_max)->default_value(2), "Maximum allowed dimension of the Rips complex.") - ("input_file_name,i", po::value(&in_file_name), + ("input_file_name,i", po::value(&csv_matrix_file), "The input file.") - ("out_file_name,o", po::value(&out_file_name), + ("filediag,o", po::value(&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> 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(in_file_name); - number_of_points = distances.size(); + distances = Gudhi::read_lower_triangular_matrix_from_csv_file(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(&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(&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(&threshold)->default_value(std::numeric_limits::infinity()), + "Maximal length of an edge for the Rips complex construction.")( + "cpx-dimension,d", po::value(&dim_max)->default_value(1), + "Maximal dimension of the Rips complex we want to compute.")( + "field-charac,p", po::value(&p)->default_value(11), + "Characteristic p of the coefficient field Z/pZ for computing homology.")( + "min-persistence,m", po::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); + } +} -- cgit v1.2.3