split step map generator from converter

This commit is contained in:
2022-09-07 09:51:45 +09:00
parent 74efa6d70c
commit 7b15cf2347
5 changed files with 105 additions and 47 deletions

View File

@@ -1,5 +1,3 @@
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${BLKY_CXX_FLAGS} -I ${PROJECT_SOURCE_DIR}")
add_executable(fidx_video common.hh fidx_video.cc)
target_link_libraries(fidx_video PRIVATE args minimp4 openh264)

View File

@@ -24,24 +24,8 @@ HelpFlag help {
parser, "help", "display this menu", {'h', "help"},
};
enum StepAlgo {
kIncrement,
};
const std::unordered_map<std::string, StepAlgo> kStepAlgo = {
{"inc", kIncrement},
};
MapFlag<std::string, StepAlgo> algo {
parser, "inc", "step algorithm (inc)", {"algorithm", "algo"}, kStepAlgo,
};
Group inc {
parser, "increment algorithm parameters"
};
ValueFlag<uint32_t> inc_min {
inc, "1", "max stride of increment algorithm", {"inc-min"}, 1,
};
ValueFlag<uint32_t> inc_max {
inc, "1", "max stride of increment algorithm", {"inc-max"}, 1,
ValueFlag<std::string> smap {
parser, "path", "step map file path", {"smap"},
};
Flag output_prob {
@@ -51,31 +35,6 @@ Flag output_prob {
} // namespace param
static auto GenerateLegalStepMap(size_t dur, size_t n) {
const auto inc_max = args::get(param::inc_max);
const auto inc_min = args::get(param::inc_min);
Enforce(0 <= inc_min && inc_min <= inc_max, "invalid increment stride");
std::vector<std::vector<int32_t>> ret;
ret.resize(dur*n);
auto legals = &ret[0];
for (size_t t = 0; t < dur; ++t) {
for (size_t i = 0; i < n; ++i) {
switch (args::get(param::algo)) {
case param::kIncrement:
legals->reserve(inc_max-inc_min+1);
for (uint32_t j = inc_min; j <= inc_max; ++j) {
legals->push_back(static_cast<int32_t>((i+j)%n));
}
break;
}
++legals;
}
}
return ret;
}
static void Exec() {
const auto cprobs = ReadMatrix<double>(std::cin);
Enforce(cprobs.size() > 0 && cprobs[0].size() > 0, "empty matrix");
@@ -83,7 +42,10 @@ static void Exec() {
const auto dur = cprobs.size();
const auto n = cprobs[0].size();
const auto lmap = GenerateLegalStepMap(dur, n);
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() >= dur*n, "smap row shortage");
struct Step {
double prob = -1;
@@ -97,7 +59,7 @@ static void Exec() {
Enforce(cprobs[t].size() == n, "ill-formed matrix");
for (size_t i = 0; i < n; ++i) {
const auto& cur = steps[(t-1)*n + i];
for (auto j : lmap[t*n+i]) {
for (auto j : smap[(t-1)*n+i]) {
auto& next = steps[t*n + j];
const auto sum = cur.prob + cprobs[t][j];