10 #ifndef ROL_FLETCHERSTEP_H
11 #define ROL_FLETCHERSTEP_H
18 #include "ROL_ParameterList.hpp"
31 ROL::Ptr<BoundConstraint<Real> >
bnd_;
35 ROL::Ptr<Vector<Real> >
x_;
53 ROL::Ptr<Vector<Real> >
g_;
93 Real
zero(0), one(1), two(2), oe8(1.e8), oe1(1.e-1), oem6(1e-6), oem8(1.e-8);
95 ROL::ParameterList& sublist = parlist.sublist(
"Step").sublist(
"Fletcher");
97 delta_ = sublist.get(
"Regularization Parameter",
zero);
98 deltaMin_ = sublist.get(
"Min Regularization Parameter",oem8);
99 deltaUpdate_ = sublist.get(
"Regularization Parameter Decrease Factor", oe1);
101 penaltyUpdate_ = sublist.get(
"Penalty Parameter Growth Factor", two);
106 subStep_ = sublist.get(
"Subproblem Solver",
"Trust Region");
116 bnd_ = ROL::makePtr<BoundConstraint<Real>>();
129 ROL::ParameterList trlist(
parlist_);
130 bool inexactFletcher = trlist.sublist(
"Step").sublist(
"Fletcher").get(
"Inexact Solves",
false);
131 if( inexactFletcher ) {
132 trlist.sublist(
"General").set(
"Inexact Objective Value",
true);
133 trlist.sublist(
"General").set(
"Inexact Gradient",
true);
136 trlist.sublist(
"Step").sublist(
"Trust Region").set(
"Subproblem Model",
"Coleman-Li");
140 step_ = makePtr<LineSearchStep<Real>>(trlist);
143 step_ = makePtr<TrustRegionStep<Real>>(trlist);
145 std::string solverType =
parlist_.sublist(
"Step").sublist(
"Trust Region").get(
"Subproblem Solver",
"Truncated CG");
163 state->descentVec = x.
clone();
164 state->gradientVec = g.
clone();
165 state->constraintVec = c.
clone();
167 algo_state.
nfval = 0;
168 algo_state.
ncval = 0;
169 algo_state.
ngrad = 0;
177 algo_state.
cnorm = (state->constraintVec)->norm();
218 bool modified =
false;
222 const ROL::Ptr<const StepState<Real> > state =
step_->getStepState();
228 Real cnorm = (fletcherState->constraintVec)->norm();
229 bool too_infeasible = cnorm >
static_cast<Real
>(100.)*gPhiNorm;
230 bool too_feasible = cnorm < static_cast<Real>(1e-2)*gPhiNorm;
236 algo_state.
flag =
true;
250 algo_state.
flag =
true;
262 if( gPhiNorm < deltaNext ) {
272 Real tol =
static_cast<Real
>(1e-12);
288 fletcherState->descentVec->set(s);
295 algo_state.
cnorm = (fletcherState->constraintVec)->norm();
316 std::stringstream hist;
319 hist << std::setw(6) << std::left <<
"iter";
320 hist << std::setw(15) << std::left <<
"merit";
321 hist << std::setw(15) << std::left <<
"fval";
322 hist << std::setw(15) << std::left <<
"gpnorm";
323 hist << std::setw(15) << std::left <<
"gLnorm";
324 hist << std::setw(15) << std::left <<
"cnorm";
325 hist << std::setw(15) << std::left <<
"snorm";
326 hist << std::setw(15) << std::left <<
"tr_radius";
327 hist << std::setw(10) << std::left <<
"tr_flag";
329 hist << std::setw(10) << std::left <<
"iterCG";
330 hist << std::setw(10) << std::left <<
"flagCG";
332 hist << std::setw(15) << std::left <<
"penalty";
333 hist << std::setw(15) << std::left <<
"delta";
334 hist << std::setw(10) << std::left <<
"#fval";
335 hist << std::setw(10) << std::left <<
"#grad";
336 hist << std::setw(10) << std::left <<
"#cval";
340 std::string stepHeader =
step_->printHeader();
343 hist << std::setw(15) << std::left <<
"fval";
344 hist << std::setw(15) << std::left <<
"gLnorm";
345 hist << std::setw(15) << std::left <<
"cnorm";
346 hist << std::setw(15) << std::left <<
"penalty";
347 hist << std::setw(15) << std::left <<
"delta";
348 hist << std::setw(10) << std::left <<
"#cval";
357 std::stringstream hist;
358 hist <<
"\n" <<
" Fletcher solver : " <<
subStep_;
367 stepHist.erase(std::remove(stepHist.end()-3, stepHist.end(),
'\n'), stepHist.end());
368 std::string name =
step_->printName();
369 size_t pos = stepHist.find(name);
370 if ( pos != std::string::npos ) {
371 stepHist.erase(pos, name.length());
374 std::stringstream hist;
375 hist << std::scientific << std::setprecision(6);
376 if ( algo_state.
iter == 0 ) {
388 hist << std::setw(6) << std::left << algo_state.
iter;
390 hist << std::setw(15) << std::left << algo_state.
value;
392 hist << std::setw(15) << std::left << algo_state.
gnorm;
393 hist << std::setw(15) << std::left << algo_state.
cnorm;
394 hist << std::setw(15) << std::left << stepHist.substr(38,15);
395 hist << std::setw(15) << std::left << stepHist.substr(53,15);
396 hist << std::setw(10) << std::left << (algo_state.
iter == 0 ?
"" : stepHist.substr(88,10));
398 hist << std::setw(10) << std::left << (algo_state.
iter == 0 ?
"" : stepHist.substr(93,10));
399 hist << std::setw(10) << std::left << (algo_state.
iter == 0 ?
"" : stepHist.substr(103,10));
401 hist << std::setw(15) << std::left << penaltyString;
402 hist << std::setw(15) << std::left << deltaString;
403 hist << std::setw(10) << std::left << (algo_state.
iter == 0 ?
"" : stepHist.substr(68,10));
404 hist << std::setw(10) << std::left << (algo_state.
iter == 0 ?
"" : stepHist.substr(78,10));
405 hist << std::setw(10) << std::left << algo_state.
ncval;
409 hist << std::setw(15) << std::left << algo_state.
value;
410 hist << std::setw(15) << std::left << algo_state.
gnorm;
411 hist << std::setw(15) << std::left << algo_state.
cnorm;
412 hist << std::setw(15) << std::left << penaltyString;
413 hist << std::setw(15) << std::left << deltaString;
414 hist << std::setw(10) << std::left << algo_state.
ncval;
422 std::stringstream valString;
423 valString << std::scientific << std::setprecision(6);
425 valString << std::setw(15) << std::left <<
value;
427 valString << std::setw(15) <<
"";
429 return valString.str();
void update(Vector< Real > &x, Vector< Real > &l, const Vector< Real > &s, Objective< Real > &obj, Constraint< Real > &con, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Update step, if successful (equality and bound constraints).
Provides the interface to evaluate objective functions.
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
int getNumberGradientEvaluations() const
void setDelta(Real delta)
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
AlgorithmState< Real > tr_algo_state_
Real getObjectiveValue(const Vector< Real > &x)
bool isActivated(void) const
Check if bounds are on.
virtual Real value(const Vector< Real > &x, Real &tol)=0
Compute value.
Provides the interface to compute optimization steps.
std::string print(AlgorithmState< Real > &algo_state, bool pHeader=false) const
Print iterate status.
void compute(Vector< Real > &s, const Vector< Real > &x, const Vector< Real > &l, Objective< Real > &obj, Constraint< Real > &con, AlgorithmState< Real > &algo_state)
Compute step (equality constraint).
Real aggregateGradientNorm
Contains definitions of custom data types in ROL.
const Ptr< Vector< Real > > getMultiplierVec(const Vector< Real > &x)
ROL::Objective_SimOpt value
int getNumberFunctionEvaluations() const
FletcherStep(ROL::ParameterList &parlist)
void update(Vector< Real > &x, Vector< Real > &l, const Vector< Real > &s, Objective< Real > &obj, Constraint< Real > &con, AlgorithmState< Real > &algo_state)
Update step, if successful (equality constraint).
Defines the linear algebra or vector space interface.
ROL::Ptr< BoundConstraint< Real > > bnd_
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
State for algorithm class. Will be used for restarts.
ROL::Ptr< Vector< Real > > x_
virtual void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
void compute(Vector< Real > &s, const Vector< Real > &x, const Vector< Real > &l, Objective< Real > &obj, Constraint< Real > &con, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Compute step (equality and bound constraints).
void setPenaltyParameter(Real sigma)
ROL::Ptr< StepState< Real > > getState(void)
const Ptr< Vector< Real > > getConstraintVec(const Vector< Real > &x)
ROL::ParameterList parlist_
Real computeProjGradientNorm(const Vector< Real > &g, const Vector< Real > &x, BoundConstraint< Real > &bnd)
ROL::Ptr< Vector< Real > > iterateVec
ROL::Ptr< Vector< Real > > g_
Provides the interface to compute Fletcher steps.
virtual void project(Vector< Real > &x)
Project optimization variables onto the bounds.
std::string getValueString(const Real value, const bool print) const
void update(Vector< Real > &x, const Vector< Real > &s, Objective< Real > &obj, BoundConstraint< Real > &con, AlgorithmState< Real > &algo_state)
Update step, for bound constraints; here only to satisfy the interface requirements, does nothing, needs refactoring.
int getNumberConstraintEvaluations() const
std::string printName(void) const
Print step name.
Provides the interface to apply upper and lower bound constraints.
void initialize(Vector< Real > &x, const Vector< Real > &g, Vector< Real > &l, const Vector< Real > &c, Objective< Real > &obj, Constraint< Real > &con, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Initialize step with equality and bound constraints.
const Ptr< Vector< Real > > getLagrangianGradient(const Vector< Real > &x)
std::string printHeader(void) const
Print iterate header.
ETrustRegion StringToETrustRegion(std::string s)
ROL::Ptr< Vector< Real > > lagmultVec
void compute(Vector< Real > &s, const Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &con, AlgorithmState< Real > &algo_state)
Compute step for bound constraints; here only to satisfy the interface requirements, does nothing, needs refactoring.
virtual Real norm() const =0
Returns where .
ETrustRegion
Enumeration of trust-region solver types.
void initialize(Vector< Real > &x, const Vector< Real > &g, Vector< Real > &l, const Vector< Real > &c, Objective< Real > &obj, Constraint< Real > &con, AlgorithmState< Real > &algo_state)
Initialize step with equality constraint.
ROL::Ptr< Step< Real > > step_
Defines the general constraint operator interface.
const ROL::Ptr< const StepState< Real > > getStepState(void) const
Get state for step object.