lbfgs.hpp
Go to the documentation of this file.00001
00023 #ifndef __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP
00024 #define __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP
00025
00026 #include <mlpack/core.hpp>
00027
00028 namespace mlpack {
00029 namespace optimization {
00030
00043 template<typename FunctionType>
00044 class L_BFGS
00045 {
00046 public:
00067 L_BFGS(FunctionType& function,
00068 const size_t numBasis = 5,
00069 const size_t maxIterations = 0,
00070 const double armijoConstant = 1e-4,
00071 const double wolfe = 0.9,
00072 const double minGradientNorm = 1e-10,
00073 const size_t maxLineSearchTrials = 50,
00074 const double minStep = 1e-20,
00075 const double maxStep = 1e20);
00076
00083 const std::pair<arma::mat, double>& MinPointIterate() const;
00084
00096 double Optimize(arma::mat& iterate);
00097
00110 double Optimize(arma::mat& iterate, const size_t maxIterations);
00111
00113 const FunctionType& Function() const { return function; }
00115 FunctionType& Function() { return function; }
00116
00118 size_t NumBasis() const { return numBasis; }
00120 size_t& NumBasis() { return numBasis; }
00121
00123 size_t MaxIterations() const { return maxIterations; }
00125 size_t& MaxIterations() { return maxIterations; }
00126
00128 double ArmijoConstant() const { return armijoConstant; }
00130 double& ArmijoConstant() { return armijoConstant; }
00131
00133 double Wolfe() const { return wolfe; }
00135 double& Wolfe() { return wolfe; }
00136
00138 double MinGradientNorm() const { return minGradientNorm; }
00140 double& MinGradientNorm() { return minGradientNorm; }
00141
00143 size_t MaxLineSearchTrials() const { return maxLineSearchTrials; }
00145 size_t& MaxLineSearchTrials() { return maxLineSearchTrials; }
00146
00148 double MinStep() const { return minStep; }
00150 double& MinStep() { return minStep; }
00151
00153 double MaxStep() const { return maxStep; }
00155 double& MaxStep() { return maxStep; }
00156
00157 private:
00159 FunctionType& function;
00160
00162 arma::mat newIterateTmp;
00164 arma::cube s;
00166 arma::cube y;
00167
00169 size_t numBasis;
00171 size_t maxIterations;
00173 double armijoConstant;
00175 double wolfe;
00177 double minGradientNorm;
00179 size_t maxLineSearchTrials;
00181 double minStep;
00183 double maxStep;
00184
00186 std::pair<arma::mat, double> minPointIterate;
00187
00194 double Evaluate(const arma::mat& iterate);
00195
00203 double ChooseScalingFactor(const size_t iterationNum,
00204 const arma::mat& gradient);
00205
00212 bool GradientNormTooSmall(const arma::mat& gradient);
00213
00227 bool LineSearch(double& functionValue,
00228 arma::mat& iterate,
00229 arma::mat& gradient,
00230 const arma::mat& searchDirection);
00231
00240 void SearchDirection(const arma::mat& gradient,
00241 const size_t iterationNum,
00242 const double scalingFactor,
00243 arma::mat& searchDirection);
00244
00256 void UpdateBasisSet(const size_t iterationNum,
00257 const arma::mat& iterate,
00258 const arma::mat& oldIterate,
00259 const arma::mat& gradient,
00260 const arma::mat& oldGradient);
00261 };
00262
00263 };
00264 };
00265
00266 #include "lbfgs_impl.hpp"
00267
00268 #endif // __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP