MLPACK  1.0.4
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   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