diff --git a/ripser.cpp b/ripser.cpp index bdcd249..8e2edcb 100644 --- a/ripser.cpp +++ b/ripser.cpp @@ -835,6 +835,32 @@ template T read(std::istream& input_stream) { return result; } +template bool next_value_stream(T& s, value_t& next_value) { + value_t value; + std::string tmp; + bool valid = false; + + if (s >> value || !s.eof()) { + /* Any input stream fails to convert correctly when Inf or NaN is + * present, this checks if it encounters this kind of values + * if stof fails to find any valid convertion, it throws an + * invalid_argument exception*/ + if (s.fail()) { + s.clear(); + s >> tmp; + next_value = std::stof(tmp.c_str()); + } else { + next_value = value; + } + + /* This check prevent encountering any zero values in distances matrices */ + if (next_value != 0) valid = true; + } + + s.ignore(); + return valid; +} + compressed_lower_distance_matrix read_point_cloud(std::istream& input_stream) { std::vector> points; @@ -892,10 +918,7 @@ sparse_distance_matrix read_sparse_distance_matrix(std::istream& input_stream) { compressed_lower_distance_matrix read_lower_distance_matrix(std::istream& input_stream) { std::vector distances; value_t value; - while (input_stream >> value) { - distances.push_back(value); - input_stream.ignore(); - } + while (next_value_stream(input_stream, value)) { distances.push_back(value); } return compressed_lower_distance_matrix(std::move(distances)); } @@ -903,10 +926,7 @@ compressed_lower_distance_matrix read_lower_distance_matrix(std::istream& input_ compressed_lower_distance_matrix read_upper_distance_matrix(std::istream& input_stream) { std::vector distances; value_t value; - while (input_stream >> value) { - distances.push_back(value); - input_stream.ignore(); - } + while (next_value_stream(input_stream, value)) { distances.push_back(value); } return compressed_lower_distance_matrix(compressed_upper_distance_matrix(std::move(distances))); } @@ -918,10 +938,7 @@ compressed_lower_distance_matrix read_distance_matrix(std::istream& input_stream value_t value; for (int i = 0; std::getline(input_stream, line); ++i) { std::istringstream s(line); - for (int j = 0; j < i && s >> value; ++j) { - distances.push_back(value); - s.ignore(); - } + for (int j = 0; j < i && next_value_stream(s, value); ++j) { distances.push_back(value); } } return compressed_lower_distance_matrix(std::move(distances));