2 // Copyright (c) 2000-2002
3 // Joerg Walter, Mathias Koch
5 // Distributed under the Boost Software License, Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // The authors gratefully acknowledge the support of
10 // GeNeSys mbH & Co. KG in producing this work.
13 #if defined(__GNUC__) && (__GNUC__ >= 9)
14 #pragma GCC diagnostic ignored "-Wdeprecated-copy"
19 // Test matrix & vector expression templates
20 template <class V, class M, int N>
21 struct test_my_matrix_vector
23 typedef typename V::value_type value_type;
25 template <class VP, class MP>
26 void test_with(VP& v1, VP& v2, MP& m1) const
30 initialize_matrix(m1);
31 for (int i = 0; i < N; ++i)
33 v1 = ublas::row(m1, i);
34 std::cout << "row (m, " << i << ") = " << v1 << std::endl;
35 v1 = ublas::column(m1, i);
36 std::cout << "column (m, " << i << ") = " << v1 << std::endl;
40 initialize_vector(v1);
41 initialize_vector(v2);
42 m1 = ublas::outer_prod(v1, v2);
43 std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
45 // Matrix vector product
46 initialize_matrix(m1);
47 initialize_vector(v1);
48 v2 = ublas::prod(m1, v1);
49 std::cout << "prod (m1, v1) = " << v2 << std::endl;
50 v2 = ublas::prod(v1, m1);
51 std::cout << "prod (v1, m1) = " << v2 << std::endl;
54 void operator()() const
60 test_with(v1, v2, m1);
62 ublas::matrix_row<M> mr1(m1, 0), mr2(m1, N - 1);
63 test_with(mr1, mr2, m1);
65 ublas::matrix_column<M> mc1(m1, 0), mc2(m1, N - 1);
66 test_with(mc1, mc2, m1);
69 ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),
70 mvr2(m1, ublas::range(0, N), ublas::range(0, N));
71 test_with(mvr1, mvr2, m1);
75 ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
76 mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
77 test_with(mvs1, mvs2, m1);
83 // Test matrix & vector
84 void test_matrix_vector()
86 std::cout << "test_matrix_vector" << std::endl;
88 #ifdef USE_SPARSE_MATRIX
91 std::cout << "mp_test_type, map_array" << std::endl;
92 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
93 ublas::mapped_matrix<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, mp_test_type> >, 3>()();
97 std::cout << "double, map_array" << std::endl;
98 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
99 ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3>()();
102 #ifdef USE_STD_COMPLEX
104 std::cout << "std::complex<mp_test_type>, map_array" << std::endl;
105 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
106 ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()();
110 std::cout << "std::complex<double>, map_array" << std::endl;
111 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
112 ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3>()();
119 std::cout << "mp_test_type, std::map" << std::endl;
120 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
121 ublas::mapped_matrix<mp_test_type, ublas::row_major, std::map<std::size_t, mp_test_type> >, 3>()();
125 std::cout << "double, std::map" << std::endl;
126 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
127 ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3>()();
130 #ifdef USE_STD_COMPLEX
132 std::cout << "std::complex<mp_test_type>, std::map" << std::endl;
133 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
134 ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()();
138 std::cout << "std::complex<double>, std::map" << std::endl;
139 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
140 ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3>()();
146 #ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR
149 std::cout << "mp_test_type, mapped_vector map_array" << std::endl;
150 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
151 ublas::mapped_vector<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, mp_test_type> > >, 3>()();
155 std::cout << "double, mapped_vector map_array" << std::endl;
156 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
157 ublas::mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3>()();
160 #ifdef USE_STD_COMPLEX
162 std::cout << "std::complex<mp_test_type>, mapped_vector map_array" << std::endl;
163 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
164 ublas::mapped_vector<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<mp_test_type> > > >, 3>()();
168 std::cout << "std::complex<double>,mapped_vector map_array" << std::endl;
169 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
170 ublas::mapped_vector<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<double> > > >, 3>()();
177 std::cout << "mp_test_type, mapped_vector std::map" << std::endl;
178 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
179 ublas::mapped_vector<mp_test_type, ublas::row_major, std::map<std::size_t, std::map<std::size_t, mp_test_type> > >, 3>()();
183 std::cout << "double, mapped_vector std::map" << std::endl;
184 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
185 ublas::mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3>()();
188 #ifdef USE_STD_COMPLEX
190 std::cout << "std::complex<mp_test_type>, mapped_vector std::map" << std::endl;
191 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
192 ublas::mapped_vector<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<mp_test_type> > > >, 3>()();
196 std::cout << "std::complex<double>, mapped_vector std::map" << std::endl;
197 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
198 ublas::mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3>()();
204 #ifdef USE_GENERALIZED_VECTOR_OF_VECTOR
207 std::cout << "mp_test_type, generalized_vector_of_vector map_array" << std::endl;
208 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
209 ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > >, 3>()();
210 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
211 ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >, ublas::map_array<std::size_t, ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> > > > >, 3>()();
215 std::cout << "double, generalized_vector_of_vector map_array" << std::endl;
216 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
217 ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3>()();
218 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
219 ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >, ublas::map_array<std::size_t, ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > > >, 3>()();
222 #ifdef USE_STD_COMPLEX
224 std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector map_array" << std::endl;
225 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
226 ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > >, 3>()();
227 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
228 ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > > > > >, 3>()();
232 std::cout << "std::complex<double>, generalized_vector_of_vector map_array" << std::endl;
233 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
234 ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > >, 3>()();
235 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
236 ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > > > > >, 3>()();
243 std::cout << "mp_test_type, generalized_vector_of_vector std::map" << std::endl;
244 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
245 ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > >, 3>()();
246 test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
247 ublas::generalized_vector_of_vector<mp_test_type, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >, std::map<std::size_t, ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> > > > >, 3>()();
251 std::cout << "double, generalized_vector_of_vector std::map" << std::endl;
252 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
253 ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3>()();
254 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
255 ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >, std::map<std::size_t, ublas::mapped_vector<double, std::map<std::size_t, double> > > > >, 3>()();
258 #ifdef USE_STD_COMPLEX
260 std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector std::map" << std::endl;
261 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
262 ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > >, 3>()();
263 test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
264 ublas::generalized_vector_of_vector<std::complex<mp_test_type>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > > > > >, 3>()();
268 std::cout << "std::complex<double>, generalized_vector_of_vector std::map" << std::endl;
269 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
270 ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > >, 3>()();
271 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
272 ublas::generalized_vector_of_vector<std::complex<double>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > > > > >, 3>()();
278 #ifdef USE_COMPRESSED_MATRIX
280 std::cout << "mp_test_type compressed" << std::endl;
281 test_my_matrix_vector<ublas::compressed_vector<mp_test_type>,
282 ublas::compressed_matrix<mp_test_type>, 3>()();
286 std::cout << "double compressed" << std::endl;
287 test_my_matrix_vector<ublas::compressed_vector<double>,
288 ublas::compressed_matrix<double>, 3>()();
291 #ifdef USE_STD_COMPLEX
293 std::cout << "std::complex<mp_test_type> compressed" << std::endl;
294 test_my_matrix_vector<ublas::compressed_vector<std::complex<mp_test_type> >,
295 ublas::compressed_matrix<std::complex<mp_test_type> >, 3>()();
299 std::cout << "std::complex<double> compressed" << std::endl;
300 test_my_matrix_vector<ublas::compressed_vector<std::complex<double> >,
301 ublas::compressed_matrix<std::complex<double> >, 3>()();
306 #ifdef USE_COORDINATE_MATRIX
308 std::cout << "mp_test_type coordinate" << std::endl;
309 test_my_matrix_vector<ublas::coordinate_vector<mp_test_type>,
310 ublas::coordinate_matrix<mp_test_type>, 3>()();
314 std::cout << "double coordinate" << std::endl;
315 test_my_matrix_vector<ublas::coordinate_vector<double>,
316 ublas::coordinate_matrix<double>, 3>()();
319 #ifdef USE_STD_COMPLEX
321 std::cout << "std::complex<mp_test_type> coordinate" << std::endl;
322 test_my_matrix_vector<ublas::coordinate_vector<std::complex<mp_test_type> >,
323 ublas::coordinate_matrix<std::complex<mp_test_type> >, 3>()();
327 std::cout << "std::complex<double> coordinate" << std::endl;
328 test_my_matrix_vector<ublas::coordinate_vector<std::complex<double> >,
329 ublas::coordinate_matrix<std::complex<double> >, 3>()();