lifted condition that indices must be rising

This commit is contained in:
Hans Dembinski
2018-11-12 21:56:58 +01:00
parent fd31f06729
commit 7e23f3da7b
5 changed files with 141 additions and 126 deletions

View File

@@ -7,6 +7,7 @@
#include <boost/core/lightweight_test.hpp>
#include <boost/histogram/algorithm/project.hpp>
#include <boost/histogram/axis/integer.hpp>
#include <boost/histogram/axis/ostream_operators.hpp>
#include <boost/histogram/literals.hpp>
#include <vector>
#include "utility_histogram.hpp"
@@ -17,97 +18,119 @@ using boost::histogram::algorithm::project;
template <typename Tag>
void run_tests() {
auto h1 = make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
h1(0, 0);
h1(0, 1);
h1(1, 0);
h1(1, 1);
h1(1, 2);
{
auto h = make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
h(0, 0);
h(0, 1);
h(1, 0);
h(1, 1);
h(1, 2);
h(1, 2);
/*
matrix layout:
/*
matrix layout:
0 ->
1 1 1 0 0
| 1 1 0 0
v 0 1 0 0
0 0 0 0
0 0 0 0
*/
x ->
y 1 1
| 1 1
v 0 2
*/
auto h1_0 = project(h1, 0_c);
BOOST_TEST_EQ(h1_0.rank(), 1);
BOOST_TEST_EQ(sum(h1_0), 5);
BOOST_TEST_EQ(h1_0.at(0), 2);
BOOST_TEST_EQ(h1_0.at(1), 3);
BOOST_TEST(h1_0.axis() == h1.axis(0_c));
auto hx = project(h, 0_c);
BOOST_TEST_EQ(hx.rank(), 1);
BOOST_TEST_EQ(sum(hx), 6);
BOOST_TEST_EQ(hx.axis(), h.axis(0_c));
BOOST_TEST_EQ(hx.at(0), 2);
BOOST_TEST_EQ(hx.at(1), 4);
auto h1_1 = project(h1, 1_c);
BOOST_TEST_EQ(h1_1.rank(), 1);
BOOST_TEST_EQ(sum(h1_1), 5);
BOOST_TEST_EQ(h1_1.at(0), 2);
BOOST_TEST_EQ(h1_1.at(1), 2);
BOOST_TEST_EQ(h1_1.at(2), 1);
BOOST_TEST(h1_1.axis() == h1.axis(1_c));
auto hy = project(h, 1_c);
BOOST_TEST_EQ(hy.rank(), 1);
BOOST_TEST_EQ(sum(hy), 6);
BOOST_TEST_EQ(hy.axis(), h.axis(1_c));
BOOST_TEST_EQ(hy.at(0), 2);
BOOST_TEST_EQ(hy.at(1), 2);
BOOST_TEST_EQ(hy.at(2), 2);
auto h2 =
make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3), axis::integer<>(0, 4));
h2(0, 0, 0);
h2(0, 1, 0);
h2(0, 1, 1);
h2(0, 0, 2);
h2(1, 0, 2);
auto hyx = project(h, 1_c, 0_c);
BOOST_TEST_EQ(hyx.rank(), 2);
BOOST_TEST_EQ(sum(hyx), 6);
BOOST_TEST_EQ(hyx.axis(0_c), h.axis(1_c));
BOOST_TEST_EQ(hyx.axis(1_c), h.axis(0_c));
BOOST_TEST_EQ(hyx.at(0, 0), 1);
BOOST_TEST_EQ(hyx.at(1, 0), 1);
BOOST_TEST_EQ(hyx.at(2, 0), 0);
BOOST_TEST_EQ(hyx.at(0, 1), 1);
BOOST_TEST_EQ(hyx.at(1, 1), 1);
BOOST_TEST_EQ(hyx.at(2, 1), 2);
}
auto h2_0 = project(h2, 0_c);
BOOST_TEST_EQ(h2_0.rank(), 1);
BOOST_TEST_EQ(sum(h2_0), 5);
BOOST_TEST_EQ(h2_0.at(0), 4);
BOOST_TEST_EQ(h2_0.at(1), 1);
BOOST_TEST(h2_0.axis() == axis::integer<>(0, 2));
{
auto h =
make(Tag(), axis::integer<>(0, 2), axis::integer<>(0, 3), axis::integer<>(0, 4));
h(0, 0, 0);
h(0, 1, 0);
h(0, 1, 1);
h(0, 0, 2);
h(1, 0, 2);
auto h2_1 = project(h2, 1_c);
BOOST_TEST_EQ(h2_1.rank(), 1);
BOOST_TEST_EQ(sum(h2_1), 5);
BOOST_TEST_EQ(h2_1.at(0), 3);
BOOST_TEST_EQ(h2_1.at(1), 2);
BOOST_TEST(h2_1.axis() == axis::integer<>(0, 3));
auto h_0 = project(h, 0_c);
BOOST_TEST_EQ(h_0.rank(), 1);
BOOST_TEST_EQ(sum(h_0), 5);
BOOST_TEST_EQ(h_0.at(0), 4);
BOOST_TEST_EQ(h_0.at(1), 1);
BOOST_TEST_EQ(h_0.axis(), axis::integer<>(0, 2));
auto h2_2 = project(h2, 2_c);
BOOST_TEST_EQ(h2_2.rank(), 1);
BOOST_TEST_EQ(sum(h2_2), 5);
BOOST_TEST_EQ(h2_2.at(0), 2);
BOOST_TEST_EQ(h2_2.at(1), 1);
BOOST_TEST_EQ(h2_2.at(2), 2);
BOOST_TEST(h2_2.axis() == axis::integer<>(0, 4));
auto h_1 = project(h, 1_c);
BOOST_TEST_EQ(h_1.rank(), 1);
BOOST_TEST_EQ(sum(h_1), 5);
BOOST_TEST_EQ(h_1.at(0), 3);
BOOST_TEST_EQ(h_1.at(1), 2);
BOOST_TEST_EQ(h_1.axis(), axis::integer<>(0, 3));
auto h2_01 = project(h2, 0_c, 1_c);
BOOST_TEST_EQ(h2_01.rank(), 2);
BOOST_TEST_EQ(sum(h2_01), 5);
BOOST_TEST_EQ(h2_01.at(0, 0), 2);
BOOST_TEST_EQ(h2_01.at(0, 1), 2);
BOOST_TEST_EQ(h2_01.at(1, 0), 1);
BOOST_TEST(h2_01.axis(0_c) == axis::integer<>(0, 2));
BOOST_TEST(h2_01.axis(1_c) == axis::integer<>(0, 3));
auto h_2 = project(h, 2_c);
BOOST_TEST_EQ(h_2.rank(), 1);
BOOST_TEST_EQ(sum(h_2), 5);
BOOST_TEST_EQ(h_2.at(0), 2);
BOOST_TEST_EQ(h_2.at(1), 1);
BOOST_TEST_EQ(h_2.at(2), 2);
BOOST_TEST_EQ(h_2.axis(), axis::integer<>(0, 4));
auto h2_02 = project(h2, 0_c, 2_c);
BOOST_TEST_EQ(h2_02.rank(), 2);
BOOST_TEST_EQ(sum(h2_02), 5);
BOOST_TEST_EQ(h2_02.at(0, 0), 2);
BOOST_TEST_EQ(h2_02.at(0, 1), 1);
BOOST_TEST_EQ(h2_02.at(0, 2), 1);
BOOST_TEST_EQ(h2_02.at(1, 2), 1);
BOOST_TEST(h2_02.axis(0_c) == axis::integer<>(0, 2));
BOOST_TEST(h2_02.axis(1_c) == axis::integer<>(0, 4));
auto h_01 = project(h, 0_c, 1_c);
BOOST_TEST_EQ(h_01.rank(), 2);
BOOST_TEST_EQ(sum(h_01), 5);
BOOST_TEST_EQ(h_01.at(0, 0), 2);
BOOST_TEST_EQ(h_01.at(0, 1), 2);
BOOST_TEST_EQ(h_01.at(1, 0), 1);
BOOST_TEST_EQ(h_01.axis(0_c), axis::integer<>(0, 2));
BOOST_TEST_EQ(h_01.axis(1_c), axis::integer<>(0, 3));
auto h2_12 = project(h2, 1_c, 2_c);
BOOST_TEST_EQ(h2_12.rank(), 2);
BOOST_TEST_EQ(sum(h2_12), 5);
BOOST_TEST_EQ(h2_12.at(0, 0), 1);
BOOST_TEST_EQ(h2_12.at(1, 0), 1);
BOOST_TEST_EQ(h2_12.at(1, 1), 1);
BOOST_TEST_EQ(h2_12.at(0, 2), 2);
BOOST_TEST(h2_12.axis(0_c) == axis::integer<>(0, 3));
BOOST_TEST(h2_12.axis(1_c) == axis::integer<>(0, 4));
auto h_02 = project(h, 0_c, 2_c);
BOOST_TEST_EQ(h_02.rank(), 2);
BOOST_TEST_EQ(sum(h_02), 5);
BOOST_TEST_EQ(h_02.at(0, 0), 2);
BOOST_TEST_EQ(h_02.at(0, 1), 1);
BOOST_TEST_EQ(h_02.at(0, 2), 1);
BOOST_TEST_EQ(h_02.at(1, 2), 1);
BOOST_TEST_EQ(h_02.axis(0_c), axis::integer<>(0, 2));
BOOST_TEST_EQ(h_02.axis(1_c), axis::integer<>(0, 4));
auto h_12 = project(h, 1_c, 2_c);
BOOST_TEST_EQ(h_12.rank(), 2);
BOOST_TEST_EQ(sum(h_12), 5);
BOOST_TEST_EQ(h_12.at(0, 0), 1);
BOOST_TEST_EQ(h_12.at(1, 0), 1);
BOOST_TEST_EQ(h_12.at(1, 1), 1);
BOOST_TEST_EQ(h_12.at(0, 2), 2);
BOOST_TEST_EQ(h_12.axis(0_c), axis::integer<>(0, 3));
BOOST_TEST_EQ(h_12.axis(1_c), axis::integer<>(0, 4));
auto h_210 = project(h, 2_c, 1_c, 0_c);
BOOST_TEST_EQ(h_210.at(0, 0, 0), 1);
BOOST_TEST_EQ(h_210.at(0, 1, 0), 1);
BOOST_TEST_EQ(h_210.at(1, 1, 0), 1);
BOOST_TEST_EQ(h_210.at(2, 0, 0), 1);
BOOST_TEST_EQ(h_210.at(2, 0, 1), 1);
}
}
int main() {
@@ -115,31 +138,44 @@ int main() {
run_tests<dynamic_tag>();
{
auto h1 = make(dynamic_tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
h1(0, 0);
h1(0, 1);
h1(1, 0);
h1(1, 1);
h1(1, 2);
auto h = make(dynamic_tag(), axis::integer<>(0, 2), axis::integer<>(0, 3));
h(0, 0);
h(0, 1);
h(1, 0);
h(1, 1);
h(1, 2);
h(1, 2);
std::vector<int> x;
x = {0};
auto h1_0 = project(h1, x.begin(), x.end());
BOOST_TEST_EQ(h1_0.rank(), 1);
BOOST_TEST_EQ(sum(h1_0), 5);
BOOST_TEST_EQ(h1_0.at(0), 2);
BOOST_TEST_EQ(h1_0.at(1), 3);
BOOST_TEST(h1_0.axis() == h1.axis(0_c));
auto hx = project(h, x.begin(), x.end());
BOOST_TEST_EQ(hx.rank(), 1);
BOOST_TEST_EQ(sum(hx), 6);
BOOST_TEST_EQ(hx.at(0), 2);
BOOST_TEST_EQ(hx.at(1), 4);
BOOST_TEST(hx.axis() == h.axis(0_c));
x = {1};
auto h1_1 = project(h1, x.begin(), x.end());
BOOST_TEST_EQ(h1_1.rank(), 1);
BOOST_TEST_EQ(sum(h1_1), 5);
BOOST_TEST_EQ(h1_1.at(0), 2);
BOOST_TEST_EQ(h1_1.at(1), 2);
BOOST_TEST_EQ(h1_1.at(2), 1);
BOOST_TEST(h1_1.axis() == h1.axis(1_c));
auto hy = project(h, x.begin(), x.end());
BOOST_TEST_EQ(hy.rank(), 1);
BOOST_TEST_EQ(sum(hy), 6);
BOOST_TEST_EQ(hy.at(0), 2);
BOOST_TEST_EQ(hy.at(1), 2);
BOOST_TEST_EQ(hy.at(2), 2);
BOOST_TEST(hy.axis() == h.axis(1_c));
x = {1, 0};
auto hyx = project(h, x.begin(), x.end());
BOOST_TEST_EQ(hyx.rank(), 2);
BOOST_TEST_EQ(hyx.axis(0_c), h.axis(1_c));
BOOST_TEST_EQ(hyx.axis(1_c), h.axis(0_c));
BOOST_TEST_EQ(sum(hyx), 6);
BOOST_TEST_EQ(hyx.at(0, 0), 1);
BOOST_TEST_EQ(hyx.at(1, 0), 1);
BOOST_TEST_EQ(hyx.at(0, 1), 1);
BOOST_TEST_EQ(hyx.at(1, 1), 1);
BOOST_TEST_EQ(hyx.at(2, 1), 2);
}
return boost::report_errors();