| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file   testVector.cpp | 
					
						
							|  |  |  |  * @brief  Unit tests for Vector class | 
					
						
							|  |  |  |  * @author Frank Dellaert | 
					
						
							|  |  |  |  **/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/CppUnitLite/TestHarness.h>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #include <boost/tuple/tuple.hpp>
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/base/Vector.h>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-01 01:24:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, subInsert ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector big = zero(6), | 
					
						
							|  |  |  | 		   small = ones(3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	size_t i = 2; | 
					
						
							|  |  |  | 	subInsert(big, small, i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector expected = Vector_(6, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected, big)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-18 14:11:19 +08:00
										 |  |  |   list<Vector> vs; | 
					
						
							|  |  |  |   vs.push_back(A); | 
					
						
							|  |  |  |   vs.push_back(B); | 
					
						
							|  |  |  |   Vector AB1 = concatVectors(vs); | 
					
						
							|  |  |  |   CHECK(AB1 == C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Vector AB2 = concatVectors(2, &A, &B); | 
					
						
							|  |  |  |   CHECK(AB2 == C); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector weights = reciprocal(emul(sigmas,sigmas)); | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// perform solve
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector actual; double precision; | 
					
						
							|  |  |  | 	boost::tie(actual, precision) = weightedPseudoinverse(x, weights); | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// construct expected
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector expected(2); | 
					
						
							|  |  |  | 	expected(0) = 0.5; expected(1) = 0.25; | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 	double expPrecision = 200.0; | 
					
						
							| 
									
										
										
										
											2009-10-27 22:21:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	CHECK(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-11-10 05:34:20 +08:00
										 |  |  | 	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; | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector weights = reciprocal(emul(sigmas,sigmas)); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// perform solve
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector actual; double precision; | 
					
						
							|  |  |  | 	boost::tie(actual, precision) = weightedPseudoinverse(x, weights); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// construct expected
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector expected(2); | 
					
						
							|  |  |  | 	expected(0) = 1.0; expected(1) = 0.0; | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// verify
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	CHECK(assert_equal(expected,actual)); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 	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.); | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector weights = reciprocal(emul(sigmas,sigmas)); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 	Vector pseudo; double precision; | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	boost::tie(pseudo, precision) = weightedPseudoinverse(a, weights); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | 	Vector expected = Vector_(4, 1., 0., 0.,0.); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected, pseudo)); | 
					
						
							| 
									
										
										
										
											2009-11-10 12:36:07 +08:00
										 |  |  | 	DOUBLES_EQUAL(100, precision, 1e-5); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, ediv ) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-30 10:04:37 +08:00
										 |  |  |   Vector a = Vector_(3,10.,20.,30.); | 
					
						
							|  |  |  |   Vector b = Vector_(3,2.0,5.0,6.0); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  |   Vector actual(ediv(a,b)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-30 10:04:37 +08:00
										 |  |  |   Vector c = Vector_(3,5.0,4.0,5.0); | 
					
						
							| 
									
										
										
										
											2009-11-05 04:59:16 +08:00
										 |  |  |   CHECK(assert_equal(c,actual)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-30 10:04:37 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, dot ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector a = Vector_(3,10.,20.,30.); | 
					
						
							|  |  |  |   Vector b = Vector_(3,2.0,5.0,6.0); | 
					
						
							|  |  |  |   DOUBLES_EQUAL(20+100+180,dot(a,b),1e-9); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, axpy ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Vector x = Vector_(3,10.,20.,30.); | 
					
						
							|  |  |  |   Vector y = Vector_(3,2.0,5.0,6.0); | 
					
						
							|  |  |  |   axpy(0.1,x,y); | 
					
						
							|  |  |  |   Vector expected = Vector_(3,3.0,7.0,9.0); | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,y)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-16 14:25:11 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, reciprocal ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector v = Vector_(3, 1.0, 2.0, 4.0); | 
					
						
							|  |  |  |   CHECK(assert_equal(Vector_(3, 1.0, 0.5, 0.25),reciprocal(v))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-05 07:50:21 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, linear_dependent ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector v1 = Vector_(3, 1.0, 2.0, 3.0); | 
					
						
							|  |  |  | 	Vector v2 = Vector_(3, -2.0, -4.0, -6.0); | 
					
						
							|  |  |  | 	CHECK(linear_dependent(v1, v2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, linear_dependent2 ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector v1 = Vector_(3, 0.0, 2.0, 0.0); | 
					
						
							|  |  |  | 	Vector v2 = Vector_(3, 0.0, -4.0, 0.0); | 
					
						
							|  |  |  | 	CHECK(linear_dependent(v1, v2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( TestVector, linear_dependent3 ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector v1 = Vector_(3, 0.0, 2.0, 0.0); | 
					
						
							|  |  |  | 	Vector v2 = Vector_(3, 0.1, -4.1, 0.0); | 
					
						
							|  |  |  | 	CHECK(!linear_dependent(v1, v2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { TestResult tr; return TestRegistry::runAllTests(tr); } | 
					
						
							|  |  |  | /* ************************************************************************* */ |