moved addClique and removeClique implementations to inl.h,
removePath takes clique argument nowrelease/4.3a0
parent
286d826119
commit
072846a70f
|
@ -171,6 +171,37 @@ namespace gtsam {
|
|||
return marginalize<Factor,Conditional>(*bn,keys12);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
template<class Conditional>
|
||||
typename BayesTree<Conditional>::sharedClique BayesTree<Conditional>::addClique
|
||||
(const sharedConditional& conditional, sharedClique parent_clique) {
|
||||
sharedClique new_clique(new Clique(conditional));
|
||||
nodes_.insert(make_pair(conditional->key(), new_clique));
|
||||
if (parent_clique != NULL) {
|
||||
new_clique->parent_ = parent_clique;
|
||||
parent_clique->children_.push_back(new_clique);
|
||||
}
|
||||
return new_clique;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
template<class Conditional>
|
||||
void BayesTree<Conditional>::removeClique(sharedClique clique) {
|
||||
if (!clique->isRoot())
|
||||
clique->parent_->children_.remove(clique);
|
||||
else {
|
||||
// we remove the root clique: have to make another clique the root
|
||||
if (clique->children_.empty())
|
||||
root_.reset();
|
||||
else
|
||||
root_ = *(clique->children_.begin());
|
||||
}
|
||||
BOOST_FOREACH(sharedClique child, clique->children_)
|
||||
child->parent_.reset();
|
||||
BOOST_FOREACH(std::string key, clique->ordering())
|
||||
nodes_.erase(key);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
template<class Conditional>
|
||||
BayesTree<Conditional>::BayesTree() {
|
||||
|
@ -319,21 +350,20 @@ namespace gtsam {
|
|||
template<class Conditional>
|
||||
template<class Factor>
|
||||
FactorGraph<Factor>
|
||||
BayesTree<Conditional>::removePath(const string& key) {
|
||||
sharedClique clique = (*this)[key];
|
||||
BayesTree<Conditional>::removePath(sharedClique clique) {
|
||||
|
||||
#if 0
|
||||
cout << "removing:" << endl;
|
||||
clique->print();
|
||||
cout << "from" << endl;
|
||||
typedef std::pair<string, sharedClique> sometype;
|
||||
BOOST_FOREACH(sometype clique, nodes_) {
|
||||
clique.second->print();
|
||||
//if (clique==NULL) return;
|
||||
|
||||
bool verbose = false;
|
||||
if (verbose) {
|
||||
clique->print("removing");
|
||||
cout << "before" << endl;
|
||||
BOOST_FOREACH(typename Nodes::value_type clique, nodes_)
|
||||
clique.second->print();
|
||||
}
|
||||
#endif
|
||||
|
||||
// convert clique to factor
|
||||
FactorGraph<Factor> factors(*clique);
|
||||
FactorGraph<Factor> factors(*clique);// = removePath(clique->parent_);
|
||||
|
||||
while (!(clique->isRoot())) {
|
||||
sharedClique old_clique = clique;
|
||||
|
@ -343,6 +373,12 @@ namespace gtsam {
|
|||
}
|
||||
removeClique(clique);
|
||||
|
||||
if (verbose) {
|
||||
cout << "after" << endl;
|
||||
BOOST_FOREACH(typename Nodes::value_type clique, nodes_)
|
||||
clique.second->print();
|
||||
}
|
||||
|
||||
return factors;
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ namespace gtsam {
|
|||
Ordering keys() const;
|
||||
|
||||
/** print this node */
|
||||
void print(const std::string& s = "Bayes tree node") const;
|
||||
void print(const std::string& s = "") const;
|
||||
|
||||
/** The size *includes* the separator */
|
||||
size_t size() const {
|
||||
|
@ -94,34 +94,10 @@ namespace gtsam {
|
|||
|
||||
/** add a clique */
|
||||
sharedClique addClique(const sharedConditional& conditional,
|
||||
sharedClique parent_clique = sharedClique()) {
|
||||
sharedClique new_clique(new Clique(conditional));
|
||||
nodes_.insert(make_pair(conditional->key(), new_clique));
|
||||
if (parent_clique != NULL) {
|
||||
new_clique->parent_ = parent_clique;
|
||||
parent_clique->children_.push_back(new_clique);
|
||||
}
|
||||
return new_clique;
|
||||
}
|
||||
sharedClique parent_clique = sharedClique());
|
||||
|
||||
/** remove a clique: warning, can result in a forest */
|
||||
void removeClique(sharedClique clique) {
|
||||
if (clique->parent_ != NULL) {
|
||||
clique->parent_->children_.remove(clique);
|
||||
} else {
|
||||
// we remove the root clique: have to make another clique the root
|
||||
if (clique->children_.empty()) {
|
||||
root_.reset();
|
||||
} else {
|
||||
root_ = *(clique->children_.begin());
|
||||
}
|
||||
}
|
||||
BOOST_FOREACH(sharedClique child, clique->children_) {
|
||||
child->parent_.reset();
|
||||
}
|
||||
std::string key = *(clique->keys().begin());
|
||||
nodes_.erase(key);
|
||||
}
|
||||
void removeClique(sharedClique clique);
|
||||
|
||||
public:
|
||||
|
||||
|
@ -179,11 +155,10 @@ namespace gtsam {
|
|||
template<class Factor>
|
||||
BayesNet<Conditional> jointBayesNet(const std::string& key1, const std::string& key2) const;
|
||||
|
||||
/** IMPERATIVE! Return the factor containing all nodes contaminated by key; also,
|
||||
* removes those entries from the Bayes Tree, resulting in a forest of orphans
|
||||
*/
|
||||
/** Remove path from clique to root and return that path as factors */
|
||||
template<class Factor>
|
||||
FactorGraph<Factor> removePath(const std::string& key);
|
||||
FactorGraph<Factor> removePath(sharedClique clique);
|
||||
|
||||
}; // BayesTree
|
||||
|
||||
} /// namespace gtsam
|
||||
|
|
|
@ -332,21 +332,15 @@ TEST( BayesTree, removePath )
|
|||
expected.push_factor("A","B");
|
||||
expected.push_factor("A");
|
||||
|
||||
SymbolicFactorGraph actual = bayesTree.removePath<SymbolicFactor>("C");
|
||||
SymbolicFactorGraph actual = bayesTree.removePath<SymbolicFactor>(bayesTree["C"]);
|
||||
CHECK(assert_equal(expected, actual));
|
||||
|
||||
// remove A, nothing should happen (already removed)
|
||||
SymbolicFactorGraph expected2; // empty factor
|
||||
|
||||
actual = bayesTree.removePath<SymbolicFactor>("A");
|
||||
// CHECK(assert_equal(expected2, actual));
|
||||
|
||||
// remove E: factor graph with EB; E|B removed from second orphan tree
|
||||
SymbolicFactorGraph expected3;
|
||||
expected3.push_factor("C","A");
|
||||
expected3.push_factor("B","E");
|
||||
|
||||
actual = bayesTree.removePath<SymbolicFactor>("E");
|
||||
// CHECK(assert_equal(expected3, actual));
|
||||
actual = bayesTree.removePath<SymbolicFactor>(bayesTree["E"]);
|
||||
CHECK(assert_equal(expected3, actual));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
Loading…
Reference in New Issue