custom path for empty separator

release/4.3a0
Varun Agrawal 2025-01-01 19:13:13 -05:00
parent e49b40b4c4
commit bb4ee207b8
1 changed files with 24 additions and 25 deletions

View File

@ -341,41 +341,40 @@ discreteElimination(const HybridGaussianFactorGraph &factors,
#if GTSAM_HYBRID_TIMING
gttic_(EliminateDiscrete);
#endif
/**** NOTE: This does sum-product. ****/
// Get product factor
TableFactor product = ProductAndNormalize(dfg);
// Check if separator is empty
Ordering allKeys(dfg.keyVector());
Ordering separator;
std::set_difference(allKeys.begin(), allKeys.end(), frontalKeys.begin(),
frontalKeys.end(),
std::inserter(separator, separator.begin()));
// If the separator is empty, we have a clique of all the discrete variables
// so we can use the TableFactor for efficiency.
if (separator.size() == 0) {
// Get product factor
TableFactor product = ProductAndNormalize(dfg);
#if GTSAM_HYBRID_TIMING
gttic_(EliminateDiscreteSum);
gttic_(EliminateDiscreteFormDiscreteConditional);
#endif
// All the discrete variables should form a single clique,
// so we can sum out on all the variables as frontals.
// This should give an empty separator.
TableFactor::shared_ptr sum = product.sum(frontalKeys);
auto conditional = std::make_shared<DiscreteConditional>(
frontalKeys.size(), product.toDecisionTreeFactor());
#if GTSAM_HYBRID_TIMING
gttoc_(EliminateDiscreteSum);
gttoc_(EliminateDiscreteFormDiscreteConditional);
#endif
// Ordering keys for the conditional so that frontalKeys are really in front
Ordering orderedKeys;
orderedKeys.insert(orderedKeys.end(), frontalKeys.begin(), frontalKeys.end());
orderedKeys.insert(orderedKeys.end(), sum->keys().begin(), sum->keys().end());
TableFactor::shared_ptr sum = product.sum(frontalKeys);
#if GTSAM_HYBRID_TIMING
gttic_(EliminateDiscreteFormDiscreteConditional);
#endif
auto c = product / (*sum);
auto conditional = std::make_shared<DiscreteConditional>(
frontalKeys.size(), c.toDecisionTreeFactor(), orderedKeys);
#if GTSAM_HYBRID_TIMING
gttoc_(EliminateDiscreteFormDiscreteConditional);
gttoc_(EliminateDiscrete);
#endif
#if GTSAM_HYBRID_TIMING
gttoc_(EliminateDiscrete);
#endif
return {std::make_shared<HybridConditional>(conditional), sum};
return {std::make_shared<HybridConditional>(conditional), sum};
} else {
// Perform sum-product.
auto result = EliminateDiscrete(dfg, frontalKeys);
return {std::make_shared<HybridConditional>(result.first), result.second};
}
}
/* ************************************************************************ */