41 size_t dim = t.size();
44 double eps = std::numeric_limits<double>::epsilon();
45 double h = std::pow(eps, 0.25);
46 const double ft =
f(t);
47 std::vector<double> t_shift;
48 std::vector<std::pair<int, int>> signs = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
49 for (
size_t i = 0; i < dim; i++) {
51 for (
int sign : {-1, 1}) {
53 t_shift[i] += sign * h;
58 Hii = (Hii - 2 * ft) / std::pow(h, 2);
60 if (!std::isfinite(Hii))
61 throw std::runtime_error(
"Invalid value found in hessian");
65 for (
size_t j = i + 1; j < dim; j++) {
67 for (
auto& ss : signs) {
69 t_shift[i] += ss.first * h;
70 t_shift[j] += ss.second * h;
74 Hij += ss.first * ss.second *
f(t_shift);
79 if (!std::isfinite(Hij))
80 throw std::runtime_error(
"Invalid value found in hessian");
87 return 0.5 * (H + H.transpose());