update addConditionals to only use factor graph keys and remove an extra loop

release/4.3a0
Varun Agrawal 2025-01-23 20:32:49 -05:00
parent 7b56d6689c
commit 2d7690dbb7
2 changed files with 15 additions and 20 deletions

View File

@ -68,8 +68,7 @@ void HybridSmoother::update(HybridGaussianFactorGraph graph,
} }
// Add the necessary conditionals from the previous timestep(s). // Add the necessary conditionals from the previous timestep(s).
std::tie(graph, hybridBayesNet_) = std::tie(graph, hybridBayesNet_) = addConditionals(graph, hybridBayesNet_);
addConditionals(graph, hybridBayesNet_, ordering);
// Eliminate. // Eliminate.
HybridBayesNet bayesNetFragment = *graph.eliminateSequential(ordering); HybridBayesNet bayesNetFragment = *graph.eliminateSequential(ordering);
@ -88,10 +87,11 @@ void HybridSmoother::update(HybridGaussianFactorGraph graph,
/* ************************************************************************* */ /* ************************************************************************* */
std::pair<HybridGaussianFactorGraph, HybridBayesNet> std::pair<HybridGaussianFactorGraph, HybridBayesNet>
HybridSmoother::addConditionals(const HybridGaussianFactorGraph &originalGraph, HybridSmoother::addConditionals(const HybridGaussianFactorGraph &originalGraph,
const HybridBayesNet &originalHybridBayesNet, const HybridBayesNet &hybridBayesNet) const {
const Ordering &ordering) const {
HybridGaussianFactorGraph graph(originalGraph); HybridGaussianFactorGraph graph(originalGraph);
HybridBayesNet hybridBayesNet(originalHybridBayesNet); HybridBayesNet updatedHybridBayesNet(hybridBayesNet);
KeySet factorKeys = graph.keys();
// If hybridBayesNet is not empty, // If hybridBayesNet is not empty,
// it means we have conditionals to add to the factor graph. // it means we have conditionals to add to the factor graph.
@ -99,10 +99,6 @@ HybridSmoother::addConditionals(const HybridGaussianFactorGraph &originalGraph,
// We add all relevant hybrid conditionals on the last continuous variable // We add all relevant hybrid conditionals on the last continuous variable
// in the previous `hybridBayesNet` to the graph // in the previous `hybridBayesNet` to the graph
// Conditionals to remove from the bayes net
// since the conditional will be updated.
std::vector<HybridConditional::shared_ptr> conditionals_to_erase;
// New conditionals to add to the graph // New conditionals to add to the graph
gtsam::HybridBayesNet newConditionals; gtsam::HybridBayesNet newConditionals;
@ -112,25 +108,24 @@ HybridSmoother::addConditionals(const HybridGaussianFactorGraph &originalGraph,
auto conditional = hybridBayesNet.at(i); auto conditional = hybridBayesNet.at(i);
for (auto &key : conditional->frontals()) { for (auto &key : conditional->frontals()) {
if (std::find(ordering.begin(), ordering.end(), key) != if (std::find(factorKeys.begin(), factorKeys.end(), key) !=
ordering.end()) { factorKeys.end()) {
newConditionals.push_back(conditional); newConditionals.push_back(conditional);
conditionals_to_erase.push_back(conditional);
// Remove the conditional from the updated Bayes net
auto it = find(updatedHybridBayesNet.begin(),
updatedHybridBayesNet.end(), conditional);
updatedHybridBayesNet.erase(it);
break; break;
} }
} }
} }
// Remove conditionals at the end so we don't affect the order in the
// original bayes net.
for (auto &&conditional : conditionals_to_erase) {
auto it = find(hybridBayesNet.begin(), hybridBayesNet.end(), conditional);
hybridBayesNet.erase(it);
}
graph.push_back(newConditionals); graph.push_back(newConditionals);
} }
return {graph, hybridBayesNet};
return {graph, updatedHybridBayesNet};
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -66,7 +66,7 @@ class GTSAM_EXPORT HybridSmoother {
*/ */
std::pair<HybridGaussianFactorGraph, HybridBayesNet> addConditionals( std::pair<HybridGaussianFactorGraph, HybridBayesNet> addConditionals(
const HybridGaussianFactorGraph& graph, const HybridGaussianFactorGraph& graph,
const HybridBayesNet& hybridBayesNet, const Ordering& ordering) const; const HybridBayesNet& hybridBayesNet) const;
/** /**
* @brief Get the hybrid Gaussian conditional from * @brief Get the hybrid Gaussian conditional from