pulsatrix
Loading...
Searching...
No Matches
acquisition_functions.hpp
Go to the documentation of this file.
1
11#pragma once
12
13#include <cmath>
14#include <stdexcept>
15
16namespace pulsatrix {
17
19inline double StandardNormalPdf(double z) {
20 constexpr double kInvSqrt2Pi = 0.3989422804014327; // 1 / sqrt(2*pi)
21 return kInvSqrt2Pi * std::exp(-0.5 * z * z);
22}
23
25inline double StandardNormalCdf(double z) { return 0.5 * (1.0 + std::erf(z / std::sqrt(2.0))); }
26
39inline double ExpectedImprovement(double mean, double variance, double best_value, double xi = 0.01) {
40 if (variance < 0.0) {
41 throw std::invalid_argument("ExpectedImprovement: variance must be non-negative");
42 }
43 double sigma = std::sqrt(variance);
44 if (sigma <= 1e-12) {
45 return 0.0;
46 }
47 double z = (mean - best_value - xi) / sigma;
48 return (mean - best_value - xi) * StandardNormalCdf(z) + sigma * StandardNormalPdf(z);
49}
50
58inline double ProbabilityOfImprovement(double mean, double variance, double best_value, double xi = 0.01) {
59 if (variance < 0.0) {
60 throw std::invalid_argument("ProbabilityOfImprovement: variance must be non-negative");
61 }
62 double sigma = std::sqrt(variance);
63 if (sigma <= 1e-12) {
64 return (mean > best_value + xi) ? 1.0 : 0.0;
65 }
66 double z = (mean - best_value - xi) / sigma;
67 return StandardNormalCdf(z);
68}
69
76inline double UpperConfidenceBound(double mean, double variance, double kappa = 2.0) {
77 if (variance < 0.0) {
78 throw std::invalid_argument("UpperConfidenceBound: variance must be non-negative");
79 }
80 return mean + kappa * std::sqrt(variance);
81}
82
83} // namespace pulsatrix
Definition acquisition_functions.hpp:16
double StandardNormalCdf(double z)
Standard normal CDF, Phi(z) = 0.5 * (1 + erf(z / sqrt(2))).
Definition acquisition_functions.hpp:25
double StandardNormalPdf(double z)
Standard normal PDF, phi(z) = (1/sqrt(2*pi)) * exp(-z^2/2).
Definition acquisition_functions.hpp:19