algorithm_project_test.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // Copyright 2015-2018 Hans Dembinski
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/core/lightweight_test.hpp>
  7. #include <boost/histogram/algorithm/project.hpp>
  8. #include <boost/histogram/algorithm/sum.hpp>
  9. #include <boost/histogram/axis/integer.hpp>
  10. #include <boost/histogram/axis/ostream.hpp>
  11. #include <boost/histogram/literals.hpp>
  12. #include <boost/histogram/ostream.hpp>
  13. #include <vector>
  14. #include "throw_exception.hpp"
  15. #include "utility_histogram.hpp"
  16. using namespace boost::histogram;
  17. using namespace boost::histogram::literals; // to get _c suffix
  18. using namespace boost::histogram::algorithm;
  19. template <typename Tag>
  20. void run_tests() {
  21. {
  22. auto h = make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
  23. h(0, 0);
  24. h(0, 1);
  25. h(1, 0);
  26. h(1, 1);
  27. h(1, 2);
  28. h(1, 2);
  29. /*
  30. matrix layout:
  31. x ->
  32. y 1 1
  33. | 1 1
  34. v 0 2
  35. */
  36. auto hx = project(h, 0_c);
  37. BOOST_TEST_EQ(hx.rank(), 1);
  38. BOOST_TEST_EQ(sum(hx), 6);
  39. BOOST_TEST_EQ(hx.axis(), h.axis(0_c));
  40. BOOST_TEST_EQ(hx.at(0), 2);
  41. BOOST_TEST_EQ(hx.at(1), 4);
  42. auto hy = project(h, 1_c);
  43. BOOST_TEST_EQ(hy.rank(), 1);
  44. BOOST_TEST_EQ(sum(hy), 6);
  45. BOOST_TEST_EQ(hy.axis(), h.axis(1_c));
  46. BOOST_TEST_EQ(hy.at(0), 2);
  47. BOOST_TEST_EQ(hy.at(1), 2);
  48. BOOST_TEST_EQ(hy.at(2), 2);
  49. auto hyx = project(h, 1_c, 0_c);
  50. BOOST_TEST_EQ(hyx.rank(), 2);
  51. BOOST_TEST_EQ(sum(hyx), 6);
  52. BOOST_TEST_EQ(hyx.axis(0_c), h.axis(1_c));
  53. BOOST_TEST_EQ(hyx.axis(1_c), h.axis(0_c));
  54. BOOST_TEST_EQ(hyx.at(0, 0), 1);
  55. BOOST_TEST_EQ(hyx.at(1, 0), 1);
  56. BOOST_TEST_EQ(hyx.at(2, 0), 0);
  57. BOOST_TEST_EQ(hyx.at(0, 1), 1);
  58. BOOST_TEST_EQ(hyx.at(1, 1), 1);
  59. BOOST_TEST_EQ(hyx.at(2, 1), 2);
  60. }
  61. {
  62. auto h =
  63. make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3), axis::integer<>(0, 4));
  64. h(0, 0, 0);
  65. h(0, 1, 0);
  66. h(0, 1, 1);
  67. h(0, 0, 2);
  68. h(1, 0, 2);
  69. auto h_0 = project(h, 0_c);
  70. BOOST_TEST_EQ(h_0.rank(), 1);
  71. BOOST_TEST_EQ(sum(h_0), 5);
  72. BOOST_TEST_EQ(h_0.at(0), 4);
  73. BOOST_TEST_EQ(h_0.at(1), 1);
  74. BOOST_TEST_EQ(h_0.axis(), axis::integer<>(0, 2));
  75. auto h_1 = project(h, 1_c);
  76. BOOST_TEST_EQ(h_1.rank(), 1);
  77. BOOST_TEST_EQ(sum(h_1), 5);
  78. BOOST_TEST_EQ(h_1.at(0), 3);
  79. BOOST_TEST_EQ(h_1.at(1), 2);
  80. BOOST_TEST_EQ(h_1.axis(), axis::integer<>(0, 3));
  81. auto h_2 = project(h, 2_c);
  82. BOOST_TEST_EQ(h_2.rank(), 1);
  83. BOOST_TEST_EQ(sum(h_2), 5);
  84. BOOST_TEST_EQ(h_2.at(0), 2);
  85. BOOST_TEST_EQ(h_2.at(1), 1);
  86. BOOST_TEST_EQ(h_2.at(2), 2);
  87. BOOST_TEST_EQ(h_2.axis(), axis::integer<>(0, 4));
  88. auto h_01 = project(h, 0_c, 1_c);
  89. BOOST_TEST_EQ(h_01.rank(), 2);
  90. BOOST_TEST_EQ(sum(h_01), 5);
  91. BOOST_TEST_EQ(h_01.at(0, 0), 2);
  92. BOOST_TEST_EQ(h_01.at(0, 1), 2);
  93. BOOST_TEST_EQ(h_01.at(1, 0), 1);
  94. BOOST_TEST_EQ(h_01.axis(0_c), axis::integer<>(0, 2));
  95. BOOST_TEST_EQ(h_01.axis(1_c), axis::integer<>(0, 3));
  96. auto h_02 = project(h, 0_c, 2_c);
  97. BOOST_TEST_EQ(h_02.rank(), 2);
  98. BOOST_TEST_EQ(sum(h_02), 5);
  99. BOOST_TEST_EQ(h_02.at(0, 0), 2);
  100. BOOST_TEST_EQ(h_02.at(0, 1), 1);
  101. BOOST_TEST_EQ(h_02.at(0, 2), 1);
  102. BOOST_TEST_EQ(h_02.at(1, 2), 1);
  103. BOOST_TEST_EQ(h_02.axis(0_c), axis::integer<>(0, 2));
  104. BOOST_TEST_EQ(h_02.axis(1_c), axis::integer<>(0, 4));
  105. auto h_12 = project(h, 1_c, 2_c);
  106. BOOST_TEST_EQ(h_12.rank(), 2);
  107. BOOST_TEST_EQ(sum(h_12), 5);
  108. BOOST_TEST_EQ(h_12.at(0, 0), 1);
  109. BOOST_TEST_EQ(h_12.at(1, 0), 1);
  110. BOOST_TEST_EQ(h_12.at(1, 1), 1);
  111. BOOST_TEST_EQ(h_12.at(0, 2), 2);
  112. BOOST_TEST_EQ(h_12.axis(0_c), axis::integer<>(0, 3));
  113. BOOST_TEST_EQ(h_12.axis(1_c), axis::integer<>(0, 4));
  114. auto h_210 = project(h, 2_c, 1_c, 0_c);
  115. BOOST_TEST_EQ(h_210.at(0, 0, 0), 1);
  116. BOOST_TEST_EQ(h_210.at(0, 1, 0), 1);
  117. BOOST_TEST_EQ(h_210.at(1, 1, 0), 1);
  118. BOOST_TEST_EQ(h_210.at(2, 0, 0), 1);
  119. BOOST_TEST_EQ(h_210.at(2, 0, 1), 1);
  120. }
  121. {
  122. auto h = make(dynamic_tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
  123. h(0, 0);
  124. h(0, 1);
  125. h(1, 0);
  126. h(1, 1);
  127. h(1, 2);
  128. h(1, 2);
  129. std::vector<int> x;
  130. x = {0};
  131. auto hx = project(h, x);
  132. BOOST_TEST_EQ(hx.rank(), 1);
  133. BOOST_TEST_EQ(sum(hx), 6);
  134. BOOST_TEST_EQ(hx.at(0), 2);
  135. BOOST_TEST_EQ(hx.at(1), 4);
  136. BOOST_TEST(hx.axis() == h.axis(0_c));
  137. x = {1};
  138. auto hy = project(h, x);
  139. BOOST_TEST_EQ(hy.rank(), 1);
  140. BOOST_TEST_EQ(sum(hy), 6);
  141. BOOST_TEST_EQ(hy.at(0), 2);
  142. BOOST_TEST_EQ(hy.at(1), 2);
  143. BOOST_TEST_EQ(hy.at(2), 2);
  144. BOOST_TEST(hy.axis() == h.axis(1_c));
  145. x = {1, 0};
  146. auto hyx = project(h, x);
  147. BOOST_TEST_EQ(hyx.rank(), 2);
  148. BOOST_TEST_EQ(hyx.axis(0_c), h.axis(1_c));
  149. BOOST_TEST_EQ(hyx.axis(1_c), h.axis(0_c));
  150. BOOST_TEST_EQ(sum(hyx), 6);
  151. BOOST_TEST_EQ(hyx.at(0, 0), 1);
  152. BOOST_TEST_EQ(hyx.at(1, 0), 1);
  153. BOOST_TEST_EQ(hyx.at(0, 1), 1);
  154. BOOST_TEST_EQ(hyx.at(1, 1), 1);
  155. BOOST_TEST_EQ(hyx.at(2, 1), 2);
  156. // indices must be unique
  157. x = {0, 0};
  158. BOOST_TEST_THROWS((void)project(h, x), std::invalid_argument);
  159. // indices must be valid
  160. x = {2, 1};
  161. BOOST_TEST_THROWS((void)project(h, x), std::invalid_argument);
  162. }
  163. }
  164. int main() {
  165. run_tests<static_tag>();
  166. run_tests<dynamic_tag>();
  167. return boost::report_errors();
  168. }