CMP++: Uncertainty Quantification & Bayesian Calibration
Loading...
Searching...
No Matches
covariance.h
Go to the documentation of this file.
1#ifndef COVARIANCE_H
2#define COVARIANCE_H
3
4#include <cmp_defines.h>
5#include <boost/math/special_functions/gamma.hpp>
6#include <boost/math/special_functions/beta.hpp>
7#include <boost/math/special_functions/bessel.hpp>
8
13namespace cmp::covariance {
31 public:
32 virtual ~Covariance() = default;
33 virtual double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const = 0;
34 virtual double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const = 0;
35 virtual double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const = 0;
36};
37
47class Sum : public Covariance {
48 private:
49 std::shared_ptr<Covariance> leftCovariance_;
50 std::shared_ptr<Covariance> rightCovariance_;
51 public:
52
53 Sum() = default;
54 Sum(const Sum&) = default;
55 Sum(Sum&&) = default;
56 Sum& operator=(const Sum&) = default;
57 Sum& operator=(Sum&&) = default;
58
62 Sum(std::shared_ptr<Covariance> k1, std::shared_ptr<Covariance> k2) : leftCovariance_(k1), rightCovariance_(k2) {};
63
67 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
68 return leftCovariance_->eval(x1, x2, par) + rightCovariance_->eval(x1, x2, par);
69 }
70
74 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
75 return leftCovariance_->evalGradient(x1, x2, par, i) + rightCovariance_->evalGradient(x1, x2, par, i);
76 }
77
81 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
82 return leftCovariance_->evalHessian(x1, x2, par, i, j) + rightCovariance_->evalHessian(x1, x2, par, i, j);
83 }
84
88 static std::shared_ptr<Covariance> make(std::shared_ptr<Covariance> k1, std::shared_ptr<Covariance> k2) {
89 return std::make_shared<Sum>(k1, k2);
90 };
91};
92
102class Product : public Covariance {
103 private:
104 std::shared_ptr<Covariance> leftCovariance_;
105 std::shared_ptr<Covariance> rightCovariance_;
106
107 public:
108
109 Product(const Product&) = default;
110 Product(Product&&) = default;
111 Product& operator=(const Product&) = default;
112 Product& operator=(Product&&) = default;
113
117 Product(std::shared_ptr<Covariance> k1, std::shared_ptr<Covariance> k2) : leftCovariance_(k1), rightCovariance_(k2) {};
118
122 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
123 return leftCovariance_->eval(x1, x2, par) * rightCovariance_->eval(x1, x2, par);
124 }
125
129 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
130
131 // Smart eval for first term
132 double d1 = leftCovariance_->evalGradient(x1, x2, par, i);
133 if(std::abs(d1) < TOL) {
134 } else {
135 d1 *= rightCovariance_->eval(x1, x2, par);
136 }
137
138 // Smart eval for second term
139 double d2 = rightCovariance_->evalGradient(x1, x2, par, i);
140 if(std::abs(d2) < TOL) {
141 } else {
142 d2 *= leftCovariance_->eval(x1, x2, par);
143 }
144
145 // Return the result
146 return d1 + d2;
147 }
148
152 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
153
154 // Smart eval of the first term
155 double d1 = leftCovariance_->evalGradient(x1, x2, par, i);
156 if(std::abs(d1) < TOL) {
157 } else {
158 d1 = (d1 + leftCovariance_->evalHessian(x1, x2, par, i, j)) * rightCovariance_->eval(x1, x2, par);
159 }
160
161 // Smart eval for second term
162 double d2 = rightCovariance_->evalGradient(x1, x2, par, i);
163 if(std::abs(d2) < TOL) {
164 } else {
165 d2 = (d2 + rightCovariance_->evalHessian(x1, x2, par, i, j)) * leftCovariance_->eval(x1, x2, par);
166 }
167
168 // Smart eval for the third term
169 return d1 + d2;
170 }
171
175 static std::shared_ptr<Covariance> make(std::shared_ptr<Covariance> k1, std::shared_ptr<Covariance> k2) {
176 return std::make_shared<Product>(k1, k2);
177 };
178};
179
183class Custom : public Covariance {
184 private:
185 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&)> eval_;
186 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&, const size_t&)> evalGradient_;
187 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&, const size_t&, const size_t&)> evalHessian_;
188 public:
189
190 Custom(const Custom&) = default;
191 Custom(Custom&&) = default;
192 Custom& operator=(const Custom&) = default;
193 Custom& operator=(Custom&&) = default;
194
198 Custom(std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&)> eval,
199 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&, const size_t&)> evalGradient,
200 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&, const size_t&, const size_t&)> evalHessian) : eval_(eval), evalGradient_(evalGradient), evalHessian_(evalHessian) {};
201
205 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
206 return eval_(x1, x2, par);
207 }
208
212 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
213 return evalGradient_(x1, x2, par, i);
214 }
215
219 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
220 return evalHessian_(x1, x2, par, i, j);
221 }
222
226 std::shared_ptr<Custom> make(std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&)> eval,
227 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&, const size_t&)> evalGradient,
228 std::function<double(const Eigen::VectorXd&, const Eigen::VectorXd&, const Eigen::VectorXd&, const size_t&, const size_t&)> evalHessian) {
229 return std::make_shared<Custom>(eval, evalGradient, evalHessian);
230 };
231};
232
242class Constant : public Covariance {
243 private:
244 size_t index_;
245 public:
246
247 Constant(const Constant&) = default;
248 Constant(Constant&&) = default;
249 Constant& operator=(const Constant&) = default;
251
255 Constant(const size_t &index) : index_(index) {};
256
260 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
261 return std::pow(par(index_), 2);
262 };
263
267 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
268 if(i == index_) {
269 return 2 * par(index_);
270 } else {
271 return 0;
272 }
273 };
274
278 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
279 if(i == index_ && j == index_) {
280 return 2;
281 } else {
282 return 0;
283 }
284 };
285
289 static std::shared_ptr<Covariance> make(const size_t &c) {
290 return std::make_shared<Constant>(c);
291 };
292
293};
294
308class Linear : public Covariance {
309 private:
311 public:
312
313 Linear(const Linear&) = default;
314 Linear(Linear&&) = default;
315 Linear& operator=(const Linear&) = default;
316 Linear& operator=(Linear&&) = default;
317
322 Linear(const int &indexX = -1) : indexX_(indexX) {};
323
327 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
328 if(indexX_ == -1) {
329 return x1.dot(x2);
330 } else {
331 return x1(indexX_) * x2(indexX_);
332 }
333 };
334
338 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
339 return 0;
340 };
341
345 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
346 return 0;
347 };
348
352 static std::shared_ptr<Covariance> make(const int &i) {
353 return std::make_shared<Linear>(i);
354 };
355
356};
357
371class Inverse : public Covariance {
372 private:
374 public:
375
376 Inverse(const Inverse&) = default;
377 Inverse(Inverse&&) = default;
378 Inverse& operator=(const Inverse&) = default;
379 Inverse& operator=(Inverse&&) = default;
380
385 Inverse(const int &indexX = -1) : indexX_(indexX) {};
386
390 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
391 if(indexX_ == -1) {
392 return 1.0 / (x1.dot(x2) + 1);
393 } else {
394 return 1.0 / (x1(indexX_) * x2(indexX_) + 1);
395 }
396 };
397
401 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
402 return 0;
403 };
404
408 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
409 return 0;
410 };
411
415 static std::shared_ptr<Covariance> make(const int &i) {
416 return std::make_shared<Inverse>(i);
417 };
418
419};
420
437 private:
438 size_t index_;
440 public:
441
446
447 SquaredExponential(const size_t &index, const int &indexX = -1) : index_(index), indexX_(indexX) {};
448 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
449 double d;
450 if(indexX_ == -1) {
451 d = (x1 - x2).norm();
452 } else {
453 d = std::abs(x1(indexX_) - x2(indexX_));
454 }
455 return std::exp(-0.5 * std::pow(d / par(index_), 2));
456 };
457
458 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
459 double d;
460 if(indexX_ == -1) {
461 d = (x1 - x2).norm();
462 } else {
463 d = std::abs(x1(indexX_) - x2(indexX_));
464 }
465
466 // Compute the gradient
467 if(i == index_) {
468 return std::exp(-0.5 * std::pow(d / par(index_), 2)) * std::pow(d, 2) / std::pow(par(index_), 3);
469 } else {
470 return 0;
471 }
472 };
473
474 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
475 double d;
476 if(indexX_ == -1) {
477 d = (x1 - x2).norm();
478 } else {
479 d = std::abs(x1(indexX_) - x2(indexX_));
480 }
481
482 // Compute the hessian
483 if(i == index_ && j == index_) {
484 return (std::exp(-0.5 * std::pow(d / par(index_), 2)) * std::pow(d, 2) / std::pow(par(index_), 4)) * (-3 + std::pow(d, 2) / std::pow(par(index_), 3));
485 } else {
486 return 0;
487 }
488 };
489
490 static std::shared_ptr<Covariance> make(const size_t &l, const int &i) {
491 return std::make_shared<SquaredExponential>(l, i);
492 };
493
494};
495
511class Matern52 : public Covariance {
512 private:
513 size_t index_;
515 public:
516
517 Matern52(const Matern52&) = default;
518 Matern52(Matern52&&) = default;
519 Matern52& operator=(const Matern52&) = default;
521
522 Matern52(const size_t &l, const int &i = -1) : index_(l), indexX_(i) {};
523 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
524 double d;
525 if(indexX_ == -1) {
526 d = (x1 - x2).norm();
527 } else {
528 d = std::abs(x1(indexX_) - x2(indexX_));
529 }
530 double l = par(index_);
531 double c_1 = sqrt(5.) * d / l;
532 double c_2 = (5. / 3.) * pow(d / l, 2);
533 return (1 + c_1 + c_2) * exp(-c_1);
534 };
535
536 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
537 double d;
538 if(indexX_ == -1) {
539 d = (x1 - x2).norm();
540 } else {
541 d = std::abs(x1(indexX_) - x2(indexX_));
542 }
543
544 // Compute the gradient
545 if(i == index_) {
546 double l = par(index_);
547 return (5.*std::pow(d, 2) * (std::sqrt(5) * d + l)) / (3.*std::exp((std::sqrt(5) * d) / l) * std::pow(l, 4));
548 } else {
549 return 0;
550 }
551 };
552
553 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
554 double d;
555 if(indexX_ == -1) {
556 d = (x1 - x2).norm();
557 } else {
558 d = std::abs(x1(indexX_) - x2(indexX_));
559 }
560
561 // Compute the hessian
562 if(i == index_ && j == index_) {
563 double l = par(index_);
564 return (5 * std::pow(d, 2) * (5 * std::pow(d, 2) - 3 * std::sqrt(5) * d * l - 3 * std::pow(l, 2))) / (3.*std::exp(std::sqrt(5) * d / l) * std::pow(l, 6));
565 } else {
566 return 0;
567 }
568 };
569
570 static std::shared_ptr<Covariance> make(const size_t &l, const int &i) {
571 return std::make_shared<Matern52>(l, i);
572 };
573};
574
590class Matern : public Covariance {
591 private:
592 size_t index_;
594 double nu_;
595 public:
596
597 Matern(const Matern&) = default;
598 Matern(Matern&&) = default;
599 Matern& operator=(const Matern&) = default;
600 Matern& operator=(Matern&&) = default;
601
602 Matern(const size_t &index, const double &nu, const int &indexX = -1) : index_(index), indexX_(indexX), nu_(nu) {};
603 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
604 double d;
605 if(indexX_ == -1) {
606 d = (x1 - x2).norm();
607 } else {
608 d = std::abs(x1(indexX_) - x2(indexX_));
609 }
610 double l = par(index_);
611 double r = std::sqrt(2 * nu_) * d / l;
612 return (1.0 / (std::tgamma(nu_) * std::pow(2, nu_ - 1))) * std::pow(r, nu_) * boost::math::cyl_bessel_k(nu_, r);
613 };
614
615 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
616 double d;
617 if(indexX_ == -1) {
618 d = (x1 - x2).norm();
619 } else {
620 d = std::abs(x1(indexX_) - x2(indexX_));
621 }
622
623 // Compute the gradient
624 if(i == index_) {
625 double l = par(index_);
626 double r = std::sqrt(2 * nu_) * d / l;
627 return (std::pow(r, nu_) * boost::math::cyl_bessel_k(nu_ - 1, r) * (-std::sqrt(2 * nu_) * d / std::pow(l, 2)) - nu_ * std::pow(r, nu_) * boost::math::cyl_bessel_k(nu_, r) / l) / (std::tgamma(nu_) * std::pow(2, nu_ - 1));
628 } else {
629 return 0;
630 }
631 };
632
633 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
634 double d;
635 if(indexX_ == -1) {
636 d = (x1 - x2).norm();
637 } else {
638 d = std::abs(x1(indexX_) - x2(indexX_));
639 }
640
641 // Compute the hessian
642 if(i == index_ && j == index_) {
643 double l = par(index_);
644 double r = std::sqrt(2 * nu_) * d / l;
645 return (std::pow(r, nu_) * boost::math::cyl_bessel_k(nu_ - 2, r) * std::pow(-std::sqrt(2 * nu_) * d / std::pow(l, 2), 2)
646 + 2 * nu_ * std::pow(r, nu_) * boost::math::cyl_bessel_k(nu_ - 1, r) * (-std::sqrt(2 * nu_) * d / std::pow(l, 3))
647 + nu_ * (nu_ + 1) * std::pow(r, nu_) * boost::math::cyl_bessel_k(nu_, r) / std::pow(l, 2)) / (std::tgamma(nu_) * std::pow(2, nu_ - 1));
648 } else {
649 return 0;
650 }
651 };
652 static std::shared_ptr<Covariance> make(const size_t &l, const double &nu, const int &i) {
653 return std::make_shared<Matern>(l, nu, i);
654 };
655};
656
670class WhiteNoise : public Covariance {
671 private:
672 int indexX_{-1};
673 double tol_{1e-10};
674 public:
675 WhiteNoise(const WhiteNoise&) = default;
676 WhiteNoise(WhiteNoise&&) = default;
677 WhiteNoise& operator=(const WhiteNoise&) = default;
679 WhiteNoise(const size_t &indexX = -1, double tol = 1e-10) : indexX_(indexX), tol_(tol) {};
680
681 double eval(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par) const {
682 double d;
683 if(indexX_ == -1) {
684 d = (x1 - x2).norm();
685 } else {
686 d = std::abs(x1(indexX_) - x2(indexX_));
687 }
688 if(d < tol_) {
689 return 1.0;
690 } else {
691 return 0.0;
692 }
693 };
694
695 double evalGradient(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i) const {
696 return 0.0;
697 };
698
699 double evalHessian(const Eigen::VectorXd& x1, const Eigen::VectorXd &x2, const Eigen::VectorXd& par, const size_t &i, const size_t &j) const {
700 return 0.0;
701 };
702
703 static std::shared_ptr<Covariance> make(const int &i = -1, double tol = 1e-10) {
704 return std::make_shared<WhiteNoise>(i, tol);
705 };
706
707};
708
709// Inline operator helpers — define here to ensure they live in the same namespace
710inline std::shared_ptr<Covariance> operator+(std::shared_ptr<Covariance> k1, std::shared_ptr<Covariance> k2) {
711 return Sum::make(k1, k2);
712}
713
714inline std::shared_ptr<Covariance> operator*(std::shared_ptr<Covariance> k1, std::shared_ptr<Covariance> k2) {
715 return Product::make(k1, k2);
716}
717
718
719
720
721}
722
725#endif
Represents a constant scale covariance function.
Definition covariance.h:242
Constant & operator=(Constant &&)=default
Constant(Constant &&)=default
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Evaluates the second-order partial derivative of the Constant kernel.
Definition covariance.h:278
Constant(const size_t &index)
Constructs a Constant covariance function using the hyperparameter at index.
Definition covariance.h:255
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Evaluates the Constant kernel.
Definition covariance.h:260
Constant(const Constant &)=default
static std::shared_ptr< Covariance > make(const size_t &c)
Factory method for creating a constant covariance.
Definition covariance.h:289
size_t index_
Hyperparameter parameter index.
Definition covariance.h:244
Constant & operator=(const Constant &)=default
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Evaluates the partial derivative of the Constant kernel.
Definition covariance.h:267
Abstract base class for all covariance (kernel) functions.
Definition covariance.h:30
virtual double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const =0
virtual double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const =0
virtual ~Covariance()=default
virtual double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const =0
Represents a custom user-defined covariance function using std::function wrappers.
Definition covariance.h:183
std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &)> eval_
Custom kernel evaluation function.
Definition covariance.h:185
Custom & operator=(const Custom &)=default
Custom(const Custom &)=default
Custom & operator=(Custom &&)=default
std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &, const size_t &)> evalGradient_
Custom gradient evaluation function.
Definition covariance.h:186
Custom(Custom &&)=default
std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &, const size_t &, const size_t &)> evalHessian_
Custom Hessian evaluation function.
Definition covariance.h:187
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Evaluates the custom kernel's Hessian.
Definition covariance.h:219
std::shared_ptr< Custom > make(std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &)> eval, std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &, const size_t &)> evalGradient, std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &, const size_t &, const size_t &)> evalHessian)
Factory method for creating a shared pointer to a custom covariance.
Definition covariance.h:226
Custom(std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &)> eval, std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &, const size_t &)> evalGradient, std::function< double(const Eigen::VectorXd &, const Eigen::VectorXd &, const Eigen::VectorXd &, const size_t &, const size_t &)> evalHessian)
Constructs a custom covariance kernel with evaluation, gradient, and Hessian functions.
Definition covariance.h:198
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Evaluates the custom kernel's gradient.
Definition covariance.h:212
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Evaluates the custom kernel.
Definition covariance.h:205
Represents an Inverse covariance function.
Definition covariance.h:371
Inverse(Inverse &&)=default
int indexX_
Coordinate index to project (-1 for full vector dot product).
Definition covariance.h:373
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Evaluates the second-order partial derivative of the Inverse kernel.
Definition covariance.h:408
Inverse(const Inverse &)=default
Inverse(const int &indexX=-1)
Constructs an Inverse covariance function.
Definition covariance.h:385
Inverse & operator=(Inverse &&)=default
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Evaluates the partial derivative of the Inverse kernel.
Definition covariance.h:401
static std::shared_ptr< Covariance > make(const int &i)
Factory method for creating an inverse covariance.
Definition covariance.h:415
Inverse & operator=(const Inverse &)=default
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Evaluates the Inverse kernel.
Definition covariance.h:390
Represents a Linear covariance function.
Definition covariance.h:308
static std::shared_ptr< Covariance > make(const int &i)
Factory method for creating a linear covariance.
Definition covariance.h:352
Linear(const Linear &)=default
Linear & operator=(Linear &&)=default
Linear(const int &indexX=-1)
Constructs a Linear covariance function.
Definition covariance.h:322
int indexX_
Coordinate index to project (-1 for full vector inner product).
Definition covariance.h:310
Linear(Linear &&)=default
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Evaluates the second-order partial derivative of the Linear kernel.
Definition covariance.h:345
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Evaluates the Linear kernel.
Definition covariance.h:327
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Evaluates the partial derivative of the Linear kernel.
Definition covariance.h:338
Linear & operator=(const Linear &)=default
Matérn covariance function with parameter nu = 5/2.
Definition covariance.h:511
static std::shared_ptr< Covariance > make(const size_t &l, const int &i)
Definition covariance.h:570
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Definition covariance.h:536
int indexX_
Dimension index to evaluate, or -1 for the full isotropic kernel.
Definition covariance.h:514
Matern52(const Matern52 &)=default
Matern52(Matern52 &&)=default
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Definition covariance.h:553
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Definition covariance.h:523
size_t index_
Hyperparameter index for the lengthscale parameter.
Definition covariance.h:513
Matern52 & operator=(Matern52 &&)=default
Matern52 & operator=(const Matern52 &)=default
Matern52(const size_t &l, const int &i=-1)
Definition covariance.h:522
General Matérn covariance function.
Definition covariance.h:590
Matern & operator=(const Matern &)=default
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Definition covariance.h:603
double nu_
Smoothness parameter nu.
Definition covariance.h:594
size_t index_
Hyperparameter index for the lengthscale parameter.
Definition covariance.h:592
Matern(const Matern &)=default
Matern(const size_t &index, const double &nu, const int &indexX=-1)
Definition covariance.h:602
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Definition covariance.h:615
static std::shared_ptr< Covariance > make(const size_t &l, const double &nu, const int &i)
Definition covariance.h:652
int indexX_
Dimension index to evaluate, or -1 for the full isotropic kernel.
Definition covariance.h:593
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Definition covariance.h:633
Matern & operator=(Matern &&)=default
Matern(Matern &&)=default
Represents the product of two covariance functions.
Definition covariance.h:102
std::shared_ptr< Covariance > leftCovariance_
Left operand covariance function.
Definition covariance.h:104
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Evaluates the partial derivative of the product kernel.
Definition covariance.h:129
Product & operator=(const Product &)=default
Product(Product &&)=default
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Evaluates the product kernel.
Definition covariance.h:122
Product & operator=(Product &&)=default
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Evaluates the second-order partial derivative of the product kernel.
Definition covariance.h:152
std::shared_ptr< Covariance > rightCovariance_
Right operand covariance function.
Definition covariance.h:105
Product(const Product &)=default
Product(std::shared_ptr< Covariance > k1, std::shared_ptr< Covariance > k2)
Constructs a product covariance function from two kernels.
Definition covariance.h:117
static std::shared_ptr< Covariance > make(std::shared_ptr< Covariance > k1, std::shared_ptr< Covariance > k2)
Factory method to create a shared pointer to a product covariance.
Definition covariance.h:175
Squared Exponential (RBF / Gaussian) covariance function.
Definition covariance.h:436
int indexX_
Dimension index to evaluate, or -1 for the full isotropic kernel.
Definition covariance.h:439
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Definition covariance.h:474
SquaredExponential(SquaredExponential &&)=default
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Definition covariance.h:458
static std::shared_ptr< Covariance > make(const size_t &l, const int &i)
Definition covariance.h:490
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Definition covariance.h:448
SquaredExponential & operator=(SquaredExponential &&)=default
size_t index_
Hyperparameter index for the lengthscale parameter.
Definition covariance.h:438
SquaredExponential(const size_t &index, const int &indexX=-1)
Definition covariance.h:447
SquaredExponential & operator=(const SquaredExponential &)=default
SquaredExponential(const SquaredExponential &)=default
Represents the sum of two covariance functions.
Definition covariance.h:47
Sum(Sum &&)=default
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Evaluates the sum kernel.
Definition covariance.h:67
Sum(std::shared_ptr< Covariance > k1, std::shared_ptr< Covariance > k2)
Constructs a sum covariance function from two kernels.
Definition covariance.h:62
std::shared_ptr< Covariance > rightCovariance_
Right operand covariance function.
Definition covariance.h:50
static std::shared_ptr< Covariance > make(std::shared_ptr< Covariance > k1, std::shared_ptr< Covariance > k2)
Factory method to create a shared pointer to a sum covariance.
Definition covariance.h:88
std::shared_ptr< Covariance > leftCovariance_
Left operand covariance function.
Definition covariance.h:49
Sum & operator=(const Sum &)=default
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Evaluates the partial derivative of the sum kernel.
Definition covariance.h:74
Sum(const Sum &)=default
Sum & operator=(Sum &&)=default
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Evaluates the second-order partial derivative of the sum kernel.
Definition covariance.h:81
White noise covariance function.
Definition covariance.h:670
double evalHessian(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i, const size_t &j) const
Definition covariance.h:699
WhiteNoise(const size_t &indexX=-1, double tol=1e-10)
Definition covariance.h:679
double evalGradient(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par, const size_t &i) const
Definition covariance.h:695
WhiteNoise(WhiteNoise &&)=default
double tol_
Distance tolerance threshold.
Definition covariance.h:673
WhiteNoise & operator=(const WhiteNoise &)=default
WhiteNoise & operator=(WhiteNoise &&)=default
int indexX_
Dimension index to evaluate, or -1 for the full isotropic kernel.
Definition covariance.h:672
WhiteNoise(const WhiteNoise &)=default
static std::shared_ptr< Covariance > make(const int &i=-1, double tol=1e-10)
Definition covariance.h:703
double eval(const Eigen::VectorXd &x1, const Eigen::VectorXd &x2, const Eigen::VectorXd &par) const
Definition covariance.h:681
Definition covariance.h:13
std::shared_ptr< Covariance > operator*(std::shared_ptr< Covariance > k1, std::shared_ptr< Covariance > k2)
Definition covariance.h:714
std::shared_ptr< Covariance > operator+(std::shared_ptr< Covariance > k1, std::shared_ptr< Covariance > k2)
Definition covariance.h:710
constexpr double TOL
Definition cmp_defines.h:30