update addConditionals to only use factor graph keys and remove an extra loop
parent
7b56d6689c
commit
2d7690dbb7
|
@ -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};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue