MLPACK  1.0.8
lbfgs.hpp
Go to the documentation of this file.
1 
23 #ifndef __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP
24 #define __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP
25 
26 #include <mlpack/core.hpp>
27 
28 namespace mlpack {
29 namespace optimization {
30 
43 template<typename FunctionType>
44 class L_BFGS
45 {
46  public:
67  L_BFGS(FunctionType& function,
68  const size_t numBasis = 5, /* entirely arbitrary */
69  const size_t maxIterations = 0, /* run forever */
70  const double armijoConstant = 1e-4,
71  const double wolfe = 0.9,
72  const double minGradientNorm = 1e-10,
73  const size_t maxLineSearchTrials = 50,
74  const double minStep = 1e-20,
75  const double maxStep = 1e20);
76 
83  const std::pair<arma::mat, double>& MinPointIterate() const;
84 
96  double Optimize(arma::mat& iterate);
97 
110  double Optimize(arma::mat& iterate, const size_t maxIterations);
111 
113  const FunctionType& Function() const { return function; }
115  FunctionType& Function() { return function; }
116 
118  size_t NumBasis() const { return numBasis; }
120  size_t& NumBasis() { return numBasis; }
121 
123  size_t MaxIterations() const { return maxIterations; }
125  size_t& MaxIterations() { return maxIterations; }
126 
128  double ArmijoConstant() const { return armijoConstant; }
130  double& ArmijoConstant() { return armijoConstant; }
131 
133  double Wolfe() const { return wolfe; }
135  double& Wolfe() { return wolfe; }
136 
138  double MinGradientNorm() const { return minGradientNorm; }
140  double& MinGradientNorm() { return minGradientNorm; }
141 
143  size_t MaxLineSearchTrials() const { return maxLineSearchTrials; }
146 
148  double MinStep() const { return minStep; }
150  double& MinStep() { return minStep; }
151 
153  double MaxStep() const { return maxStep; }
155  double& MaxStep() { return maxStep; }
156 
157  private:
159  FunctionType& function;
160 
162  arma::mat newIterateTmp;
164  arma::cube s;
166  arma::cube y;
167 
169  size_t numBasis;
175  double wolfe;
181  double minStep;
183  double maxStep;
184 
186  std::pair<arma::mat, double> minPointIterate;
187 
194  double Evaluate(const arma::mat& iterate);
195 
203  double ChooseScalingFactor(const size_t iterationNum,
204  const arma::mat& gradient);
205 
212  bool GradientNormTooSmall(const arma::mat& gradient);
213 
227  bool LineSearch(double& functionValue,
228  arma::mat& iterate,
229  arma::mat& gradient,
230  const arma::mat& searchDirection);
231 
240  void SearchDirection(const arma::mat& gradient,
241  const size_t iterationNum,
242  const double scalingFactor,
243  arma::mat& searchDirection);
244 
256  void UpdateBasisSet(const size_t iterationNum,
257  const arma::mat& iterate,
258  const arma::mat& oldIterate,
259  const arma::mat& gradient,
260  const arma::mat& oldGradient);
261 };
262 
263 }; // namespace optimization
264 }; // namespace mlpack
265 
266 #include "lbfgs_impl.hpp"
267 
268 #endif // __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP