enhance fmap to add new parameter, time

This commit is contained in:
falsycat 2022-10-10 22:02:31 +09:00
parent e6e8a68c09
commit 83ee7f5f1e
3 changed files with 35 additions and 18 deletions

View File

@ -33,20 +33,21 @@ static void Exec() {
std::ifstream fmap_st {args::get(param::fmap)}; std::ifstream fmap_st {args::get(param::fmap)};
Enforce(!!fmap_st, "fmap path is invalid"); Enforce(!!fmap_st, "fmap path is invalid");
const auto fmap = ReadMatrix<uint32_t>(fmap_st); const auto fmap = ReadTensor3<uint32_t>(fmap_st);
Enforce(fmap.size() > 0, "empty fmap"); Enforce(fmap.size() > 0 && fmap[0].size() > 0, "empty fmap");
for (auto& idxs : fmap) { for (auto& fmap_t : fmap) {
Enforce(idxs.size() > 0, "fmap has empty item"); Enforce(fmap_t.size() == fmap[0].size(), "fmap is broken");
} }
for (size_t t = 0; t < aprobs.size(); ++t) { for (size_t t = 0; t < aprobs.size(); ++t) {
Enforce(aprobs[t].size() <= fmap.size(), "unmatched aprobs and fmap"); const auto tidx = t % fmap.size();
for (size_t c = 0; c < fmap.size(); ++c) { for (size_t c = 0; c < fmap[tidx].size(); ++c) {
double sum = 0; double sum = 0;
for (auto i : fmap[c]) { for (auto i : fmap[tidx][c]) {
Enforce(i < aprobs[t].size(), "aprob has no enough columns");
sum += aprobs[t][i]; sum += aprobs[t][i];
} }
std::cout << sum / fmap[c].size() << ' '; std::cout << sum / fmap[tidx][c].size() << ' ';
} }
std::cout << '\n'; std::cout << '\n';
} }

View File

@ -17,7 +17,7 @@ inline void Enforce(bool eval, const std::string& msg) {
} }
template <typename T> template <typename T>
std::vector<std::vector<T>> ReadMatrix(std::istream& st) noexcept { auto ReadMatrix(std::istream& st) noexcept {
std::vector<std::vector<T>> ret; std::vector<std::vector<T>> ret;
std::string line; std::string line;
@ -28,6 +28,23 @@ std::vector<std::vector<T>> ReadMatrix(std::istream& st) noexcept {
} }
return ret; return ret;
} }
template <typename T>
auto ReadTensor3(std::istream& st) noexcept {
std::vector<std::vector<std::vector<T>>> ret(1);
std::string line;
while (std::getline(st, line)) {
if (line == "----") {
ret.push_back({});
} else {
std::istringstream sst {line};
ret.back().emplace_back(std::istream_iterator<T> {sst},
std::istream_iterator<T> {});
}
}
return ret;
}
// ---- MP4 utilities // ---- MP4 utilities

View File

@ -27,17 +27,16 @@ ValueFlag<std::string> fmap {
static void Exec() { static void Exec() {
std::ifstream fmap_st {args::get(param::fmap)}; std::ifstream fmap_st {args::get(param::fmap)};
Enforce(!!fmap_st, "fmap path is invalid"); Enforce(!!fmap_st, "fmap path is invalid");
const auto fmap = ReadMatrix<uint32_t>(fmap_st); const auto fmap = ReadTensor3<uint32_t>(fmap_st);
Enforce(fmap.size() > 0, "empty fmap"); Enforce(fmap.size() > 0 && fmap[0].size() > 0, "empty fmap");
for (auto& idxs : fmap) { for (auto& fmap_t : fmap) {
Enforce(idxs.size() > 0, "fmap has empty item"); Enforce(fmap_t.size() == fmap[0].size(), "fmap is broken");
} }
size_t feat; for (size_t feat, t = 0; std::cin >> feat; ++t) {
while (std::cin >> feat) { const auto tidx = t % fmap.size();
Enforce(feat < fmap.size(), "feat overflow"); Enforce(feat < fmap[tidx].size(), "feat overflow");
for (const auto idx : fmap[tidx][feat]) {
for (const auto idx : fmap[feat]) {
std::cout << idx << ' '; std::cout << idx << ' ';
} }
std::cout << '\n'; std::cout << '\n';