Re-implemented eliminated factor caching needed for ISAM2 (need to move this to the ISAM2 class though, see ticket)
parent
7b0a63ecd3
commit
8f9542b67d
|
|
@ -133,6 +133,7 @@ namespace gtsam {
|
||||||
void BayesTree<CONDITIONAL>::Clique::permuteWithInverse(const Permutation& inversePermutation) {
|
void BayesTree<CONDITIONAL>::Clique::permuteWithInverse(const Permutation& inversePermutation) {
|
||||||
BayesNet<CONDITIONAL>::permuteWithInverse(inversePermutation);
|
BayesNet<CONDITIONAL>::permuteWithInverse(inversePermutation);
|
||||||
BOOST_FOREACH(Index& separatorKey, separator_) { separatorKey = inversePermutation[separatorKey]; }
|
BOOST_FOREACH(Index& separatorKey, separator_) { separatorKey = inversePermutation[separatorKey]; }
|
||||||
|
if(cachedFactor_) cachedFactor_->permuteWithInverse(inversePermutation);
|
||||||
BOOST_FOREACH(const shared_ptr& child, children_) {
|
BOOST_FOREACH(const shared_ptr& child, children_) {
|
||||||
child->permuteWithInverse(inversePermutation);
|
child->permuteWithInverse(inversePermutation);
|
||||||
}
|
}
|
||||||
|
|
@ -152,6 +153,7 @@ namespace gtsam {
|
||||||
#endif
|
#endif
|
||||||
if(changed) {
|
if(changed) {
|
||||||
BOOST_FOREACH(Index& separatorKey, separator_) { separatorKey = inversePermutation[separatorKey]; }
|
BOOST_FOREACH(Index& separatorKey, separator_) { separatorKey = inversePermutation[separatorKey]; }
|
||||||
|
if(cachedFactor_) cachedFactor_->permuteWithInverse(inversePermutation);
|
||||||
BOOST_FOREACH(const shared_ptr& child, children_) {
|
BOOST_FOREACH(const shared_ptr& child, children_) {
|
||||||
(void)child->permuteSeparatorWithInverse(inversePermutation);
|
(void)child->permuteSeparatorWithInverse(inversePermutation);
|
||||||
}
|
}
|
||||||
|
|
@ -611,7 +613,7 @@ namespace gtsam {
|
||||||
// otherwise, find the parent clique by using the index data structure
|
// otherwise, find the parent clique by using the index data structure
|
||||||
// to find the lowest-ordered parent
|
// to find the lowest-ordered parent
|
||||||
Index parentRepresentative = findParentClique(parents);
|
Index parentRepresentative = findParentClique(parents);
|
||||||
if(debug) cout << "First-eliminated parent is " << parentRepresentative << endl;
|
if(debug) cout << "First-eliminated parent is " << parentRepresentative << ", have " << nodes_.size() << " nodes." << endl;
|
||||||
sharedClique parent_clique = (*this)[parentRepresentative];
|
sharedClique parent_clique = (*this)[parentRepresentative];
|
||||||
if(debug) parent_clique->print("Parent clique is ");
|
if(debug) parent_clique->print("Parent clique is ");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ namespace gtsam {
|
||||||
weak_ptr parent_;
|
weak_ptr parent_;
|
||||||
std::list<shared_ptr> children_;
|
std::list<shared_ptr> children_;
|
||||||
std::list<Index> separator_; /** separator keys */
|
std::list<Index> separator_; /** separator keys */
|
||||||
|
typename CONDITIONAL::Factor::shared_ptr cachedFactor_;
|
||||||
|
|
||||||
friend class BayesTree<CONDITIONAL>;
|
friend class BayesTree<CONDITIONAL>;
|
||||||
|
|
||||||
|
|
@ -89,6 +90,9 @@ namespace gtsam {
|
||||||
/** The size of subtree rooted at this clique, i.e., nr of Cliques */
|
/** The size of subtree rooted at this clique, i.e., nr of Cliques */
|
||||||
size_t treeSize() const;
|
size_t treeSize() const;
|
||||||
|
|
||||||
|
/** Access the cached factor (this is a hack) */
|
||||||
|
typename CONDITIONAL::Factor::shared_ptr& cachedFactor() { return cachedFactor_; }
|
||||||
|
|
||||||
/** print this node and entire subtree below it */
|
/** print this node and entire subtree below it */
|
||||||
void printTree(const std::string& indent="") const;
|
void printTree(const std::string& indent="") const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,7 @@ namespace gtsam {
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
template <class FG>
|
template <class FG>
|
||||||
pair<typename JunctionTree<FG>::BayesTree::sharedClique, typename FG::sharedFactor>
|
pair<typename JunctionTree<FG>::BayesTree::sharedClique, typename FG::sharedFactor>
|
||||||
JunctionTree<FG>::eliminateOneClique(const boost::shared_ptr<const Clique>& current) const {
|
JunctionTree<FG>::eliminateOneClique(const boost::shared_ptr<const Clique>& current, bool cache) const {
|
||||||
|
|
||||||
FG fg; // factor graph will be assembled from local factors and marginalized children
|
FG fg; // factor graph will be assembled from local factors and marginalized children
|
||||||
fg.reserve(current->size() + current->children().size());
|
fg.reserve(current->size() + current->children().size());
|
||||||
|
|
@ -156,7 +156,7 @@ namespace gtsam {
|
||||||
list<typename BayesTree::sharedClique> children;
|
list<typename BayesTree::sharedClique> children;
|
||||||
BOOST_FOREACH(const boost::shared_ptr<const Clique>& child, current->children()) {
|
BOOST_FOREACH(const boost::shared_ptr<const Clique>& child, current->children()) {
|
||||||
pair<typename BayesTree::sharedClique, typename FG::sharedFactor> tree_factor(
|
pair<typename BayesTree::sharedClique, typename FG::sharedFactor> tree_factor(
|
||||||
eliminateOneClique(child));
|
eliminateOneClique(child, cache));
|
||||||
children.push_back(tree_factor.first);
|
children.push_back(tree_factor.first);
|
||||||
fg.push_back(tree_factor.second);
|
fg.push_back(tree_factor.second);
|
||||||
}
|
}
|
||||||
|
|
@ -181,6 +181,8 @@ namespace gtsam {
|
||||||
BOOST_FOREACH(typename BayesTree::sharedClique& childRoot, children) {
|
BOOST_FOREACH(typename BayesTree::sharedClique& childRoot, children) {
|
||||||
childRoot->parent_ = new_clique;
|
childRoot->parent_ = new_clique;
|
||||||
}
|
}
|
||||||
|
if(cache)
|
||||||
|
new_clique->cachedFactor() = eliminated.second;
|
||||||
toc(3, "Update tree");
|
toc(3, "Update tree");
|
||||||
|
|
||||||
return make_pair(new_clique, eliminated.second);
|
return make_pair(new_clique, eliminated.second);
|
||||||
|
|
@ -188,9 +190,9 @@ namespace gtsam {
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
template <class FG>
|
template <class FG>
|
||||||
typename JunctionTree<FG>::BayesTree::sharedClique JunctionTree<FG>::eliminate() const {
|
typename JunctionTree<FG>::BayesTree::sharedClique JunctionTree<FG>::eliminate(bool cache) const {
|
||||||
if(this->root()) {
|
if(this->root()) {
|
||||||
pair<typename BayesTree::sharedClique, typename FG::sharedFactor> ret = this->eliminateOneClique(this->root());
|
pair<typename BayesTree::sharedClique, typename FG::sharedFactor> ret = this->eliminateOneClique(this->root(), cache);
|
||||||
if (ret.second->size() != 0)
|
if (ret.second->size() != 0)
|
||||||
throw runtime_error("JuntionTree::eliminate: elimination failed because of factors left over!");
|
throw runtime_error("JuntionTree::eliminate: elimination failed because of factors left over!");
|
||||||
return ret.first;
|
return ret.first;
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ namespace gtsam {
|
||||||
|
|
||||||
// recursive elimination function
|
// recursive elimination function
|
||||||
std::pair<typename BayesTree::sharedClique, typename FG::sharedFactor>
|
std::pair<typename BayesTree::sharedClique, typename FG::sharedFactor>
|
||||||
eliminateOneClique(const boost::shared_ptr<const Clique>& clique) const;
|
eliminateOneClique(const boost::shared_ptr<const Clique>& clique, bool cache=false) const;
|
||||||
|
|
||||||
// internal constructor
|
// internal constructor
|
||||||
void construct(const FG& fg, const VariableIndex& variableIndex);
|
void construct(const FG& fg, const VariableIndex& variableIndex);
|
||||||
|
|
@ -80,7 +80,7 @@ namespace gtsam {
|
||||||
JunctionTree(const FG& fg, const VariableIndex& variableIndex);
|
JunctionTree(const FG& fg, const VariableIndex& variableIndex);
|
||||||
|
|
||||||
// eliminate the factors in the subgraphs
|
// eliminate the factors in the subgraphs
|
||||||
typename BayesTree::sharedClique eliminate() const;
|
typename BayesTree::sharedClique eliminate(bool cache=false) const;
|
||||||
|
|
||||||
}; // JunctionTree
|
}; // JunctionTree
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue