From 7ea3593588fea4337786aeaa5841559bbc5137ef Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Tue, 13 Oct 2015 14:38:49 +0200 Subject: [PATCH] Adds script I use to parse/accumulate data for a learning plot --- src/scatter_plot.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/scatter_plot.cpp diff --git a/src/scatter_plot.cpp b/src/scatter_plot.cpp new file mode 100644 index 0000000..7732293 --- /dev/null +++ b/src/scatter_plot.cpp @@ -0,0 +1,81 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +static const char USAGE[] = + R"(Generate a statistical learning graph from multiple runs + + Usage: + learning_graph ... + + Options: + -h, --help Show this screen + --version Show version +)"; + +struct datapoint { + uint64_t states; + uint64_t learning_queries; + uint64_t learning_inputs; + uint64_t testing_queries; + uint64_t testing_inputs; +}; + +using dataset = vector; + +static void accumulate_dataset(dataset & ds) { + for (size_t i = 0; i < ds.size() - 1; ++i) { + ds[i + 1].learning_queries += ds[i].learning_queries; + ds[i + 1].learning_inputs += ds[i].learning_inputs; + ds[i + 1].testing_queries += ds[i].testing_queries; + ds[i + 1].testing_inputs += ds[i].testing_inputs; + } +} + +int main(int argc, char * argv[]) { + const auto args = docopt::docopt(USAGE, {argv + 1, argv + argc}, true, __DATE__ __TIME__); + + vector> dataset_futures; + for (auto const & filename : args.at("").asStringList()) { + dataset_futures.emplace_back(async([filename] { + fstream file(filename); + if (!file) throw runtime_error("Could not open file " + filename); + + dataset s; + datapoint p; + while (file >> p.states >> p.learning_queries >> p.learning_inputs >> p.testing_queries + >> p.testing_inputs) { + s.push_back(p); + } + + accumulate_dataset(s); + + return s; + })); + } + + vector datasets; + clog << "datasets"; + for (auto & f : dataset_futures) { + datasets.emplace_back(f.get()); + clog << ' ' << datasets.back().size(); + if (datasets.back().size() == 0) throw runtime_error("empty dataset"); + } + clog << endl; + + for (auto const & set : datasets) { + for (auto const & p : set) { + const auto v + = p.learning_queries + p.learning_inputs + p.testing_queries + p.testing_inputs; + cout << p.states << '\t' << v << endl; + } + } +}