removePath mostly working
parent
08f5b074a0
commit
0286bc27eb
|
@ -316,6 +316,37 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
template<class Conditional>
|
||||||
|
template<class Factor>
|
||||||
|
FactorGraph<Factor>
|
||||||
|
BayesTree<Conditional>::removePath(const string& key) {
|
||||||
|
sharedClique clique = (*this)[key];
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
cout << "removing:" << endl;
|
||||||
|
clique->print();
|
||||||
|
cout << "from" << endl;
|
||||||
|
typedef std::pair<string, sharedClique> sometype;
|
||||||
|
BOOST_FOREACH(sometype clique, nodes_) {
|
||||||
|
clique.second->print();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// convert clique to factor
|
||||||
|
FactorGraph<Factor> factors(*clique);
|
||||||
|
|
||||||
|
while (!(clique->isRoot())) {
|
||||||
|
sharedClique old_clique = clique;
|
||||||
|
clique = old_clique->parent_;
|
||||||
|
removeClique(old_clique);
|
||||||
|
factors.push_back(*clique);
|
||||||
|
}
|
||||||
|
removeClique(clique);
|
||||||
|
|
||||||
|
return factors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
|
||||||
}
|
}
|
||||||
/// namespace gtsam
|
/// namespace gtsam
|
||||||
|
|
|
@ -79,7 +79,7 @@ namespace gtsam {
|
||||||
/** return the joint P(C1,C2), where C1==this. TODO: not a method? */
|
/** return the joint P(C1,C2), where C1==this. TODO: not a method? */
|
||||||
template<class Factor>
|
template<class Factor>
|
||||||
FactorGraph<Factor> joint(shared_ptr C2, shared_ptr root);
|
FactorGraph<Factor> joint(shared_ptr C2, shared_ptr root);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef boost::shared_ptr<Clique> sharedClique;
|
typedef boost::shared_ptr<Clique> sharedClique;
|
||||||
|
|
||||||
|
@ -104,6 +104,25 @@ namespace gtsam {
|
||||||
return new_clique;
|
return new_clique;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 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);
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** Create an empty Bayes Tree */
|
/** Create an empty Bayes Tree */
|
||||||
|
@ -160,6 +179,11 @@ namespace gtsam {
|
||||||
template<class Factor>
|
template<class Factor>
|
||||||
BayesNet<Conditional> jointBayesNet(const std::string& key1, const std::string& key2) const;
|
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
|
||||||
|
*/
|
||||||
|
template<class Factor>
|
||||||
|
FactorGraph<Factor> removePath(const std::string& key);
|
||||||
}; // BayesTree
|
}; // BayesTree
|
||||||
|
|
||||||
} /// namespace gtsam
|
} /// namespace gtsam
|
||||||
|
|
|
@ -11,6 +11,7 @@ using namespace boost::assign;
|
||||||
|
|
||||||
#include "SymbolicBayesNet.h"
|
#include "SymbolicBayesNet.h"
|
||||||
#include "GaussianBayesNet.h"
|
#include "GaussianBayesNet.h"
|
||||||
|
#include "SymbolicFactorGraph.h"
|
||||||
#include "Ordering.h"
|
#include "Ordering.h"
|
||||||
#include "BayesTree-inl.h"
|
#include "BayesTree-inl.h"
|
||||||
#include "smallExample.h"
|
#include "smallExample.h"
|
||||||
|
@ -302,6 +303,60 @@ TEST( BayesTree, balanced_smoother_joint )
|
||||||
CHECK(assert_equal(expected4,actual4,1e-4));
|
CHECK(assert_equal(expected4,actual4,1e-4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* *
|
||||||
|
Bayes Tree, for testing conversion to a forest of orphans needed for incremental.
|
||||||
|
A,B
|
||||||
|
C|A E|B
|
||||||
|
D|C F|E
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( BayesTree, removePath )
|
||||||
|
{
|
||||||
|
SymbolicConditional::shared_ptr A(new SymbolicConditional("A")),
|
||||||
|
B(new SymbolicConditional("B", "A")),
|
||||||
|
C(new SymbolicConditional("C", "A")),
|
||||||
|
D(new SymbolicConditional("D", "C")),
|
||||||
|
E(new SymbolicConditional("E", "B")),
|
||||||
|
F(new SymbolicConditional("F", "E"));
|
||||||
|
SymbolicBayesTree bayesTree;
|
||||||
|
bayesTree.insert(A);
|
||||||
|
bayesTree.insert(B);
|
||||||
|
bayesTree.insert(C);
|
||||||
|
bayesTree.insert(D);
|
||||||
|
bayesTree.insert(E);
|
||||||
|
bayesTree.insert(F);
|
||||||
|
|
||||||
|
// remove C, expected outcome: factor graph with ABC, Bayes Tree now contains two orphan trees: D|C and E|B,F|E
|
||||||
|
SymbolicFactorGraph expected;
|
||||||
|
list<string> keys;
|
||||||
|
keys += "A","C";
|
||||||
|
boost::shared_ptr<SymbolicFactor> _CA(new SymbolicFactor(keys));
|
||||||
|
expected.push_back(_CA);
|
||||||
|
keys.clear();
|
||||||
|
keys += "A","B";
|
||||||
|
boost::shared_ptr<SymbolicFactor> _BA(new SymbolicFactor(keys));
|
||||||
|
expected.push_back(_BA);
|
||||||
|
keys.clear();
|
||||||
|
keys += "A";
|
||||||
|
boost::shared_ptr<SymbolicFactor> _A(new SymbolicFactor(keys));
|
||||||
|
expected.push_back(_A);
|
||||||
|
SymbolicFactorGraph actual = bayesTree.removePath<SymbolicFactor>("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;
|
||||||
|
keys.clear();
|
||||||
|
keys += "C","A";
|
||||||
|
boost::shared_ptr<SymbolicFactor> CA(new SymbolicFactor(keys));
|
||||||
|
expected3.push_back(CA);
|
||||||
|
actual = bayesTree.removePath<SymbolicFactor>("E");
|
||||||
|
// CHECK(assert_equal(expected3, actual));
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() {
|
int main() {
|
||||||
TestResult tr;
|
TestResult tr;
|
||||||
|
|
Loading…
Reference in New Issue