File: test_rank.cpp

package info (click to toggle)
scipy 1.16.0-1exp7
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 234,820 kB
  • sloc: cpp: 503,145; python: 344,611; ansic: 195,638; javascript: 89,566; fortran: 56,210; cs: 3,081; f90: 1,150; sh: 848; makefile: 785; pascal: 284; csh: 135; lisp: 134; xml: 56; perl: 51
file content (102 lines) | stat: -rw-r--r-- 3,808 bytes parent folder | download | duplicates (10)
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
//  (C) Copyright Matt Borland 2022.
//  Use, modification and distribution are subject to the
//  Boost Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#include <cstdint>
#include <vector>
#include <boost/math/statistics/detail/rank.hpp>
#include <boost/math/tools/config.hpp>
#include "math_unit_test.hpp"

template <typename T>
void test()
{
    std::vector<T> test_vals {T(1.0), T(3.2), T(2.4), T(5.6), T(4.1)};
    auto rank_vector = boost::math::statistics::detail::rank(test_vals.begin(), test_vals.end());

    CHECK_EQUAL(static_cast<std::size_t>(0), rank_vector[0]);
    CHECK_EQUAL(static_cast<std::size_t>(2), rank_vector[1]);
    CHECK_EQUAL(static_cast<std::size_t>(1), rank_vector[2]);
    CHECK_EQUAL(static_cast<std::size_t>(4), rank_vector[3]);
    CHECK_EQUAL(static_cast<std::size_t>(3), rank_vector[4]);

    // Remove duplicates
    test_vals.push_back(T(4.1));
    test_vals.push_back(T(2.4));
    rank_vector = boost::math::statistics::detail::rank(test_vals.begin(), test_vals.end());

    // Check the size is correct and the ordering is not disrupted
    CHECK_EQUAL(static_cast<std::size_t>(5), rank_vector.size());
    CHECK_EQUAL(static_cast<std::size_t>(0), rank_vector[0]);
    CHECK_EQUAL(static_cast<std::size_t>(2), rank_vector[1]);
    CHECK_EQUAL(static_cast<std::size_t>(1), rank_vector[2]);
    CHECK_EQUAL(static_cast<std::size_t>(4), rank_vector[3]);
    CHECK_EQUAL(static_cast<std::size_t>(3), rank_vector[4]);
}

template <typename T>
void container_test()
{
    std::vector<T> test_vals {T(1.0), T(3.2), T(2.4), T(5.6), T(4.1)};
    auto rank_vector = boost::math::statistics::detail::rank(test_vals);

    CHECK_EQUAL(static_cast<std::size_t>(0), rank_vector[0]);
    CHECK_EQUAL(static_cast<std::size_t>(2), rank_vector[1]);
    CHECK_EQUAL(static_cast<std::size_t>(1), rank_vector[2]);
    CHECK_EQUAL(static_cast<std::size_t>(4), rank_vector[3]);
    CHECK_EQUAL(static_cast<std::size_t>(3), rank_vector[4]);
}

#ifdef BOOST_MATH_EXEC_COMPATIBLE

#include <execution>

template<typename T, typename ExecutionPolicy>
void execution_test(ExecutionPolicy&& exec)
{
    std::vector<T> test_vals {T(1.0), T(3.2), T(2.4), T(5.6), T(4.1)};
    auto rank_vector = boost::math::statistics::detail::rank(exec, test_vals.begin(), test_vals.end());

    CHECK_EQUAL(static_cast<std::size_t>(0), rank_vector[0]);
    CHECK_EQUAL(static_cast<std::size_t>(2), rank_vector[1]);
    CHECK_EQUAL(static_cast<std::size_t>(1), rank_vector[2]);
    CHECK_EQUAL(static_cast<std::size_t>(4), rank_vector[3]);
    CHECK_EQUAL(static_cast<std::size_t>(3), rank_vector[4]);

    // Remove duplicates
    test_vals.push_back(T(4.1));
    test_vals.push_back(T(2.4));
    rank_vector = boost::math::statistics::detail::rank(exec, test_vals.begin(), test_vals.end());

    // Check the size is correct and the ordering is not disrupted
    CHECK_EQUAL(static_cast<std::size_t>(5), rank_vector.size());
    CHECK_EQUAL(static_cast<std::size_t>(0), rank_vector[0]);
    CHECK_EQUAL(static_cast<std::size_t>(2), rank_vector[1]);
    CHECK_EQUAL(static_cast<std::size_t>(1), rank_vector[2]);
    CHECK_EQUAL(static_cast<std::size_t>(4), rank_vector[3]);
    CHECK_EQUAL(static_cast<std::size_t>(3), rank_vector[4]);
}

#endif // BOOST_MATH_EXEC_COMPATIBLE

int main(void)
{
    test<float>();
    test<double>();
    test<long double>();

    container_test<float>();
    container_test<double>();
    container_test<long double>();

    #ifdef BOOST_MATH_EXEC_COMPATIBLE

    execution_test<float>(std::execution::par);
    execution_test<double>(std::execution::par);
    execution_test<long double>(std::execution::par);

    #endif // BOOST_MATH_EXEC_COMPATIBLE

    return boost::math::test::report_errors();
}