Make key generation more efficient
parent
ae8d79cb3c
commit
74c40556e3
|
@ -147,14 +147,14 @@ namespace gtsam {
|
|||
size_t i;
|
||||
ADT result(*this);
|
||||
for (i = 0; i < nrFrontals; i++) {
|
||||
Key j = keys()[i];
|
||||
Key j = keys_[i];
|
||||
result = result.combine(j, cardinality(j), op);
|
||||
}
|
||||
|
||||
// create new factor, note we start keys after nrFrontals
|
||||
// Create new factor, note we start with keys after nrFrontals:
|
||||
DiscreteKeys dkeys;
|
||||
for (; i < keys().size(); i++) {
|
||||
Key j = keys()[i];
|
||||
for (; i < keys_.size(); i++) {
|
||||
Key j = keys_[i];
|
||||
dkeys.push_back(DiscreteKey(j, cardinality(j)));
|
||||
}
|
||||
return std::make_shared<DecisionTreeFactor>(dkeys, result);
|
||||
|
@ -179,24 +179,22 @@ namespace gtsam {
|
|||
result = result.combine(j, cardinality(j), op);
|
||||
}
|
||||
|
||||
// create new factor, note we collect keys that are not in frontalKeys
|
||||
/*
|
||||
Due to branch merging, the labels in `result` may be missing some keys
|
||||
Create new factor, note we collect keys that are not in frontalKeys.
|
||||
|
||||
Due to branch merging, the labels in `result` may be missing some keys.
|
||||
E.g. After branch merging, we may get a ADT like:
|
||||
Leaf [2] 1.0204082
|
||||
|
||||
This is missing the key values used for branching.
|
||||
Hence, code below traverses the original keys and omits those in
|
||||
frontalKeys. We loop over cardinalities, which is O(n) even for a map, and
|
||||
then "contains" is a binary search on a small vector.
|
||||
*/
|
||||
KeyVector difference, frontalKeys_(frontalKeys), keys_(keys());
|
||||
// Get the difference of the frontalKeys and the factor keys using set_difference
|
||||
std::sort(keys_.begin(), keys_.end());
|
||||
std::sort(frontalKeys_.begin(), frontalKeys_.end());
|
||||
std::set_difference(keys_.begin(), keys_.end(), frontalKeys_.begin(),
|
||||
frontalKeys_.end(), back_inserter(difference));
|
||||
|
||||
DiscreteKeys dkeys;
|
||||
for (Key key : difference) {
|
||||
dkeys.push_back(DiscreteKey(key, cardinality(key)));
|
||||
for (auto&& [key, cardinality] : cardinalities_) {
|
||||
if (!frontalKeys.contains(key)) {
|
||||
dkeys.push_back(DiscreteKey(key, cardinality));
|
||||
}
|
||||
}
|
||||
return std::make_shared<DecisionTreeFactor>(dkeys, result);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue