| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file   testVector.cpp | 
					
						
							|  |  |  |  * @brief  Unit tests for Vector class | 
					
						
							|  |  |  |  * @author Frank Dellaert | 
					
						
							|  |  |  |  **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | #include <boost/tuple/tuple.hpp>
 | 
					
						
							|  |  |  | #include "Vector.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, Vector_variants ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a = Vector_(2,10.0,20.0); | 
					
						
							|  |  |  |   double data[] = {10,20}; | 
					
						
							|  |  |  |   Vector b = Vector_(2,data); | 
					
						
							|  |  |  |   CHECK(a==b); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, copy ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(2); a(0) = 10; a(1) = 20; | 
					
						
							|  |  |  |   double data[] = {10,20}; | 
					
						
							|  |  |  |   Vector b(2); copy(data,data+2,b.begin()); | 
					
						
							|  |  |  |   CHECK(a==b); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, zero1 ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector v(2,0.0); | 
					
						
							|  |  |  |   CHECK(zero(v)==true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, zero2 ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a = zero(2); | 
					
						
							|  |  |  |   Vector b(2,0.0); | 
					
						
							|  |  |  |   CHECK(a==b); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, scalar_multiply ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(2); a(0) = 10; a(1) = 20; | 
					
						
							|  |  |  |   Vector b(2); b(0) = 1; b(1) = 2; | 
					
						
							|  |  |  |   CHECK(a==b*10.0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, scalar_divide ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(2); a(0) = 10; a(1) = 20; | 
					
						
							|  |  |  |   Vector b(2); b(0) = 1; b(1) = 2; | 
					
						
							|  |  |  |   CHECK(b==a/10.0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, negate ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(2); a(0) = 10; a(1) = 20; | 
					
						
							|  |  |  |   Vector b(2); b(0) = -10; b(1) = -20; | 
					
						
							|  |  |  |   CHECK(b==-a); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, sub ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(6); | 
					
						
							|  |  |  |   a(0) = 10; a(1) = 20; a(2) = 3;  | 
					
						
							|  |  |  |   a(3) = 34; a(4) = 11; a(5) = 2; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   Vector result(sub(a,2,5)); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   Vector b(3); | 
					
						
							|  |  |  |   b(0) = 3; b(1) = 34; b(2) =11;  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CHECK(b==result); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, householder ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector x(4);  | 
					
						
							|  |  |  |   x(0) = 3; x(1) = 1; x(2) = 5; x(3) = 1; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   Vector expected(4); | 
					
						
							|  |  |  |   expected(0) = 1.0; expected(1) = -0.333333; expected(2) = -1.66667; expected(3) = -0.333333; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   pair<double, Vector> result = house(x); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   CHECK(result.first==0.5); | 
					
						
							|  |  |  |   CHECK(equal_with_abs_tol(expected,result.second,1e-5)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, zeros ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(2); a(0) = 0; a(1) = 0; | 
					
						
							|  |  |  |   Vector b(2,0.0); | 
					
						
							|  |  |  |   CHECK(b==a); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, concatVectors) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector A(2); | 
					
						
							|  |  |  |   for(int i = 0; i < 2; i++) | 
					
						
							|  |  |  |     A(i) = i; | 
					
						
							|  |  |  |   Vector B(5); | 
					
						
							|  |  |  |   for(int i = 0; i < 5; i++) | 
					
						
							|  |  |  |     B(i) = i; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  |   Vector C(7); | 
					
						
							|  |  |  |   for(int i = 0; i < 2; i++) C(i) = A(i); | 
					
						
							|  |  |  |   for(int i = 0; i < 5; i++) C(i+2) = B(i); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  |   Vector AB = concatVectors(2, &A, &B); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CHECK(AB == C); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | TEST( TestVector, weightedPseudoinverse ) | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	// column from a matrix
 | 
					
						
							|  |  |  | 	Vector x(2); | 
					
						
							|  |  |  | 	x(0) = 1.0; x(1) = 2.0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 	// create sigmas
 | 
					
						
							|  |  |  | 	Vector sigmas(2); | 
					
						
							|  |  |  | 	sigmas(0) = 0.1; sigmas(1) = 0.2; | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// perform solve
 | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 	Vector act; double precision; | 
					
						
							|  |  |  | 	boost::tie(act, precision) = weightedPseudoinverse(x, sigmas); | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// construct expected
 | 
					
						
							|  |  |  | 	Vector exp(2); | 
					
						
							| 
									
										
										
										
											2009-10-30 04:12:07 +08:00
										 |  |  | 	exp(0) = 0.5; exp(1) = 0.25; | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 	double expPrecision = 200.0; | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 	CHECK(assert_equal(act, exp)); | 
					
						
							|  |  |  | 	CHECK(fabs(expPrecision-precision) < 1e-5); | 
					
						
							| 
									
										
										
										
											2009-10-29 20:52:27 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, weightedPseudoinverse_constraint ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// column from a matrix
 | 
					
						
							|  |  |  | 	Vector x(2); | 
					
						
							|  |  |  | 	x(0) = 1.0; x(1) = 2.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// create sigmas
 | 
					
						
							|  |  |  | 	Vector sigmas(2); | 
					
						
							|  |  |  | 	sigmas(0) = 0.0; sigmas(1) = 0.2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// perform solve
 | 
					
						
							|  |  |  | 	Vector act; double precision; | 
					
						
							|  |  |  | 	boost::tie(act, precision) = weightedPseudoinverse(x, sigmas); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// construct expected
 | 
					
						
							|  |  |  | 	Vector exp(2); | 
					
						
							|  |  |  | 	exp(0) = 1.0; exp(1) = 0.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(act, exp)); | 
					
						
							|  |  |  | 	CHECK(isinf(precision)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, weightedPseudoinverse_nan ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector a = Vector_(4, 1., 0., 0., 0.); | 
					
						
							|  |  |  | 	Vector sigmas = Vector_(4, 0.1, 0.1, 0., 0.); | 
					
						
							|  |  |  | 	Vector pseudo; double precision; | 
					
						
							|  |  |  | 	boost::tie(pseudo, precision) = weightedPseudoinverse(a, sigmas); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector exp = Vector_(4, 1., 0., 0.,0.); | 
					
						
							|  |  |  | 	CHECK(assert_equal(pseudo, exp)); | 
					
						
							|  |  |  | 	DOUBLES_EQUAL(100, precision, 1e-5); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, ediv ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a(3); a(0) = 10; a(1) = 20; a(2) = 30; | 
					
						
							|  |  |  |   Vector b(3); b(0) =  2; b(1) = 5;  b(2) =  6; | 
					
						
							|  |  |  |   Vector actual(ediv(a,b)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Vector c(3); c(0) =  5; c(1) = 4;  c(2) =  5; | 
					
						
							|  |  |  |   CHECK(assert_equal(c,actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-10 00:47:37 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, equals ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector v1 = Vector_(1, 0.0/0.0); //testing nan
 | 
					
						
							|  |  |  | 	Vector v2 = Vector_(1, 1.0); | 
					
						
							|  |  |  | 	double tol = 1.; | 
					
						
							|  |  |  | 	CHECK(!equal_with_abs_tol(v1, v2, tol)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 01:36:34 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, greater_than ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector v1 = Vector_(3, 1.0, 2.0, 3.0), | 
					
						
							|  |  |  | 		   v2 = zero(3); | 
					
						
							|  |  |  | 	CHECK(greaterThanOrEqual(v1, v1)); // test basic greater than
 | 
					
						
							|  |  |  | 	CHECK(greaterThanOrEqual(v1, v2)); // test equals
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | 
					
						
							|  |  |  | /* ************************************************************************* */ |