#include #include #include #include #include "common.hh" namespace param { using namespace ::args; ArgumentParser parser { "converter: feature code probability matrix -> feature code" }; HelpFlag help { parser, "help", "display this menu", {'h', "help"}, }; ValueFlag smap { parser, "path", "step map file path", {"smap"}, }; ValueFlag first { parser, "0", "first fcode", {"first"}, 0 }; ValueFlag fcnum { parser, "50", "number of fcode alphabet", {"fc-num"}, 50 }; } // namespace param static void Exec() { const auto fcnum = args::get(param::fcnum); Enforce(fcnum > 0, "fc-num 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 fcode = args::get(param::first); std::cout << fcode << '\n'; for (uint32_t dcode, t = 0; std::cin >> dcode; ++t) { Enforce(dcode < bn, "dcode must be lower than number of branch"); Enforce(fcnum*(t+1) <= smap.size(), "smap row shortage"); fcode = smap[t*fcnum + fcode][dcode]; std::cout << fcode << '\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; }