blocky/conv/aprob_bmap.cc
2022-10-14 00:42:52 +09:00

73 lines
1.8 KiB
C++

#include <fstream>
#include <iostream>
#include <string>
#include <args.hxx>
#include "common.hh"
namespace param {
using namespace ::args;
ArgumentParser parser {
"converter: aprob -> bmap"
};
HelpFlag help {
parser, "help", "display this menu", {'h', "help"},
};
ValueFlag<double> mid {
parser, "probability", "desired value of alter-probability to select", {"mid"}, 0.5,
};
ValueFlag<double> max_dist {
parser, "max distance", "maximum distance from mid value", {"max-dist"}, 0.2,
};
ValueFlag<uint32_t> min_bnum {
parser, "number of blocks", "minimum number of blocks to select (prior than max-dist)", {"min-bnum"}, 32,
};
} // namespace param
static void Exec() {
const auto aprob = ReadMatrix<double>(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<std::pair<size_t, double>> vec;
for (auto& probs : aprob) {
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';
}
}
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;
}