ROL
ROL_NonlinearCGStep.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Rapid Optimization Library (ROL) Package
4//
5// Copyright 2014 NTESS and the ROL contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef ROL_NONLINEARCGSTEP_H
11#define ROL_NONLINEARCGSTEP_H
12
13#include "ROL_Types.hpp"
14#include "ROL_Step.hpp"
15#include "ROL_NonlinearCG.hpp"
16
22
23namespace ROL {
24
25template <class Real>
26class NonlinearCGStep : public Step<Real> {
27private:
28
29 ROL::Ptr<NonlinearCG<Real> > nlcg_;
32 const bool computeObj_;
33
34 std::string ncgName_;
35
36public:
37
38 using Step<Real>::initialize;
39 using Step<Real>::compute;
40 using Step<Real>::update;
41
51 NonlinearCGStep( ROL::ParameterList &parlist,
52 const ROL::Ptr<NonlinearCG<Real> > &nlcg = ROL::nullPtr,
53 const bool computeObj = true )
54 : Step<Real>(), nlcg_(nlcg), enlcg_(NONLINEARCG_USERDEFINED),
55 verbosity_(0), computeObj_(computeObj) {
56 // Parse ParameterList
57 verbosity_ = parlist.sublist("General").get("Print Verbosity",0);
58 // Initialize secant object
59 ROL::ParameterList& Llist = parlist.sublist("Step").sublist("Line Search");
60 if ( nlcg == ROL::nullPtr ) {
61 ncgName_ = Llist.sublist("Descent Method").get("Nonlinear CG Type","Oren-Luenberger");
62 enlcg_
64 nlcg_ = ROL::makePtr<NonlinearCG<Real>>(enlcg_);
65 }
66 else {
67 ncgName_ = Llist.sublist("Descent Method").get("User Defined Nonlinear CG Name",
68 "Unspecified User Define Nonlinear CG Method");
69 }
70 }
71
72 void compute( Vector<Real> &s, const Vector<Real> &x,
74 AlgorithmState<Real> &algo_state ) {
75 ROL::Ptr<StepState<Real> > step_state = Step<Real>::getState();
76 Real one(1);
77
78 // Compute search direction
79 nlcg_->run(s,*(step_state->gradientVec),x,obj);
80 s.scale(-one);
81 }
82
84 AlgorithmState<Real> &algo_state ) {
85 Real tol = std::sqrt(ROL_EPSILON<Real>());
86 ROL::Ptr<StepState<Real> > step_state = Step<Real>::getState();
87
88 // Update iterate
89 algo_state.iter++;
90 x.plus(s);
91 (step_state->descentVec)->set(s);
92 algo_state.snorm = s.norm();
93
94 // Compute new gradient
95 obj.update(x,true,algo_state.iter);
96 if ( computeObj_ ) {
97 algo_state.value = obj.value(x,tol);
98 algo_state.nfval++;
99 }
100 obj.gradient(*(step_state->gradientVec),x,tol);
101 algo_state.ngrad++;
102
103 // Update algorithm state
104 (algo_state.iterateVec)->set(x);
105 algo_state.gnorm = (step_state->gradientVec)->norm();
106 }
107
108 std::string printHeader( void ) const {
109 std::stringstream hist;
110
111 if( verbosity_>0 ) {
112 hist << std::string(109,'-') << "\n";
114 hist << " status output definitions\n\n";
115 hist << " iter - Number of iterates (steps taken) \n";
116 hist << " value - Objective function value \n";
117 hist << " gnorm - Norm of the gradient\n";
118 hist << " snorm - Norm of the step (update to optimization vector)\n";
119 hist << " #fval - Cumulative number of times the objective function was evaluated\n";
120 hist << " #grad - Number of times the gradient was computed\n";
121 hist << std::string(109,'-') << "\n";
122 }
123
124 hist << " ";
125 hist << std::setw(6) << std::left << "iter";
126 hist << std::setw(15) << std::left << "value";
127 hist << std::setw(15) << std::left << "gnorm";
128 hist << std::setw(15) << std::left << "snorm";
129 hist << std::setw(10) << std::left << "#fval";
130 hist << std::setw(10) << std::left << "#grad";
131 hist << "\n";
132 return hist.str();
133 }
134 std::string printName( void ) const {
135 std::stringstream hist;
136 hist << "\n" << ncgName_ << " "
138 return hist.str();
139 }
140 std::string print( AlgorithmState<Real> &algo_state, bool print_header = false ) const {
141 std::stringstream hist;
142 hist << std::scientific << std::setprecision(6);
143 if ( algo_state.iter == 0 ) {
144 hist << printName();
145 }
146 if ( print_header ) {
147 hist << printHeader();
148 }
149 if ( algo_state.iter == 0 ) {
150 hist << " ";
151 hist << std::setw(6) << std::left << algo_state.iter;
152 hist << std::setw(15) << std::left << algo_state.value;
153 hist << std::setw(15) << std::left << algo_state.gnorm;
154 hist << "\n";
155 }
156 else {
157 hist << " ";
158 hist << std::setw(6) << std::left << algo_state.iter;
159 hist << std::setw(15) << std::left << algo_state.value;
160 hist << std::setw(15) << std::left << algo_state.gnorm;
161 hist << std::setw(15) << std::left << algo_state.snorm;
162 hist << std::setw(10) << std::left << algo_state.nfval;
163 hist << std::setw(10) << std::left << algo_state.ngrad;
164 hist << "\n";
165 }
166 return hist.str();
167 }
168}; // class NonlinearCGStep
169
170} // namespace ROL
171
172#endif
Contains definitions of custom data types in ROL.
Provides the interface to apply upper and lower bound constraints.
int verbosity_
Verbosity setting.
std::string printName(void) const
Print step name.
void update(Vector< Real > &x, const Vector< Real > &s, Objective< Real > &obj, BoundConstraint< Real > &con, AlgorithmState< Real > &algo_state)
Update step, if successful.
void compute(Vector< Real > &s, const Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Compute step.
std::string print(AlgorithmState< Real > &algo_state, bool print_header=false) const
Print iterate status.
std::string printHeader(void) const
Print iterate header.
NonlinearCGStep(ROL::ParameterList &parlist, const ROL::Ptr< NonlinearCG< Real > > &nlcg=ROL::nullPtr, const bool computeObj=true)
Constructor.
ROL::Ptr< NonlinearCG< Real > > nlcg_
NonlinearCG object (used for quasi-Newton).
Provides the interface to evaluate objective functions.
virtual void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
virtual Real value(const Vector< Real > &x, Real &tol)=0
Compute value.
virtual void update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update objective function.
virtual void initialize(Vector< Real > &x, const Vector< Real > &g, Objective< Real > &obj, BoundConstraint< Real > &con, AlgorithmState< Real > &algo_state)
Initialize step with bound constraint.
Definition ROL_Step.hpp:54
ROL::Ptr< StepState< Real > > getState(void)
Definition ROL_Step.hpp:39
Step(void)
Definition ROL_Step.hpp:47
Defines the linear algebra or vector space interface.
virtual Real norm() const =0
Returns where .
virtual void scale(const Real alpha)=0
Compute where .
virtual void plus(const Vector &x)=0
Compute , where .
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.
Definition ROL_Types.hpp:57
ENonlinearCG
@ NONLINEARCG_USERDEFINED
@ DESCENT_NONLINEARCG
std::string EDescentToString(EDescent tr)
ENonlinearCG StringToENonlinearCG(std::string s)
State for algorithm class. Will be used for restarts.
ROL::Ptr< Vector< Real > > iterateVec