77 lines
1.8 KiB
C++
77 lines
1.8 KiB
C++
#include <algorithm>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <numeric>
|
|
#include <string>
|
|
|
|
#include <args.hxx>
|
|
|
|
#include "common.hh"
|
|
|
|
|
|
namespace param {
|
|
using namespace ::args;
|
|
|
|
ArgumentParser parser {
|
|
"converter: alter-probability matrix -> feature probability matrix"
|
|
};
|
|
HelpFlag help {
|
|
parser, "help", "display this menu", {'h', "help"},
|
|
};
|
|
|
|
ValueFlag<std::string> fmap {
|
|
parser, "path", "feature map file path", {"fmap"},
|
|
};
|
|
|
|
ValueFlag<size_t> negative_sample {
|
|
parser, "samples", "number of samples used to calculate negative factor (deprecated and no effect)", {"negative-sample"}, 16,
|
|
};
|
|
|
|
} // namespace param
|
|
|
|
|
|
static void Exec() {
|
|
const auto aprobs = ReadMatrix<double>(std::cin);
|
|
Enforce(aprobs.size() > 0 && aprobs[0].size() > 0, "empty matrix");
|
|
|
|
std::ifstream fmap_st {args::get(param::fmap)};
|
|
Enforce(!!fmap_st, "fmap path is invalid");
|
|
const auto fmap = ReadTensor3<uint32_t>(fmap_st);
|
|
Enforce(fmap.size() > 0 && fmap[0].size() > 0, "empty fmap");
|
|
|
|
std::vector<double> negatives;
|
|
for (size_t t = 0; t < aprobs.size(); ++t) {
|
|
const auto tidx = t % fmap.size();
|
|
for (size_t c = 0; c < fmap[tidx].size(); ++c) {
|
|
const auto& blocks = fmap[tidx][c];
|
|
|
|
double positive = 0;
|
|
for (const auto b : blocks) {
|
|
positive += aprobs[t][b];
|
|
}
|
|
|
|
if (blocks.size() > 0) {
|
|
positive /= blocks.size();
|
|
} else {
|
|
positive = 1;
|
|
}
|
|
|
|
std::cout << positive << ' ';
|
|
}
|
|
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;
|
|
}
|