test42.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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. #if defined(__GNUC__) && (__GNUC__ >= 9)
  13. #pragma GCC diagnostic ignored "-Wdeprecated-copy"
  14. #endif
  15. #include "test4.hpp"
  16. // Test matrix & vector expression templates
  17. template <class V, class M, int N>
  18. struct test_my_matrix_vector
  19. {
  20. typedef typename V::value_type value_type;
  21. template <class VP, class MP>
  22. void test_with(VP& v1, VP& v2, MP& m1) const
  23. {
  24. {
  25. #ifndef USE_DIAGONAL
  26. // Rows and columns
  27. initialize_matrix(m1);
  28. for (int i = 0; i < N; ++i)
  29. {
  30. v2 = ublas::row(m1, i);
  31. std::cout << "row (m, " << i << ") = " << v2 << std::endl;
  32. v2 = ublas::column(m1, i);
  33. std::cout << "column (m, " << i << ") = " << v2 << std::endl;
  34. }
  35. // Outer product
  36. initialize_vector(v1);
  37. initialize_vector(v2);
  38. v1(0) = 0;
  39. v1(N - 1) = 0;
  40. m1 = ublas::outer_prod(v1, v2);
  41. std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
  42. // Matrix vector product
  43. initialize_matrix(m1);
  44. initialize_vector(v1);
  45. v2 = ublas::prod(m1, v1);
  46. std::cout << "prod (m1, v1) = " << v2 << std::endl;
  47. v2 = ublas::prod(v1, m1);
  48. std::cout << "prod (v1, m1) = " << v2 << std::endl;
  49. #endif
  50. }
  51. }
  52. void operator()() const
  53. {
  54. {
  55. V v1(N), v2(N);
  56. #ifdef USE_BANDED
  57. M m1(N, N, 1, 1);
  58. #endif
  59. #ifdef USE_DIAGONAL
  60. M m1(N, N);
  61. #endif
  62. test_with(v1, v2, m1);
  63. ublas::matrix_row<M> mr1(m1, 1), mr2(m1, 1);
  64. test_with(mr1, mr2, m1);
  65. ublas::matrix_column<M> mc1(m1, 1), mc2(m1, 1);
  66. test_with(mc1, mc2, m1);
  67. #ifdef USE_RANGE
  68. ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),
  69. mvr2(m1, ublas::range(0, N), ublas::range(0, N));
  70. test_with(mvr1, mvr2, m1);
  71. #endif
  72. #ifdef USE_SLICE
  73. ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
  74. mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
  75. test_with(mvs1, mvs2, m1);
  76. #endif
  77. }
  78. }
  79. void operator()(int) const
  80. {
  81. #ifdef USE_ADAPTOR
  82. {
  83. #ifdef USE_BANDED
  84. V v1(N), v2(N);
  85. M m1(N, N, 1, 1);
  86. ublas::banded_adaptor<M> bam1(m1, 1, 1);
  87. test_with(v1, v2, bam1);
  88. ublas::matrix_row<ublas::banded_adaptor<M> > mr1(bam1, 1), mr2(bam1, 1);
  89. test_with(mr1, mr2, bam1);
  90. ublas::matrix_column<ublas::banded_adaptor<M> > mc1(bam1, 1), mc2(bam1, 1);
  91. test_with(mc1, mc2, bam1);
  92. #ifdef USE_RANGE
  93. ublas::matrix_vector_range<ublas::banded_adaptor<M> > mvr1(bam1, ublas::range(0, N), ublas::range(0, N)),
  94. mvr2(bam1, ublas::range(0, N), ublas::range(0, N));
  95. test_with(mvr1, mvr2, bam1);
  96. #endif
  97. #ifdef USE_SLICE
  98. ublas::matrix_vector_slice<ublas::banded_adaptor<M> > mvs1(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
  99. mvs2(bam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
  100. test_with(mvs1, mvs2, bam1);
  101. #endif
  102. #endif
  103. #ifdef USE_DIAGONAL
  104. V v1(N), v2(N);
  105. M m1(N, N);
  106. ublas::diagonal_adaptor<M> dam1(m1);
  107. test_with(v1, v2, dam1);
  108. ublas::matrix_row<ublas::diagonal_adaptor<M> > mr1(dam1, 1), mr2(dam1, 1);
  109. test_with(mr1, mr2, dam1);
  110. ublas::matrix_column<ublas::diagonal_adaptor<M> > mc1(dam1, 1), mc2(dam1, 1);
  111. test_with(mc1, mc2, dam1);
  112. #ifdef USE_RANGE
  113. ublas::matrix_vector_range<ublas::diagonal_adaptor<M> > mvr1(dam1, ublas::range(0, N), ublas::range(0, N)),
  114. mvr2(dam1, ublas::range(0, N), ublas::range(0, N));
  115. test_with(mvr1, mvr2, dam1);
  116. #endif
  117. #ifdef USE_SLICE
  118. ublas::matrix_vector_slice<ublas::diagonal_adaptor<M> > mvs1(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
  119. mvs2(dam1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
  120. test_with(mvs1, mvs2, dam1);
  121. #endif
  122. #endif
  123. }
  124. #endif
  125. }
  126. };
  127. // Test matrix & vector
  128. void test_matrix_vector()
  129. {
  130. std::cout << "test_matrix_vector" << std::endl;
  131. #ifdef USE_BANDED
  132. #ifdef USE_BOUNDED_ARRAY
  133. #ifdef USE_FLOAT
  134. std::cout << "mp_test_type, bounded_array" << std::endl;
  135. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
  136. ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
  137. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
  138. ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
  139. #endif
  140. #ifdef USE_DOUBLE
  141. std::cout << "double, bounded_array" << std::endl;
  142. test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
  143. ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
  144. test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
  145. ublas::banded_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
  146. #endif
  147. #ifdef USE_STD_COMPLEX
  148. #ifdef USE_FLOAT
  149. std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
  150. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
  151. ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
  152. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
  153. ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
  154. #endif
  155. #ifdef USE_DOUBLE
  156. std::cout << "std::complex<double>, bounded_array" << std::endl;
  157. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
  158. ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
  159. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
  160. ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
  161. #endif
  162. #endif
  163. #endif
  164. #ifdef USE_UNBOUNDED_ARRAY
  165. #ifdef USE_FLOAT
  166. std::cout << "mp_test_type, unbounded_array" << std::endl;
  167. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
  168. ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
  169. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
  170. ublas::banded_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
  171. #endif
  172. #ifdef USE_DOUBLE
  173. std::cout << "double, unbounded_array" << std::endl;
  174. test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
  175. ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
  176. test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
  177. ublas::banded_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
  178. #endif
  179. #ifdef USE_STD_COMPLEX
  180. #ifdef USE_FLOAT
  181. std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
  182. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
  183. ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
  184. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
  185. ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
  186. #endif
  187. #ifdef USE_DOUBLE
  188. std::cout << "std::complex<double>, unbounded_array" << std::endl;
  189. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
  190. ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
  191. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
  192. ublas::banded_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
  193. #endif
  194. #endif
  195. #endif
  196. #ifdef USE_STD_VECTOR
  197. #ifdef USE_FLOAT
  198. std::cout << "mp_test_type, std::vector" << std::endl;
  199. test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
  200. ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();
  201. test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
  202. ublas::banded_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
  203. #endif
  204. #ifdef USE_DOUBLE
  205. std::cout << "double, std::vector" << std::endl;
  206. test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
  207. ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()();
  208. test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
  209. ublas::banded_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);
  210. #endif
  211. #ifdef USE_STD_COMPLEX
  212. #ifdef USE_FLOAT
  213. std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
  214. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
  215. ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
  216. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
  217. ublas::banded_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
  218. #endif
  219. #ifdef USE_DOUBLE
  220. std::cout << "std::complex<double>, std::vector" << std::endl;
  221. test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
  222. ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
  223. test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
  224. ublas::banded_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);
  225. #endif
  226. #endif
  227. #endif
  228. #endif
  229. #ifdef USE_DIAGONAL
  230. #ifdef USE_BOUNDED_ARRAY
  231. #ifdef USE_FLOAT
  232. std::cout << "mp_test_type, bounded_array" << std::endl;
  233. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
  234. ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()();
  235. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::bounded_array<mp_test_type, 3> >,
  236. ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::bounded_array<mp_test_type, 3 * 3> >, 3>()(0);
  237. #endif
  238. #ifdef USE_DOUBLE
  239. std::cout << "double, bounded_array" << std::endl;
  240. test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
  241. ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()();
  242. test_my_matrix_vector<ublas::vector<double, ublas::bounded_array<double, 3> >,
  243. ublas::diagonal_matrix<double, ublas::row_major, ublas::bounded_array<double, 3 * 3> >, 3>()(0);
  244. #endif
  245. #ifdef USE_STD_COMPLEX
  246. #ifdef USE_FLOAT
  247. std::cout << "std::complex<mp_test_type>, bounded_array" << std::endl;
  248. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
  249. ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()();
  250. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::bounded_array<std::complex<mp_test_type>, 3> >,
  251. ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::bounded_array<std::complex<mp_test_type>, 3 * 3> >, 3>()(0);
  252. #endif
  253. #ifdef USE_DOUBLE
  254. std::cout << "std::complex<double>, bounded_array" << std::endl;
  255. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
  256. ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()();
  257. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >,
  258. ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::bounded_array<std::complex<double>, 3 * 3> >, 3>()(0);
  259. #endif
  260. #endif
  261. #endif
  262. #ifdef USE_UNBOUNDED_ARRAY
  263. #ifdef USE_FLOAT
  264. std::cout << "mp_test_type, unbounded_array" << std::endl;
  265. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
  266. ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()();
  267. test_my_matrix_vector<ublas::vector<mp_test_type, ublas::unbounded_array<mp_test_type> >,
  268. ublas::diagonal_matrix<mp_test_type, ublas::row_major, ublas::unbounded_array<mp_test_type> >, 3>()(0);
  269. #endif
  270. #ifdef USE_DOUBLE
  271. std::cout << "double, unbounded_array" << std::endl;
  272. test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
  273. ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()();
  274. test_my_matrix_vector<ublas::vector<double, ublas::unbounded_array<double> >,
  275. ublas::diagonal_matrix<double, ublas::row_major, ublas::unbounded_array<double> >, 3>()(0);
  276. #endif
  277. #ifdef USE_STD_COMPLEX
  278. #ifdef USE_FLOAT
  279. std::cout << "std::complex<mp_test_type>, unbounded_array" << std::endl;
  280. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
  281. ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()();
  282. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, ublas::unbounded_array<std::complex<mp_test_type> > >,
  283. ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::unbounded_array<std::complex<mp_test_type> > >, 3>()(0);
  284. #endif
  285. #ifdef USE_DOUBLE
  286. std::cout << "std::complex<double>, unbounded_array" << std::endl;
  287. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
  288. ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()();
  289. test_my_matrix_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >,
  290. ublas::diagonal_matrix<std::complex<double>, ublas::row_major, ublas::unbounded_array<std::complex<double> > >, 3>()(0);
  291. #endif
  292. #endif
  293. #endif
  294. #ifdef USE_STD_VECTOR
  295. #ifdef USE_FLOAT
  296. std::cout << "mp_test_type, std::vector" << std::endl;
  297. test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
  298. ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()();
  299. test_my_matrix_vector<ublas::vector<mp_test_type, std::vector<mp_test_type> >,
  300. ublas::diagonal_matrix<mp_test_type, ublas::row_major, std::vector<mp_test_type> >, 3>()(0);
  301. #endif
  302. #ifdef USE_DOUBLE
  303. std::cout << "double, std::vector" << std::endl;
  304. test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
  305. ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()();
  306. test_my_matrix_vector<ublas::vector<double, std::vector<double> >,
  307. ublas::diagonal_matrix<double, ublas::row_major, std::vector<double> >, 3>()(0);
  308. #endif
  309. #ifdef USE_STD_COMPLEX
  310. #ifdef USE_FLOAT
  311. std::cout << "std::complex<mp_test_type>, std::vector" << std::endl;
  312. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
  313. ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()();
  314. test_my_matrix_vector<ublas::vector<std::complex<mp_test_type>, std::vector<std::complex<mp_test_type> > >,
  315. ublas::diagonal_matrix<std::complex<mp_test_type>, ublas::row_major, std::vector<std::complex<mp_test_type> > >, 3>()(0);
  316. #endif
  317. #ifdef USE_DOUBLE
  318. std::cout << "std::complex<double>, std::vector" << std::endl;
  319. test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
  320. ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()();
  321. test_my_matrix_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >,
  322. ublas::diagonal_matrix<std::complex<double>, ublas::row_major, std::vector<std::complex<double> > >, 3>()(0);
  323. #endif
  324. #endif
  325. #endif
  326. #endif
  327. }