testDiscreteBayesNet.cpp
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
12 /*
13  * testDiscreteBayesNet.cpp
14  *
15  * @date Feb 27, 2011
16  * @author Frank Dellaert
17  */
18 
20 #include <gtsam/base/Testable.h>
21 #include <gtsam/base/Vector.h>
22 #include <gtsam/base/debug.h>
26 #include <gtsam/inference/Symbol.h>
27 
28 #include <iostream>
29 #include <string>
30 #include <vector>
31 
32 #include "AsiaExample.h"
33 
34 using namespace gtsam;
35 
36 /* ************************************************************************* */
40  DiscreteKey Parent(0, 2), Child(1, 2);
41 
42  auto prior = std::make_shared<DiscreteConditional>(Parent % "6/4");
43  CHECK(assert_equal(ADT({Parent}, "0.6 0.4"), (ADT)*prior));
45 
46  auto conditional =
47  std::make_shared<DiscreteConditional>(Child | Parent = "7/3 8/2");
48  EXPECT_LONGS_EQUAL(1, *(conditional->beginFrontals()));
49  ADT expected(Child & Parent, "0.7 0.8 0.3 0.2");
50  CHECK(assert_equal(expected, (ADT)*conditional));
51  bayesNet.push_back(conditional);
52 
54  LONGS_EQUAL(2, fg.back()->size());
55 
56  // Check the marginals
57  const double expectedMarginal[2]{0.4, 0.6 * 0.3 + 0.4 * 0.2};
59  for (size_t j = 0; j < 2; j++) {
60  Vector FT = marginals.marginalProbabilities(DiscreteKey(j, 2));
61  EXPECT_DOUBLES_EQUAL(expectedMarginal[j], FT[1], 1e-3);
62  EXPECT_DOUBLES_EQUAL(FT[0], 1.0 - FT[1], 1e-9);
63  }
64 }
65 
66 /* ************************************************************************* */
68  using namespace asia_example;
70 
71  // Convert to factor graph
73  LONGS_EQUAL(1, fg.back()->size());
74 
75  // Check the marginals we know (of the parent-less nodes)
77  Vector2 va(0.99, 0.01), vs(0.5, 0.5);
78  EXPECT(assert_equal(va, marginals.marginalProbabilities(Asia)));
79  EXPECT(assert_equal(vs, marginals.marginalProbabilities(Smoking)));
80 
81  // Create solver and eliminate
82  const Ordering ordering{A, D, T, X, S, E, L, B};
84  DiscreteConditional expected2(Bronchitis % "11/9");
85  EXPECT(assert_equal(expected2, *chordal->back()));
86 
87  // Check evaluate and logProbability
88  auto result = fg.optimize();
89  EXPECT_DOUBLES_EQUAL(asia.logProbability(result),
90  std::log(asia.evaluate(result)), 1e-9);
91 
92  // add evidence, we were in Asia and we have dyspnea
93  fg.add(Asia, "0 1");
94  fg.add(Dyspnea, "0 1");
95 
96  // solve again, now with evidence
98  EXPECT(assert_equal(expected2, *chordal->back()));
99 
100  // now sample from it
101  DiscreteValues expectedSample{{Asia.first, 1}, {Dyspnea.first, 1},
102  {XRay.first, 1}, {Tuberculosis.first, 0},
103  {Smoking.first, 1}, {Either.first, 1},
104  {LungCancer.first, 1}, {Bronchitis.first, 0}};
105  SETDEBUG("DiscreteConditional::sample", false);
106  auto actualSample = chordal2->sample();
107  EXPECT(assert_equal(expectedSample, actualSample));
108 }
109 
110 /* ************************************************************************* */
112  DiscreteKey T(0, 2), L(1, 2), E(2, 2), C(8, 3), S(7, 2);
113 
114  DiscreteBayesNet bn;
115 
116  // try logic
117  bn.add((E | T, L) = "OR");
118  bn.add((E | T, L) = "AND");
119 
120  // try multivalued
121  bn.add(C % "1/1/2");
122  bn.add(C | S = "1/1/2 5/2/3");
123 }
124 
125 /* ************************************************************************* */
127  using namespace asia_example;
128  const DiscreteBayesNet fragment = createFragment();
129 
130  std::string expected =
131  "digraph {\n"
132  " size=\"5,5\";\n"
133  "\n"
134  " var4683743612465315848[label=\"A8\"];\n"
135  " var4971973988617027587[label=\"E3\"];\n"
136  " var5476377146882523141[label=\"L5\"];\n"
137  " var5980780305148018695[label=\"S7\"];\n"
138  " var6052837899185946630[label=\"T6\"];\n"
139  "\n"
140  " var4683743612465315848->var6052837899185946630\n"
141  " var5980780305148018695->var5476377146882523141\n"
142  " var6052837899185946630->var4971973988617027587\n"
143  " var5476377146882523141->var4971973988617027587\n"
144  "}";
145  std::string actual = fragment.dot();
146  EXPECT(actual.compare(expected) == 0);
147 }
148 
149 /* ************************************************************************* */
150 // Check markdown representation looks as expected.
152  using namespace asia_example;
153  DiscreteBayesNet priors = createPriors();
154 
155  std::string expected =
156  "`DiscreteBayesNet` of size 2\n"
157  "\n"
158  " *P(Smoking):*\n\n"
159  "|Smoking|value|\n"
160  "|:-:|:-:|\n"
161  "|0|0.5|\n"
162  "|1|0.5|\n"
163  "\n"
164  " *P(Asia):*\n\n"
165  "|Asia|value|\n"
166  "|:-:|:-:|\n"
167  "|0|0.99|\n"
168  "|1|0.01|\n\n";
169  auto formatter = [](Key key) { return key == A ? "Asia" : "Smoking"; };
170  std::string actual = priors.markdown(formatter);
171  EXPECT(actual == expected);
172 }
173 
174 /* ************************************************************************* */
175 int main() {
176  TestResult tr;
177  return TestRegistry::runAllTests(tr);
178 }
179 /* ************************************************************************* */
TestRegistry::runAllTests
static int runAllTests(TestResult &result)
Definition: TestRegistry.cpp:27
gtsam::asia_example::Asia
static const DiscreteKey Asia(A, 2)
gtsam::EliminateableFactorGraph::eliminateSequential
std::shared_ptr< BayesNetType > eliminateSequential(OptionalOrderingType orderingType={}, const Eliminate &function=EliminationTraitsType::DefaultEliminate, OptionalVariableIndex variableIndex={}) const
Definition: EliminateableFactorGraph-inst.h:29
DiscreteBayesNet.h
gtsam::markdown
string markdown(const DiscreteValues &values, const KeyFormatter &keyFormatter, const DiscreteValues::Names &names)
Free version of markdown.
Definition: DiscreteValues.cpp:153
asia::bayesNet
static const DiscreteBayesNet bayesNet
Definition: testDiscreteSearch.cpp:30
Asia
static const DiscreteKey Asia(asiaKey, 2)
SETDEBUG
#define SETDEBUG(S, V)
Definition: debug.h:61
gtsam::DiscreteFactorGraph
Definition: DiscreteFactorGraph.h:99
Vector.h
typedef and functions to augment Eigen's VectorXd
e
Array< double, 1, 3 > e(1./3., 0.5, 2.)
gtsam::asia_example::A
static const Key A
Definition: AsiaExample.h:27
EXPECT_LONGS_EQUAL
#define EXPECT_LONGS_EQUAL(expected, actual)
Definition: Test.h:154
Testable.h
Concept check for values that can be used in unit tests.
EXPECT
#define EXPECT(condition)
Definition: Test.h:150
TestHarness.h
DiscreteFactorGraph.h
gtsam::BayesNet::dot
void dot(std::ostream &os, const KeyFormatter &keyFormatter=DefaultKeyFormatter, const DotWriter &writer=DotWriter()) const
Output to graphviz format, stream version.
Definition: BayesNet-inst.h:45
gtsam::asia_example::createPriors
DiscreteBayesNet createPriors()
Definition: AsiaExample.h:34
formatter
const KeyFormatter & formatter
Definition: treeTraversal-inst.h:204
T
Eigen::Triplet< double > T
Definition: Tutorial_sparse_example.cpp:6
log
const EIGEN_DEVICE_FUNC LogReturnType log() const
Definition: ArrayCwiseUnaryOps.h:128
gtsam::Factor::back
Key back() const
Last key.
Definition: Factor.h:137
test_cases::vs
std::vector< Vector3 > vs
Definition: testPose3.cpp:900
gtsam::asia_example::T
static const Key T
Definition: AsiaExample.h:26
gtsam::Vector
Eigen::VectorXd Vector
Definition: Vector.h:39
result
Values result
Definition: OdometryOptimize.cpp:8
AsiaExample.h
gtsam::asia_example::Dyspnea
static const DiscreteKey Dyspnea(D, 2)
gtsam::AlgebraicDecisionTree< Key >
gtsam::asia_example::createFragment
DiscreteBayesNet createFragment()
Definition: AsiaExample.h:42
gtsam::asia_example::X
static const Key X
Definition: AsiaExample.h:25
gtsam::asia_example::Tuberculosis
static const DiscreteKey Tuberculosis(T, 2)
ADT
AlgebraicDecisionTree< Key > ADT
Definition: testAlgebraicDecisionTree.cpp:32
gtsam::DiscreteBayesNet
Definition: DiscreteBayesNet.h:38
j
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2
gtsam::asia_example::Bronchitis
static const DiscreteKey Bronchitis(B, 2)
gtsam::asia_example::XRay
static const DiscreteKey XRay(X, 2)
gtsam::asia_example::D
static const Key D
Definition: AsiaExample.h:25
gtsam::asia_example::LungCancer
static const DiscreteKey LungCancer(L, 2)
gtsam::DiscreteBayesNet::markdown
std::string markdown(const KeyFormatter &keyFormatter=DefaultKeyFormatter, const DiscreteFactor::Names &names={}) const
Render as markdown tables.
Definition: DiscreteBayesNet.cpp:126
cholesky::expected
Matrix expected
Definition: testMatrix.cpp:916
gtsam::DiscreteMarginals
Definition: DiscreteMarginals.h:33
L
MatrixXd L
Definition: LLT_example.cpp:6
Symbol.h
Vector2
Definition: test_operator_overloading.cpp:18
Eigen::Triplet< double >
EXPECT_DOUBLES_EQUAL
#define EXPECT_DOUBLES_EQUAL(expected, actual, threshold)
Definition: Test.h:161
DiscreteMarginals.h
A class for computing marginals in a DiscreteFactorGraph.
ordering
static enum @1096 ordering
TestResult
Definition: TestResult.h:26
key
const gtsam::Symbol key('X', 0)
E
DiscreteKey E(5, 2)
gtsam::asia_example::createAsiaExample
DiscreteBayesNet createAsiaExample()
Definition: AsiaExample.h:52
gtsam::FactorGraph::back
sharedFactor back() const
Definition: FactorGraph.h:348
gtsam::DiscreteConditional
Definition: DiscreteConditional.h:37
gtsam::DiscreteBayesNet::add
void add(const DiscreteKey &key, const std::string &spec)
Definition: DiscreteBayesNet.h:85
C
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:50
gtsam
traits
Definition: SFMdata.h:40
gtsam::TEST
TEST(SmartFactorBase, Pinhole)
Definition: testSmartFactorBase.cpp:38
asia
Definition: testDiscreteSearch.cpp:28
gtsam::DiscreteValues
Definition: DiscreteValues.h:34
gtsam::FactorGraph::push_back
IsDerived< DERIVEDFACTOR > push_back(std::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
Definition: FactorGraph.h:147
CHECK
#define CHECK(condition)
Definition: Test.h:108
gtsam::DiscreteKey
std::pair< Key, size_t > DiscreteKey
Definition: DiscreteKey.h:38
gtsam::asia_example::E
static const Key E
Definition: AsiaExample.h:25
gtsam::DiscreteFactorGraph::add
void add(Args &&... args)
Definition: DiscreteFactorGraph.h:140
gtsam::DiscreteBayesNet::shared_ptr
std::shared_ptr< This > shared_ptr
Definition: DiscreteBayesNet.h:43
gtsam::assert_equal
bool assert_equal(const Matrix &expected, const Matrix &actual, double tol)
Definition: Matrix.cpp:41
different_sigmas::prior
const auto prior
Definition: testHybridBayesNet.cpp:240
gtsam::DiscreteFactorGraph::optimize
DiscreteValues optimize(OptionalOrderingType orderingType={}) const
Find the maximum probable explanation (MPE) by doing max-product.
Definition: DiscreteFactorGraph.cpp:187
gtsam::asia_example::S
static const Key S
Definition: AsiaExample.h:27
gtsam::asia_example::Either
static const DiscreteKey Either(E, 2)
marginals
Marginals marginals(graph, result)
main
int main()
Definition: testDiscreteBayesNet.cpp:175
gtsam::Key
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:97
gtsam::Ordering
Definition: inference/Ordering.h:33
LONGS_EQUAL
#define LONGS_EQUAL(expected, actual)
Definition: Test.h:134
gtsam::asia_example::L
static const Key L
Definition: AsiaExample.h:26
S
DiscreteKey S(1, 2)
debug.h
Global debugging flags.
gtsam::asia_example::Smoking
static const DiscreteKey Smoking(S, 2)
gtsam::asia_example::B
static const Key B
Definition: AsiaExample.h:26


gtsam
Author(s):
autogenerated on Wed Mar 19 2025 03:06:32