129 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
|  | /**
 | ||
|  |  * @file   testSPQRUtil.cpp | ||
|  |  * @brief  Unit test for SPQR utility functions | ||
|  |  * @author Kai Ni | ||
|  |  **/ | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | #include <CppUnitLite/TestHarness.h>
 | ||
|  | #include "SPQRUtil.h"
 | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | using namespace gtsam; | ||
|  | 
 | ||
|  | #ifdef GT_USE_LAPACK
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST(SPQRUtil, MakeStair) | ||
|  | { | ||
|  | 	double data[] = { -5, 0, 5, 0, 0, 0, -1, | ||
|  | 										00,-5, 0, 5, 0, 0, 1.5, | ||
|  | 										10, 0, 0,	0,-10,0,   2, | ||
|  | 										00, 10,0, 0, 0, -10, -1 }; | ||
|  | 	Matrix A = Matrix_(4, 7, data); | ||
|  | 
 | ||
|  | 	long* Stair = MakeStairs(A); | ||
|  | 
 | ||
|  | 	double data2[] = { -5, 0, 5, 0, 0, 0, -1, | ||
|  | 										10, 0, 0,	0,-10,0,   2, | ||
|  | 										00,-5, 0, 5, 0, 0, 1.5, | ||
|  | 										00, 10,0, 0, 0, -10, -1 }; | ||
|  | 	Matrix A_expected = Matrix_(4, 7, data2); | ||
|  | 	CHECK(assert_equal(A_expected, A, 1e-10)); | ||
|  | 
 | ||
|  | 	long Stair_expected[] = {2, 4, 4, 4, 4, 4, 4}; | ||
|  | 	for (int i=0; i<7; i++) | ||
|  | 		DOUBLES_EQUAL(Stair_expected[i], Stair[i], 1e-7); | ||
|  | 	delete []Stair; | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST(SPQRUtil, MakeStair2) | ||
|  | { | ||
|  | 	double data[] = { 0.1, 0,	   0,	  0, | ||
|  | 										0,	 0.3,	 0,	  0, | ||
|  | 										0,	 0,	   0.3,	0, | ||
|  | 										1.6,-0.2,	-2.5,	0.2, | ||
|  | 										0,	 1.6,	 0.7,	0.1, | ||
|  | 										0,	 0,	  -7.8,	0.7 }; | ||
|  | 	Matrix A = Matrix_(6, 4, data); | ||
|  | 
 | ||
|  | 	long* Stair = MakeStairs(A); | ||
|  | 
 | ||
|  | 	double data2[] = { 0.1, 0,	   0,	  0, | ||
|  | 										 1.6,-0.2,	-2.5,	0.2, | ||
|  | 									 	 0,	 0.3,	 0,	  0, | ||
|  | 										 0,	 1.6,	 0.7,	0.1, | ||
|  | 										 0,	 0,	   0.3,	0, | ||
|  | 										 0,	 0,	  -7.8,	0.7 | ||
|  |  }; | ||
|  | 	Matrix A_expected = Matrix_(6, 4, data2); | ||
|  | 	CHECK(assert_equal(A_expected, A, 1e-10)); | ||
|  | 
 | ||
|  | 	long Stair_expected[] = {2, 4, 6, 6}; | ||
|  | 	for (int i=0; i<4; i++) | ||
|  | 		DOUBLES_EQUAL(Stair_expected[i], Stair[i], 1e-7); | ||
|  | 	delete []Stair; | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST(SPQRUtil, houseHolder_spqr) | ||
|  | { | ||
|  | 	double data[] = { -5, 0, 5, 0, 0, 0, -1, | ||
|  | 										00,-5, 0, 5, 0, 0, 1.5, | ||
|  | 										10, 0, 0,	0,-10,0,   2, | ||
|  | 										00, 10,0, 0, 0, -10, -1 }; | ||
|  | 
 | ||
|  | 	// check in-place householder, with v vectors below diagonal
 | ||
|  | 	double data1[] = { 11.1803, 0, -2.2361, 0, -8.9443, 0, 2.236, | ||
|  | 										0, 11.1803,	0, -2.2361, 0, -8.9443, -1.565, | ||
|  | 										0, 0, 4.4721, 0, -4.4721,	0, 0, | ||
|  | 										0, 0, 0, 4.4721, 0, -4.4721, 0.894 }; | ||
|  | 	Matrix expected1 = Matrix_(4, 7, data1); | ||
|  | 	Matrix A1 = Matrix_(4, 7, data); | ||
|  | 	householder_spqr(A1); | ||
|  | 	CHECK(assert_equal(expected1, A1, 1e-3)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST(SPQRUtil, houseHolder_spqr2) | ||
|  | { | ||
|  | 	double data[] = { -5, 0, 5, 0, 0, 0, -1, | ||
|  | 										00,-5, 0, 5, 0, 0, 1.5, | ||
|  | 										10, 0, 0,	0,-10,0,   2, | ||
|  | 										00, 10,0, 0, 0, -10, -1 }; | ||
|  | 
 | ||
|  | 	// check in-place householder, with v vectors below diagonal
 | ||
|  | 	double data1[] = { 11.1803, 0, -2.2361, 0, -8.9443, 0, 2.236, | ||
|  | 										0, -11.1803,	0, 2.2361, 0, 8.9443, 1.565, | ||
|  | 										0, 0, -4.4721, 0, 4.4721,	0, 0, | ||
|  | 										0, 0, 0, 4.4721, 0, -4.4721, 0.894 }; | ||
|  | 	Matrix expected1 = Matrix_(4, 7, data1); | ||
|  | 	Matrix A1 = Matrix_(4, 7, data); | ||
|  | 	long* Stair = MakeStairs(A1); | ||
|  | 	householder_spqr(A1, Stair); | ||
|  | 	CHECK(assert_equal(expected1, A1, 1e-3)); | ||
|  | } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | TEST(SPQRUtil, houseHolder_spqr3) | ||
|  | { | ||
|  | 	double data[] = { 1, 1, 9, | ||
|  | 										1, 0, 5}; | ||
|  | 
 | ||
|  | 	// check in-place householder, with v vectors below diagonal
 | ||
|  | 	double data1[] = {-sqrt(2),	-1/sqrt(2), -7*sqrt(2), | ||
|  | 			 	 	 	 	 	 	 	 0,	-1/sqrt(2), -4/sqrt(2)}; | ||
|  | 	Matrix expected1 = Matrix_(2, 3, data1); | ||
|  | 	Matrix A1 = Matrix_(2, 3, data); | ||
|  | 	householder_spqr(A1); | ||
|  | 	CHECK(assert_equal(expected1, A1, 1e-3)); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  | int main() { | ||
|  | 	TestResult tr; | ||
|  | 	return TestRegistry::runAllTests(tr); | ||
|  | } | ||
|  | /* ************************************************************************* */ |