1 #undef BOOST_UBLAS_NO_EXCEPTIONS
2 #include "common/testhelper.hpp"
3 #include <boost/numeric/ublas/vector.hpp>
4 #include <boost/numeric/ublas/matrix.hpp>
5 #include <boost/numeric/ublas/assignment.hpp>
6 #include <boost/numeric/ublas/io.hpp>
7 #include <string>
8 #include <sstream>
9 #include <complex>
10 #include <iomanip>
11 #include "utils.hpp"
12
13 #ifdef BOOST_UBLAS_CPP_GE_2011
14
15 using namespace boost::numeric::ublas;
16
17 using std::cout;
18 using std::endl;
19
20 template < class T >
test_vector(std::string type_name)21 bool test_vector( std::string type_name)
22 {
23 std::stringstream stream;
24 stream << "Testing for: " << type_name;
25 BOOST_UBLAS_DEBUG_TRACE( stream.str() );
26
27 bool pass = true;
28
29 {
30 typedef fixed_vector<T, 1> vec1;
31
32 vec1 v1( 122.0 );
33
34 pass &= ( v1(0) == (T)122 );
35
36 }
37
38 {
39 typedef fixed_vector<T, 3> vec3;
40
41 vec3 v1((T)0.0, (T)0.0, (T)0.0);
42
43 pass &=(sizeof( vec3 ) == v1.size()*sizeof( T ) ) ;
44
45 vector<T> v( 3, 0 ) ;
46
47 pass &= compare( v1, v );
48
49 v1 <<= 10.0, 10, 33;
50 v <<= 10.0, 10, 33;
51
52 //cout << std::setprecision(20) << v1 << '\n' << v;
53
54 pass &= compare( v1, v );
55
56
57 vec3 v2;
58
59 v2( 0 ) = 10.0; v2( 1 ) = 10; v2( 2 ) = 33;
60 pass &= compare( v, v2 );
61
62 v2 += v;
63
64 pass &= compare( v2, 2*v );
65
66
67 v1 = 2*v1 + v - 6*v2;
68 pass &= compare( v1, (3-2*6)*v );
69
70
71 vec3 v3{ (T)-90.0, (T)-90.0, (T)-297.0 };
72 pass &= compare( v3, v1 );
73
74 vec3 v4 = { (T)-90.0, (T)-90.0, (T)-297.0 };
75 pass &= compare( v4, v1 );
76
77 vec3 v5( (T)-90.0, (T)-90.0, (T)-297.0 );
78 pass &= compare( v5, v1 );
79
80 vec3 v6((T) 5.0, (T)8.0, (T)9.0);
81
82 matrix<T> M = outer_prod( v6, v6), L( 3, 3);
83
84 L <<= 25, 40, 45, 40, 64, 72, 45, 72, 81;
85
86 pass &= compare( M, L );
87
88 L <<= 1, 2, 3, 4, 5, 6, 7, 8, 9;
89 v6 <<= 4, 5, 6;
90 vec3 v7 ( (T)32.0, (T)77.0, (T)122.0 );
91
92 pass &= compare( v7, prod(L, v6) );
93
94 vec3 v8;
95 noalias( v8 ) = prod(L, v6);
96
97 pass &= compare( v7, v8 );
98
99 }
100
101
102 {
103 const std::size_t N = 33;
104 typedef fixed_vector<T, N> vec33;
105
106 vec33 v1;
107 vector<T> v( N );
108
109 for ( std::size_t i = 0; i!= v1.size(); i++)
110 {
111 v1( i ) = 3.14159*i;
112 v ( i ) = 3.14159*i;
113 }
114
115 pass &= compare( v1, v );
116
117
118 auto ip = inner_prod( v, v);
119 auto ip1 = inner_prod( v1, v1);
120
121 pass &= ( ip == ip1 ) ;
122
123 T c = 0;
124 for (auto i = v1.begin(); i != v1.end(); i++)
125 {
126 *i = c;
127 c = c + 1;
128 }
129
130 c = 0;
131 for (auto i = v.begin(); i != v.end(); i++)
132 {
133 *i = c;
134 c = c + 1;
135 }
136
137 pass &= compare( v1, v );
138
139 // Check if bad index indeed works
140 try {
141 T a;
142 a=v1( 100 );
143 BOOST_UBLAS_NOT_USED( a );
144
145 } catch ( bad_index &e) {
146 std::cout << " Caught (GOOD): " << e.what() << endl;
147 pass &= true;
148 }
149
150
151 }
152 return pass;
153 }
154
155 template < class T >
test_matrix(std::string type_name)156 bool test_matrix( std::string type_name)
157 {
158 std::stringstream stream;
159 stream << "Testing for: " << type_name;
160 BOOST_UBLAS_DEBUG_TRACE( stream.str() );
161
162 bool pass = true;
163
164 typedef fixed_matrix<T, 3, 4> mat34;
165 typedef fixed_matrix<T, 4, 3> mat43;
166 typedef fixed_matrix<T, 3, 3> mat33;
167
168
169 {
170 typedef fixed_matrix<T, 1, 1> mat1;
171
172 mat1 m1( 122.0 );
173
174 pass &= ( m1(0, 0) == (T)122 );
175 }
176
177
178 {
179 mat34 m1( 3.0 );
180
181 pass &=(sizeof( mat34 ) == m1.size1()*m1.size2()*sizeof( T ) ) ;
182
183 matrix<T> m( 3.0, 4.0, 3.0 ) ;
184
185 pass &= compare( m1, m );
186
187 cout << m1 << endl;
188 cout << m << endl;
189
190
191 m1 <<= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
192 m <<= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;
193
194 pass &= compare( m1, m );
195
196 cout << m1 << endl;
197 cout << m << endl;
198
199 mat34 m2( 0.0 );
200
201 T count = 1 ;
202 for ( std::size_t i = 0; i != m2.size1(); i++)
203 {
204 for (std::size_t j = 0; j!= m2.size2(); j++)
205 {
206 m2( i, j ) = count;
207 count = count + 1;
208 }
209
210 }
211 pass &= compare( m2, m );
212 cout << m2 << endl;
213
214 }
215 {
216 mat34 m1 = { (T)1, (T)2, (T)3, (T)3, (T)3, (T)2, (T)5, (T)4, (T)2, (T)6, (T)5, (T)2 };
217 mat43 m2 = { (T)4, (T)5, (T)6, (T)3, (T)2, (T)2, (T)1, (T)4, (T)2, (T)6, (T)5, (T)2 };
218
219 mat33 m3 = prod(m1, m2);
220
221 matrix<T> m(3, 3);
222 m <<= 31,36,22,47,59,40,43,52,38;
223
224 pass &= compare(m ,m3);
225
226 mat33 m4;
227 m4 <<= (T)1, (T)2, (T)1, (T)2, (T)1, (T)3, (T)1, (T)2, (T) 5;
228 m3 = prod(m4, trans(m4));
229
230 m<<=6,7,10,7,14,19,10,19,30;
231
232 cout << m3 << endl;
233 pass &= compare(m ,m3);
234
235 m3 = 2 * m4 - 1 * m3;
236
237 cout << m3;
238
239 m <<= -4,-3,-8,-3,-12,-13,-8,-15,-20;
240
241 pass &= compare(m, m3);
242
243 m = m3;
244
245 m3 = trans(m);
246
247 pass &= compare(m3, trans(m));
248
249 // Check if bad index indeed works
250 try {
251 T a;
252 a=m1( 100, 100 );
253 BOOST_UBLAS_NOT_USED( a );
254
255 } catch ( bad_index &e) {
256 std::cout << " Caught (GOOD): " << e.what() << endl;
257 pass &= true;
258 }
259
260 }
261
262 return pass;
263
264 }
265
BOOST_UBLAS_TEST_DEF(test_fixed)266 BOOST_UBLAS_TEST_DEF (test_fixed) {
267
268 BOOST_UBLAS_DEBUG_TRACE( "Starting fixed container tests" );
269
270 BOOST_UBLAS_TEST_CHECK( test_vector< double >( "double") );
271 BOOST_UBLAS_TEST_CHECK( test_vector< float >( "float") );
272 BOOST_UBLAS_TEST_CHECK( test_vector< int >( "int") );
273
274 BOOST_UBLAS_TEST_CHECK( test_vector< std::complex<double> >( "std::complex<double>") );
275 BOOST_UBLAS_TEST_CHECK( test_vector< std::complex<float> >( "std::complex<float>") );
276 BOOST_UBLAS_TEST_CHECK( test_vector< std::complex<int> >( "std::complex<int>") );
277
278 BOOST_UBLAS_TEST_CHECK( test_matrix< double >( "double") );
279 BOOST_UBLAS_TEST_CHECK( test_matrix< float >( "float") );
280 BOOST_UBLAS_TEST_CHECK( test_matrix< int >( "int") );
281
282 BOOST_UBLAS_TEST_CHECK( test_matrix< std::complex<double> >( "std::complex<double>") );
283 BOOST_UBLAS_TEST_CHECK( test_matrix< std::complex<float> >( "std::complex<float>") );
284 BOOST_UBLAS_TEST_CHECK( test_matrix< std::complex<int> >( "std::complex<int>") );
285 }
286
287
main()288 int main () {
289
290 BOOST_UBLAS_TEST_BEGIN();
291
292 BOOST_UBLAS_TEST_DO( test_fixed );
293
294 BOOST_UBLAS_TEST_END();
295 return EXIT_SUCCESS;
296
297 }
298
299 #else
300
main()301 int main () {
302
303 BOOST_UBLAS_TEST_BEGIN();
304 BOOST_UBLAS_TEST_END();
305
306 return EXIT_SUCCESS;
307
308 }
309 #endif // BOOST_UBLAS_CPP_GE_2011
310