BayesTree WIP

release/4.3a0
Frank Dellaert 2025-01-26 22:48:40 -05:00
parent 455554c803
commit 54f493358d
2 changed files with 38 additions and 0 deletions

View File

@ -17,6 +17,7 @@
*/
#include <gtsam/discrete/DiscreteBayesNet.h>
#include <gtsam/discrete/DiscreteBayesTree.h>
namespace gtsam {
@ -214,6 +215,12 @@ class DiscreteSearch {
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.
*

View File

@ -32,6 +32,7 @@
using namespace gtsam;
/* ************************************************************************* */
TEST(DiscreteBayesNet, EmptyKBest) {
DiscreteBayesNet net; // no factors
DiscreteSearch search(net, 3);
@ -41,6 +42,7 @@ TEST(DiscreteBayesNet, EmptyKBest) {
EXPECT_DOUBLES_EQUAL(0, std::fabs(solutions[0].error), 1e-9);
}
/* ************************************************************************* */
TEST(DiscreteBayesNet, AsiaKBest) {
using namespace asia_example;
DiscreteBayesNet asia = createAsiaExample();
@ -51,6 +53,35 @@ TEST(DiscreteBayesNet, AsiaKBest) {
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() {
TestResult tr;