test_strides.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Copyright (c) 2018-2019 Cem Bassoy
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // The authors gratefully acknowledge the support of
  8. // Fraunhofer and Google in producing this work
  9. // which started as a Google Summer of Code project.
  10. //
  11. #include <boost/test/unit_test.hpp>
  12. #include <boost/numeric/ublas/tensor/strides.hpp>
  13. #include <boost/numeric/ublas/tensor/extents.hpp>
  14. //BOOST_AUTO_TEST_SUITE(test_strides, * boost::unit_test::depends_on("test_extents"));
  15. BOOST_AUTO_TEST_SUITE(test_strides)
  16. using test_types = std::tuple<boost::numeric::ublas::first_order, boost::numeric::ublas::last_order>;
  17. BOOST_AUTO_TEST_CASE_TEMPLATE( test_strides_ctor, value, test_types)
  18. {
  19. using namespace boost::numeric;
  20. using extents_type = ublas::basic_extents<unsigned>;
  21. using strides_type = ublas::strides<value>;
  22. strides_type s0{};
  23. BOOST_CHECK ( s0.empty());
  24. BOOST_CHECK_EQUAL ( s0.size(), 0);
  25. strides_type s1{extents_type{1,1}};
  26. BOOST_CHECK (!s1.empty());
  27. BOOST_CHECK_EQUAL ( s1.size(), 2);
  28. strides_type s2{extents_type{1,2}};
  29. BOOST_CHECK (!s2.empty());
  30. BOOST_CHECK_EQUAL ( s2.size(), 2);
  31. strides_type s3{extents_type{2,1}};
  32. BOOST_CHECK (!s3.empty());
  33. BOOST_CHECK_EQUAL ( s3.size(), 2);
  34. strides_type s4{extents_type{2,3}};
  35. BOOST_CHECK (!s4.empty());
  36. BOOST_CHECK_EQUAL ( s4.size(), 2);
  37. strides_type s5{extents_type{2,3,1}};
  38. BOOST_CHECK (!s5.empty());
  39. BOOST_CHECK_EQUAL ( s5.size(), 3);
  40. strides_type s6{extents_type{1,2,3}};
  41. BOOST_CHECK (!s6.empty());
  42. BOOST_CHECK_EQUAL ( s6.size(), 3);
  43. strides_type s7{extents_type{4,2,3}};
  44. BOOST_CHECK (!s7.empty());
  45. BOOST_CHECK_EQUAL ( s7.size(), 3);
  46. }
  47. BOOST_AUTO_TEST_CASE( test_strides_ctor_access_first_order)
  48. {
  49. using namespace boost::numeric;
  50. using extents_type = ublas::basic_extents<unsigned>;
  51. using strides_type = ublas::strides<ublas::first_order>;
  52. strides_type s1{extents_type{1,1}};
  53. BOOST_REQUIRE_EQUAL( s1.size(),2);
  54. BOOST_CHECK_EQUAL ( s1[0], 1);
  55. BOOST_CHECK_EQUAL ( s1[1], 1);
  56. strides_type s2{extents_type{1,2}};
  57. BOOST_REQUIRE_EQUAL ( s2.size(),2);
  58. BOOST_CHECK_EQUAL ( s2[0], 1);
  59. BOOST_CHECK_EQUAL ( s2[1], 1);
  60. strides_type s3{extents_type{2,1}};
  61. BOOST_REQUIRE_EQUAL ( s3.size(),2);
  62. BOOST_CHECK_EQUAL ( s3[0], 1);
  63. BOOST_CHECK_EQUAL ( s3[1], 1);
  64. strides_type s4{extents_type{2,3}};
  65. BOOST_REQUIRE_EQUAL ( s4.size(),2);
  66. BOOST_CHECK_EQUAL ( s4[0], 1);
  67. BOOST_CHECK_EQUAL ( s4[1], 2);
  68. strides_type s5{extents_type{2,3,1}};
  69. BOOST_REQUIRE_EQUAL ( s5.size(),3);
  70. BOOST_CHECK_EQUAL ( s5[0], 1);
  71. BOOST_CHECK_EQUAL ( s5[1], 2);
  72. BOOST_CHECK_EQUAL ( s5[2], 6);
  73. strides_type s6{extents_type{1,2,3}};
  74. BOOST_REQUIRE_EQUAL ( s6.size(),3);
  75. BOOST_CHECK_EQUAL ( s6[0], 1);
  76. BOOST_CHECK_EQUAL ( s6[1], 1);
  77. BOOST_CHECK_EQUAL ( s6[2], 2);
  78. strides_type s7{extents_type{2,1,3}};
  79. BOOST_REQUIRE_EQUAL ( s7.size(),3);
  80. BOOST_CHECK_EQUAL ( s7[0], 1);
  81. BOOST_CHECK_EQUAL ( s7[1], 2);
  82. BOOST_CHECK_EQUAL ( s7[2], 2);
  83. strides_type s8{extents_type{4,2,3}};
  84. BOOST_REQUIRE_EQUAL ( s8.size(),3);
  85. BOOST_CHECK_EQUAL ( s8[0], 1);
  86. BOOST_CHECK_EQUAL ( s8[1], 4);
  87. BOOST_CHECK_EQUAL ( s8[2], 8);
  88. }
  89. BOOST_AUTO_TEST_CASE( test_strides_ctor_access_last_order)
  90. {
  91. using namespace boost::numeric;
  92. using extents_type = ublas::basic_extents<unsigned>;
  93. using strides_type = ublas::strides<ublas::last_order>;
  94. strides_type s1{extents_type{1,1}};
  95. BOOST_REQUIRE_EQUAL( s1.size(),2);
  96. BOOST_CHECK_EQUAL ( s1[0], 1);
  97. BOOST_CHECK_EQUAL ( s1[1], 1);
  98. strides_type s2{extents_type{1,2}};
  99. BOOST_REQUIRE_EQUAL ( s2.size(),2);
  100. BOOST_CHECK_EQUAL ( s2[0], 1);
  101. BOOST_CHECK_EQUAL ( s2[1], 1);
  102. strides_type s3{extents_type{2,1}};
  103. BOOST_REQUIRE_EQUAL ( s3.size(),2);
  104. BOOST_CHECK_EQUAL ( s3[0], 1);
  105. BOOST_CHECK_EQUAL ( s3[1], 1);
  106. strides_type s4{extents_type{2,3}};
  107. BOOST_REQUIRE_EQUAL ( s4.size(),2);
  108. BOOST_CHECK_EQUAL ( s4[0], 3);
  109. BOOST_CHECK_EQUAL ( s4[1], 1);
  110. strides_type s5{extents_type{2,3,1}};
  111. BOOST_REQUIRE_EQUAL ( s5.size(),3);
  112. BOOST_CHECK_EQUAL ( s5[0], 3);
  113. BOOST_CHECK_EQUAL ( s5[1], 1);
  114. BOOST_CHECK_EQUAL ( s5[2], 1);
  115. strides_type s6{extents_type{1,2,3}};
  116. BOOST_REQUIRE_EQUAL ( s6.size(),3);
  117. BOOST_CHECK_EQUAL ( s6[0], 6);
  118. BOOST_CHECK_EQUAL ( s6[1], 3);
  119. BOOST_CHECK_EQUAL ( s6[2], 1);
  120. strides_type s7{extents_type{2,1,3}};
  121. BOOST_REQUIRE_EQUAL ( s7.size(),3);
  122. BOOST_CHECK_EQUAL ( s7[0], 3);
  123. BOOST_CHECK_EQUAL ( s7[1], 3);
  124. BOOST_CHECK_EQUAL ( s7[2], 1);
  125. strides_type s8{extents_type{4,2,3}};
  126. BOOST_REQUIRE_EQUAL ( s8.size(),3);
  127. BOOST_CHECK_EQUAL ( s8[0], 6);
  128. BOOST_CHECK_EQUAL ( s8[1], 3);
  129. BOOST_CHECK_EQUAL ( s8[2], 1);
  130. }
  131. BOOST_AUTO_TEST_SUITE_END()