Kstars

covariance_functions.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2014-2017 Max Planck Society.
3 All rights reserved.
4
5 SPDX-License-Identifier: BSD-3-Clause
6*/
7
8/**
9 * @file
10 * @date 2014-2017
11 * @copyright Max Planck Society
12 *
13 * @author Edgar D. Klenske <edgar.klenske@tuebingen.mpg.de>
14 * @author Stephan Wenninger <stephan.wenninger@tuebingen.mpg.de>
15 * @author Raffi Enficiaud <raffi.enficiaud@tuebingen.mpg.de>
16 *
17 * @brief The file holds the covariance functions that can be used with the GP class.
18 */
19
21#include "math_tools.h"
22
23namespace covariance_functions
24{
25
26/* PeriodicSquareExponential */
27PeriodicSquareExponential::PeriodicSquareExponential() :
28 hyperParameters(Eigen::VectorXd::Zero(4)), extraParameters(Eigen::VectorXd::Ones(1) * std::numeric_limits<double>::max()) { }
29
30PeriodicSquareExponential::PeriodicSquareExponential(const Eigen::VectorXd &hyperParameters_) :
31 hyperParameters(hyperParameters_), extraParameters(Eigen::VectorXd::Ones(1) * std::numeric_limits<double>::max()) { }
32
33Eigen::MatrixXd PeriodicSquareExponential::evaluate(const Eigen::VectorXd &x, const Eigen::VectorXd &y)
34{
35
36 double lsSE0 = exp(hyperParameters(0));
37 double svSE0 = exp(2 * hyperParameters(1));
38 double lsP = exp(hyperParameters(2));
39 double svP = exp(2 * hyperParameters(3));
40
41 double plP = exp(extraParameters(0));
42
43 // Work with arrays internally, convert to matrix for return value.
44 // This is because all the operations act elementwise, and Eigen::Arrays
45 // do so, too.
46
47 // Compute Distances
48 Eigen::ArrayXXd squareDistanceXY = math_tools::squareDistance( x.transpose(), y.transpose());
49
50 // fast version
51 return svSE0 * ((-0.5 / std::pow(lsSE0, 2)) * squareDistanceXY).exp()
52 + svP * (-2 * (((M_PI / plP) * squareDistanceXY.sqrt()).sin() / lsP).square()).exp();
53
54 /* // verbose version
55 // Square Exponential Kernel
56 Eigen::ArrayXXd K0 = squareDistanceXY / std::pow(lsSE0, 2);
57 K0 = svSE0 * (-0.5 * K0).exp();
58
59 // Periodic Kernel
60 Eigen::ArrayXXd K1 = (M_PI * squareDistanceXY.sqrt() / plP);
61 K1 = K1.sin() / lsP;
62 K1 = K1.square();
63 K1 = svP * (-2 * K1).exp();
64
65 // Combined Kernel
66 return K0 + K1;
67 */
68}
69
70void PeriodicSquareExponential::setParameters(const Eigen::VectorXd &params)
71{
72 this->hyperParameters = params;
73}
74
75void PeriodicSquareExponential::setExtraParameters(const Eigen::VectorXd &params)
76{
77 this->extraParameters = params;
78}
79
80const Eigen::VectorXd &PeriodicSquareExponential::getParameters() const
81{
82 return this->hyperParameters;
83}
84
85const Eigen::VectorXd &PeriodicSquareExponential::getExtraParameters() const
86{
87 return this->extraParameters;
88}
89
90int PeriodicSquareExponential::getParameterCount() const
91{
92 return 4;
93}
94
95int PeriodicSquareExponential::getExtraParameterCount() const
96{
97 return 1;
98}
99
100
101/* PeriodicSquareExponential2 */
102PeriodicSquareExponential2::PeriodicSquareExponential2() :
103 hyperParameters(Eigen::VectorXd::Zero(6)), extraParameters(Eigen::VectorXd::Ones(1) * std::numeric_limits<double>::max()) { }
104
105PeriodicSquareExponential2::PeriodicSquareExponential2(const Eigen::VectorXd &hyperParameters_) :
106 hyperParameters(hyperParameters_), extraParameters(Eigen::VectorXd::Ones(1) * std::numeric_limits<double>::max()) { }
107
108Eigen::MatrixXd PeriodicSquareExponential2::evaluate(const Eigen::VectorXd &x, const Eigen::VectorXd &y)
109{
110
111 double lsSE0 = exp(hyperParameters(0));
112 double svSE0 = exp(2 * hyperParameters(1));
113 double lsP = exp(hyperParameters(2));
114 double svP = exp(2 * hyperParameters(3));
115 double lsSE1 = exp(hyperParameters(4));
116 double svSE1 = exp(2 * hyperParameters(5));
117
118 double plP = exp(extraParameters(0));
119
120 // Work with arrays internally, convert to matrix for return value.
121 // This is because all the operations act elementwise, and Eigen::Arrays
122 // do so, too.
123
124 // Compute Distances
125 Eigen::ArrayXXd squareDistanceXY = math_tools::squareDistance( x.transpose(), y.transpose());
126
127 // fast version
128 return svSE0 * ((-0.5 / std::pow(lsSE0, 2)) * squareDistanceXY).exp()
129 + svP * (-2 * (((M_PI / plP) * squareDistanceXY.sqrt()).sin() / lsP).square()).exp()
130 + svSE1 * ((-0.5 / std::pow(lsSE1, 2)) * squareDistanceXY).exp();
131
132 /* // verbose version
133 // Square Exponential Kernel
134 Eigen::ArrayXXd K0 = squareDistanceXY / pow(lsSE0, 2);
135 K0 = svSE0 * (-0.5 * K0).exp();
136
137 // Periodic Kernel
138 Eigen::ArrayXXd K1 = (M_PI * squareDistanceXY.sqrt() / plP);
139 K1 = K1.sin() / lsP;
140 K1 = K1.square();
141 K1 = svP * (-2 * K1).exp();
142
143 // Square Exponential Kernel
144 Eigen::ArrayXXd K2 = squareDistanceXY / pow(lsSE1, 2);
145 K2 = svSE1 * (-0.5 * K2).exp();
146
147 // Combined Kernel
148 return K0 + K1 + K2;
149 */
150}
151
152void PeriodicSquareExponential2::setParameters(const Eigen::VectorXd &params)
153{
154 this->hyperParameters = params;
155}
156
157void PeriodicSquareExponential2::setExtraParameters(const Eigen::VectorXd &params)
158{
159 this->extraParameters = params;
160}
161
162const Eigen::VectorXd &PeriodicSquareExponential2::getParameters() const
163{
164 return this->hyperParameters;
165}
166
167const Eigen::VectorXd &PeriodicSquareExponential2::getExtraParameters() const
168{
169 return this->extraParameters;
170}
171
173{
174 return 6;
175}
176
177int PeriodicSquareExponential2::getExtraParameterCount() const
178{
179 return 1;
180}
181
182} // namespace covariance_functions
Eigen::MatrixXd evaluate(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2) override
const Eigen::VectorXd & getParameters() const override
Returns the hyper-parameters.
void setParameters(const Eigen::VectorXd &params) override
Method to set the hyper-parameters.
int getParameterCount() const override
Returns the number of hyper-parameters.
The file holds the covariance functions that can be used with the GP class.
Provides mathematical tools needed for the Gaussian process toolbox.
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Mon Nov 18 2024 12:16:40 by doxygen 1.12.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.