131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    testGaussianBayesNet.cpp
 | |
|  * @brief   Unit tests for GaussianBayesNet
 | |
|  * @author  Frank Dellaert
 | |
|  */
 | |
| 
 | |
| // STL/C++
 | |
| #include <iostream>
 | |
| #include <sstream>
 | |
| #include <CppUnitLite/TestHarness.h>
 | |
| #include <boost/tuple/tuple.hpp>
 | |
| #include <boost/foreach.hpp>
 | |
| 
 | |
| #include <boost/assign/std/list.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
 | |
| 
 | |
| #include "GaussianBayesNet.h"
 | |
| #include "BayesNet.h"
 | |
| #include "smallExample.h"
 | |
| #include "Ordering.h"
 | |
| 
 | |
| using namespace std;
 | |
| using namespace gtsam;
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( GaussianBayesNet, constructor )
 | |
| {
 | |
|   // small Bayes Net x <- y
 | |
|   // x y d
 | |
|   // 1 1 9
 | |
|   //   1 5
 | |
|   Matrix R11 = Matrix_(1,1,1.0), S12 = Matrix_(1,1,1.0);
 | |
|   Matrix                         R22 = Matrix_(1,1,1.0);
 | |
|   Vector d1(1), d2(1);
 | |
|   d1(0) = 9; d2(0) = 5;
 | |
|   Vector sigmas(1);
 | |
|   sigmas(0) = 1.;
 | |
|   
 | |
|   // define nodes and specify in reverse topological sort (i.e. parents last)
 | |
|   GaussianConditional x("x",d1,R11,"y",S12, sigmas), y("y",d2,R22, sigmas);
 | |
| 
 | |
|   // check small example which uses constructor
 | |
|   GaussianBayesNet cbn = createSmallGaussianBayesNet();
 | |
|   CHECK( x.equals(*cbn["x"]) );
 | |
|   CHECK( y.equals(*cbn["y"]) );
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( GaussianBayesNet, matrix )
 | |
| {
 | |
|   // Create a test graph
 | |
|   GaussianBayesNet cbn = createSmallGaussianBayesNet();
 | |
| 
 | |
|   Matrix R; Vector d;
 | |
|   boost::tie(R,d) = matrix(cbn); // find matrix and RHS
 | |
| 
 | |
|   Matrix R1 = Matrix_(2,2,
 | |
| 		      1.0, 1.0,
 | |
| 		      0.0, 1.0
 | |
|     );
 | |
|   Vector d1 = Vector_(2, 9.0, 5.0);
 | |
| 
 | |
|   EQUALITY(R,R1);
 | |
|   CHECK(d==d1);
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( GaussianBayesNet, optimize )
 | |
| {
 | |
|   GaussianBayesNet cbn = createSmallGaussianBayesNet();
 | |
|   VectorConfig actual = optimize(cbn);
 | |
| 
 | |
|   VectorConfig expected;
 | |
|   Vector x(1), y(1);
 | |
|   x(0) = 4; y(0) = 5;
 | |
|   expected.insert("x",x);
 | |
|   expected.insert("y",y);
 | |
| 
 | |
|   CHECK(assert_equal(expected,actual));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| #ifdef HAVE_BOOST_SERIALIZATION
 | |
| TEST( GaussianBayesNet, serialize )
 | |
| {
 | |
| 	//create a starting CBN
 | |
| 	GaussianBayesNet cbn = createSmallGaussianBayesNet();
 | |
| 
 | |
| 	//serialize the CBN
 | |
| 	ostringstream in_archive_stream;
 | |
| 	boost::archive::text_oarchive in_archive(in_archive_stream);
 | |
| 	in_archive << cbn;
 | |
| 	string serialized = in_archive_stream.str();
 | |
| 
 | |
| 	//DEBUG
 | |
| 	cout << "CBN Raw string: [" << serialized << "]" << endl;
 | |
| 
 | |
| 	//remove newlines/carriage returns
 | |
| 	string clean;
 | |
| 	BOOST_FOREACH(char s, serialized) {
 | |
| 		if (s != '\n') {
 | |
| 			//copy in character
 | |
| 			clean.append(string(1,s));
 | |
| 			}
 | |
| 		else {
 | |
| 			cout << "   Newline character found!" << endl;
 | |
| 			//replace with an identifiable string
 | |
| 			clean.append(string(1,' '));
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	cout << "Cleaned CBN String: [" << clean << "]" << endl;
 | |
| 
 | |
| 	//deserialize the CBN
 | |
| 	istringstream out_archive_stream(clean);
 | |
| 	boost::archive::text_iarchive out_archive(out_archive_stream);
 | |
| 	GaussianBayesNet output;
 | |
| 	out_archive >> output;
 | |
| 	CHECK(cbn.equals(output));
 | |
| }
 | |
| #endif //HAVE_BOOST_SERIALIZATION
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| int main() { TestResult tr; return TestRegistry::runAllTests(tr);}
 | |
| /* ************************************************************************* */
 |