1 /**
2  * \file libs/numeric/ublas/test/test_utils.hpp
3  *
4  * \brief Test suite for utils.hpp.
5  *
6  * Copyright (c) 2012, Marco Guazzone
7  *
8  * Distributed under the Boost Software License, Version 1.0. (See
9  * accompanying file LICENSE_1_0.txt or copy at
10  * http://www.boost.org/LICENSE_1_0.txt)
11  *
12  * \author Marco Guazzone (marco.guazzone@gmail.com)
13  */
14 
15 #include <boost/numeric/ublas/io.hpp>
16 #include <boost/numeric/ublas/matrix.hpp>
17 #include <boost/numeric/ublas/vector.hpp>
18 #include <complex>
19 #include <cstddef>
20 #include "utils.hpp"
21 
22 
23 namespace ublas = boost::numeric::ublas;
24 
25 
26 static const double tol(1e-6);
27 static const double mul(tol*10);
28 
29 
BOOST_UBLAS_TEST_DEF(check)30 BOOST_UBLAS_TEST_DEF( check )
31 {
32 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check'" );
33 
34 	BOOST_UBLAS_TEST_CHECK( true );
35 }
36 
BOOST_UBLAS_TEST_DEF(check_eq)37 BOOST_UBLAS_TEST_DEF( check_eq )
38 {
39 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_eq'" );
40 
41 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
42 	BOOST_UBLAS_TEST_CHECK_EQ( short(1), short(1) );
43 	BOOST_UBLAS_TEST_CHECK_EQ( int(1), int(1) );
44 	BOOST_UBLAS_TEST_CHECK_EQ( long(1), long(1) );
45 	BOOST_UBLAS_TEST_CHECK_EQ( unsigned(1), unsigned(1) );
46 
47 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
48 	BOOST_UBLAS_TEST_CHECK_EQ( short(1), int(1) );
49 	BOOST_UBLAS_TEST_CHECK_EQ( short(1), int(1) );
50 	BOOST_UBLAS_TEST_CHECK_EQ( int(1), long(1) );
51 	BOOST_UBLAS_TEST_CHECK_EQ( long(1), int(1) );
52 
53 	BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." );
54 	BOOST_UBLAS_TEST_CHECK_EQUAL( int(1), int(1) );
55 }
56 
BOOST_UBLAS_TEST_DEF(check_close)57 BOOST_UBLAS_TEST_DEF( check_close )
58 {
59 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_close'" );
60 
61 	const double c1(1*mul);
62 	const double c2(2*mul);
63 
64 	// Check T vs. T
65 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
66 	BOOST_UBLAS_TEST_CHECK_CLOSE( float(c1), float(c1), tol );
67 	BOOST_UBLAS_TEST_CHECK_CLOSE( double(c1), double(c1), tol );
68 	BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex<float>(c1,c2), ::std::complex<float>(c1,c2), tol );
69 	BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex<double>(c1,c2), ::std::complex<double>(c1,c2), tol );
70 
71 	// Check T1 vs. T2
72 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
73 	BOOST_UBLAS_TEST_CHECK_CLOSE( float(c1), double(c1), tol );
74 	BOOST_UBLAS_TEST_CHECK_CLOSE( double(c1), float(c1), tol );
75 	BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex<float>(c1,c2), ::std::complex<double>(c1,c2), tol );
76 	BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex<double>(c1,c2), ::std::complex<float>(c1,c2), tol );
77 
78 	// Check alias
79 	BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." );
80 	BOOST_UBLAS_TEST_CHECK_PRECISION( float(c1), float(c1), tol );
81 }
82 
BOOST_UBLAS_TEST_DEF(check_rel_close)83 BOOST_UBLAS_TEST_DEF( check_rel_close )
84 {
85 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_rel_close'" );
86 
87 	const double c1(1*mul);
88 	const double c2(2*mul);
89 
90 	// Check T vs. T
91 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
92 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( float(c1), float(c1), tol );
93 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( double(c1), double(c1), tol );
94 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex<float>(c1,c2), ::std::complex<float>(c1,c2), tol );
95 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex<double>(c1,c2), ::std::complex<double>(c1,c2), tol );
96 
97 	// Check T1 vs. T2
98 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
99 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( float(c1), double(c1), tol );
100 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( double(c1), float(c1), tol );
101 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex<float>(c1,c2), ::std::complex<double>(c1,c2), tol );
102 	BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex<double>(c1,c2), ::std::complex<float>(c1,c2), tol );
103 
104 	// Check alias
105 	BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." );
106 	BOOST_UBLAS_TEST_CHECK_REL_PRECISION( float(c1), float(c1), tol );
107 }
108 
BOOST_UBLAS_TEST_DEF(check_vector_eq)109 BOOST_UBLAS_TEST_DEF( check_vector_eq )
110 {
111 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_eq'" );
112 
113 	const ::std::size_t n(5);
114 
115 	ublas::vector<short> sv = ublas::scalar_vector<short>(n, 1);
116 	ublas::vector<int> iv = ublas::scalar_vector<int>(n, 1);
117 	ublas::vector<long> lv = ublas::scalar_vector<long>(n, 1L);
118 	ublas::vector<unsigned> uv = ublas::scalar_vector<unsigned>(n, 1u);
119 
120 	// Check T vs. T
121 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
122 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( sv, sv, n );
123 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, iv, n );
124 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( lv, lv, n );
125 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( uv, uv, n );
126 
127 	// Check T1 vs. T2
128 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
129 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( sv, iv, n );
130 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, sv, n );
131 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, lv, n );
132 	BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( lv, iv, n );
133 }
134 
BOOST_UBLAS_TEST_DEF(check_vector_close)135 BOOST_UBLAS_TEST_DEF( check_vector_close )
136 {
137 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_close'" );
138 
139 	const ::std::size_t n(5);
140 
141 	ublas::vector<float> fv = ublas::scalar_vector<float>(n, 1);
142 	ublas::vector<float> dv = ublas::scalar_vector<float>(n, 1);
143 	ublas::vector< ::std::complex<float> > cfv = ublas::scalar_vector< ::std::complex<float> >(n, ::std::complex<float>(1,2));
144 	ublas::vector< ::std::complex<double> > cdv = ublas::scalar_vector< ::std::complex<double> >(n, ::std::complex<double>(1,2));
145 
146 	// Check T vs. T
147 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
148 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( fv, fv, n, tol );
149 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( dv, dv, n, tol );
150 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cfv, cfv, n, tol );
151 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cdv, cdv, n, tol );
152 
153 	// Check T1 vs. T2
154 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
155 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( fv, dv, n, tol );
156 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( dv, fv, n, tol );
157 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cfv, cdv, n, tol );
158 	BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cdv, cfv, n, tol );
159 }
160 
BOOST_UBLAS_TEST_DEF(check_vector_rel_close)161 BOOST_UBLAS_TEST_DEF( check_vector_rel_close )
162 {
163 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_rel_close'" );
164 
165 	const ::std::size_t n(5);
166 	const double c1(1*mul);
167 	const double c2(2*mul);
168 
169 	ublas::vector<float> fv = ublas::scalar_vector<float>(n, c1);
170 	ublas::vector<double> dv = ublas::scalar_vector<double>(n, c1);
171 	ublas::vector< ::std::complex<float> > cfv = ublas::scalar_vector< ::std::complex<float> >(n, ::std::complex<float>(c1,c2));
172 	ublas::vector< ::std::complex<double> > cdv = ublas::scalar_vector< ::std::complex<double> >(n, ::std::complex<double>(c1,c2));
173 
174 	// Check T vs. T
175 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
176 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( fv, fv, n, tol );
177 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( dv, dv, n, tol );
178 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cfv, cfv, n, tol );
179 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cdv, cdv, n, tol );
180 
181 	// Check T1 vs. T2
182 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
183 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( fv, dv, n, tol );
184 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( dv, fv, n, tol );
185 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cfv, cdv, n, tol );
186 	BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cdv, cfv, n, tol );
187 }
188 
BOOST_UBLAS_TEST_DEF(check_matrix_eq)189 BOOST_UBLAS_TEST_DEF( check_matrix_eq )
190 {
191 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_eq'" );
192 
193 	const ::std::size_t nr(3);
194 	const ::std::size_t nc(4);
195 
196 	ublas::matrix<short> sv = ublas::scalar_matrix<short>(nr, nc, 1);
197 	ublas::matrix<int> iv = ublas::scalar_matrix<int>(nr, nc, 1);
198 	ublas::matrix<long> lv = ublas::scalar_matrix<long>(nr, nc, 1L);
199 	ublas::matrix<unsigned> uv = ublas::scalar_matrix<unsigned>(nr, nc, 1u);
200 
201 	// Check T vs. T
202 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
203 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( sv, sv, nr, nc );
204 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, iv, nr, nc );
205 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( lv, lv, nr, nc );
206 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( uv, uv, nr, nc );
207 
208 	// Check T1 vs. T2
209 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
210 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( sv, iv, nr, nc );
211 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, sv, nr, nc );
212 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, lv, nr, nc );
213 	BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( lv, iv, nr, nc );
214 }
215 
BOOST_UBLAS_TEST_DEF(check_matrix_close)216 BOOST_UBLAS_TEST_DEF( check_matrix_close )
217 {
218 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_close'" );
219 
220 	const ::std::size_t nr(3);
221 	const ::std::size_t nc(4);
222 	const double c1(1*mul);
223 	const double c2(2*mul);
224 
225 	ublas::matrix<float> fA = ublas::scalar_matrix<float>(nr, nc, c1);
226 	ublas::matrix<double> dA = ublas::scalar_matrix<double>(nr, nc, c1);
227 	ublas::matrix< ::std::complex<float> > cfA = ublas::scalar_matrix< ::std::complex<float> >(nr, nc, ::std::complex<float>(c1,c2));
228 	ublas::matrix< ::std::complex<double> > cdA = ublas::scalar_matrix< ::std::complex<double> >(nr, nc, ::std::complex<double>(c1,c2));
229 
230 	// Check T vs. T
231 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
232 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( fA, fA, nr, nc, tol );
233 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( dA, dA, nr, nc, tol );
234 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cfA, cfA, nr, nc, tol );
235 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cdA, cdA, nr, nc, tol );
236 
237 	// Check T1 vs. T2
238 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
239 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( fA, dA, nr, nc, tol );
240 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( dA, fA, nr, nc, tol );
241 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cfA, cdA, nr, nc, tol );
242 	BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cdA, cfA, nr, nc, tol );
243 }
244 
245 
BOOST_UBLAS_TEST_DEF(check_matrix_rel_close)246 BOOST_UBLAS_TEST_DEF( check_matrix_rel_close )
247 {
248 	BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_rel_close'" );
249 
250 	const ::std::size_t nr(3);
251 	const ::std::size_t nc(4);
252 	const double c1(1*mul);
253 	const double c2(2*mul);
254 
255 	ublas::matrix<float> fA = ublas::scalar_matrix<float>(nr, nc, c1);
256 	ublas::matrix<double> dA = ublas::scalar_matrix<double>(nr, nc, c1);
257 	ublas::matrix< ::std::complex<float> > cfA = ublas::scalar_matrix< ::std::complex<float> >(nr, nc, ::std::complex<float>(c1,c2));
258 	ublas::matrix< ::std::complex<double> > cdA = ublas::scalar_matrix< ::std::complex<double> >(nr, nc, ::std::complex<double>(c1,c2));
259 
260 	// Check T vs. T
261 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
262 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( fA, fA, nr, nc, tol );
263 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( dA, dA, nr, nc, tol );
264 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cfA, cfA, nr, nc, tol );
265 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cdA, cdA, nr, nc, tol );
266 
267 	// Check T1 vs. T2
268 	BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
269 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( fA, dA, nr, nc, tol );
270 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( dA, fA, nr, nc, tol );
271 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cfA, cdA, nr, nc, tol );
272 	BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cdA, cfA, nr, nc, tol );
273 }
274 
275 
main()276 int main()
277 {
278 	BOOST_UBLAS_TEST_SUITE( "Test 'utils.hpp' functionalities" );
279 
280 	BOOST_UBLAS_TEST_BEGIN();
281 		BOOST_UBLAS_TEST_DO( check );
282 		BOOST_UBLAS_TEST_DO( check_eq );
283 		BOOST_UBLAS_TEST_DO( check_close );
284 		BOOST_UBLAS_TEST_DO( check_rel_close );
285 		BOOST_UBLAS_TEST_DO( check_vector_eq );
286 		BOOST_UBLAS_TEST_DO( check_vector_close );
287 		BOOST_UBLAS_TEST_DO( check_vector_rel_close );
288 		BOOST_UBLAS_TEST_DO( check_matrix_eq );
289 		BOOST_UBLAS_TEST_DO( check_matrix_close );
290 		BOOST_UBLAS_TEST_DO( check_matrix_rel_close );
291 	BOOST_UBLAS_TEST_END();
292 }
293