30 using namespace gtsam;
31 static constexpr
bool debug =
false;
46 for (
int i = 0;
i < 15;
i++) {
48 keys.push_back(key_i);
87 self.bayesNet.saveGraph(
"/tmp/discreteBayesNet.dot");
93 self.bayesTree->saveGraph(
"/tmp/discreteBayesTree.dot");
97 for (
size_t i : {13, 14, 9, 3, 2, 8, 1, 0, 10, 5, 4}) {
98 auto clique_i = (*
self.bayesTree)[
i];
102 for (
const auto&
x :
self.assignments) {
103 double expected =
self.bayesNet.evaluate(
x);
104 double actual =
self.bayesTree->evaluate(
x);
115 double marginal_14 = 0, joint_8_12 = 0;
116 for (
auto&
x :
self.assignments) {
117 double px =
self.bayesTree->evaluate(
x);
118 if (
x[8] &&
x[12]) joint_8_12 +=
px;
119 if (
x[14]) marginal_14 +=
px;
124 auto clique = (*
self.bayesTree)[0];
130 clique = (*
self.bayesTree)[9];
136 clique = (*
self.bayesTree)[11];
148 double joint_11_13 = 0, joint_11_13_14 = 0, joint_11_12_13_14 = 0,
149 joint_9_11_12_13 = 0, joint_8_11_12_13 = 0;
150 for (
auto&
x :
self.assignments) {
151 double px =
self.bayesTree->evaluate(
x);
152 if (
x[11] &&
x[13]) {
154 if (
x[8] &&
x[12]) joint_8_11_12_13 +=
px;
155 if (
x[9] &&
x[12]) joint_9_11_12_13 +=
px;
157 joint_11_13_14 +=
px;
159 joint_11_12_13_14 +=
px;
166 auto R =
self.bayesTree->roots().front();
169 auto clique = (*
self.bayesTree)[9];
175 clique = (*
self.bayesTree)[8];
180 clique = (*
self.bayesTree)[2];
185 clique = (*
self.bayesTree)[0];
192 for (
auto clique : cliques) {
194 clique.second->conditional_->printSignature();
195 shortcut.
print(
"shortcut:");
207 for (
size_t i = 0;
i <
self.assignments.size(); ++
i) {
209 double px =
self.bayesTree->evaluate(
x);
210 for (
size_t i = 0;
i < 15;
i++)
216 for (
size_t i = 0;
i < 15;
i++) {
218 double actual = (*marginalFactor)(all1);
230 double joint_12_14 = 0, joint_9_12_14 = 0, joint_8_12_14 = 0, joint82 = 0,
231 joint12 = 0, joint24 = 0, joint45 = 0, joint46 = 0, joint_4_11 = 0;
232 for (
size_t i = 0;
i <
self.assignments.size(); ++
i) {
234 double px =
self.bayesTree->evaluate(
x);
235 for (
size_t i = 0;
i < 15;
i++)
237 if (
x[12] &&
x[14]) {
239 if (
x[9]) joint_9_12_14 +=
px;
240 if (
x[8]) joint_8_12_14 +=
px;
243 if (
x[8]) joint82 +=
px;
244 if (
x[1]) joint12 +=
px;
247 if (
x[2]) joint24 +=
px;
248 if (
x[5]) joint45 +=
px;
249 if (
x[6]) joint46 +=
px;
250 if (
x[11]) joint_4_11 +=
px;
290 std::string actual =
self.
bayesTree->dot();
292 if (
debug) std::cout << actual << std::endl;
295 "0[label=\"13, 11, 6, 7\"];\n"
297 "1[label=\"14 : 11, 13\"];\n"
299 "2[label=\"9, 12 : 14\"];\n"
301 "3[label=\"3 : 9, 12\"];\n"
303 "4[label=\"2 : 9, 12\"];\n"
305 "5[label=\"8 : 12, 14\"];\n"
307 "6[label=\"1 : 8, 12\"];\n"
309 "7[label=\"0 : 8, 12\"];\n"
311 "8[label=\"10 : 13, 14\"];\n"
313 "9[label=\"5 : 10, 13\"];\n"
315 "10[label=\"4 : 10, 13\"];\n"
337 std::vector<double>
table{
351 auto lookup_x1_a1_x2 = (*lookup)[
X(1)]->conditional();
359 auto lookup_a2_x3 = (*lookup)[
X(3)]->conditional();
361 auto sum_x2 = lookup_a2_x3->sum(2);
386 auto clique2 = std::make_shared<DiscreteBayesTree::Clique>(
387 std::make_shared<DiscreteConditional>(
C |
B =
"3/1 3/1"));
388 auto clique1 = std::make_shared<DiscreteBayesTree::Clique>(
389 std::make_shared<DiscreteConditional>(
B |
A =
"1/3 3/1"));
390 auto clique0 = std::make_shared<DiscreteBayesTree::Clique>(
391 std::make_shared<DiscreteConditional>(
A %
"1/3"));