Throw DisconnectedGraphException when trying to eliminate a disconnected graph (previously failed with a cryptic error)
parent
5a4ef39d0c
commit
932917e930
|
|
@ -114,10 +114,12 @@ typename EliminationTree<FACTOR>::shared_ptr EliminationTree<FACTOR>::Create(
|
||||||
tic(2, "assemble tree");
|
tic(2, "assemble tree");
|
||||||
vector<shared_ptr> trees(n);
|
vector<shared_ptr> trees(n);
|
||||||
for (Index k = 1; k <= n; k++) {
|
for (Index k = 1; k <= n; k++) {
|
||||||
Index j = n - k;
|
Index j = n - k; // Start at the last variable and loop down to 0
|
||||||
trees[j].reset(new EliminationTree(j));
|
trees[j].reset(new EliminationTree(j)); // Create a new node on this variable
|
||||||
if (parents[j] != none)
|
if (parents[j] != none) // If this node has a parent, add it to the parent's children
|
||||||
trees[parents[j]]->add(trees[j]);
|
trees[parents[j]]->add(trees[j]);
|
||||||
|
else if(!structure[j].empty() && j != n - 1) // If a node other than the last has no parents, this is a forest
|
||||||
|
throw DisconnectedGraphException();
|
||||||
}
|
}
|
||||||
toc(2, "assemble tree");
|
toc(2, "assemble tree");
|
||||||
|
|
||||||
|
|
@ -134,12 +136,6 @@ typename EliminationTree<FACTOR>::shared_ptr EliminationTree<FACTOR>::Create(
|
||||||
}
|
}
|
||||||
toc(3, "hang factors");
|
toc(3, "hang factors");
|
||||||
|
|
||||||
// Assert that all other nodes have parents, i.e. that this is not a forest.
|
|
||||||
#ifndef NDEBUG
|
|
||||||
for(typename vector<shared_ptr>::const_iterator tree=trees.begin(); tree!=trees.end()-1; ++tree)
|
|
||||||
assert((*tree) != shared_ptr());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(debug)
|
if(debug)
|
||||||
trees.back()->print("ETree: ");
|
trees.back()->print("ETree: ");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,4 +117,23 @@ public:
|
||||||
typename BayesNet::shared_ptr eliminate(Eliminate function) const;
|
typename BayesNet::shared_ptr eliminate(Eliminate function) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception thrown when attempting to eliminate a disconnected factor
|
||||||
|
* graph, which is not currently possible in gtsam. If you need to work with
|
||||||
|
* disconnected graphs, a workaround is to create zero-information factors to
|
||||||
|
* bridge the disconnects. To do this, create any factor type (e.g.
|
||||||
|
* BetweenFactor or RangeFactor) with the noise model
|
||||||
|
* <tt>\ref sharedPrecision(dim, 0.0)</tt>, where \c dim is the appropriate
|
||||||
|
* dimensionality for that factor.
|
||||||
|
*/
|
||||||
|
struct DisconnectedGraphException : public std::exception {
|
||||||
|
DisconnectedGraphException() {}
|
||||||
|
virtual ~DisconnectedGraphException() throw() {}
|
||||||
|
|
||||||
|
/// Returns the string "Attempting to eliminate a disconnected graph - this is not currently possible in gtsam."
|
||||||
|
virtual const char* what() const throw() {
|
||||||
|
return "Attempting to eliminate a disconnected graph - this is not currently possible in gtsam."; }
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,17 @@ TEST(EliminationTree, eliminate )
|
||||||
CHECK(assert_equal(expected,actual));
|
CHECK(assert_equal(expected,actual));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST(EliminationTree, disconnected_graph) {
|
||||||
|
SymbolicFactorGraph fg;
|
||||||
|
fg.push_factor(0, 1);
|
||||||
|
fg.push_factor(0, 2);
|
||||||
|
fg.push_factor(1, 2);
|
||||||
|
fg.push_factor(3, 4);
|
||||||
|
|
||||||
|
CHECK_EXCEPTION(SymbolicEliminationTree::Create(fg), DisconnectedGraphException);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() {
|
int main() {
|
||||||
TestResult tr;
|
TestResult tr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue