1 //
2 // Copyright (c) 2000-2002
3 // Joerg Walter, Mathias Koch
4 //
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)
8 //
9 // The authors gratefully acknowledge the support of
10 // GeNeSys mbH & Co. KG in producing this work.
11 //
12
13 #include "test3.hpp"
14
15 // Test matrix & vector expression templates
16 template<class V, class M, int N>
17 struct test_my_matrix_vector {
18 typedef typename V::value_type value_type;
19
20 template<class VP, class MP>
test_withtest_my_matrix_vector21 void test_with (VP &v1, VP &v2, MP &m1) const {
22 {
23 // Rows and columns
24 initialize_matrix (m1);
25 for (int i = 0; i < N; ++ i) {
26 v1 = ublas::row (m1, i);
27 std::cout << "row (m, " << i << ") = " << v1 << std::endl;
28 v1 = ublas::column (m1, i);
29 std::cout << "column (m, " << i << ") = " << v1 << std::endl;
30 }
31
32 // Outer product
33 initialize_vector (v1);
34 initialize_vector (v2);
35 m1 = ublas::outer_prod (v1, v2);
36 std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
37
38 // Matrix vector product
39 initialize_matrix (m1);
40 initialize_vector (v1);
41 v2 = ublas::prod (m1, v1);
42 std::cout << "prod (m1, v1) = " << v2 << std::endl;
43 v2 = ublas::prod (v1, m1);
44 std::cout << "prod (v1, m1) = " << v2 << std::endl;
45 }
46 }
operator ()test_my_matrix_vector47 void operator () () const {
48 {
49 V v1 (N, N), v2 (N, N);
50 M m1 (N, N, N * N);
51
52 test_with (v1, v2, m1);
53
54 ublas::matrix_row<M> mr1 (m1, 0), mr2 (m1, N - 1);
55 test_with (mr1, mr2, m1);
56
57 ublas::matrix_column<M> mc1 (m1, 0), mc2 (m1, N - 1);
58 test_with (mc1, mc2, m1);
59
60 #ifdef USE_RANGE
61 ublas::matrix_vector_range<M> mvr1 (m1, ublas::range (0, N), ublas::range (0, N)),
62 mvr2 (m1, ublas::range (0, N), ublas::range (0, N));
63 test_with (mvr1, mvr2, m1);
64 #endif
65
66 #ifdef USE_SLICE
67 ublas::matrix_vector_slice<M> mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)),
68 mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N));
69 test_with (mvs1, mvs2, m1);
70 #endif
71 }
72 }
73 };
74
75 // Test matrix & vector
test_matrix_vector()76 void test_matrix_vector () {
77 std::cout << "test_matrix_vector" << std::endl;
78
79 #ifdef USE_SPARSE_MATRIX
80 #ifdef USE_MAP_ARRAY
81 #ifdef USE_FLOAT
82 std::cout << "float, map_array" << std::endl;
83 test_my_matrix_vector<ublas::mapped_vector<float, ublas::map_array<std::size_t, float> >,
84 ublas::mapped_matrix<float, ublas::row_major, ublas::map_array<std::size_t, float> >, 3 > () ();
85 #endif
86
87 #ifdef USE_DOUBLE
88 std::cout << "double, map_array" << std::endl;
89 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
90 ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3 > () ();
91 #endif
92
93 #ifdef USE_STD_COMPLEX
94 #ifdef USE_FLOAT
95 std::cout << "std::complex<float>, map_array" << std::endl;
96 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > >,
97 ublas::mapped_matrix<std::complex<float>, ublas::row_major, ublas::map_array<std::size_t, std::complex<float> > >, 3 > () ();
98 #endif
99
100 #ifdef USE_DOUBLE
101 std::cout << "std::complex<double>, map_array" << std::endl;
102 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
103 ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3 > () ();
104 #endif
105 #endif
106 #endif
107
108 #ifdef USE_STD_MAP
109 #ifdef USE_FLOAT
110 std::cout << "float, std::map" << std::endl;
111 test_my_matrix_vector<ublas::mapped_vector<float, std::map<std::size_t, float> >,
112 ublas::mapped_matrix<float, ublas::row_major, std::map<std::size_t, float> >, 3 > () ();
113 #endif
114
115 #ifdef USE_DOUBLE
116 std::cout << "double, std::map" << std::endl;
117 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
118 ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3 > () ();
119 #endif
120
121 #ifdef USE_STD_COMPLEX
122 #ifdef USE_FLOAT
123 std::cout << "std::complex<float>, std::map" << std::endl;
124 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > >,
125 ublas::mapped_matrix<std::complex<float>, ublas::row_major, std::map<std::size_t, std::complex<float> > >, 3 > () ();
126 #endif
127
128 #ifdef USE_DOUBLE
129 std::cout << "std::complex<double>, std::map" << std::endl;
130 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
131 ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3 > () ();
132 #endif
133 #endif
134 #endif
135 #endif
136
137 #ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR
138 #ifdef USE_MAP_ARRAY
139 #ifdef USE_FLOAT
140 std::cout << "float, mapped_vector map_array" << std::endl;
141 test_my_matrix_vector<ublas::mapped_vector<float, ublas::map_array<std::size_t, float> >,
142 ublas::mapped_vector<float, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, float> > >, 3 > () ();
143 #endif
144
145 #ifdef USE_DOUBLE
146 std::cout << "double, mapped_vector map_array" << std::endl;
147 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
148 ublas::mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3 > () ();
149 #endif
150
151 #ifdef USE_STD_COMPLEX
152 #ifdef USE_FLOAT
153 std::cout << "std::complex<float>, mapped_vector map_array" << std::endl;
154 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > >,
155 ublas::mapped_vector<std::complex<float>, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, std::complex<float> > > >, 3 > () ();
156 #endif
157
158 #ifdef USE_DOUBLE
159 std::cout << "std::complex<double>,mapped_vector map_array" << std::endl;
160 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
161 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 > () ();
162 #endif
163 #endif
164 #endif
165
166 #ifdef USE_STD_MAP
167 #ifdef USE_FLOAT
168 std::cout << "float, mapped_vector std::map" << std::endl;
169 test_my_matrix_vector<ublas::mapped_vector<float, std::map<std::size_t, float> >,
170 ublas::mapped_vector<float, ublas::row_major, std::map<std::size_t, std::map<std::size_t, float> > >, 3 > () ();
171 #endif
172
173 #ifdef USE_DOUBLE
174 std::cout << "double, mapped_vector std::map" << std::endl;
175 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
176 ublas::mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3 > () ();
177 #endif
178
179 #ifdef USE_STD_COMPLEX
180 #ifdef USE_FLOAT
181 std::cout << "std::complex<float>, mapped_vector std::map" << std::endl;
182 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > >,
183 ublas::mapped_vector<std::complex<float>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<float> > > >, 3 > () ();
184 #endif
185
186 #ifdef USE_DOUBLE
187 std::cout << "std::complex<double>, mapped_vector std::map" << std::endl;
188 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
189 ublas::mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3 > () ();
190 #endif
191 #endif
192 #endif
193 #endif
194
195 #ifdef USE_GENERALIZED_VECTOR_OF_VECTOR
196 #ifdef USE_MAP_ARRAY
197 #ifdef USE_FLOAT
198 std::cout << "float, generalized_vector_of_vector map_array" << std::endl;
199 test_my_matrix_vector<ublas::mapped_vector<float, ublas::map_array<std::size_t, float> >,
200 ublas::generalized_vector_of_vector<float, ublas::row_major, ublas::vector<ublas::mapped_vector<float, ublas::map_array<std::size_t, float> > > >, 3 > () ();
201 test_my_matrix_vector<ublas::mapped_vector<float, ublas::map_array<std::size_t, float> >,
202 ublas::generalized_vector_of_vector<float, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<float, ublas::map_array<std::size_t, float> >, ublas::map_array<std::size_t, ublas::mapped_vector<float, ublas::map_array<std::size_t, float> > > > >, 3 > () ();
203 #endif
204
205 #ifdef USE_DOUBLE
206 std::cout << "double, generalized_vector_of_vector map_array" << std::endl;
207 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
208 ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3 > () ();
209 test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
210 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 > () ();
211 #endif
212
213 #ifdef USE_STD_COMPLEX
214 #ifdef USE_FLOAT
215 std::cout << "std::complex<float>, generalized_vector_of_vector map_array" << std::endl;
216 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > >,
217 ublas::generalized_vector_of_vector<std::complex<float>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > > > >, 3 > () ();
218 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > >,
219 ublas::generalized_vector_of_vector<std::complex<float>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > >, ublas::map_array<std::size_t, ublas::mapped_vector<std::complex<float>, ublas::map_array<std::size_t, std::complex<float> > > > > >, 3 > () ();
220 #endif
221
222 #ifdef USE_DOUBLE
223 std::cout << "std::complex<double>, generalized_vector_of_vector map_array" << std::endl;
224 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
225 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 > () ();
226 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
227 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 > () ();
228 #endif
229 #endif
230 #endif
231
232 #ifdef USE_STD_MAP
233 #ifdef USE_FLOAT
234 std::cout << "float, generalized_vector_of_vector std::map" << std::endl;
235 test_my_matrix_vector<ublas::mapped_vector<float, std::map<std::size_t, float> >,
236 ublas::generalized_vector_of_vector<float, ublas::row_major, ublas::vector<ublas::mapped_vector<float, std::map<std::size_t, float> > > >, 3 > () ();
237 test_my_matrix_vector<ublas::mapped_vector<float, std::map<std::size_t, float> >,
238 ublas::generalized_vector_of_vector<float, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<float, std::map<std::size_t, float> >, std::map<std::size_t, ublas::mapped_vector<float, std::map<std::size_t, float> > > > >, 3 > () ();
239 #endif
240
241 #ifdef USE_DOUBLE
242 std::cout << "double, generalized_vector_of_vector std::map" << std::endl;
243 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
244 ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3 > () ();
245 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
246 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 > () ();
247 #endif
248
249 #ifdef USE_STD_COMPLEX
250 #ifdef USE_FLOAT
251 std::cout << "std::complex<float>, generalized_vector_of_vector std::map" << std::endl;
252 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > >,
253 ublas::generalized_vector_of_vector<std::complex<float>, ublas::row_major, ublas::vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > > > >, 3 > () ();
254 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > >,
255 ublas::generalized_vector_of_vector<std::complex<float>, ublas::row_major, ublas::mapped_vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > >, std::map<std::size_t, ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > > > > >, 3 > () ();
256 #endif
257
258 #ifdef USE_DOUBLE
259 std::cout << "std::complex<double>, generalized_vector_of_vector std::map" << std::endl;
260 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
261 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 > () ();
262 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
263 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 > () ();
264 #endif
265 #endif
266 #endif
267 #endif
268
269 #ifdef USE_COMPRESSED_MATRIX
270 #ifdef USE_FLOAT
271 std::cout << "float compressed" << std::endl;
272 test_my_matrix_vector<ublas::compressed_vector<float>,
273 ublas::compressed_matrix<float>, 3 > () ();
274 #endif
275
276 #ifdef USE_DOUBLE
277 std::cout << "double compressed" << std::endl;
278 test_my_matrix_vector<ublas::compressed_vector<double>,
279 ublas::compressed_matrix<double>, 3 > () ();
280 #endif
281
282 #ifdef USE_STD_COMPLEX
283 #ifdef USE_FLOAT
284 std::cout << "std::complex<float> compressed" << std::endl;
285 test_my_matrix_vector<ublas::compressed_vector<std::complex<float> >,
286 ublas::compressed_matrix<std::complex<float> >, 3 > () ();
287 #endif
288
289 #ifdef USE_DOUBLE
290 std::cout << "std::complex<double> compressed" << std::endl;
291 test_my_matrix_vector<ublas::compressed_vector<std::complex<double> >,
292 ublas::compressed_matrix<std::complex<double> >, 3 > () ();
293 #endif
294 #endif
295 #endif
296
297 #ifdef USE_COORDINATE_MATRIX
298 #ifdef USE_FLOAT
299 std::cout << "float coordinate" << std::endl;
300 test_my_matrix_vector<ublas::coordinate_vector<float>,
301 ublas::coordinate_matrix<float>, 3 > () ();
302 #endif
303
304 #ifdef USE_DOUBLE
305 std::cout << "double coordinate" << std::endl;
306 test_my_matrix_vector<ublas::coordinate_vector<double>,
307 ublas::coordinate_matrix<double>, 3 > () ();
308 #endif
309
310 #ifdef USE_STD_COMPLEX
311 #ifdef USE_FLOAT
312 std::cout << "std::complex<float> coordinate" << std::endl;
313 test_my_matrix_vector<ublas::coordinate_vector<std::complex<float> >,
314 ublas::coordinate_matrix<std::complex<float> >, 3 > () ();
315 #endif
316
317 #ifdef USE_DOUBLE
318 std::cout << "std::complex<double> coordinate" << std::endl;
319 test_my_matrix_vector<ublas::coordinate_vector<std::complex<double> >,
320 ublas::coordinate_matrix<std::complex<double> >, 3 > () ();
321 #endif
322 #endif
323 #endif
324
325 #ifdef USE_MAPPED_VECTOR_OF_MAPPED_VECTOR
326 #ifdef USE_STD_MAP
327 #ifdef USE_FLOAT
328 std::cout << "float mapped_vector_of_mapped_vector" << std::endl;
329 test_my_matrix_vector<ublas::mapped_vector<float, std::map<std::size_t, float> >,
330 ublas::mapped_vector_of_mapped_vector<float>, 3 > () ();
331 #endif
332
333 #ifdef USE_DOUBLE
334 std::cout << "double mapped_vector_of_mapped_vector" << std::endl;
335 test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
336 ublas::mapped_vector_of_mapped_vector<double>, 3 > () ();
337 #endif
338
339 #ifdef USE_STD_COMPLEX
340 #ifdef USE_FLOAT
341 std::cout << "std::complex<float> mapped_vector_of_mapped_vector" << std::endl;
342 test_my_matrix_vector<ublas::mapped_vector<std::complex<float>, std::map<std::size_t, std::complex<float> > >,
343 ublas::mapped_vector_of_mapped_vector<std::complex<float> >, 3 > () ();
344 #endif
345
346 #ifdef USE_DOUBLE
347 std::cout << "std::complex<double> mapped_vector_of_mapped_vector" << std::endl;
348 test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
349 ublas::mapped_vector_of_mapped_vector<std::complex<double> >, 3 > () ();
350 #endif
351 #endif
352 #endif
353 #endif
354 }
355