test32.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  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 "test3.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. // Rows and columns
  26. initialize_matrix(m1);
  27. for (int i = 0; i < N; ++i)
  28. {
  29. v1 = ublas::row(m1, i);
  30. std::cout << "row (m, " << i << ") = " << v1 << std::endl;
  31. v1 = ublas::column(m1, i);
  32. std::cout << "column (m, " << i << ") = " << v1 << std::endl;
  33. }
  34. // Outer product
  35. initialize_vector(v1);
  36. initialize_vector(v2);
  37. m1 = ublas::outer_prod(v1, v2);
  38. std::cout << "outer_prod (v1, v2) = " << m1 << std::endl;
  39. // Matrix vector product
  40. initialize_matrix(m1);
  41. initialize_vector(v1);
  42. v2 = ublas::prod(m1, v1);
  43. std::cout << "prod (m1, v1) = " << v2 << std::endl;
  44. v2 = ublas::prod(v1, m1);
  45. std::cout << "prod (v1, m1) = " << v2 << std::endl;
  46. }
  47. }
  48. void operator()() const
  49. {
  50. {
  51. V v1(N, N), v2(N, N);
  52. M m1(N, N, N * N);
  53. test_with(v1, v2, m1);
  54. ublas::matrix_row<M> mr1(m1, 0), mr2(m1, N - 1);
  55. test_with(mr1, mr2, m1);
  56. ublas::matrix_column<M> mc1(m1, 0), mc2(m1, N - 1);
  57. test_with(mc1, mc2, m1);
  58. #ifdef USE_RANGE
  59. ublas::matrix_vector_range<M> mvr1(m1, ublas::range(0, N), ublas::range(0, N)),
  60. mvr2(m1, ublas::range(0, N), ublas::range(0, N));
  61. test_with(mvr1, mvr2, m1);
  62. #endif
  63. #ifdef USE_SLICE
  64. ublas::matrix_vector_slice<M> mvs1(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N)),
  65. mvs2(m1, ublas::slice(0, 1, N), ublas::slice(0, 1, N));
  66. test_with(mvs1, mvs2, m1);
  67. #endif
  68. }
  69. }
  70. };
  71. // Test matrix & vector
  72. void test_matrix_vector()
  73. {
  74. std::cout << "test_matrix_vector" << std::endl;
  75. #ifdef USE_SPARSE_MATRIX
  76. #ifdef USE_MAP_ARRAY
  77. #ifdef USE_FLOAT
  78. std::cout << "mp_test_type, map_array" << std::endl;
  79. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
  80. ublas::mapped_matrix<mp_test_type, ublas::row_major, ublas::map_array<std::size_t, mp_test_type> >, 3>()();
  81. #endif
  82. #ifdef USE_DOUBLE
  83. std::cout << "double, map_array" << std::endl;
  84. test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
  85. ublas::mapped_matrix<double, ublas::row_major, ublas::map_array<std::size_t, double> >, 3>()();
  86. #endif
  87. #ifdef USE_STD_COMPLEX
  88. #ifdef USE_FLOAT
  89. std::cout << "std::complex<mp_test_type>, map_array" << std::endl;
  90. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
  91. ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, ublas::map_array<std::size_t, std::complex<mp_test_type> > >, 3>()();
  92. #endif
  93. #ifdef USE_DOUBLE
  94. std::cout << "std::complex<double>, map_array" << std::endl;
  95. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
  96. ublas::mapped_matrix<std::complex<double>, ublas::row_major, ublas::map_array<std::size_t, std::complex<double> > >, 3>()();
  97. #endif
  98. #endif
  99. #endif
  100. #ifdef USE_STD_MAP
  101. #ifdef USE_FLOAT
  102. std::cout << "mp_test_type, std::map" << std::endl;
  103. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
  104. ublas::mapped_matrix<mp_test_type, ublas::row_major, std::map<std::size_t, mp_test_type> >, 3>()();
  105. #endif
  106. #ifdef USE_DOUBLE
  107. std::cout << "double, std::map" << std::endl;
  108. test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
  109. ublas::mapped_matrix<double, ublas::row_major, std::map<std::size_t, double> >, 3>()();
  110. #endif
  111. #ifdef USE_STD_COMPLEX
  112. #ifdef USE_FLOAT
  113. std::cout << "std::complex<mp_test_type>, std::map" << std::endl;
  114. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
  115. ublas::mapped_matrix<std::complex<mp_test_type>, ublas::row_major, std::map<std::size_t, std::complex<mp_test_type> > >, 3>()();
  116. #endif
  117. #ifdef USE_DOUBLE
  118. std::cout << "std::complex<double>, std::map" << std::endl;
  119. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
  120. ublas::mapped_matrix<std::complex<double>, ublas::row_major, std::map<std::size_t, std::complex<double> > >, 3>()();
  121. #endif
  122. #endif
  123. #endif
  124. #endif
  125. #ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR
  126. #ifdef USE_MAP_ARRAY
  127. #ifdef USE_FLOAT
  128. std::cout << "mp_test_type, mapped_vector map_array" << std::endl;
  129. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
  130. 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>()();
  131. #endif
  132. #ifdef USE_DOUBLE
  133. std::cout << "double, mapped_vector map_array" << std::endl;
  134. test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
  135. ublas::mapped_vector<double, ublas::row_major, ublas::map_array<std::size_t, ublas::map_array<std::size_t, double> > >, 3>()();
  136. #endif
  137. #ifdef USE_STD_COMPLEX
  138. #ifdef USE_FLOAT
  139. std::cout << "std::complex<mp_test_type>, mapped_vector map_array" << std::endl;
  140. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
  141. 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>()();
  142. #endif
  143. #ifdef USE_DOUBLE
  144. std::cout << "std::complex<double>,mapped_vector map_array" << std::endl;
  145. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
  146. 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>()();
  147. #endif
  148. #endif
  149. #endif
  150. #ifdef USE_STD_MAP
  151. #ifdef USE_FLOAT
  152. std::cout << "mp_test_type, mapped_vector std::map" << std::endl;
  153. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
  154. ublas::mapped_vector<mp_test_type, ublas::row_major, std::map<std::size_t, std::map<std::size_t, mp_test_type> > >, 3>()();
  155. #endif
  156. #ifdef USE_DOUBLE
  157. std::cout << "double, mapped_vector std::map" << std::endl;
  158. test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
  159. ublas::mapped_vector<double, ublas::row_major, std::map<std::size_t, std::map<std::size_t, double> > >, 3>()();
  160. #endif
  161. #ifdef USE_STD_COMPLEX
  162. #ifdef USE_FLOAT
  163. std::cout << "std::complex<mp_test_type>, mapped_vector std::map" << std::endl;
  164. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
  165. 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>()();
  166. #endif
  167. #ifdef USE_DOUBLE
  168. std::cout << "std::complex<double>, mapped_vector std::map" << std::endl;
  169. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<std::size_t, std::complex<double> > >,
  170. ublas::mapped_vector<std::complex<double>, ublas::row_major, std::map<std::size_t, std::map<std::size_t, std::complex<double> > > >, 3>()();
  171. #endif
  172. #endif
  173. #endif
  174. #endif
  175. #ifdef USE_GENERALIZED_VECTOR_OF_VECTOR
  176. #ifdef USE_MAP_ARRAY
  177. #ifdef USE_FLOAT
  178. std::cout << "mp_test_type, generalized_vector_of_vector map_array" << std::endl;
  179. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
  180. 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>()();
  181. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, ublas::map_array<std::size_t, mp_test_type> >,
  182. 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>()();
  183. #endif
  184. #ifdef USE_DOUBLE
  185. std::cout << "double, generalized_vector_of_vector map_array" << std::endl;
  186. test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
  187. ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> > > >, 3>()();
  188. test_my_matrix_vector<ublas::mapped_vector<double, ublas::map_array<std::size_t, double> >,
  189. 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>()();
  190. #endif
  191. #ifdef USE_STD_COMPLEX
  192. #ifdef USE_FLOAT
  193. std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector map_array" << std::endl;
  194. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
  195. 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>()();
  196. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, ublas::map_array<std::size_t, std::complex<mp_test_type> > >,
  197. 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>()();
  198. #endif
  199. #ifdef USE_DOUBLE
  200. std::cout << "std::complex<double>, generalized_vector_of_vector map_array" << std::endl;
  201. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
  202. 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>()();
  203. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, ublas::map_array<std::size_t, std::complex<double> > >,
  204. 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>()();
  205. #endif
  206. #endif
  207. #endif
  208. #ifdef USE_STD_MAP
  209. #ifdef USE_FLOAT
  210. std::cout << "mp_test_type, generalized_vector_of_vector std::map" << std::endl;
  211. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
  212. 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>()();
  213. test_my_matrix_vector<ublas::mapped_vector<mp_test_type, std::map<std::size_t, mp_test_type> >,
  214. 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>()();
  215. #endif
  216. #ifdef USE_DOUBLE
  217. std::cout << "double, generalized_vector_of_vector std::map" << std::endl;
  218. test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
  219. ublas::generalized_vector_of_vector<double, ublas::row_major, ublas::vector<ublas::mapped_vector<double, std::map<std::size_t, double> > > >, 3>()();
  220. test_my_matrix_vector<ublas::mapped_vector<double, std::map<std::size_t, double> >,
  221. 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>()();
  222. #endif
  223. #ifdef USE_STD_COMPLEX
  224. #ifdef USE_FLOAT
  225. std::cout << "std::complex<mp_test_type>, generalized_vector_of_vector std::map" << std::endl;
  226. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
  227. 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>()();
  228. test_my_matrix_vector<ublas::mapped_vector<std::complex<mp_test_type>, std::map<std::size_t, std::complex<mp_test_type> > >,
  229. 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>()();
  230. #endif
  231. #ifdef USE_DOUBLE
  232. std::cout << "std::complex<double>, generalized_vector_of_vector std::map" << std::endl;
  233. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<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>, std::map<std::size_t, std::complex<double> > > > >, 3>()();
  235. test_my_matrix_vector<ublas::mapped_vector<std::complex<double>, std::map<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>, 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>()();
  237. #endif
  238. #endif
  239. #endif
  240. #endif
  241. #ifdef USE_COMPRESSED_MATRIX
  242. #ifdef USE_FLOAT
  243. std::cout << "mp_test_type compressed" << std::endl;
  244. test_my_matrix_vector<ublas::compressed_vector<mp_test_type>,
  245. ublas::compressed_matrix<mp_test_type>, 3>()();
  246. #endif
  247. #ifdef USE_DOUBLE
  248. std::cout << "double compressed" << std::endl;
  249. test_my_matrix_vector<ublas::compressed_vector<double>,
  250. ublas::compressed_matrix<double>, 3>()();
  251. #endif
  252. #ifdef USE_STD_COMPLEX
  253. #ifdef USE_FLOAT
  254. std::cout << "std::complex<mp_test_type> compressed" << std::endl;
  255. test_my_matrix_vector<ublas::compressed_vector<std::complex<mp_test_type> >,
  256. ublas::compressed_matrix<std::complex<mp_test_type> >, 3>()();
  257. #endif
  258. #ifdef USE_DOUBLE
  259. std::cout << "std::complex<double> compressed" << std::endl;
  260. test_my_matrix_vector<ublas::compressed_vector<std::complex<double> >,
  261. ublas::compressed_matrix<std::complex<double> >, 3>()();
  262. #endif
  263. #endif
  264. #endif
  265. #ifdef USE_COORDINATE_MATRIX
  266. #ifdef USE_FLOAT
  267. std::cout << "mp_test_type coordinate" << std::endl;
  268. test_my_matrix_vector<ublas::coordinate_vector<mp_test_type>,
  269. ublas::coordinate_matrix<mp_test_type>, 3>()();
  270. #endif
  271. #ifdef USE_DOUBLE
  272. std::cout << "double coordinate" << std::endl;
  273. test_my_matrix_vector<ublas::coordinate_vector<double>,
  274. ublas::coordinate_matrix<double>, 3>()();
  275. #endif
  276. #ifdef USE_STD_COMPLEX
  277. #ifdef USE_FLOAT
  278. std::cout << "std::complex<mp_test_type> coordinate" << std::endl;
  279. test_my_matrix_vector<ublas::coordinate_vector<std::complex<mp_test_type> >,
  280. ublas::coordinate_matrix<std::complex<mp_test_type> >, 3>()();
  281. #endif
  282. #ifdef USE_DOUBLE
  283. std::cout << "std::complex<double> coordinate" << std::endl;
  284. test_my_matrix_vector<ublas::coordinate_vector<std::complex<double> >,
  285. ublas::coordinate_matrix<std::complex<double> >, 3>()();
  286. #endif
  287. #endif
  288. #endif
  289. }