test11.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // Copyright (c) 2000-2002
  2. // Joerg Walter, Mathias Koch
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // The authors gratefully acknowledge the support of
  9. // GeNeSys mbH & Co. KG in producing this work.
  10. #include "test1.hpp"
  11. // Test vector expression templates
  12. template<class V, int N>
  13. struct test_my_vector {
  14. typedef typename V::value_type value_type;
  15. typedef typename V::size_type size_type;
  16. typedef typename ublas::type_traits<value_type>::real_type real_type;
  17. template<class VP>
  18. void test_container_with (VP &v1) const {
  19. // Container type tests in addition to expression types
  20. // Insert and erase
  21. v1.insert_element (0, 55);
  22. v1.erase_element (1);
  23. v1.clear ();
  24. }
  25. template<class VP>
  26. void test_expression_with (VP &v1, VP &v2, VP &v3) const {
  27. // Expression type tests
  28. value_type t;
  29. size_type i;
  30. real_type n;
  31. // Default Construct
  32. default_construct<VP>::test ();
  33. // Copy and swap
  34. initialize_vector (v1);
  35. initialize_vector (v2);
  36. v1 = v2;
  37. std::cout << "v1 = v2 = " << v1 << std::endl;
  38. v1.assign_temporary (v2);
  39. std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl;
  40. v1.swap (v2);
  41. std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl;
  42. // Zero assignment
  43. v1 = ublas::zero_vector<> (v1.size ());
  44. std::cout << "v1.zero_vector = " << v1 << std::endl;
  45. v1 = v2;
  46. #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
  47. // Project range and slice
  48. initialize_vector (v1);
  49. initialize_vector (v2);
  50. project (v1, ublas::range(0,1)) = project (v2, ublas::range(0,1));
  51. project (v1, ublas::range(0,1)) = project (v2, ublas::slice(0,1,1));
  52. project (v1, ublas::slice(2,-1,2)) = project (v2, ublas::slice(0,1,2));
  53. project (v1, ublas::slice(2,-1,2)) = project (v2, ublas::range(0,2));
  54. std::cout << "v1 = range/slice " << v1 << std::endl;
  55. #endif
  56. // Unary vector operations resulting in a vector
  57. initialize_vector (v1);
  58. v2 = - v1;
  59. std::cout << "- v1 = " << v2 << std::endl;
  60. v2 = ublas::conj (v1);
  61. std::cout << "conj (v1) = " << v2 << std::endl;
  62. // Binary vector operations resulting in a vector
  63. initialize_vector (v1);
  64. initialize_vector (v2);
  65. v3 = v1 + v2;
  66. std::cout << "v1 + v2 = " << v3 << std::endl;
  67. v3 = v1 - v2;
  68. std::cout << "v1 - v2 = " << v3 << std::endl;
  69. v3 = ublas::element_prod (v1, v2);
  70. std::cout << "element_prod (v1, v2) = " << v3 << std::endl;
  71. // Scaling a vector
  72. t = N;
  73. initialize_vector (v1);
  74. v2 = value_type (1.) * v1;
  75. std::cout << "1. * v1 = " << v2 << std::endl;
  76. v2 = t * v1;
  77. std::cout << "N * v1 = " << v2 << std::endl;
  78. initialize_vector (v1);
  79. v2 = v1 * value_type (1.);
  80. std::cout << "v1 * 1. = " << v2 << std::endl;
  81. v2 = v1 * t;
  82. std::cout << "v1 * value_type(N) = " << v2 << std::endl;
  83. // test interop with integer
  84. v2 = v1 * N;
  85. std::cout << "v1 * N = " << v2 << std::endl;
  86. // Some assignments
  87. initialize_vector (v1);
  88. initialize_vector (v2);
  89. v2 += v1;
  90. std::cout << "v2 += v1 = " << v2 << std::endl;
  91. v2 -= v1;
  92. std::cout << "v2 -= v1 = " << v2 << std::endl;
  93. v2 = v2 + v1;
  94. std::cout << "v2 = v2 + v1 = " << v2 << std::endl;
  95. v2 = v2 - v1;
  96. std::cout << "v2 = v2 - v1 = " << v2 << std::endl;
  97. v1 *= value_type (1.);
  98. std::cout << "v1 *= 1. = " << v1 << std::endl;
  99. v1 *= t;
  100. std::cout << "v1 *= value_type(N) = " << v1 << std::endl;
  101. // test interop with integer
  102. v1 *= N;
  103. std::cout << "v1 *= N = " << v1 << std::endl;
  104. // Unary vector operations resulting in a scalar
  105. initialize_vector (v1);
  106. t = ublas::sum (v1);
  107. std::cout << "sum (v1) = " << t << std::endl;
  108. n = ublas::norm_1 (v1);
  109. std::cout << "norm_1 (v1) = " << n << std::endl;
  110. n = ublas::norm_2 (v1);
  111. std::cout << "norm_2 (v1) = " << n << std::endl;
  112. n = ublas::norm_inf (v1);
  113. std::cout << "norm_inf (v1) = " << n << std::endl;
  114. i = ublas::index_norm_inf (v1);
  115. std::cout << "index_norm_inf (v1) = " << i << std::endl;
  116. // Binary vector operations resulting in a scalar
  117. initialize_vector (v1);
  118. initialize_vector (v2);
  119. t = ublas::inner_prod (v1, v2);
  120. std::cout << "inner_prod (v1, v2) = " << t << std::endl;
  121. // Scalar and Binary vector expression resulting in a vector
  122. initialize_vector (v1);
  123. initialize_vector (v2);
  124. v1 = v1 * ublas::inner_prod (v1, v2);
  125. std::cout << "v1 * inner_prod (v1, v2) = " << v1 << std::endl;
  126. }
  127. void operator () () const {
  128. V v1 (N), v2 (N), v3 (N);
  129. test_expression_with (v1, v2, v3);
  130. test_container_with (v1);
  131. #ifdef USE_RANGE
  132. ublas::vector_range<V> vr1 (v1, ublas::range (0, N)),
  133. vr2 (v2, ublas::range (0, N)),
  134. vr3 (v3, ublas::range (0, N));
  135. test_expression_with (vr1, vr2, vr3);
  136. #endif
  137. #ifdef USE_SLICE
  138. ublas::vector_slice<V> vs1 (v1, ublas::slice (0, 1, N)),
  139. vs2 (v2, ublas::slice (0, 1, N)),
  140. vs3 (v3, ublas::slice (0, 1, N));
  141. test_expression_with (vs1, vs2, vs3);
  142. #endif
  143. }
  144. };
  145. // Test vector
  146. void test_vector () {
  147. std::cout << "test_vector" << std::endl;
  148. #ifdef USE_BOUNDED_ARRAY
  149. #ifdef USE_FLOAT
  150. std::cout << "float, bounded_array" << std::endl;
  151. test_my_vector<ublas::vector<float, ublas::bounded_array<float, 3> >, 3 > () ();
  152. #endif
  153. #ifdef USE_DOUBLE
  154. std::cout << "double, bounded_array" << std::endl;
  155. test_my_vector<ublas::vector<double, ublas::bounded_array<double, 3> >, 3 > () ();
  156. #endif
  157. #ifdef USE_STD_COMPLEX
  158. #ifdef USE_FLOAT
  159. std::cout << "std::complex<float>, bounded_array" << std::endl;
  160. test_my_vector<ublas::vector<std::complex<float>, ublas::bounded_array<std::complex<float>, 3> >, 3 > () ();
  161. #endif
  162. #ifdef USE_DOUBLE
  163. std::cout << "std::complex<double>, bounded_array" << std::endl;
  164. test_my_vector<ublas::vector<std::complex<double>, ublas::bounded_array<std::complex<double>, 3> >, 3 > () ();
  165. #endif
  166. #endif
  167. #endif
  168. #ifdef USE_UNBOUNDED_ARRAY
  169. #ifdef USE_FLOAT
  170. std::cout << "float, unbounded_array" << std::endl;
  171. test_my_vector<ublas::vector<float, ublas::unbounded_array<float> >, 3 > () ();
  172. #endif
  173. #ifdef USE_DOUBLE
  174. std::cout << "double, unbounded_array" << std::endl;
  175. test_my_vector<ublas::vector<double, ublas::unbounded_array<double> >, 3 > () ();
  176. #endif
  177. #ifdef USE_STD_COMPLEX
  178. #ifdef USE_FLOAT
  179. std::cout << "std::complex<float>, unbounded_array" << std::endl;
  180. test_my_vector<ublas::vector<std::complex<float>, ublas::unbounded_array<std::complex<float> > >, 3 > () ();
  181. #endif
  182. #ifdef USE_DOUBLE
  183. std::cout << "std::complex<double>, unbounded_array" << std::endl;
  184. test_my_vector<ublas::vector<std::complex<double>, ublas::unbounded_array<std::complex<double> > >, 3 > () ();
  185. #endif
  186. #endif
  187. #endif
  188. #ifdef USE_STD_VECTOR
  189. #ifdef USE_FLOAT
  190. std::cout << "float, std::vector" << std::endl;
  191. test_my_vector<ublas::vector<float, std::vector<float> >, 3 > () ();
  192. #endif
  193. #ifdef USE_DOUBLE
  194. std::cout << "double, std::vector" << std::endl;
  195. test_my_vector<ublas::vector<double, std::vector<double> >, 3 > () ();
  196. #endif
  197. #ifdef USE_STD_COMPLEX
  198. #ifdef USE_FLOAT
  199. std::cout << "std::complex<float>, std::vector" << std::endl;
  200. test_my_vector<ublas::vector<std::complex<float>, std::vector<std::complex<float> > >, 3 > () ();
  201. #endif
  202. #ifdef USE_DOUBLE
  203. std::cout << "std::complex<double>, std::vector" << std::endl;
  204. test_my_vector<ublas::vector<std::complex<double>, std::vector<std::complex<double> > >, 3 > () ();
  205. #endif
  206. #endif
  207. #endif
  208. #ifdef USE_BOUNDED_VECTOR
  209. #ifdef USE_FLOAT
  210. std::cout << "float, bounded" << std::endl;
  211. test_my_vector<ublas::bounded_vector<float, 3>, 3> () ();
  212. #endif
  213. #ifdef USE_DOUBLE
  214. std::cout << "double, bounded" << std::endl;
  215. test_my_vector<ublas::bounded_vector<double, 3>, 3> () ();
  216. #endif
  217. #ifdef USE_STD_COMPLEX
  218. #ifdef USE_FLOAT
  219. std::cout << "std::complex<float>, bounded" << std::endl;
  220. test_my_vector<ublas::bounded_vector<std::complex<float>, 3>, 3> () ();
  221. #endif
  222. #ifdef USE_DOUBLE
  223. std::cout << "std::complex<double>, bounded" << std::endl;
  224. test_my_vector<ublas::bounded_vector<std::complex<double>, 3>, 3> () ();
  225. #endif
  226. #endif
  227. #endif
  228. }