81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    testBinaryBayesNet.cpp
 | |
|  * @brief   Unit tests for BinaryBayesNet
 | |
|  * @author  Manohar Paluri
 | |
|  */
 | |
| 
 | |
| // STL/C++
 | |
| #include <iostream>
 | |
| #include <sstream>
 | |
| #include <map>
 | |
| #include <CppUnitLite/TestHarness.h>
 | |
| #include <boost/tuple/tuple.hpp>
 | |
| #include <boost/foreach.hpp>
 | |
| 
 | |
| #include <boost/assign/std/vector.hpp> // for operator +=
 | |
| using namespace boost::assign;
 | |
| 
 | |
| #ifdef HAVE_BOOST_SERIALIZATION
 | |
| #include <boost/archive/text_oarchive.hpp>
 | |
| #include <boost/archive/text_iarchive.hpp>
 | |
| #endif //HAVE_BOOST_SERIALIZATION
 | |
| 
 | |
| #define GTSAM_MAGIC_KEY
 | |
| 
 | |
| #include "BinaryConditional.h"
 | |
| #include "BayesNet-inl.h"
 | |
| #include "Ordering.h"
 | |
| #include "SymbolMap.h"
 | |
| 
 | |
| using namespace std;
 | |
| using namespace gtsam;
 | |
| 
 | |
| /** A Bayes net made from binary conditional probability tables */
 | |
| typedef BayesNet<BinaryConditional> BinaryBayesNet;
 | |
| 
 | |
| 
 | |
| double probability( BinaryBayesNet & bbn, SymbolMap<bool> & config)
 | |
| {
 | |
| 	double result = 1.0;
 | |
| 	BinaryBayesNet::const_iterator it = bbn.begin();
 | |
| 	while( it != bbn.end() ){
 | |
| 		result *= (*it)->probability(config);
 | |
| 		it++;
 | |
| 	}
 | |
| 	return result;
 | |
| }
 | |
| 
 | |
| /************************************************************************** */
 | |
| TEST( BinaryBayesNet, constructor )
 | |
| {
 | |
| 	// small Bayes Net x <- y
 | |
| 	// p(y) = 0.2
 | |
| 	// p(x|y=0) = 0.3
 | |
| 	// p(x|y=1) = 0.6
 | |
| 
 | |
| 	SymbolMap<bool> config;
 | |
| 	config["y"] = false;
 | |
| 	config["x"] = false;
 | |
| 	// unary conditional for y
 | |
| 	boost::shared_ptr<BinaryConditional> py(new BinaryConditional("y",0.2));
 | |
| 	DOUBLES_EQUAL(0.8,py->probability(config),0.01);
 | |
| 
 | |
| 	// single parent conditional for x
 | |
| 	vector<double> cpt;
 | |
| 	cpt += 0.3, 0.6 ; // array index corresponds to binary parent configuration
 | |
| 	boost::shared_ptr<BinaryConditional> px_y(new BinaryConditional("x","y",cpt));
 | |
| 	DOUBLES_EQUAL(0.7,px_y->probability(config),0.01);
 | |
| 
 | |
| 	// push back conditionals in topological sort order (parents last)
 | |
| 	BinaryBayesNet bbn;
 | |
| 	bbn.push_back(py);
 | |
| 	bbn.push_back(px_y);
 | |
| 
 | |
| 	// Test probability of 00,01,10,11
 | |
| 	DOUBLES_EQUAL(0.56,probability(bbn,config),0.01); // P(y=0)P(x=0|y=0) = 0.8 * 0.7 = 0.56;
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
 | |
| /* ************************************************************************* */
 |