5#ifndef EIGEN_NONLINEAROPTIMIZATION_DOGLEG_H
6#define EIGEN_NONLINEAROPTIMIZATION_DOGLEG_H
8#include "./InternalHeaderCheck.h"
14template <
typename Scalar>
15void dogleg(
const Matrix<Scalar, Dynamic, Dynamic> &qrfac,
const Matrix<Scalar, Dynamic, 1> &diag,
16 const Matrix<Scalar, Dynamic, 1> &qtb, Scalar delta, Matrix<Scalar, Dynamic, 1> &x) {
20 typedef DenseIndex Index;
24 Scalar sum, temp, alpha, bnorm;
29 const Scalar epsmch = NumTraits<Scalar>::epsilon();
30 const Index n = qrfac.cols();
31 eigen_assert(n == qtb.size());
32 eigen_assert(n == x.size());
33 eigen_assert(n == diag.size());
34 Matrix<Scalar, Dynamic, 1> wa1(n), wa2(n);
37 for (j = n - 1; j >= 0; --j) {
40 temp = epsmch * qrfac.col(j).head(j + 1).maxCoeff();
41 if (temp == 0.) temp = epsmch;
46 x[j] = (qtb[j] - qrfac.row(j).tail(n - j - 1).dot(x.tail(n - j - 1))) / temp;
50 qnorm = diag.cwiseProduct(x).stableNorm();
51 if (qnorm <= delta)
return;
59 for (j = 0; j < n; ++j) {
60 wa1.tail(n - j) += qrfac.row(j).tail(n - j) * qtb[j];
66 gnorm = wa1.stableNorm();
68 alpha = delta / qnorm;
69 if (gnorm == 0.)
goto algo_end;
73 wa1.array() /= (diag * gnorm).array();
76 for (j = 0; j < n; ++j) {
78 for (i = j; i < n; ++i) {
79 sum += qrfac(j, i) * wa1[i];
83 temp = wa2.stableNorm();
84 sgnorm = gnorm / temp / temp;
88 if (sgnorm >= delta)
goto algo_end;
93 bnorm = qtb.stableNorm();
94 temp = bnorm / gnorm * (bnorm / qnorm) * (sgnorm / delta);
95 temp = temp - delta / qnorm * numext::abs2(sgnorm / delta) +
96 sqrt(numext::abs2(temp - delta / qnorm) +
97 (1. - numext::abs2(delta / qnorm)) * (1. - numext::abs2(sgnorm / delta)));
98 alpha = delta / qnorm * (1. - numext::abs2(sgnorm / delta)) / temp;
103 temp = (1. - alpha) * (std::min)(sgnorm, delta);
104 x = temp * wa1 + alpha * x;
Namespace containing all symbols from the Eigen library.