1 // Copyright 2015-2018 Hans Dembinski
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)
7 #include <boost/core/lightweight_test.hpp>
8 #include <boost/histogram/algorithm/project.hpp>
9 #include <boost/histogram/algorithm/sum.hpp>
10 #include <boost/histogram/axis/integer.hpp>
11 #include <boost/histogram/axis/ostream.hpp>
12 #include <boost/histogram/literals.hpp>
13 #include <boost/histogram/ostream.hpp>
15 #include "throw_exception.hpp"
16 #include "utility_histogram.hpp"
18 using namespace boost::histogram;
19 using namespace boost::histogram::literals; // to get _c suffix
20 using namespace boost::histogram::algorithm;
22 template <typename Tag>
25 auto h = make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
42 auto hx = project(h, 0_c);
43 BOOST_TEST_EQ(hx.rank(), 1);
44 BOOST_TEST_EQ(sum(hx), 6);
45 BOOST_TEST_EQ(hx.axis(), h.axis(0_c));
46 BOOST_TEST_EQ(hx.at(0), 2);
47 BOOST_TEST_EQ(hx.at(1), 4);
49 auto hy = project(h, 1_c);
50 BOOST_TEST_EQ(hy.rank(), 1);
51 BOOST_TEST_EQ(sum(hy), 6);
52 BOOST_TEST_EQ(hy.axis(), h.axis(1_c));
53 BOOST_TEST_EQ(hy.at(0), 2);
54 BOOST_TEST_EQ(hy.at(1), 2);
55 BOOST_TEST_EQ(hy.at(2), 2);
57 auto hyx = project(h, 1_c, 0_c);
58 BOOST_TEST_EQ(hyx.rank(), 2);
59 BOOST_TEST_EQ(sum(hyx), 6);
60 BOOST_TEST_EQ(hyx.axis(0_c), h.axis(1_c));
61 BOOST_TEST_EQ(hyx.axis(1_c), h.axis(0_c));
62 BOOST_TEST_EQ(hyx.at(0, 0), 1);
63 BOOST_TEST_EQ(hyx.at(1, 0), 1);
64 BOOST_TEST_EQ(hyx.at(2, 0), 0);
65 BOOST_TEST_EQ(hyx.at(0, 1), 1);
66 BOOST_TEST_EQ(hyx.at(1, 1), 1);
67 BOOST_TEST_EQ(hyx.at(2, 1), 2);
72 make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3), axis::integer<>(0, 4));
79 auto h_0 = project(h, 0_c);
80 BOOST_TEST_EQ(h_0.rank(), 1);
81 BOOST_TEST_EQ(sum(h_0), 5);
82 BOOST_TEST_EQ(h_0.at(0), 4);
83 BOOST_TEST_EQ(h_0.at(1), 1);
84 BOOST_TEST_EQ(h_0.axis(), axis::integer<>(0, 2));
86 auto h_1 = project(h, 1_c);
87 BOOST_TEST_EQ(h_1.rank(), 1);
88 BOOST_TEST_EQ(sum(h_1), 5);
89 BOOST_TEST_EQ(h_1.at(0), 3);
90 BOOST_TEST_EQ(h_1.at(1), 2);
91 BOOST_TEST_EQ(h_1.axis(), axis::integer<>(0, 3));
93 auto h_2 = project(h, 2_c);
94 BOOST_TEST_EQ(h_2.rank(), 1);
95 BOOST_TEST_EQ(sum(h_2), 5);
96 BOOST_TEST_EQ(h_2.at(0), 2);
97 BOOST_TEST_EQ(h_2.at(1), 1);
98 BOOST_TEST_EQ(h_2.at(2), 2);
99 BOOST_TEST_EQ(h_2.axis(), axis::integer<>(0, 4));
101 auto h_01 = project(h, 0_c, 1_c);
102 BOOST_TEST_EQ(h_01.rank(), 2);
103 BOOST_TEST_EQ(sum(h_01), 5);
104 BOOST_TEST_EQ(h_01.at(0, 0), 2);
105 BOOST_TEST_EQ(h_01.at(0, 1), 2);
106 BOOST_TEST_EQ(h_01.at(1, 0), 1);
107 BOOST_TEST_EQ(h_01.axis(0_c), axis::integer<>(0, 2));
108 BOOST_TEST_EQ(h_01.axis(1_c), axis::integer<>(0, 3));
110 auto h_02 = project(h, 0_c, 2_c);
111 BOOST_TEST_EQ(h_02.rank(), 2);
112 BOOST_TEST_EQ(sum(h_02), 5);
113 BOOST_TEST_EQ(h_02.at(0, 0), 2);
114 BOOST_TEST_EQ(h_02.at(0, 1), 1);
115 BOOST_TEST_EQ(h_02.at(0, 2), 1);
116 BOOST_TEST_EQ(h_02.at(1, 2), 1);
117 BOOST_TEST_EQ(h_02.axis(0_c), axis::integer<>(0, 2));
118 BOOST_TEST_EQ(h_02.axis(1_c), axis::integer<>(0, 4));
120 auto h_12 = project(h, 1_c, 2_c);
121 BOOST_TEST_EQ(h_12.rank(), 2);
122 BOOST_TEST_EQ(sum(h_12), 5);
123 BOOST_TEST_EQ(h_12.at(0, 0), 1);
124 BOOST_TEST_EQ(h_12.at(1, 0), 1);
125 BOOST_TEST_EQ(h_12.at(1, 1), 1);
126 BOOST_TEST_EQ(h_12.at(0, 2), 2);
127 BOOST_TEST_EQ(h_12.axis(0_c), axis::integer<>(0, 3));
128 BOOST_TEST_EQ(h_12.axis(1_c), axis::integer<>(0, 4));
130 auto h_210 = project(h, 2_c, 1_c, 0_c);
131 BOOST_TEST_EQ(h_210.at(0, 0, 0), 1);
132 BOOST_TEST_EQ(h_210.at(0, 1, 0), 1);
133 BOOST_TEST_EQ(h_210.at(1, 1, 0), 1);
134 BOOST_TEST_EQ(h_210.at(2, 0, 0), 1);
135 BOOST_TEST_EQ(h_210.at(2, 0, 1), 1);
139 auto h = make(dynamic_tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
150 auto hx = project(h, x);
151 BOOST_TEST_EQ(hx.rank(), 1);
152 BOOST_TEST_EQ(sum(hx), 6);
153 BOOST_TEST_EQ(hx.at(0), 2);
154 BOOST_TEST_EQ(hx.at(1), 4);
155 BOOST_TEST(hx.axis() == h.axis(0_c));
158 auto hy = project(h, x);
159 BOOST_TEST_EQ(hy.rank(), 1);
160 BOOST_TEST_EQ(sum(hy), 6);
161 BOOST_TEST_EQ(hy.at(0), 2);
162 BOOST_TEST_EQ(hy.at(1), 2);
163 BOOST_TEST_EQ(hy.at(2), 2);
164 BOOST_TEST(hy.axis() == h.axis(1_c));
167 auto hyx = project(h, x);
168 BOOST_TEST_EQ(hyx.rank(), 2);
169 BOOST_TEST_EQ(hyx.axis(0_c), h.axis(1_c));
170 BOOST_TEST_EQ(hyx.axis(1_c), h.axis(0_c));
171 BOOST_TEST_EQ(sum(hyx), 6);
172 BOOST_TEST_EQ(hyx.at(0, 0), 1);
173 BOOST_TEST_EQ(hyx.at(1, 0), 1);
174 BOOST_TEST_EQ(hyx.at(0, 1), 1);
175 BOOST_TEST_EQ(hyx.at(1, 1), 1);
176 BOOST_TEST_EQ(hyx.at(2, 1), 2);
178 // indices must be unique
180 BOOST_TEST_THROWS((void)project(h, x), std::invalid_argument);
182 // indices must be valid
184 BOOST_TEST_THROWS((void)project(h, x), std::invalid_argument);
189 run_tests<static_tag>();
190 run_tests<dynamic_tag>();
192 return boost::report_errors();