Belle II Software development
test_dual_numbers.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <generators/utilities/beamHelpers.h>
10#include <gtest/gtest.h>
11#include <cmath>
12
13using namespace std;
14using namespace Belle2;
15
16namespace {
17
19 class DualNumbersTests : public ::testing::Test {
20 protected:
21
23 virtual void SetUp() { }
24
26 virtual void TearDown() { }
27
28 };
29
31 TEST_F(DualNumbersTests, TestDerivatives)
32 {
33 DualNumber x0(0, 1);
34
35 EXPECT_NEAR(tan(x0).x, 0, 1e-15); // value of tan(x) for x = 0
36 EXPECT_NEAR(tan(x0).dx, 1, 1e-15); // derivative of tan(x) for x = 0
37
38 EXPECT_NEAR(atan(x0).x, 0, 1e-15); // value of atan(x) for x = 0
39 EXPECT_NEAR(atan(x0).dx, 1., 1e-15); // derivative of atan(x) for x = 0
40
41 DualNumber x4(4, 1);
42
43 EXPECT_NEAR(sqrt(x4).x, 2, 1e-15); // value of sqrt(x) for x = 4
44 EXPECT_NEAR(sqrt(x4).dx, 1. / 4, 1e-15); // derivative of sqrt(x) for x = 4
45
46
47 //derivative of product
48 EXPECT_NEAR((tan(x0) * x0).x, 0, 1e-15); // value of x tan(x) for x = 0
49 EXPECT_NEAR((tan(x0) * x0).dx, 0, 1e-15); // derivative of x tan(x) for x = 0
50
51 //derivative of ratio
52 DualNumber xPi(M_PI, 1);
53
54 EXPECT_NEAR((tan(xPi) / xPi).x, 0, 1e-15); // value of tan(x)/x for x = pi
55 EXPECT_NEAR((tan(xPi) / xPi).dx, 1. / M_PI, 1e-15); // derivative of tan(x)/x for x = pi
56 }
57
58
60 TEST_F(DualNumbersTests, TestVectorDerivatives)
61 {
63
64 EXPECT_NEAR((-1.0 / sqrt(r.norm2())).x, -1. / sqrt(3), 1e-15); // -1/r for r=(1,1,1)
65 EXPECT_NEAR((-1.0 / sqrt(r.norm2())).dx, 1. / (3 * sqrt(3)), 1e-15); // grad -1/r for r=(1,1,1), x-component
66
67 EXPECT_NEAR(dot(r, r).x, r.norm2().x, 1e-15); // dot(r,r) == |r|^2
68 EXPECT_NEAR(dot(r, r).dx, 2., 1e-15); // grad dot(r,r) == 2 for r =(1,1,1), x-component
69 }
70
71}
double atan(double a)
atan for double
Definition: beamHelpers.h:34
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
T dot(GeneralVector< T > a, GeneralVector< T > b)
dot product of two general vectors
Definition: beamHelpers.h:163
Abstract base class for different kinds of events.
STL namespace.
Simple structure implementing dual numbers which are used for exact evaluation of the derivatives,...
Definition: beamHelpers.h:38
3-vector with members of arbitrary type, especially members can be dual numbers
Definition: beamHelpers.h:136