Fix tests

release/4.3a0
Frank Dellaert 2025-01-24 09:14:30 -05:00
parent fff14ab0b7
commit 2b1f51f098
2 changed files with 32 additions and 29 deletions

View File

@ -28,7 +28,7 @@
#include <vector> #include <vector>
using namespace gtsam; using namespace gtsam;
static constexpr bool debug = false; static constexpr bool debug = true;
/* ************************************************************************* */ /* ************************************************************************* */
struct TestFixture { struct TestFixture {
@ -186,11 +186,11 @@ TEST(DiscreteBayesTree, Shortcuts) {
shortcut = clique->shortcut(R, EliminateDiscrete); shortcut = clique->shortcut(R, EliminateDiscrete);
DOUBLES_EQUAL(joint_8_11_12_13 / joint_11_13, shortcut.evaluate(all1), 1e-9); DOUBLES_EQUAL(joint_8_11_12_13 / joint_11_13, shortcut.evaluate(all1), 1e-9);
// calculate all shortcuts to root if (debug) {
DiscreteBayesTree::Nodes cliques = self.bayesTree->nodes(); // print all shortcuts to root
for (auto clique : cliques) { DiscreteBayesTree::Nodes cliques = self.bayesTree->nodes();
DiscreteBayesNet shortcut = clique.second->shortcut(R, EliminateDiscrete); for (auto clique : cliques) {
if (debug) { DiscreteBayesNet shortcut = clique.second->shortcut(R, EliminateDiscrete);
clique.second->conditional_->printSignature(); clique.second->conditional_->printSignature();
shortcut.print("shortcut:"); shortcut.print("shortcut:");
} }
@ -202,6 +202,7 @@ TEST(DiscreteBayesTree, Shortcuts) {
TEST(DiscreteBayesTree, MarginalFactors) { TEST(DiscreteBayesTree, MarginalFactors) {
TestFixture self; TestFixture self;
// Caclulate marginals with brute force enumeration.
Vector marginals = Vector::Zero(15); Vector marginals = Vector::Zero(15);
for (size_t i = 0; i < self.assignments.size(); ++i) { for (size_t i = 0; i < self.assignments.size(); ++i) {
DiscreteValues& x = self.assignments[i]; DiscreteValues& x = self.assignments[i];
@ -287,6 +288,8 @@ TEST(DiscreteBayesTree, Joints) {
TEST(DiscreteBayesTree, Dot) { TEST(DiscreteBayesTree, Dot) {
TestFixture self; TestFixture self;
std::string actual = self.bayesTree->dot(); std::string actual = self.bayesTree->dot();
// print actual:
if (debug) std::cout << actual << std::endl;
EXPECT(actual == EXPECT(actual ==
"digraph G{\n" "digraph G{\n"
"0[label=\"13, 11, 6, 7\"];\n" "0[label=\"13, 11, 6, 7\"];\n"
@ -374,18 +377,18 @@ TEST(DiscreteBayesTree, Lookup) {
TEST(DiscreteBayesTree, DirectFromCliques) { TEST(DiscreteBayesTree, DirectFromCliques) {
// Create a BayesNet // Create a BayesNet
DiscreteBayesNet bayesNet; DiscreteBayesNet bayesNet;
DiscreteKey key0(0, 2), key1(1, 2), key2(2, 2); DiscreteKey A(0, 2), B(1, 2), C(2, 2);
bayesNet.add(key0 % "1/3"); bayesNet.add(A % "1/3");
bayesNet.add(key1 | key0 = "1/3 3/1"); bayesNet.add(B | A = "1/3 3/1");
bayesNet.add(key2 | key1 = "3/1 3/1"); bayesNet.add(C | B = "3/1 3/1");
// Create cliques directly // Create cliques directly
auto clique2 = std::make_shared<DiscreteBayesTree::Clique>( auto clique2 = std::make_shared<DiscreteBayesTree::Clique>(
std::make_shared<DiscreteConditional>(key2 | key1 = "3/1 3/1")); std::make_shared<DiscreteConditional>(C | B = "3/1 3/1"));
auto clique1 = std::make_shared<DiscreteBayesTree::Clique>( auto clique1 = std::make_shared<DiscreteBayesTree::Clique>(
std::make_shared<DiscreteConditional>(key1 | key0 = "1/3 3/1")); std::make_shared<DiscreteConditional>(B | A = "1/3 3/1"));
auto clique0 = std::make_shared<DiscreteBayesTree::Clique>( auto clique0 = std::make_shared<DiscreteBayesTree::Clique>(
std::make_shared<DiscreteConditional>(key0 % "1/3")); std::make_shared<DiscreteConditional>(A % "1/3"));
// Create a BayesTree // Create a BayesTree
DiscreteBayesTree bayesTree; DiscreteBayesTree bayesTree;
@ -395,13 +398,13 @@ TEST(DiscreteBayesTree, DirectFromCliques) {
// Check that the BayesTree is correct // Check that the BayesTree is correct
DiscreteValues values; DiscreteValues values;
values[0] = 1; values[A.first] = 1;
values[1] = 1; values[A.first] = 1;
values[2] = 1; values[A.first] = 1;
double expected = bayesNet.evaluate(values); // Regression
double actual = bayesTree.evaluate(values); double expected = .046875;
DOUBLES_EQUAL(expected, actual, 1e-9); DOUBLES_EQUAL(expected, bayesTree.evaluate(values), 1e-9);
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -160,15 +160,15 @@ class TestDiscreteBayesNet(GtsamTestCase):
"""Test creating a Bayes tree directly from cliques.""" """Test creating a Bayes tree directly from cliques."""
# Create a BayesNet # Create a BayesNet
bayesNet = DiscreteBayesNet() bayesNet = DiscreteBayesNet()
key0, key1, key2 = (0, 2), (1, 2), (2, 2) A, B, C = (0, 2), (1, 2), (2, 2)
bayesNet.add(key0, "1/3") bayesNet.add(A, "1/3")
bayesNet.add(key1, [key0], "1/3 3/1") bayesNet.add(B, [A], "1/3 3/1")
bayesNet.add(key2, [key1], "3/1 3/1") bayesNet.add(C, [B], "3/1 3/1")
# Create cliques directly # Create cliques directly
clique2 = DiscreteBayesTreeClique(DiscreteConditional(key2, [key1], "3/1 3/1")) clique2 = DiscreteBayesTreeClique(DiscreteConditional(C, [B], "3/1 3/1"))
clique1 = DiscreteBayesTreeClique(DiscreteConditional(key1, [key0], "1/3 3/1")) clique1 = DiscreteBayesTreeClique(DiscreteConditional(B, [A], "1/3 3/1"))
clique0 = DiscreteBayesTreeClique(DiscreteConditional(key0, "1/3")) clique0 = DiscreteBayesTreeClique(DiscreteConditional(A, "1/3"))
# Create a BayesTree # Create a BayesTree
bayesTree = gtsam.DiscreteBayesTree() bayesTree = gtsam.DiscreteBayesTree()
@ -182,9 +182,9 @@ class TestDiscreteBayesNet(GtsamTestCase):
values[1] = 1 values[1] = 1
values[2] = 1 values[2] = 1
expected = bayesNet.evaluate(values) # regression
actual = bayesTree.evaluate(values) expected = .046875
self.assertAlmostEqual(expected, actual, places=9) self.assertAlmostEqual(expected, bayesNet.evaluate(values))
if __name__ == "__main__": if __name__ == "__main__":