BayesTree WIP
parent
455554c803
commit
54f493358d
|
@ -17,6 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtsam/discrete/DiscreteBayesNet.h>
|
#include <gtsam/discrete/DiscreteBayesNet.h>
|
||||||
|
#include <gtsam/discrete/DiscreteBayesTree.h>
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
|
||||||
|
@ -214,6 +215,12 @@ class DiscreteSearch {
|
||||||
expansions_.push(root);
|
expansions_.push(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct from a DiscreteBayesNet and K.
|
||||||
|
*/
|
||||||
|
DiscreteSearch(const DiscreteBayesTree& bayesTree, size_t K)
|
||||||
|
: solutions_(K) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Search for the K best solutions.
|
* @brief Search for the K best solutions.
|
||||||
*
|
*
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
using namespace gtsam;
|
using namespace gtsam;
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
TEST(DiscreteBayesNet, EmptyKBest) {
|
TEST(DiscreteBayesNet, EmptyKBest) {
|
||||||
DiscreteBayesNet net; // no factors
|
DiscreteBayesNet net; // no factors
|
||||||
DiscreteSearch search(net, 3);
|
DiscreteSearch search(net, 3);
|
||||||
|
@ -41,6 +42,7 @@ TEST(DiscreteBayesNet, EmptyKBest) {
|
||||||
EXPECT_DOUBLES_EQUAL(0, std::fabs(solutions[0].error), 1e-9);
|
EXPECT_DOUBLES_EQUAL(0, std::fabs(solutions[0].error), 1e-9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
TEST(DiscreteBayesNet, AsiaKBest) {
|
TEST(DiscreteBayesNet, AsiaKBest) {
|
||||||
using namespace asia_example;
|
using namespace asia_example;
|
||||||
DiscreteBayesNet asia = createAsiaExample();
|
DiscreteBayesNet asia = createAsiaExample();
|
||||||
|
@ -51,6 +53,35 @@ TEST(DiscreteBayesNet, AsiaKBest) {
|
||||||
EXPECT_DOUBLES_EQUAL(1.236627, std::fabs(solutions[0].error), 1e-5);
|
EXPECT_DOUBLES_EQUAL(1.236627, std::fabs(solutions[0].error), 1e-5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST(DiscreteBayesTree, testEmptyTree) {
|
||||||
|
DiscreteBayesTree bt;
|
||||||
|
|
||||||
|
DiscreteSearch search(bt, 3);
|
||||||
|
auto solutions = search.run();
|
||||||
|
|
||||||
|
// We expect exactly 1 solution with error = 0.0 (the empty assignment).
|
||||||
|
assert(solutions.size() == 1 && "There should be exactly one empty solution");
|
||||||
|
EXPECT_LONGS_EQUAL(1, solutions.size());
|
||||||
|
EXPECT_DOUBLES_EQUAL(0, std::fabs(solutions[0].error), 1e-9);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST(DiscreteBayesTree, testTrivialOneClique) {
|
||||||
|
using namespace asia_example;
|
||||||
|
DiscreteFactorGraph asia(createAsiaExample());
|
||||||
|
DiscreteBayesTree::shared_ptr bt = asia.eliminateMultifrontal();
|
||||||
|
GTSAM_PRINT(*bt);
|
||||||
|
|
||||||
|
// Ask for top 4 solutions
|
||||||
|
DiscreteSearch search(*bt, 4);
|
||||||
|
auto solutions = search.run();
|
||||||
|
|
||||||
|
EXPECT(!solutions.empty());
|
||||||
|
// Regression test: check the first solution
|
||||||
|
EXPECT_DOUBLES_EQUAL(1.236627, std::fabs(solutions[0].error), 1e-5);
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
int main() {
|
int main() {
|
||||||
TestResult tr;
|
TestResult tr;
|
||||||
|
|
Loading…
Reference in New Issue