#include #include #include #include #include "common.hh" namespace param { using namespace ::args; ArgumentParser parser { "converter: data code -> feature" }; HelpFlag help { parser, "help", "display this menu", {'h', "help"}, }; ValueFlag smap { parser, "path", "step map file path", {"smap"}, }; ValueFlag first { parser, "0", "first feature", {"first"}, 0 }; ValueFlag fnum { parser, "50", "number of feature kinds", {"fnum"}, 50 }; } // namespace param static void Exec() { const auto fnum = args::get(param::fnum); Enforce(fnum > 0, "fnum must be greater than 0"); std::ifstream smap_st {args::get(param::smap)}; Enforce(!!smap_st, "smap path is invalid"); const auto smap = ReadMatrix(smap_st); Enforce(smap.size() > 0 && smap[0].size() > 0, "empty smap"); const auto bn = smap[0].size(); for (auto& br : smap) { Enforce(br.size() == bn, "all node should have the same number of branch"); } uint32_t feat = args::get(param::first); std::cout << feat << '\n'; for (uint32_t dcode, t = 0; std::cin >> dcode; ++t) { Enforce(dcode < bn, "dcode must be lower than number of branch"); Enforce(fnum*(t+1) <= smap.size(), "smap row shortage"); feat = smap[t*fnum + feat][dcode]; std::cout << feat << '\n'; } } int main(int argc, char** argv) try { param::parser.ParseCLI(argc, argv); Exec(); return EXIT_SUCCESS; } catch (const args::Help&) { std::cout << param::parser << std::endl; return EXIT_SUCCESS; } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; }