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, /* 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   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 }; // namespace optimization
00264 }; // namespace mlpack
00265 
00266 #include "lbfgs_impl.hpp"
00267 
00268 #endif // __MLPACK_CORE_OPTIMIZERS_LBFGS_LBFGS_HPP

Generated on 13 Aug 2014 for MLPACK by  doxygen 1.6.1