File: test_xhistogram.cpp

package info (click to toggle)
xtensor 0.25.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,476 kB
  • sloc: cpp: 65,302; makefile: 202; python: 171; javascript: 8
file content (116 lines) | stat: -rw-r--r-- 4,020 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/***************************************************************************
 * Copyright (c) Johan Mabille, Sylvain Corlay and Wolf Vollprecht          *
 * Copyright (c) QuantStack                                                 *
 *                                                                          *
 * Distributed under the terms of the BSD 3-Clause License.                 *
 *                                                                          *
 * The full license is in the file LICENSE, distributed with this software. *
 ****************************************************************************/

#include <complex>
#include <limits>

// For some obscure reason xtensor.hpp need to be included first for Windows' Clangcl
#include "xtensor/xtensor.hpp"
//
#include "xtensor/xhistogram.hpp"
#include "xtensor/xrandom.hpp"

#include "test_common_macros.hpp"

namespace xt
{
    TEST(xhistogram, histogram)
    {
        xt::xtensor<double, 1> data = {1., 1., 2., 2.};

        {
            xt::xtensor<double, 1> count = xt::histogram(data, std::size_t(2));

            EXPECT_EQ(count.size(), std::size_t(2));
            EXPECT_EQ(count(0), 2.);
            EXPECT_EQ(count(1), 2.);
        }

        {
            xt::xtensor<double, 1> count = xt::histogram(
                data,
                xt::histogram_bin_edges(data, std::size_t(2), xt::histogram_algorithm::uniform)
            );

            EXPECT_EQ(count.size(), std::size_t(2));
            EXPECT_EQ(count(0), 2.);
            EXPECT_EQ(count(1), 2.);
        }

        {
            xt::xtensor<double, 1> count = xt::histogram(data, size_t(2), 0.5, 1.5);

            EXPECT_EQ(count.size(), std::size_t(2));
            EXPECT_EQ(count(0), 0.);
            EXPECT_EQ(count(1), 2.);
        }

        {
            // test specifying return type as well
            auto count = xt::histogram<float>(data, size_t(2), xt::xtensor<double, 1>({1., 2., 1., 1.}), 0.5, 1.5);

            EXPECT_EQ(count.size(), std::size_t(2));
            EXPECT_EQ(count(0), 0.f);
            EXPECT_EQ(count(1), 3.f);
            bool is_same_type = std::is_same<decltype(count)::value_type, float>::value;
            EXPECT_TRUE(is_same_type);
        }

        {
            // test input being a container other than xtensor
            xt::xarray<double> arr = {1., 1., 2., 2.};
            xt::xtensor<double, 1> count = xt::histogram(arr, std::size_t(2));

            EXPECT_EQ(count.size(), std::size_t(2));
            EXPECT_EQ(count(0), 2.);
            EXPECT_EQ(count(1), 2.);
        }
    }

    TEST(xhistogram, bincount)
    {
        xtensor<int, 1> data = {1, 2, 3, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 3};
        xtensor<int, 1> weights = xt::ones<int>(data.shape()) * 3;
        xtensor<int, 1> expc = {0, 5, 3, 6};
        auto bc = bincount(data);
        EXPECT_EQ(bc, expc);

        auto bc2 = bincount(data, weights);
        EXPECT_EQ(bc2, expc * 3);

        auto bc3 = bincount(data, 10);
        EXPECT_EQ(bc3.size(), std::size_t(10));
        EXPECT_EQ(bc3(3), expc(3));
    }

    TEST(xhistogram, digitize)
    {
        xt::xtensor<size_t, 1> bin_edges = {0, 10, 20, 30};
        xt::xtensor<size_t, 1> data = {1, 12, 2, 21, 11, 10};
        xt::xtensor<size_t, 1> res_left = {1, 2, 1, 3, 2, 2};
        xt::xtensor<size_t, 1> res_right = {1, 2, 1, 3, 2, 1};
        EXPECT_EQ(xt::digitize(data, bin_edges), res_left);
        EXPECT_EQ(xt::digitize(data, bin_edges, false), res_left);
        EXPECT_EQ(xt::digitize(data, bin_edges, true), res_right);
    }

    TEST(xhistogram, bin_items_1)
    {
        xt::xtensor<size_t, 1> a = xt::bin_items(11, xt::xtensor<double, 1>{0.9, 0.0, 0.0, 0.1});
        xt::xtensor<size_t, 1> b = {9, 0, 0, 2};
        EXPECT_EQ(a, b);
    }

    TEST(xhistogram, bin_items_2)
    {
        xt::xtensor<size_t, 1> a = xt::bin_items(11, xt::xtensor<double, 1>{0.25, 0.25, 0.25, 0.25});
        xt::xtensor<size_t, 1> b = {3, 3, 3, 2};
        EXPECT_EQ(a, b);
    }
}