Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / histogram / test / algorithm_project_test.cpp
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
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>
14 #include <vector>
15 #include "throw_exception.hpp"
16 #include "utility_histogram.hpp"
17
18 using namespace boost::histogram;
19 using namespace boost::histogram::literals; // to get _c suffix
20 using namespace boost::histogram::algorithm;
21
22 template <typename Tag>
23 void run_tests() {
24   {
25     auto h = make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
26     h(0, 0);
27     h(0, 1);
28     h(1, 0);
29     h(1, 1);
30     h(1, 2);
31     h(1, 2);
32
33     /*
34       matrix layout:
35
36       x ->
37     y 1 1
38     | 1 1
39     v 0 2
40     */
41
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);
48
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);
56
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);
68   }
69
70   {
71     auto h =
72         make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3), axis::integer<>(0, 4));
73     h(0, 0, 0);
74     h(0, 1, 0);
75     h(0, 1, 1);
76     h(0, 0, 2);
77     h(1, 0, 2);
78
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));
85
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));
92
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));
100
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));
109
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));
119
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));
129
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);
136   }
137
138   {
139     auto h = make(dynamic_tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
140     h(0, 0);
141     h(0, 1);
142     h(1, 0);
143     h(1, 1);
144     h(1, 2);
145     h(1, 2);
146
147     std::vector<int> x;
148
149     x = {0};
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));
156
157     x = {1};
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));
165
166     x = {1, 0};
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);
177
178     // indices must be unique
179     x = {0, 0};
180     BOOST_TEST_THROWS((void)project(h, x), std::invalid_argument);
181
182     // indices must be valid
183     x = {2, 1};
184     BOOST_TEST_THROWS((void)project(h, x), std::invalid_argument);
185   }
186 }
187
188 int main() {
189   run_tests<static_tag>();
190   run_tests<dynamic_tag>();
191
192   return boost::report_errors();
193 }