79 inline int minimize(Foo& f, Vector& x, Scalar& fx)
84 const int n = x.size();
88 const int fpast = m_param.past;
92 m_gnorm = m_grad.norm();
100 if (m_gnorm <= m_param.epsilon || m_gnorm <= m_param.epsilon_rel * x.norm())
106 m_drt.noalias() = -m_grad;
108 Scalar step = Scalar(1) / m_drt.norm();
110 constexpr Scalar eps = std::numeric_limits<Scalar>::epsilon();
112 Vector vecs(n), vecy(n);
122 m_gradp.noalias() = m_grad;
123 Scalar dg = m_grad.dot(m_drt);
124 const Scalar step_max = m_param.max_step;
127 LineSearch<Scalar>::LineSearch(f, m_param, m_xp, m_drt, step_max, step, fx, m_grad, dg, x);
130 m_gnorm = m_grad.norm();
137 if (m_gnorm <= m_param.epsilon || m_gnorm <= m_param.epsilon_rel * x.norm())
144 const Scalar fxd = m_fx[k % fpast];
145 if (k >= fpast && abs(fxd - fx) <= m_param.delta * std::max(std::max(abs(fx), abs(fxd)), Scalar(1)))
148 m_fx[k % fpast] = fx;
151 if (m_param.max_iterations != 0 && k >= m_param.max_iterations)
159 vecs.noalias() = x - m_xp;
160 vecy.noalias() = m_grad - m_gradp;
161 if (vecs.dot(vecy) > eps * vecy.squaredNorm())
162 m_bfgs.add_correction(vecs, vecy);
165 m_bfgs.apply_Hv(m_grad, -Scalar(1), m_drt);