Files
slopetimize/lib/importer.cpp
T
2026-10-06 17:20:47 +02:00

73 lines
2.0 KiB
C++

#include "autoopt/importer.hpp"
namespace autoopt {
std::generator<std::pair<double, double>> parse_dat_file(
const std::filesystem::path& filename) {
// check if file exists
if (!std::filesystem::exists(filename)) {
throw std::runtime_error("File does not exist: " + filename.string());
}
std::fstream file(filename, std::ios::in);
std::string line;
while (std::getline(file, line)) {
if (line.empty() || line == "\r" || line[0] == '#') {
continue;
}
std::istringstream iss(line);
double x, y;
iss >> x;
for (size_t i = 1; i < 5; ++i) {
iss >> y; // skip unused columns
}
co_yield {x, -y};
}
co_return;
}
std::pair<std::vector<double>, std::vector<double>> parse_row(auto& iter,
auto sentinel) {
std::vector<double> xs;
std::vector<double> ys;
xs.push_back((*iter).first);
ys.push_back((*iter).second);
++iter;
double last_x = xs[0];
bool forward = last_x < (*iter).first;
while (iter != sentinel && ((forward && last_x < (*iter).first) ||
(!forward && last_x > (*iter).first))) {
xs.push_back((*iter).first);
ys.push_back((*iter).second);
last_x = (*iter).first;
++iter;
}
if (!forward) {
std::reverse(xs.begin(), xs.end());
std::reverse(ys.begin(), ys.end());
}
return std::make_pair(std::move(xs), std::move(ys));
}
raw_data read_data(const std::filesystem::path &filename){
auto lines = parse_dat_file(filename);
raw_data result;
auto it = lines.begin();
while (it != lines.end()) {
auto [xs, ys] = parse_row(it, lines.end());
if (result._xs.rows() == 0) {
result._xs = Eigen::VectorXd(xs.size());
std::copy(xs.begin(), xs.end(), result._xs.begin());
}
Eigen::VectorXd ys_vec = Eigen::VectorXd(ys.size());
std::copy(ys.begin(), ys.end(), ys_vec.begin());
result._yss.push_back(ys_vec);
}
return result;
}
} // namespace autoopt