| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2014-10-31 00:44:46 +08:00
										 |  |  |  * @file    testLoopyBelief.cpp | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |  * @brief   | 
					
						
							|  |  |  |  * @author Duy-Nguyen Ta | 
					
						
							| 
									
										
										
										
											2014-10-31 00:44:46 +08:00
										 |  |  |  * @date    Oct 11, 2013 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gtsam/inference/VariableIndex.h>
 | 
					
						
							|  |  |  | #include <gtsam/discrete/DecisionTreeFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam/discrete/DiscreteFactorGraph.h>
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | #include <boost/range/adaptor/map.hpp>
 | 
					
						
							|  |  |  | #include <boost/assign/list_of.hpp>
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <fstream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  | using namespace boost; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | using namespace boost::assign; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Loopy belief solver for graphs with only binary and unary factors | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | class LoopyBelief { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |   /** Star graph struct for each node, containing
 | 
					
						
							|  |  |  |    * - the star graph itself | 
					
						
							|  |  |  |    * - the product of original unary factors so we don't have to recompute it later, and | 
					
						
							|  |  |  |    * - the factor indices of the corrected belief factors of the neighboring nodes | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |   typedef std::map<Key, size_t> CorrectedBeliefIndices; | 
					
						
							|  |  |  |   struct StarGraph { | 
					
						
							|  |  |  |     DiscreteFactorGraph::shared_ptr star; | 
					
						
							|  |  |  |     CorrectedBeliefIndices correctedBeliefIndices; | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |     DecisionTreeFactor::shared_ptr unary; | 
					
						
							|  |  |  |     VariableIndex varIndex_; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |     StarGraph(const DiscreteFactorGraph::shared_ptr& _star, | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |         const CorrectedBeliefIndices& _beliefIndices, | 
					
						
							|  |  |  |         const DecisionTreeFactor::shared_ptr& _unary) : | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |         star(_star), correctedBeliefIndices(_beliefIndices), unary(_unary), varIndex_( | 
					
						
							|  |  |  |             *_star) { | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void print(const std::string& s = "") const { | 
					
						
							|  |  |  |       cout << s << ":" << endl; | 
					
						
							|  |  |  |       star->print("Star graph: "); | 
					
						
							|  |  |  |       BOOST_FOREACH(Key key, correctedBeliefIndices | boost::adaptors::map_keys) { | 
					
						
							|  |  |  |         cout << "Belief factor index for " << key << ": " | 
					
						
							|  |  |  |             << correctedBeliefIndices.at(key) << endl; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (unary) | 
					
						
							|  |  |  |         unary->print("Unary: "); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |   typedef std::map<Key, StarGraph> StarGraphs; | 
					
						
							|  |  |  |   StarGraphs starGraphs_; ///< star graph at each variable
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |   /** Constructor
 | 
					
						
							|  |  |  |    * Need all discrete keys to access node's cardinality for creating belief factors | 
					
						
							|  |  |  |    * TODO: so troublesome!! | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   LoopyBelief(const DiscreteFactorGraph& graph, | 
					
						
							|  |  |  |       const std::map<Key, DiscreteKey>& allDiscreteKeys) : | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |       starGraphs_(buildStarGraphs(graph, allDiscreteKeys)) { | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// print
 | 
					
						
							|  |  |  |   void print(const std::string& s = "") const { | 
					
						
							|  |  |  |     cout << s << ":" << endl; | 
					
						
							|  |  |  |     BOOST_FOREACH(Key key, starGraphs_ | boost::adaptors::map_keys) { | 
					
						
							|  |  |  |       starGraphs_.at(key).print((boost::format("Node %d:") % key).str()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |   /// One step of belief propagation
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |   DiscreteFactorGraph::shared_ptr iterate( | 
					
						
							|  |  |  |       const std::map<Key, DiscreteKey>& allDiscreteKeys) { | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |     static const bool debug = false; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |     static DiscreteConditional::shared_ptr dummyCond; // unused by-product of elimination
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |     DiscreteFactorGraph::shared_ptr beliefs(new DiscreteFactorGraph()); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |     std::map<Key, std::map<Key, DiscreteFactor::shared_ptr> > allMessages; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |     // Eliminate each star graph
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |     BOOST_FOREACH(Key key, starGraphs_ | boost::adaptors::map_keys) { | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  | //      cout << "***** Node " << key << "*****" << endl;
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |       // initialize belief to the unary factor from the original graph
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |       DecisionTreeFactor::shared_ptr beliefAtKey; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // keep intermediate messages to divide later
 | 
					
						
							|  |  |  |       std::map<Key, DiscreteFactor::shared_ptr> messages; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // eliminate each neighbor in this star graph one by one
 | 
					
						
							|  |  |  |       BOOST_FOREACH(Key neighbor, starGraphs_.at(key).correctedBeliefIndices | boost::adaptors::map_keys) { | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |         DiscreteFactorGraph subGraph; | 
					
						
							|  |  |  |         BOOST_FOREACH(size_t factor, starGraphs_.at(key).varIndex_[neighbor]) { | 
					
						
							|  |  |  |           subGraph.push_back(starGraphs_.at(key).star->at(factor)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |         if (debug) subGraph.print("------- Subgraph:"); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |         DiscreteFactor::shared_ptr message; | 
					
						
							|  |  |  |         boost::tie(dummyCond, message) = EliminateDiscrete(subGraph, | 
					
						
							|  |  |  |             Ordering(list_of(neighbor))); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |         // store the new factor into messages
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |         messages.insert(make_pair(neighbor, message)); | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |         if (debug) message->print("------- Message: "); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Belief is the product of all messages and the unary factor
 | 
					
						
							|  |  |  |         // Incorporate new the factor to belief
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |         if (!beliefAtKey) | 
					
						
							|  |  |  |           beliefAtKey = boost::dynamic_pointer_cast<DecisionTreeFactor>( | 
					
						
							|  |  |  |               message); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           beliefAtKey = | 
					
						
							| 
									
										
										
										
											2013-11-06 00:06:10 +08:00
										 |  |  |               boost::make_shared<DecisionTreeFactor>( | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |                   (*beliefAtKey) | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |                       * (*boost::dynamic_pointer_cast<DecisionTreeFactor>( | 
					
						
							|  |  |  |                           message))); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |       if (starGraphs_.at(key).unary) | 
					
						
							| 
									
										
										
										
											2013-11-06 00:06:10 +08:00
										 |  |  |         beliefAtKey = boost::make_shared<DecisionTreeFactor>( | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |             (*beliefAtKey) * (*starGraphs_.at(key).unary)); | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |       if (debug) beliefAtKey->print("New belief at key: "); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |       // normalize belief
 | 
					
						
							|  |  |  |       double sum = 0.0; | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |       for (size_t v = 0; v < allDiscreteKeys.at(key).second; ++v) { | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |         DiscreteFactor::Values val; | 
					
						
							|  |  |  |         val[key] = v; | 
					
						
							|  |  |  |         sum += (*beliefAtKey)(val); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |       string sumFactorTable; | 
					
						
							|  |  |  |       for (size_t v = 0; v < allDiscreteKeys.at(key).second; ++v) | 
					
						
							|  |  |  |         sumFactorTable = (boost::format("%s %f") % sumFactorTable % sum).str(); | 
					
						
							|  |  |  |       DecisionTreeFactor sumFactor(allDiscreteKeys.at(key), sumFactorTable); | 
					
						
							|  |  |  |       if (debug) sumFactor.print("denomFactor: "); | 
					
						
							| 
									
										
										
										
											2013-11-06 00:06:10 +08:00
										 |  |  |       beliefAtKey = boost::make_shared<DecisionTreeFactor>((*beliefAtKey) / sumFactor); | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |       if (debug) beliefAtKey->print("New belief at key normalized: "); | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |       beliefs->push_back(beliefAtKey); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |       allMessages[key] = messages; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |     // Update corrected beliefs
 | 
					
						
							|  |  |  |     VariableIndex beliefFactors(*beliefs); | 
					
						
							|  |  |  |     BOOST_FOREACH(Key key, starGraphs_ | boost::adaptors::map_keys) { | 
					
						
							|  |  |  |       std::map<Key, DiscreteFactor::shared_ptr> messages = allMessages[key]; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       BOOST_FOREACH(Key neighbor, starGraphs_.at(key).correctedBeliefIndices | boost::adaptors::map_keys) { | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |         DecisionTreeFactor correctedBelief = (*boost::dynamic_pointer_cast< | 
					
						
							|  |  |  |             DecisionTreeFactor>(beliefs->at(beliefFactors[key].front()))) | 
					
						
							|  |  |  |             / (*boost::dynamic_pointer_cast<DecisionTreeFactor>( | 
					
						
							|  |  |  |                 messages.at(neighbor))); | 
					
						
							|  |  |  |         if (debug) correctedBelief.print("correctedBelief: "); | 
					
						
							|  |  |  |         size_t beliefIndex = starGraphs_.at(neighbor).correctedBeliefIndices.at( | 
					
						
							|  |  |  |             key); | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |         starGraphs_.at(neighbor).star->replace(beliefIndex, | 
					
						
							|  |  |  |             boost::make_shared<DecisionTreeFactor>(correctedBelief)); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |     if (debug) print("After update: "); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |     return beliefs; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    * Build star graphs for each node. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   StarGraphs buildStarGraphs(const DiscreteFactorGraph& graph, | 
					
						
							|  |  |  |       const std::map<Key, DiscreteKey>& allDiscreteKeys) const { | 
					
						
							|  |  |  |     StarGraphs starGraphs; | 
					
						
							|  |  |  |     VariableIndex varIndex(graph); ///< access to all factors of each node
 | 
					
						
							|  |  |  |     BOOST_FOREACH(Key key, varIndex | boost::adaptors::map_keys) { | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       // initialize to multiply with other unary factors later
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |       DecisionTreeFactor::shared_ptr prodOfUnaries; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // collect all factors involving this key in the original graph
 | 
					
						
							|  |  |  |       DiscreteFactorGraph::shared_ptr star(new DiscreteFactorGraph()); | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |       BOOST_FOREACH(size_t factorIdx, varIndex[key]) { | 
					
						
							|  |  |  |         star->push_back(graph.at(factorIdx)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // accumulate unary factors
 | 
					
						
							|  |  |  |         if (graph.at(factorIdx)->size() == 1) { | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |           if (!prodOfUnaries) | 
					
						
							|  |  |  |             prodOfUnaries = boost::dynamic_pointer_cast<DecisionTreeFactor>( | 
					
						
							|  |  |  |                 graph.at(factorIdx)); | 
					
						
							|  |  |  |           else | 
					
						
							| 
									
										
										
										
											2013-11-06 00:06:10 +08:00
										 |  |  |             prodOfUnaries = boost::make_shared<DecisionTreeFactor>( | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |                 *prodOfUnaries | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |                     * (*boost::dynamic_pointer_cast<DecisionTreeFactor>( | 
					
						
							|  |  |  |                         graph.at(factorIdx)))); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |       // add the belief factor for each neighbor variable to this star graph
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       // also record the factor index for later modification
 | 
					
						
							| 
									
										
										
										
											2015-06-21 09:38:25 +08:00
										 |  |  |       KeySet neighbors = star->keys(); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       neighbors.erase(key); | 
					
						
							|  |  |  |       CorrectedBeliefIndices correctedBeliefIndices; | 
					
						
							|  |  |  |       BOOST_FOREACH(Key neighbor, neighbors) { | 
					
						
							|  |  |  |         // TODO: default table for keys with more than 2 values?
 | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |         string initialBelief; | 
					
						
							|  |  |  |         for (size_t v = 0; v < allDiscreteKeys.at(neighbor).second - 1; ++v) { | 
					
						
							|  |  |  |           initialBelief = initialBelief + "0.0 "; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         initialBelief = initialBelief + "1.0"; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |         star->push_back( | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |             DecisionTreeFactor(allDiscreteKeys.at(neighbor), initialBelief)); | 
					
						
							|  |  |  |         correctedBeliefIndices.insert(make_pair(neighbor, star->size() - 1)); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |       starGraphs.insert( | 
					
						
							|  |  |  |           make_pair(key, | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |               StarGraph(star, correctedBeliefIndices, prodOfUnaries))); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |     return starGraphs; | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_UNSAFE(LoopyBelief, construction) { | 
					
						
							|  |  |  |   // Variables: Cloudy, Sprinkler, Rain, Wet
 | 
					
						
							|  |  |  |   DiscreteKey C(0, 2), S(1, 2), R(2, 2), W(3, 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Map from key to DiscreteKey for building belief factor.
 | 
					
						
							|  |  |  |   // TODO: this is bad!
 | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |   std::map<Key, DiscreteKey> allKeys = map_list_of(0, C)(1, S)(2, R)(3, W); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Build graph
 | 
					
						
							|  |  |  |   DecisionTreeFactor pC(C, "0.5 0.5"); | 
					
						
							|  |  |  |   DiscreteConditional pSC(S | C = "0.5/0.5 0.9/0.1"); | 
					
						
							|  |  |  |   DiscreteConditional pRC(R | C = "0.8/0.2 0.2/0.8"); | 
					
						
							| 
									
										
										
										
											2013-10-16 02:25:05 +08:00
										 |  |  |   DecisionTreeFactor pSR(S & R, "0.0 0.9 0.9 0.99"); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |   DiscreteFactorGraph graph; | 
					
						
							|  |  |  |   graph.push_back(pC); | 
					
						
							|  |  |  |   graph.push_back(pSC); | 
					
						
							|  |  |  |   graph.push_back(pRC); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |   graph.push_back(pSR); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   graph.print("graph: "); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   LoopyBelief solver(graph, allKeys); | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |   solver.print("Loopy belief: "); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Main loop
 | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |   for (size_t iter = 0; iter < 20; ++iter) { | 
					
						
							|  |  |  |     cout << "==================================" << endl; | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |     cout << "iteration: " << iter << endl; | 
					
						
							| 
									
										
										
										
											2013-10-13 04:06:02 +08:00
										 |  |  |     DiscreteFactorGraph::shared_ptr beliefs = solver.iterate(allKeys); | 
					
						
							| 
									
										
										
										
											2013-10-12 23:27:37 +08:00
										 |  |  |     beliefs->print(); | 
					
						
							| 
									
										
										
										
											2013-10-12 13:49:11 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  |   TestResult tr; | 
					
						
							|  |  |  |   return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* ************************************************************************* */ |