blocky/conv/dcode_feat.cc
2022-10-05 11:44:56 +09:00

71 lines
1.6 KiB
C++

#include <fstream>
#include <iostream>
#include <string>
#include <args.hxx>
#include "common.hh"
namespace param {
using namespace ::args;
ArgumentParser parser {
"converter: data code -> feature"
};
HelpFlag help {
parser, "help", "display this menu", {'h', "help"},
};
ValueFlag<std::string> smap {
parser, "path", "step map file path", {"smap"},
};
ValueFlag<uint32_t> first {
parser, "0", "first feature", {"first"}, 0
};
ValueFlag<uint32_t> 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<uint32_t>(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;
}