1 // @HEADER 2 // ************************************************************************ 3 // 4 // Rapid Optimization Library (ROL) Package 5 // Copyright (2014) Sandia Corporation 6 // 7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 8 // license for use of this work by or on behalf of the U.S. Government. 9 // 10 // Redistribution and use in source and binary forms, with or without 11 // modification, are permitted provided that the following conditions are 12 // met: 13 // 14 // 1. Redistributions of source code must retain the above copyright 15 // notice, this list of conditions and the following disclaimer. 16 // 17 // 2. Redistributions in binary form must reproduce the above copyright 18 // notice, this list of conditions and the following disclaimer in the 19 // documentation and/or other materials provided with the distribution. 20 // 21 // 3. Neither the name of the Corporation nor the names of the 22 // contributors may be used to endorse or promote products derived from 23 // this software without specific prior written permission. 24 // 25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 // 37 // Questions? Contact lead developers: 38 // Drew Kouri (dpkouri@sandia.gov) and 39 // Denis Ridzal (dridzal@sandia.gov) 40 // 41 // ************************************************************************ 42 // @HEADER 43 44 #ifndef ROL_BACKTRACKING_H 45 #define ROL_BACKTRACKING_H 46 47 #include "ROL_LineSearch.hpp" 48 49 /** \class ROL::BackTracking 50 \brief Implements a simple back tracking line search. 51 */ 52 53 namespace ROL { 54 55 template<class Real> 56 class BackTracking : public LineSearch<Real> { 57 private: 58 Real rho_; 59 ROL::Ptr<Vector<Real> > xnew_; 60 61 public: 62 ~BackTracking()63 virtual ~BackTracking() {} 64 65 // Constructor BackTracking(ROL::ParameterList & parlist)66 BackTracking( ROL::ParameterList &parlist ) : LineSearch<Real>(parlist) { 67 Real half(0.5); 68 rho_ = parlist.sublist("Step").sublist("Line Search").sublist("Line-Search Method").get("Backtracking Rate",half); 69 } 70 initialize(const Vector<Real> & x,const Vector<Real> & s,const Vector<Real> & g,Objective<Real> & obj,BoundConstraint<Real> & con)71 void initialize( const Vector<Real> &x, const Vector<Real> &s, const Vector<Real> &g, 72 Objective<Real> &obj, BoundConstraint<Real> &con ) { 73 LineSearch<Real>::initialize(x,s,g,obj,con); 74 xnew_ = x.clone(); 75 } 76 run(Real & alpha,Real & fval,int & ls_neval,int & ls_ngrad,const Real & gs,const Vector<Real> & s,const Vector<Real> & x,Objective<Real> & obj,BoundConstraint<Real> & con)77 void run( Real &alpha, Real &fval, int &ls_neval, int &ls_ngrad, 78 const Real &gs, const Vector<Real> &s, const Vector<Real> &x, 79 Objective<Real> &obj, BoundConstraint<Real> &con ) { 80 Real tol = std::sqrt(ROL_EPSILON<Real>()); 81 ls_neval = 0; 82 ls_ngrad = 0; 83 // Get initial line search parameter 84 alpha = LineSearch<Real>::getInitialAlpha(ls_neval,ls_ngrad,fval,gs,x,s,obj,con); 85 // Update iterate 86 LineSearch<Real>::updateIterate(*xnew_,x,s,alpha,con); 87 // Get objective value at xnew 88 Real fold = fval; 89 obj.update(*xnew_); 90 fval = obj.value(*xnew_,tol); 91 ls_neval++; 92 // Perform backtracking 93 while ( !LineSearch<Real>::status(LINESEARCH_BACKTRACKING,ls_neval,ls_ngrad,alpha,fold,gs,fval,*xnew_,s,obj,con) ) { 94 alpha *= rho_; 95 // Update iterate 96 LineSearch<Real>::updateIterate(*xnew_,x,s,alpha,con); 97 // Get objective value at xnew 98 obj.update(*xnew_); 99 fval = obj.value(*xnew_,tol); 100 ls_neval++; 101 } 102 } 103 }; 104 105 } 106 107 #endif 108