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();
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
Contains definitions of custom data types in ROL.
Provides the interface to apply upper and lower bound constraints.
bool isActivated(void) const
Check if bounds are on.
virtual void project(Vector< Real > &x)
Project optimization variables onto the bounds.
Defines the general constraint operator interface.
const Ptr< Vector< Real > > getLagrangianGradient(const Vector< Real > &x)
int getNumberConstraintEvaluations() const
int getNumberGradientEvaluations() const
void setDelta(Real delta)
const Ptr< Vector< Real > > getMultiplierVec(const Vector< Real > &x)
Real getObjectiveValue(const Vector< Real > &x)
int getNumberFunctionEvaluations() const
const Ptr< Vector< Real > > getConstraintVec(const Vector< Real > &x)
void setPenaltyParameter(Real sigma)
Provides the interface to compute Fletcher steps.
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).
std::string printHeader(void) const
Print iterate header.
ROL::Ptr< BoundConstraint< Real > > bnd_
ROL::ParameterList parlist_
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,...
FletcherStep(ROL::ParameterList &parlist)
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).
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,...
ROL::Ptr< Step< Real > > step_
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.
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.
std::string getValueString(const Real value, const bool print) const
std::string printName(void) const
Print step name.
Real computeProjGradientNorm(const Vector< Real > &g, const Vector< Real > &x, BoundConstraint< Real > &bnd)
std::string print(AlgorithmState< Real > &algo_state, bool pHeader=false) const
Print iterate status.
ROL::Ptr< Vector< Real > > g_
AlgorithmState< Real > tr_algo_state_
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 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).
ROL::Ptr< Vector< Real > > x_
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.
Provides the interface to compute optimization steps.
ROL::Ptr< StepState< Real > > getState(void)
const ROL::Ptr< const StepState< Real > > getStepState(void) const
Get state for step object.
Defines the linear algebra or vector space interface.
virtual Real norm() const =0
Returns where .
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis,...
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
ROL::Objective_SerialSimOpt Objective_SimOpt value(const V &u, const V &z, Real &tol) override
ETrustRegion StringToETrustRegion(std::string s)
@ TRUSTREGION_TRUNCATEDCG
State for algorithm class. Will be used for restarts.
Real aggregateGradientNorm
ROL::Ptr< Vector< Real > > lagmultVec
ROL::Ptr< Vector< Real > > iterateVec