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
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.
int getParameterCount() const override
Returns the number of hyper-parameters.
void setParameters(const Eigen::VectorXd &params) override
Method to set the hyper-parameters.
const Eigen::VectorXd & getParameters() const override
Returns the hyper-parameters.
Eigen::MatrixXd evaluate(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2) override
The file holds the covariance functions that can be used with the GP class.
Eigen::MatrixXd squareDistance(const Eigen::MatrixXd &a, const Eigen::MatrixXd &b)
Provides mathematical tools needed for the Gaussian process toolbox.
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 24 2025 11:53:01 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.