More'-Thuente Line Search. Original code by Dianne O'Leary, modfified by Tammy Kolda and Roger Pawlowski for the NOX project. This version has been slightly optimized and also supports Homer Walker's work on adaptive forcing terms and Ared/Pred conditions. It also allows for arbitrary merit functions and norms to be supplied by the user. More...
|MoreThuente (const Teuchos::RCP< NOX::GlobalData > &gd, Teuchos::ParameterList ¶ms)|
|bool||reset (const Teuchos::RCP< NOX::GlobalData > &gd, Teuchos::ParameterList ¶ms)|
|bool||compute (NOX::Abstract::Group &newgrp, double &step, const NOX::Abstract::Vector &dir, const NOX::Solver::Generic &s)|
|Perform a line search. |
More'-Thuente Line Search. Original code by Dianne O'Leary, modfified by Tammy Kolda and Roger Pawlowski for the NOX project. This version has been slightly optimized and also supports Homer Walker's work on adaptive forcing terms and Ared/Pred conditions. It also allows for arbitrary merit functions and norms to be supplied by the user.
This code is based on the More'-Thuente line search from the 1983 MINPACK Project. More specifically, this code is based on Dianne O'Leary's 1991 Matlab-implementation of the More'-Thuente line search. The original comments are preserved in the descriptions of the individual subroutines. What follows is an updated summary.
The merit function we are minimizing is given by
(alternatively the user can define this)
The purpose of the More'-Thuente line search is to find a step which satisfies a sufficient decrease condition and a curvature condition. At each stage the subroutine updates an interval of uncertainty with endpoints stx and sty. The interval of uncertainty is initially chosen so that it contains a minimizer of the modified function
If a step is obtained for which the modified function has a nonpositive function value and nonnegative derivative, then the interval of uncertainty is chosen so that it contains a minimizer of .
The algorithm is designed to find a step which satisfies one of two sufficient decrease conditions:
(1) Armijo-Goldstein Condition
(2) Ared/Pred Condtition
and the curvature condition
If ftol is less than gtol and if, for example, the function is bounded below, then there is always a step which satisfies both conditions. If no step can be found which satisfies both conditions, then the algorithm usually stops when rounding errors prevent further progress. In this case stp only satisfies the sufficient decrease condition.
Modifications from NOX::LineSearch::MoreThuente
1. Added the option to use Ared/Pred conditions as describe in Homer Walker's papers. 2. Added support to use an adjustable forcing term as describe in Homer Walker's papers. 3. Added the option to use directional derivatives in computing the slope instead of explicitly computing the Jacobian. This eliminates the need to recompute the Jacobian at each inner iteration of the More'-Thuente algorithm. 4. Added the ability to use the NOX::Parameter::UserNorm and NOX::Parameter::MeritFunction objects to supply user defined norms and merit functions to the line search.
This line search can be called via NOX::LineSearch::Manager.
This line search is used if "More'-Thuente2" is the "Method" in the "Line Search" sublist. (See NOX::LineSearch::Manager for details.)
The following parameters can be specified for this line search in the "More'-Thuente2" sublist of the "Line Search" sublist:
A sublist for output parameters will be created called "Output" in the parameter list used to instantiate or reset the class. Valid output parameters are:
|bool NOX::LineSearch::MoreThuente::compute||(||NOX::Abstract::Group &||grp,|
|const NOX::Abstract::Vector &||dir,|
|const NOX::Solver::Generic &||s|
Perform a line search.
|grp||The initial solution vector, .|
|dir||A vector of directions to be used in the line search, .|
|s||The nonlinear solver.|
|step||The distance the direction was scaled, .|
Ideally, (e.g the final direction is a descent direction).
Note that the
dir object is a std::vector. For typical line searches as described in the above equation, this vector is of size one. We have used a std::vector to allow for special cases of multi-directional line searches such as the Bader/Schnabel curvillinear line search.
Return value is true for a successful line search computation.