16 template <
typename Scalar>
37 const int m = m_param.
m;
76 template <
typename Foo>
77 inline int minimize(Foo& f, Vector& x, Scalar& fx)
79 const int n = x.size();
80 const int fpast = m_param.
past;
85 Scalar xnorm = x.norm();
86 Scalar gnorm = m_grad.norm();
99 Scalar step = Scalar(1.0) / m_drt.norm();
107 m_gradp.noalias() =
m_grad;
114 gnorm = m_grad.norm();
124 if(k >= fpast &&
std::abs((m_fx[k % fpast] - fx) / fx) < m_param.
delta)
127 m_fx[k % fpast] = fx;
138 MapVec svec(&
m_s(0, end), n);
139 MapVec yvec(&
m_y(0, end), n);
140 svec.noalias() = x -
m_xp;
141 yvec.noalias() = m_grad -
m_gradp;
145 Scalar ys = yvec.dot(svec);
146 Scalar yy = yvec.squaredNorm();
150 m_drt.noalias() = -
m_grad;
152 end = (end + 1) % m_param.
m;
154 for(
int i = 0; i < bound; i++)
156 j = (j + m_param.
m - 1) % m_param.
m;
157 MapVec sj(&
m_s(0, j), n);
158 MapVec yj(&
m_y(0, j), n);
159 m_alpha[j] = sj.dot(m_drt) / m_ys[j];
160 m_drt.noalias() -= m_alpha[j] * yj;
165 for(
int i = 0; i < bound; i++)
167 MapVec sj(&
m_s(0, j), n);
168 MapVec yj(&
m_y(0, j), n);
169 Scalar beta = yj.dot(m_drt) / m_ys[j];
170 m_drt.noalias() += (m_alpha[j] - beta) * sj;
171 j = (j + 1) % m_param.
m;
Eigen::Map< Vector > MapVec
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
A matrix or vector expression mapping an existing array of data.
int minimize(Foo &f, Vector &x, Scalar &fx)
const LBFGSParam< Scalar > & m_param
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > Matrix
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const AbsReturnType abs() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
LBFGSSolver(const LBFGSParam< Scalar > ¶m)
static void Backtracking(Foo &f, Scalar &fx, Vector &x, Vector &grad, Scalar &step, const Vector &drt, const Vector &xp, const LBFGSParam< Scalar > ¶m)
int64_t max(int64_t a, const int b)