test_ticket7296.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /**
  2. * \file libs/numeric/ublas/test/test_utils.hpp
  3. *
  4. * \brief Test suite for utils.hpp.
  5. *
  6. * Copyright (c) 2012, Marco Guazzone
  7. *
  8. * Distributed under the Boost Software License, Version 1.0. (See
  9. * accompanying file LICENSE_1_0.txt or copy at
  10. * http://www.boost.org/LICENSE_1_0.txt)
  11. *
  12. * \author Marco Guazzone (marco.guazzone@gmail.com)
  13. */
  14. #include <boost/numeric/ublas/io.hpp>
  15. #include <boost/numeric/ublas/matrix.hpp>
  16. #include <boost/numeric/ublas/vector.hpp>
  17. #include <complex>
  18. #include <cstddef>
  19. #include "utils.hpp"
  20. namespace ublas = boost::numeric::ublas;
  21. static const float tol(1e-6f);
  22. static const float mul(tol*10);
  23. BOOST_UBLAS_TEST_DEF( check )
  24. {
  25. BOOST_UBLAS_TEST_TRACE( "Test case: 'check'" );
  26. BOOST_UBLAS_TEST_CHECK( true );
  27. }
  28. BOOST_UBLAS_TEST_DEF( check_eq )
  29. {
  30. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_eq'" );
  31. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  32. BOOST_UBLAS_TEST_CHECK_EQ( short(1), short(1) );
  33. BOOST_UBLAS_TEST_CHECK_EQ( int(1), int(1) );
  34. BOOST_UBLAS_TEST_CHECK_EQ( long(1), long(1) );
  35. BOOST_UBLAS_TEST_CHECK_EQ( unsigned(1), unsigned(1) );
  36. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  37. BOOST_UBLAS_TEST_CHECK_EQ( short(1), int(1) );
  38. BOOST_UBLAS_TEST_CHECK_EQ( short(1), int(1) );
  39. BOOST_UBLAS_TEST_CHECK_EQ( int(1), long(1) );
  40. BOOST_UBLAS_TEST_CHECK_EQ( long(1), int(1) );
  41. BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." );
  42. BOOST_UBLAS_TEST_CHECK_EQUAL( int(1), int(1) );
  43. }
  44. BOOST_UBLAS_TEST_DEF( check_close )
  45. {
  46. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_close'" );
  47. const float c1(1*mul);
  48. const float c2(2*mul);
  49. // Check T vs. T
  50. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  51. BOOST_UBLAS_TEST_CHECK_CLOSE( float(c1), float(c1), tol );
  52. BOOST_UBLAS_TEST_CHECK_CLOSE( double(c1), double(c1), tol );
  53. BOOST_UBLAS_TEST_CHECK_CLOSE( std::complex<float>(c1,c2), std::complex<float>(c1,c2), tol );
  54. BOOST_UBLAS_TEST_CHECK_CLOSE( std::complex<double>(c1,c2), std::complex<double>(c1,c2), tol );
  55. // Check T1 vs. T2
  56. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  57. BOOST_UBLAS_TEST_CHECK_CLOSE( float(c1), double(c1), tol );
  58. BOOST_UBLAS_TEST_CHECK_CLOSE( double(c1), float(c1), tol );
  59. BOOST_UBLAS_TEST_CHECK_CLOSE( std::complex<float>(c1,c2), std::complex<double>(c1,c2), tol );
  60. BOOST_UBLAS_TEST_CHECK_CLOSE( std::complex<double>(c1,c2), std::complex<float>(c1,c2), tol );
  61. // Check alias
  62. BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." );
  63. BOOST_UBLAS_TEST_CHECK_PRECISION( float(c1), float(c1), tol );
  64. }
  65. BOOST_UBLAS_TEST_DEF( check_rel_close )
  66. {
  67. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_rel_close'" );
  68. const float c1(1*mul);
  69. const float c2(2*mul);
  70. // Check T vs. T
  71. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  72. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( float(c1), float(c1), tol );
  73. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( double(c1), double(c1), tol );
  74. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( std::complex<float>(c1,c2), std::complex<float>(c1,c2), tol );
  75. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( std::complex<double>(c1,c2), std::complex<double>(c1,c2), tol );
  76. // Check T1 vs. T2
  77. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  78. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( float(c1), double(c1), tol );
  79. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( double(c1), float(c1), tol );
  80. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( std::complex<float>(c1,c2), std::complex<double>(c1,c2), tol );
  81. BOOST_UBLAS_TEST_CHECK_REL_CLOSE( std::complex<double>(c1,c2), std::complex<float>(c1,c2), tol );
  82. // Check alias
  83. BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." );
  84. BOOST_UBLAS_TEST_CHECK_REL_PRECISION( float(c1), float(c1), tol );
  85. }
  86. BOOST_UBLAS_TEST_DEF( check_vector_eq )
  87. {
  88. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_eq'" );
  89. const std::size_t n(5);
  90. ublas::vector<short> sv = ublas::scalar_vector<short>(n, 1);
  91. ublas::vector<int> iv = ublas::scalar_vector<int>(n, 1);
  92. ublas::vector<long> lv = ublas::scalar_vector<long>(n, 1L);
  93. ublas::vector<unsigned> uv = ublas::scalar_vector<unsigned>(n, 1u);
  94. // Check T vs. T
  95. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  96. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( sv, sv, n );
  97. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, iv, n );
  98. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( lv, lv, n );
  99. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( uv, uv, n );
  100. // Check T1 vs. T2
  101. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  102. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( sv, iv, n );
  103. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, sv, n );
  104. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, lv, n );
  105. BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( lv, iv, n );
  106. }
  107. BOOST_UBLAS_TEST_DEF( check_vector_close )
  108. {
  109. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_close'" );
  110. const std::size_t n(5);
  111. ublas::vector<float> fv = ublas::scalar_vector<float>(n, 1);
  112. ublas::vector<float> dv = ublas::scalar_vector<float>(n, 1);
  113. ublas::vector< std::complex<float> > cfv = ublas::scalar_vector< std::complex<float> >(n, std::complex<float>(1,2));
  114. ublas::vector< std::complex<double> > cdv = ublas::scalar_vector< std::complex<double> >(n, std::complex<double>(1,2));
  115. // Check T vs. T
  116. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  117. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( fv, fv, n, tol );
  118. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( dv, dv, n, tol );
  119. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cfv, cfv, n, tol );
  120. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cdv, cdv, n, tol );
  121. // Check T1 vs. T2
  122. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  123. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( fv, dv, n, tol );
  124. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( dv, fv, n, tol );
  125. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cfv, cdv, n, tol );
  126. BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cdv, cfv, n, tol );
  127. }
  128. BOOST_UBLAS_TEST_DEF( check_vector_rel_close )
  129. {
  130. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_rel_close'" );
  131. const std::size_t n(5);
  132. const float c1(1*mul);
  133. const float c2(2*mul);
  134. ublas::vector<float> fv = ublas::scalar_vector<float>(n, c1);
  135. ublas::vector<double> dv = ublas::scalar_vector<double>(n, c1);
  136. ublas::vector< std::complex<float> > cfv = ublas::scalar_vector< std::complex<float> >(n, std::complex<float>(c1,c2));
  137. ublas::vector< std::complex<double> > cdv = ublas::scalar_vector< std::complex<double> >(n, std::complex<double>(c1,c2));
  138. // Check T vs. T
  139. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  140. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( fv, fv, n, tol );
  141. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( dv, dv, n, tol );
  142. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cfv, cfv, n, tol );
  143. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cdv, cdv, n, tol );
  144. // Check T1 vs. T2
  145. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  146. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( fv, dv, n, tol );
  147. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( dv, fv, n, tol );
  148. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cfv, cdv, n, tol );
  149. BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cdv, cfv, n, tol );
  150. }
  151. BOOST_UBLAS_TEST_DEF( check_matrix_eq )
  152. {
  153. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_eq'" );
  154. const std::size_t nr(3);
  155. const std::size_t nc(4);
  156. ublas::matrix<short> sv = ublas::scalar_matrix<short>(nr, nc, 1);
  157. ublas::matrix<int> iv = ublas::scalar_matrix<int>(nr, nc, 1);
  158. ublas::matrix<long> lv = ublas::scalar_matrix<long>(nr, nc, 1L);
  159. ublas::matrix<unsigned> uv = ublas::scalar_matrix<unsigned>(nr, nc, 1u);
  160. // Check T vs. T
  161. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  162. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( sv, sv, nr, nc );
  163. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, iv, nr, nc );
  164. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( lv, lv, nr, nc );
  165. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( uv, uv, nr, nc );
  166. // Check T1 vs. T2
  167. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  168. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( sv, iv, nr, nc );
  169. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, sv, nr, nc );
  170. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, lv, nr, nc );
  171. BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( lv, iv, nr, nc );
  172. }
  173. BOOST_UBLAS_TEST_DEF( check_matrix_close )
  174. {
  175. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_close'" );
  176. const std::size_t nr(3);
  177. const std::size_t nc(4);
  178. const float c1(1*mul);
  179. const float c2(2*mul);
  180. ublas::matrix<float> fA = ublas::scalar_matrix<float>(nr, nc, c1);
  181. ublas::matrix<double> dA = ublas::scalar_matrix<double>(nr, nc, c1);
  182. ublas::matrix< std::complex<float> > cfA = ublas::scalar_matrix< std::complex<float> >(nr, nc, std::complex<float>(c1,c2));
  183. ublas::matrix< std::complex<double> > cdA = ublas::scalar_matrix< std::complex<double> >(nr, nc, std::complex<double>(c1,c2));
  184. // Check T vs. T
  185. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  186. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( fA, fA, nr, nc, tol );
  187. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( dA, dA, nr, nc, tol );
  188. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cfA, cfA, nr, nc, tol );
  189. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cdA, cdA, nr, nc, tol );
  190. // Check T1 vs. T2
  191. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  192. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( fA, dA, nr, nc, tol );
  193. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( dA, fA, nr, nc, tol );
  194. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cfA, cdA, nr, nc, tol );
  195. BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cdA, cfA, nr, nc, tol );
  196. }
  197. BOOST_UBLAS_TEST_DEF( check_matrix_rel_close )
  198. {
  199. BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_rel_close'" );
  200. const std::size_t nr(3);
  201. const std::size_t nc(4);
  202. const float c1(1*mul);
  203. const float c2(2*mul);
  204. ublas::matrix<float> fA = ublas::scalar_matrix<float>(nr, nc, c1);
  205. ublas::matrix<double> dA = ublas::scalar_matrix<double>(nr, nc, c1);
  206. ublas::matrix< std::complex<float> > cfA = ublas::scalar_matrix< std::complex<float> >(nr, nc, std::complex<float>(c1,c2));
  207. ublas::matrix< std::complex<double> > cdA = ublas::scalar_matrix< std::complex<double> >(nr, nc, std::complex<double>(c1,c2));
  208. // Check T vs. T
  209. BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." );
  210. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( fA, fA, nr, nc, tol );
  211. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( dA, dA, nr, nc, tol );
  212. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cfA, cfA, nr, nc, tol );
  213. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cdA, cdA, nr, nc, tol );
  214. // Check T1 vs. T2
  215. BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." );
  216. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( fA, dA, nr, nc, tol );
  217. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( dA, fA, nr, nc, tol );
  218. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cfA, cdA, nr, nc, tol );
  219. BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cdA, cfA, nr, nc, tol );
  220. }
  221. int main()
  222. {
  223. BOOST_UBLAS_TEST_SUITE( "Test 'utils.hpp' functionalities" );
  224. BOOST_UBLAS_TEST_BEGIN();
  225. BOOST_UBLAS_TEST_DO( check );
  226. BOOST_UBLAS_TEST_DO( check_eq );
  227. BOOST_UBLAS_TEST_DO( check_close );
  228. BOOST_UBLAS_TEST_DO( check_rel_close );
  229. BOOST_UBLAS_TEST_DO( check_vector_eq );
  230. BOOST_UBLAS_TEST_DO( check_vector_close );
  231. BOOST_UBLAS_TEST_DO( check_vector_rel_close );
  232. BOOST_UBLAS_TEST_DO( check_matrix_eq );
  233. BOOST_UBLAS_TEST_DO( check_matrix_close );
  234. BOOST_UBLAS_TEST_DO( check_matrix_rel_close );
  235. BOOST_UBLAS_TEST_END();
  236. }