diff options
author | pdlotko <pdlotko@636b058d-ea47-450e-bf9e-a15bfbe3eedb> | 2017-08-14 19:43:45 +0000 |
---|---|---|
committer | pdlotko <pdlotko@636b058d-ea47-450e-bf9e-a15bfbe3eedb> | 2017-08-14 19:43:45 +0000 |
commit | e2c0166fcbf17e91cf5ed7b6159f80d64b49cc0b (patch) | |
tree | 8b406841de67ed77647a9c4153bbb88dee90a60a /src/Persistence_representations/include/gudhi/read_persistence_from_file.h | |
parent | 871bf8d781f88536942a92f9003509eaaa4e2e12 (diff) |
Adding a code that use Clement's procedure to read files. Correcting some samll errors. Now the code is ready.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/persistence_representation_integration@2610 636b058d-ea47-450e-bf9e-a15bfbe3eedb
Former-commit-id: b2947d1c484d661eca6c32fe5386461e741b76f9
Diffstat (limited to 'src/Persistence_representations/include/gudhi/read_persistence_from_file.h')
-rw-r--r-- | src/Persistence_representations/include/gudhi/read_persistence_from_file.h | 192 |
1 files changed, 72 insertions, 120 deletions
diff --git a/src/Persistence_representations/include/gudhi/read_persistence_from_file.h b/src/Persistence_representations/include/gudhi/read_persistence_from_file.h index ad3d4e83..770da15b 100644 --- a/src/Persistence_representations/include/gudhi/read_persistence_from_file.h +++ b/src/Persistence_representations/include/gudhi/read_persistence_from_file.h @@ -30,6 +30,7 @@ #include <algorithm> #include <string> #include <utility> +#include <gudhi/reader_utils.h> namespace Gudhi { namespace Persistence_representations { @@ -49,130 +50,81 @@ namespace Persistence_representations { * The procedure returns vector of persistence pairs. **/ std::vector<std::pair<double, double> > read_persistence_intervals_in_one_dimension_from_file( - std::string const& filename, int dimension = -1, double what_to_substitute_for_infinite_bar = -1) { + std::string const& filename, int dimension = -1, double what_to_substitute_for_infinite_bar = -1) { bool dbg = false; - std::ifstream in; - in.open(filename); - // checking if the file exist: - if (!in.good()) { - std::cerr << "The file : " << filename << " do not exist. The program will now terminate \n"; - throw "The persistence landscape file do not exist. The program will now terminate \n"; - } std::string line; - std::vector<std::pair<double, double> > barcode; - - int number_of_entries_per_line = -1; - - while (!in.eof()) { - getline(in, line); - if (dbg) std::cerr << "Reading line : " << line << std::endl; - if (!(line.length() == 0 || line[0] == '#')) { - // If we do not know how many entries per line we have, we check it in below. - if (number_of_entries_per_line == -1) { - number_of_entries_per_line = 0; - std::string line_copy(line); - if (line_copy.find("inf") != std::string::npos) { - size_t np = line_copy.find("inf"); - // replace symbols 'inf' in line_copy with white spaces: - line_copy[np] = ' '; - line_copy[np + 1] = ' '; - line_copy[np + 2] = ' '; - number_of_entries_per_line = 1; - } - // check how many entries we have in the line. - std::stringstream ss(line_copy); - double number; - std::vector<double> this_line; - while (ss >> number) { - this_line.push_back(number); - } - number_of_entries_per_line += static_cast<int>(this_line.size()); - if (dbg) { - std::cerr << "number_of_entries_per_line : " << number_of_entries_per_line - << ". This number was obtained by analyzing this line : " << line << std::endl; - } - if ((number_of_entries_per_line < 2) || (number_of_entries_per_line > 4)) { - std::cerr << "The input file you have provided have wrong number of numerical entries per line. The program " - "will now terminate. \n"; - throw "Wrong number of numerical entries per line in the input file. The program will now terminate. \n"; - } - } - // In case there is an 'inf' string in this line, we are dealing with this situation in below. - if (line.find("inf") != std::string::npos) { - if (dbg) { - std::cerr << "This line: " << line << " contains infinite interval. \n"; - } - // first we substitute inf by white spaces: - size_t np = line.find("inf"); - line[np] = ' '; - line[np + 1] = ' '; - line[np + 2] = ' '; - if (what_to_substitute_for_infinite_bar != -1) { - double beginn, field, dim; - std::stringstream lineSS(line); - if (number_of_entries_per_line == 4) lineSS >> field; - if (number_of_entries_per_line >= 3) { - lineSS >> dim; - } else { - dim = dimension; - } - lineSS >> beginn; - if (dim == dimension) { - if (beginn > what_to_substitute_for_infinite_bar) { - barcode.push_back(std::make_pair(what_to_substitute_for_infinite_bar, beginn)); - } else { - barcode.push_back(std::make_pair(beginn, what_to_substitute_for_infinite_bar)); - } - if (dbg) { - std::cerr << "this is the line that is going to the output : " << beginn << " , " - << what_to_substitute_for_infinite_bar << std::endl; - } - } - } else { - // this is a line with infinity. Since the variable what_to_substitute_for_infinite_bar have not been set up, - // it means that this line will be skipped. - if (dbg) { - std::cerr << "We will skip it \n"; - } - } - continue; - } else { - // Then, we read the content of the line. We know that it do not contain 'inf' substring. - std::stringstream lineSS(line); - double beginn, endd, field, dim; - if (number_of_entries_per_line == 4) lineSS >> field; - if (number_of_entries_per_line >= 3) { - lineSS >> dim; - } else { - dim = dimension; - } - lineSS >> beginn; - lineSS >> endd; - if (beginn > endd) { - std::swap(beginn, endd); - } - if (dim == dimension) { - barcode.push_back(std::make_pair(beginn, endd)); - if (dbg) { - std::cerr << "This is a line that is going to the output : " << beginn << " , " << endd << std::endl; - } - } else { - if ((number_of_entries_per_line == 3) && (dimension == -1)) { - barcode.push_back(std::make_pair(beginn, endd)); - } - } - } - } else { - if (dbg) { - std::cerr << "This is a comment line \n"; - } - } + std::vector<std::pair<double, double> > barcode_initial = read_persistence_intervals_in_dimension(filename,(int)dimension); + std::vector<std::pair<double, double> > final_barcode; + final_barcode.reserve( barcode_initial.size() ); + + if ( dbg ) + { + std::cerr << "Here are the intervals that we read from the file : \n"; + for ( size_t i = 0 ; i != barcode_initial.size() ; ++i ) + { + std::cout << barcode_initial[i].first << " " << barcode_initial[i].second << std::endl; + } + getchar(); } - in.close(); - if (dbg) std::cerr << "End of reading \n"; - - return barcode; + + for ( size_t i = 0 ; i != barcode_initial.size() ; ++i ) + { + if ( dbg ) + { + std::cout << "COnsidering interval : " << barcode_initial[i].first << " " << barcode_initial[i].second << std::endl; + } + // if ( barcode_initial[i].first == barcode_initial[i].second ) + //{ + // if ( dbg )std::cout << "It has zero length \n"; + // continue;//zero length intervals are not relevant, so we skip all of them. + //} + + if ( barcode_initial[i].first > barcode_initial[i].second )//note that in this case barcode_initial[i].second != std::numeric_limits<double>::infinity() + { + if ( dbg )std::cout << "Swap and enter \n"; + //swap them to make sure that birth < death + final_barcode.push_back( std::pair<double,double>( barcode_initial[i].second , barcode_initial[i].first ) ); + continue; + } + else + { + if ( barcode_initial[i].second != std::numeric_limits<double>::infinity() ) + { + if ( dbg )std::cout << "Simply enters\n"; + //in this case, due to the previous conditions we know that barcode_initial[i].first < barcode_initial[i].second, so we put them as they are + final_barcode.push_back( std::pair<double,double>( barcode_initial[i].first , barcode_initial[i].second ) ); + } + } + + if ( (barcode_initial[i].second == std::numeric_limits<double>::infinity() ) && ( what_to_substitute_for_infinite_bar != -1 ) ) + { + if ( barcode_initial[i].first < what_to_substitute_for_infinite_bar )//if only birth < death. + { + final_barcode.push_back( std::pair<double,double>( barcode_initial[i].first , what_to_substitute_for_infinite_bar ) ); + } + } + else + { + //if the variable what_to_substitute_for_infinite_bar is not set, then we ignore all the infinite bars. + } + } + + + if ( dbg ) + { + std::cerr << "Here are the final bars that we are sending further : \n"; + for ( size_t i = 0 ; i != final_barcode.size() ; ++i ) + { + std::cout << final_barcode[i].first << " " << final_barcode[i].second << std::endl; + } + std::cerr << "final_barcode.size() : " << final_barcode.size() << std::endl; + getchar(); + } + + + + return final_barcode; } // read_persistence_intervals_in_one_dimension_from_file } // namespace Persistence_representations |