18 using namespace boost;
19 using namespace gtsam;
42 correctedBeliefIndices(_beliefIndices),
46 void print(
const std::string&
s =
"")
const {
47 cout <<
s <<
":" << endl;
48 star->print(
"Star graph: ");
49 for (
const auto& [
key,
_] : correctedBeliefIndices) {
50 cout <<
"Belief factor index for " <<
key <<
": "
51 << correctedBeliefIndices.at(
key) << endl;
67 const std::map<Key, DiscreteKey>& allDiscreteKeys)
68 : starGraphs_(buildStarGraphs(
graph, allDiscreteKeys)) {}
71 void print(
const std::string&
s =
"")
const {
72 cout <<
s <<
":" << endl;
73 for (
const auto& [
key,
_] : starGraphs_) {
74 starGraphs_.at(
key).print(
"Node " + std::to_string(
key) +
":");
80 const std::map<Key, DiscreteKey>& allDiscreteKeys) {
81 static const bool debug =
false;
83 std::map<Key, std::map<Key, DiscreteFactor::shared_ptr> > allMessages;
85 for (
const auto& [
key,
_] : starGraphs_) {
91 std::map<Key, DiscreteFactor::shared_ptr> messages;
94 for (
const auto& [neighbor,
_] : starGraphs_.at(
key).correctedBeliefIndices) {
96 for (
size_t factor : starGraphs_.at(
key).varIndex_[neighbor]) {
99 if (
debug) subGraph.
print(
"------- Subgraph:");
100 const auto [dummyCond, message] =
103 messages.insert(make_pair(neighbor, message));
104 if (
debug) message->print(
"------- Message: ");
110 std::dynamic_pointer_cast<DecisionTreeFactor>(message);
112 beliefAtKey = std::make_shared<DecisionTreeFactor>(
114 (*std::dynamic_pointer_cast<DecisionTreeFactor>(message)));
116 if (starGraphs_.at(
key).unary)
117 beliefAtKey = std::make_shared<DecisionTreeFactor>(
118 (*beliefAtKey) * (*starGraphs_.at(
key).unary));
119 if (
debug) beliefAtKey->print(
"New belief at key: ");
122 for (
size_t v = 0;
v < allDiscreteKeys.at(
key).second; ++
v) {
125 sum += (*beliefAtKey)(val);
128 string sumFactorTable;
129 for (
size_t v = 0;
v < allDiscreteKeys.at(
key).second; ++
v) {
130 sumFactorTable = sumFactorTable +
" " + std::to_string(sum);
135 std::make_shared<DecisionTreeFactor>((*beliefAtKey) / sumFactor);
136 if (
debug) beliefAtKey->print(
"New belief at key normalized: ");
137 beliefs->push_back(beliefAtKey);
138 allMessages[
key] = messages;
143 for (
const auto& [
key,
_] : starGraphs_) {
144 std::map<Key, DiscreteFactor::shared_ptr> messages = allMessages[
key];
145 for (
const auto& [neighbor,
_] : starGraphs_.at(
key).correctedBeliefIndices) {
147 (*std::dynamic_pointer_cast<DecisionTreeFactor>(
148 beliefs->at(beliefFactors[
key].front()))) /
149 (*std::dynamic_pointer_cast<DecisionTreeFactor>(
150 messages.at(neighbor)));
151 if (
debug) correctedBelief.
print(
"correctedBelief: ");
153 starGraphs_.at(neighbor).correctedBeliefIndices.at(
key);
154 starGraphs_.at(neighbor).star->replace(
156 std::make_shared<DecisionTreeFactor>(correctedBelief));
171 const std::map<Key, DiscreteKey>& allDiscreteKeys)
const {
174 for (
const auto& [
key,
_] : varIndex) {
180 for (
size_t factorIndex : varIndex[
key]) {
181 star->push_back(
graph.
at(factorIndex));
184 if (
graph.
at(factorIndex)->size() == 1) {
188 prodOfUnaries = std::make_shared<DecisionTreeFactor>(
195 KeySet neighbors = star->keys();
196 neighbors.erase(
key);
198 for (
Key neighbor : neighbors) {
200 string initialBelief;
201 for (
size_t v = 0;
v < allDiscreteKeys.at(neighbor).second - 1; ++
v) {
202 initialBelief = initialBelief +
"0.0 ";
204 initialBelief = initialBelief +
"1.0";
207 correctedBeliefIndices.insert(make_pair(neighbor, star->size() - 1));
209 starGraphs.insert(make_pair(
210 key,
StarGraph(star, correctedBeliefIndices, prodOfUnaries)));
224 std::map<Key, DiscreteKey> allKeys{{0,
C}, {1,
S}, {2,
R}, {3,
W}};
241 solver.print(
"Loopy belief: ");
245 cout <<
"==================================" << endl;
246 cout <<
"iteration: " <<
iter << endl;