Skip to content

Commit

Permalink
added list of ambiguous shortnames, that require context-based disamb…
Browse files Browse the repository at this point in the history
…iguation
  • Loading branch information
danovaro committed Jul 24, 2024
1 parent 6cdf160 commit 1d43861
Showing 3 changed files with 88 additions and 35 deletions.
5 changes: 5 additions & 0 deletions src/metkit/config/LibMetkit.cc
Original file line number Diff line number Diff line change
@@ -55,6 +55,11 @@ eckit::PathName LibMetkit::paramYamlFile() {
eckit::PathName LibMetkit::paramStaticYamlFile() {
return "~metkit/share/metkit/params-static.yaml";
}

eckit::PathName LibMetkit::shortnameContextYamlFile() {
return "~metkit/share/metkit/shortname-context.yaml";
}

eckit::PathName LibMetkit::paramIDYamlFile() {
return "~metkit/share/metkit/paramids.yaml";
}
1 change: 1 addition & 0 deletions src/metkit/config/LibMetkit.h
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@ class LibMetkit : public eckit::system::Library {
static eckit::PathName paramStaticYamlFile();
static eckit::PathName paramIDYamlFile();
static eckit::PathName paramMatchingYamlFile();
static eckit::PathName shortnameContextYamlFile();
static eckit::PathName bufrSubtypesYamlFile();

static const LibMetkit& instance();
117 changes: 82 additions & 35 deletions src/metkit/mars/TypeParam.cc
Original file line number Diff line number Diff line change
@@ -272,9 +272,7 @@ std::string Rule::lookup(const MarsExpandContext& ctx, const std::string & s, bo
}

throw eckit::UserError("Cannot match parameter " + p);
// eckit::Log::warning() << "Cannot match parameter " << p << std::endl;
return p;

}

// std::cout << "--- [" << s << "]" << std::endl;
@@ -301,57 +299,106 @@ static void init() {
const eckit::Value ids = eckit::YAMLParser::decodeFile(LibMetkit::paramIDYamlFile());
ASSERT(ids.isOrderedMap());

bool metkitRawParam = eckit::Resource<bool>("metkitRawParam;$METKIT_RAW_PARAM", false);
if (metkitRawParam) {
(*rules).push_back(Rule(eckit::Value::makeMap(), ids.keys(), ids));
return;
}
eckit::ValueMap merge;

eckit::Value r = eckit::YAMLParser::decodeFile(LibMetkit::paramYamlFile());
ASSERT(r.isList());
static bool metkitLegacyParamCheck = eckit::Resource<bool>("metkitLegacyParamCheck;$METKIT_LEGACY_PARAM_CHECK", false);
static bool metkitRawParam = eckit::Resource<bool>("metkitRawParam;$METKIT_RAW_PARAM", false);
if (metkitLegacyParamCheck || (!metkitRawParam)) {
eckit::Value r = eckit::YAMLParser::decodeFile(LibMetkit::paramYamlFile());
ASSERT(r.isList());

const eckit::Value rs = eckit::YAMLParser::decodeFile(LibMetkit::paramStaticYamlFile());
ASSERT(rs.isList());
const eckit::Value rs = eckit::YAMLParser::decodeFile(LibMetkit::paramStaticYamlFile());
ASSERT(rs.isList());

// merge r and rs
eckit::ValueMap merge;
for (size_t i = 0; i < r.size(); ++i) {
const eckit::Value& rule = r[i];
// merge r and rs
for (size_t i = 0; i < r.size(); ++i) {
const eckit::Value& rule = r[i];

if (!rule.isList()) {
rule.dump(Log::error()) << std::endl;
}
ASSERT(rule.isList());
ASSERT(rule.size() == 2);

if (!rule.isList()) {
rule.dump(Log::error()) << std::endl;
merge.emplace(rule[0], rule[1]);
}
ASSERT(rule.isList());
ASSERT(rule.size() == 2);

merge.emplace(rule[0], rule[1]);
}
for (size_t i = 0; i < rs.size(); ++i) {
const eckit::Value& rule = rs[i];

for (size_t i = 0; i < rs.size(); ++i) {
const eckit::Value& rule = rs[i];
if (!rule.isList()) {
rule.dump(Log::error()) << std::endl;
}
ASSERT(rule.isList());
ASSERT(rule.size() == 2);

if (!rule.isList()) {
rule.dump(Log::error()) << std::endl;
auto it = merge.find(rule[0]);
if (it == merge.end()) {
merge.emplace(rule[0], rule[1]);
}
else {
it->second += rule[1];
}
}
ASSERT(rule.isList());
ASSERT(rule.size() == 2);
}

auto it = merge.find(rule[0]);
if (it == merge.end()) {
merge.emplace(rule[0], rule[1]);
if (metkitLegacyParamCheck) {
for (auto it = merge.begin(); it != merge.end(); it++) {
(*rules).push_back(Rule(it->first, it->second, ids));
}
else {
it->second += rule[1];
return;
}

if (metkitRawParam) {
(*rules).push_back(Rule(eckit::Value::makeMap(), ids.keys(), ids));
return;
}


std::set<std::string> shortnames;
std::set<std::string> associatedIDs;
eckit::ValueList unambiguousIDs;

const eckit::Value pc = eckit::YAMLParser::decodeFile(LibMetkit::shortnameContextYamlFile());
ASSERT(pc.isList());

for (size_t i = 0; i < pc.size(); i++) {
// std::cout << pc[i] << std::endl;
shortnames.emplace(pc[i]);
}
auto keys = ids.keys();

for (size_t i=0; i < keys.size(); i++) {
auto el = ids.element(keys[i]);
ASSERT(el.size() > 0);
// std::cout << keys[i] << " " << ids.element(keys[i])[0] << std::endl;
auto val = el[0];

if (shortnames.find(val) != shortnames.end()) {
associatedIDs.emplace(keys[i]);
// std::cout << "Found " << val << " in " << keys[i] << std::endl;
} else {
unambiguousIDs.push_back(keys[i]);
}
}

// std::cout << associatedIDs.size() << " " << associatedIDs << std::endl;

for (auto it = merge.begin(); it != merge.end(); it++) {
(*rules).push_back(Rule(it->first, it->second, ids));
auto listIDs = eckit::Value::makeList();

for (size_t j=0; j<it->second.size(); j++) {
if (associatedIDs.find(it->second[j]) != associatedIDs.end()) {
listIDs.append(it->second[j]);
}
}
if (listIDs.size() > 0) {
(*rules).push_back(Rule(it->first, listIDs, ids));
}
}
(*rules).push_back(Rule(eckit::Value::makeMap(), unambiguousIDs, ids));
}



namespace metkit {
namespace mars {

0 comments on commit 1d43861

Please sign in to comment.