File: test_reverse_mode_autodiff_error_functions.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (114 lines) | stat: -rw-r--r-- 4,847 bytes parent folder | download | duplicates (3)
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
//           Copyright Maksym Zhelyenzyakov 2025-2026.
// Distributed under the Boost Software License, Version 1.0.
//      (See accompanying file LICENSE_1_0.txt or copy at
//           https://www.boost.org/LICENSE_1_0.txt)
#include "test_autodiff_reverse.hpp"
#include <boost/math/tools/test_value.hpp>
#include <boost/utility/identity_type.hpp>
#include <cmath>
BOOST_AUTO_TEST_SUITE(erf_support)

using namespace rdiff;
BOOST_AUTO_TEST_CASE_TEMPLATE(test_erf, T, all_float_types)
{
    std::array<T, 5> answers{
        {BOOST_MATH_TEST_VALUE(
             T, 0.99997790950300141455862722387041767962015229291260075034275901649691099714918),
         BOOST_MATH_TEST_VALUE(T, 0.0001392530519467478538904180310183558561119961779459213),
         BOOST_MATH_TEST_VALUE(T, -0.0008355183116804871233425081861101351366719770676755276),
         BOOST_MATH_TEST_VALUE(T, 0.004734603766189427032274213054624099107807870050161323),
         BOOST_MATH_TEST_VALUE(T, -0.02506554935041461370027524558330405410015931203026583)}};
    const T       eps = 0.01;
    constexpr int ord = 4;
    T             cx  = 3.0;

    rvar<T, ord> x  = cx;
    rvar<T, ord> y  = rdiff::erf(x);
    auto         g1 = grad_nd<1>(y, &x);
    auto         g2 = grad_nd<2>(y, &x);
    auto         g3 = grad_nd<3>(y, &x);
    auto         g4 = grad_nd<4>(y, &x);

    BOOST_CHECK_CLOSE(y.item(), answers[0], eps);
    BOOST_CHECK_CLOSE(g1[0], answers[1], eps);
    BOOST_CHECK_CLOSE(g2[0][0], answers[2], eps);
    BOOST_CHECK_CLOSE(g3[0][0][0], answers[3], eps);
    BOOST_CHECK_CLOSE(g4[0][0][0][0], answers[4], eps);
}

BOOST_AUTO_TEST_CASE_TEMPLATE(test_erfc, T, all_float_types)
{
    std::array<T, 5> answers{
        {BOOST_MATH_TEST_VALUE(T, 0.00002209049699858544137277612958232037984770708739924966),
         BOOST_MATH_TEST_VALUE(T, -0.0001392530519467478538904180310183558561119961779459213),
         BOOST_MATH_TEST_VALUE(T, 0.0008355183116804871233425081861101351366719770676755276),
         BOOST_MATH_TEST_VALUE(T, -0.004734603766189427032274213054624099107807870050161323),
         BOOST_MATH_TEST_VALUE(T, 0.02506554935041461370027524558330405410015931203026583)}};
    const T       eps = 0.01;
    constexpr int ord = 4;
    T             cx  = 3.0;

    rvar<T, ord> x  = cx;
    rvar<T, ord> y  = rdiff::erfc(x);
    auto         g1 = grad_nd<1>(y, &x);
    auto         g2 = grad_nd<2>(y, &x);
    auto         g3 = grad_nd<3>(y, &x);
    auto         g4 = grad_nd<4>(y, &x);

    BOOST_CHECK_CLOSE(y.item(), answers[0], eps);
    BOOST_CHECK_CLOSE(g1[0], answers[1], eps);
    BOOST_CHECK_CLOSE(g2[0][0], answers[2], eps);
    BOOST_CHECK_CLOSE(g3[0][0][0], answers[3], eps);
    BOOST_CHECK_CLOSE(g4[0][0][0][0], answers[4], eps);
}

using namespace rdiff;
BOOST_AUTO_TEST_CASE_TEMPLATE(test_erf_inv, T, all_float_types)
{
    std::array<T, 5> answers{{BOOST_MATH_TEST_VALUE(T, 0.4769362762044699),
                              BOOST_MATH_TEST_VALUE(T, 1.11258481897195),
                              BOOST_MATH_TEST_VALUE(T, 1.1807463499934),
                              BOOST_MATH_TEST_VALUE(T, 5.26058253926122),
                              BOOST_MATH_TEST_VALUE(T, 28.44125004446708)}};
    const T          eps = 0.01;
    constexpr int    ord = 4;
    T                cx  = 0.5;

    rvar<T, ord> x  = cx;
    rvar<T, ord> y  = rdiff::erf_inv(x);
    auto         g1 = grad_nd<1>(y, &x);
    auto         g2 = grad_nd<2>(y, &x);
    auto         g3 = grad_nd<3>(y, &x);
    auto         g4 = grad_nd<4>(y, &x);

    BOOST_CHECK_CLOSE(y.item(), answers[0], eps);
    BOOST_CHECK_CLOSE(g1[0], answers[1], eps);
    BOOST_CHECK_CLOSE(g2[0][0], answers[2], eps);
    BOOST_CHECK_CLOSE(g3[0][0][0], answers[3], eps);
    BOOST_CHECK_CLOSE(g4[0][0][0][0], answers[4], eps);
}
BOOST_AUTO_TEST_CASE_TEMPLATE(test_erfc_inv, T, all_float_types)
{
    std::array<T, 5> answers{{BOOST_MATH_TEST_VALUE(T, 0.4769362762044699),
                              BOOST_MATH_TEST_VALUE(T, -1.11258481897195),
                              BOOST_MATH_TEST_VALUE(T, 1.1807463499934),
                              BOOST_MATH_TEST_VALUE(T, -5.260582539261222),
                              BOOST_MATH_TEST_VALUE(T, 28.44125004446708)}};
    const T          eps = 0.01;
    constexpr int    ord = 4;
    T                cx  = 0.5;

    rvar<T, ord> x  = cx;
    rvar<T, ord> y  = rdiff::erfc_inv(x);
    auto         g1 = grad_nd<1>(y, &x);
    auto         g2 = grad_nd<2>(y, &x);
    auto         g3 = grad_nd<3>(y, &x);
    auto         g4 = grad_nd<4>(y, &x);

    BOOST_CHECK_CLOSE(y.item(), answers[0], eps);
    BOOST_CHECK_CLOSE(g1[0], answers[1], eps);
    BOOST_CHECK_CLOSE(g2[0][0], answers[2], eps);
    BOOST_CHECK_CLOSE(g3[0][0][0], answers[3], eps);
    BOOST_CHECK_CLOSE(g4[0][0][0][0], answers[4], eps);
}
BOOST_AUTO_TEST_SUITE_END()