Make key generation more efficient
parent
ae8d79cb3c
commit
74c40556e3
|
@ -147,14 +147,14 @@ namespace gtsam {
|
||||||
size_t i;
|
size_t i;
|
||||||
ADT result(*this);
|
ADT result(*this);
|
||||||
for (i = 0; i < nrFrontals; i++) {
|
for (i = 0; i < nrFrontals; i++) {
|
||||||
Key j = keys()[i];
|
Key j = keys_[i];
|
||||||
result = result.combine(j, cardinality(j), op);
|
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;
|
DiscreteKeys dkeys;
|
||||||
for (; i < keys().size(); i++) {
|
for (; i < keys_.size(); i++) {
|
||||||
Key j = keys()[i];
|
Key j = keys_[i];
|
||||||
dkeys.push_back(DiscreteKey(j, cardinality(j)));
|
dkeys.push_back(DiscreteKey(j, cardinality(j)));
|
||||||
}
|
}
|
||||||
return std::make_shared<DecisionTreeFactor>(dkeys, result);
|
return std::make_shared<DecisionTreeFactor>(dkeys, result);
|
||||||
|
@ -179,24 +179,22 @@ namespace gtsam {
|
||||||
result = result.combine(j, cardinality(j), op);
|
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:
|
E.g. After branch merging, we may get a ADT like:
|
||||||
Leaf [2] 1.0204082
|
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;
|
DiscreteKeys dkeys;
|
||||||
for (Key key : difference) {
|
for (auto&& [key, cardinality] : cardinalities_) {
|
||||||
dkeys.push_back(DiscreteKey(key, cardinality(key)));
|
if (!frontalKeys.contains(key)) {
|
||||||
|
dkeys.push_back(DiscreteKey(key, cardinality));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return std::make_shared<DecisionTreeFactor>(dkeys, result);
|
return std::make_shared<DecisionTreeFactor>(dkeys, result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue