MLPACK
1.0.4
|
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, /* entirely arbitrary */ 00069 const size_t maxIterations = 0, /* run forever */ 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 size_t NumBasis() const { return numBasis; } 00115 size_t& NumBasis() { return numBasis; } 00116 00118 size_t MaxIterations() const { return maxIterations; } 00120 size_t& MaxIterations() { return maxIterations; } 00121 00123 double ArmijoConstant() const { return armijoConstant; } 00125 double& ArmijoConstant() { return armijoConstant; } 00126 00128 double Wolfe() const { return wolfe; } 00130 double& Wolfe() { return wolfe; } 00131 00133 double MinGradientNorm() const { return minGradientNorm; } 00135 double& MinGradientNorm() { return minGradientNorm; } 00136 00138 size_t MaxLineSearchTrials() const { return maxLineSearchTrials; } 00140 size_t& MaxLineSearchTrials() { return maxLineSearchTrials; } 00141 00143 double MinStep() const { return minStep; } 00145 double& MinStep() { return minStep; } 00146 00148 double MaxStep() const { return maxStep; } 00150 double& MaxStep() { return maxStep; } 00151 00152 private: 00154 FunctionType& function; 00155 00157 arma::mat newIterateTmp; 00159 arma::cube s; 00161 arma::cube y; 00162 00164 size_t numBasis; 00166 size_t maxIterations; 00168 double armijoConstant; 00170 double wolfe; 00172 double minGradientNorm; 00174 size_t maxLineSearchTrials; 00176 double minStep; 00178 double maxStep; 00179 00181 std::pair<arma::mat, double> minPointIterate; 00182 00189 double Evaluate(const arma::mat& iterate); 00190 00198 double ChooseScalingFactor(const size_t iterationNum, 00199 const arma::mat& gradient); 00200 00207 bool GradientNormTooSmall(const arma::mat& gradient); 00208 00222 bool LineSearch(double& functionValue, 00223 arma::mat& iterate, 00224 arma::mat& gradient, 00225 const arma::mat& searchDirection); 00226 00235 void SearchDirection(const arma::mat& gradient, 00236 const size_t iterationNum, 00237 const double scalingFactor, 00238 arma::mat& searchDirection); 00239 00251 void UpdateBasisSet(const size_t iterationNum, 00252 const arma::mat& iterate, 00253 const arma::mat& oldIterate, 00254 const arma::mat& gradient, 00255 const arma::mat& oldGradient); 00256 }; 00257 00258 }; // namespace optimization 00259 }; // namespace mlpack 00260 00261 #include "lbfgs_impl.hpp" 00262 00263 #endif // __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP