diff --git a/conv/aprob_bmap.cc b/conv/aprob_bmap.cc index 489f61f..b9d3607 100644 --- a/conv/aprob_bmap.cc +++ b/conv/aprob_bmap.cc @@ -17,11 +17,14 @@ HelpFlag help { parser, "help", "display this menu", {'h', "help"}, }; -ValueFlag min { - parser, "0.2", "minimum alter-probability to select", {"min"}, 0.4, +ValueFlag mid { + parser, "probability", "desired value of alter-probability to select", {"mid"}, 0.5, }; -ValueFlag max { - parser, "0.6", "maximum alter-probability to select", {"max"}, 0.6, +ValueFlag max_dist { + parser, "max distance", "maximum distance from mid value", {"max-dist"}, 0.2, +}; +ValueFlag min_bnum { + parser, "number of blocks", "minimum number of blocks to select (prior than max-dist)", {"min-bnum"}, 32, }; } // namespace param @@ -30,11 +33,25 @@ ValueFlag max { static void Exec() { const auto aprob = ReadMatrix(std::cin); + const auto mid = args::get(param::mid); + const auto max_dist = args::get(param::max_dist); + const auto min_bnum = args::get(param::min_bnum); + + std::vector> vec; for (auto& probs : aprob) { - for (size_t i = 0; i < probs.size(); ++i) { - if (args::get(param::min) <= probs[i] && probs[i] <= args::get(param::max)) { - std::cout << i << ' '; + vec.reserve(probs.size()); + vec.clear(); + for (auto prob : probs) { + vec.emplace_back(vec.size(), std::abs(prob-mid)); + } + std::sort(vec.begin(), vec.end(), [](auto& a, auto& b) { return a.second < b.second; }); + + Enforce(vec.size() >= min_bnum, "cannot satisfy min-bnum limitation"); + for (auto itr = vec.begin(); itr < vec.end(); ++itr) { + if (itr >= vec.begin()+min_bnum) { // min-bnum is satisfied + if (itr->second > max_dist) break; // max-dist is unsatisfied } + std::cout << itr->first << ' '; } std::cout << '\n'; }