10#ifndef ROL_TRUSTREGIONSTEP_H
11#define ROL_TRUSTREGIONSTEP_H
152 ROL::ParameterList &slist = parlist.sublist(
"Step");
153 ROL::ParameterList &list = slist.sublist(
"Trust Region");
154 step_state->searchSize = list.get(
"Initial Radius",
static_cast<Real
>(-1));
155 delMax_ = list.get(
"Maximum Radius",
static_cast<Real
>(1.e8));
157 ROL::ParameterList &glist = parlist.sublist(
"General");
159 bool inexactObj = glist.get(
"Inexact Objective Function",
false);
160 bool inexactGrad = glist.get(
"Inexact Gradient",
false);
161 bool inexactHessVec = glist.get(
"Inexact Hessian-Times-A-Vector",
false);
166 ROL::ParameterList &ilist = list.sublist(
"Inexact").sublist(
"Gradient");
167 scale0_ = ilist.get(
"Tolerance Scaling",
static_cast<Real
>(0.1));
168 scale1_ = ilist.get(
"Relative Tolerance",
static_cast<Real
>(2));
170 std::string solverName = list.get(
"Subproblem Solver",
"Dogleg");
172 std::string modelName = list.get(
"Subproblem Model",
"Kelley-Sachs");
177 scaleEps_ = glist.get(
"Scale for Epsilon Active Sets",
static_cast<Real
>(1));
180 max_fval_ = list.sublist(
"Post-Smoothing").get(
"Function Evaluation Limit", 20);
181 alpha_init_ = list.sublist(
"Post-Smoothing").get(
"Initial Step Size",
static_cast<Real
>(1));
182 mu_ = list.sublist(
"Post-Smoothing").get(
"Tolerance",
static_cast<Real
>(0.9999));
183 beta_ = list.sublist(
"Post-Smoothing").get(
"Rate",
static_cast<Real
>(0.01));
185 stepBackMax_ = list.sublist(
"Coleman-Li").get(
"Maximum Step Back",
static_cast<Real
>(0.9999));
186 stepBackScale_ = list.sublist(
"Coleman-Li").get(
"Maximum Step Scale",
static_cast<Real
>(1));
187 singleReflect_ = list.sublist(
"Coleman-Li").get(
"Single Reflection",
true);
221 Real gtol1 =
scale0_*state->searchSize;
223 Real gtol0 = gtol1 + one;
224 while ( gtol0 > gtol1 ) {
225 obj.
gradient(*(state->gradientVec),x,gtol1);
228 gtol1 =
scale0_*std::min(algo_state.
gnorm,state->searchSize);
233 Real gtol = std::sqrt(ROL_EPSILON<Real>());
234 obj.
gradient(*(state->gradientVec),x,gtol);
261 return xnew_->norm();
301 ROL::ParameterList &glist = parlist.sublist(
"General");
302 std::string secantName = glist.sublist(
"Secant").get(
"Type",
"Limited-Memory BFGS");
306 secant_ = SecantFactory<Real>(parlist);
335 ROL::ParameterList &glist = parlist.sublist(
"General");
338 if ( ROL::is_nullPtr(
secant_) ) {
339 ROL::ParameterList Slist;
340 Slist.sublist(
"General").sublist(
"Secant").set(
"Type",
"Limited-Memory BFGS");
341 Slist.sublist(
"General").sublist(
"Secant").set(
"Maximum Storage",10);
342 secant_ = SecantFactory<Real>(Slist);
360 Real p1(0.1), oe10(1.e10),
zero(0), one(1), half(0.5), three(3), two(2), six(6);
366 Real htol = std::sqrt(ROL_EPSILON<Real>());
367 Real ftol = p1*ROL_OVERFLOW<Real>();
369 step_state->descentVec = s.
clone();
370 step_state->gradientVec = g.
clone();
387 algo_state.
snorm = oe10;
390 algo_state.
gnorm = ROL_INF<Real>();
397 Ptr<Vector<Real>> v = g.
clone();
398 Ptr<Vector<Real>> hv = x.
clone();
401 catch (std::exception &e) {
407 bool autoRad =
false;
408 if ( step_state->searchSize <=
zero ) {
410 Ptr<Vector<Real>> Bg = g.
clone();
412 secant_->applyB(*Bg,(step_state->gradientVec)->dual());
415 obj.
hessVec(*Bg,(step_state->gradientVec)->dual(),x,htol);
417 Real gBg = Bg->dot(*(step_state->gradientVec));
419 if ( gBg > ROL_EPSILON<Real>() ) {
420 alpha = algo_state.
gnorm*algo_state.
gnorm/gBg;
423 Ptr<Vector<Real>> cp = s.
clone();
424 cp->set((step_state->gradientVec)->dual());
426 Ptr<Vector<Real>> xcp = x.
clone();
433 Real fnew = obj.
value(*xcp,ftol);
436 Real gs = cp->dot((step_state->gradientVec)->dual());
437 Real a = fnew - algo_state.
value - gs - half*alpha*alpha*gBg;
438 if ( std::abs(a) < ROL_EPSILON<Real>() ) {
440 step_state->searchSize = std::min(alpha*algo_state.
gnorm,
delMax_);
443 Real b = half*alpha*alpha*gBg;
445 if ( b*b-three*a*c > ROL_EPSILON<Real>() ) {
447 Real t1 = (-b-std::sqrt(b*b-three*a*c))/(three*a);
448 Real t2 = (-b+std::sqrt(b*b-three*a*c))/(three*a);
449 if ( six*a*t1 + two*b >
zero ) {
451 step_state->searchSize = std::min(t1*alpha*algo_state.
gnorm,
delMax_);
455 step_state->searchSize = std::min(t2*alpha*algo_state.
gnorm,
delMax_);
459 step_state->searchSize = std::min(alpha*algo_state.
gnorm,
delMax_);
462 if (step_state->searchSize <= ROL_EPSILON<Real>()*algo_state.
gnorm && autoRad) {
463 step_state->searchSize = one;
470 model_ = makePtr<KelleySachsModel<Real>>(obj,
473 *(step_state->gradientVec),
479 model_ = makePtr<ColemanLiModel<Real>>(obj,
482 *(step_state->gradientVec),
491 model_ = makePtr<LinMoreModel<Real>>(obj,
494 *(step_state->gradientVec),
500 ROL_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
501 ">>> ERROR (TrustRegionStep): Invalid trust-region model!");
505 model_ = makePtr<TrustRegionModel<Real>>(obj,
508 *(step_state->gradientVec),
535 Real eps =
scaleEps_ * std::min(std::pow(algo_state.
gnorm,
static_cast<Real
>(0.75)),
536 static_cast<Real
>(0.001));
537 dynamicPtrCast<KelleySachsModel<Real>>(
model_)->setEpsilon(eps);
540 dynamicPtrCast<ColemanLiModel<Real>>(
model_)->setRadius(step_state->searchSize);
575 Real fold = algo_state.
value;
579 s,algo_state.
snorm,fold,*(state->gradientVec),algo_state.
iter,
581 algo_state.
nfval += state->nfval;
582 algo_state.
ngrad += state->ngrad;
583 state->flag =
static_cast<int>(
TRflag_);
592 gp_->set(*(state->gradientVec));
617 algo_state.
value = fnew;
625 std::stringstream hist;
628 hist << std::string(114,
'-') <<
"\n";
630 hist <<
"Trust-Region status output definitions\n\n";
632 hist <<
" iter - Number of iterates (steps taken) \n";
633 hist <<
" value - Objective function value \n";
634 hist <<
" gnorm - Norm of the gradient\n";
635 hist <<
" snorm - Norm of the step (update to optimization vector)\n";
636 hist <<
" delta - Trust-Region radius\n";
637 hist <<
" #fval - Number of times the objective function was evaluated\n";
638 hist <<
" #grad - Number of times the gradient was computed\n";
643 hist <<
" tr_flag - Trust-Region flag" <<
"\n";
652 hist <<
" iterCG - Number of Truncated CG iterations\n\n";
653 hist <<
" flagGC - Trust-Region Truncated CG flag" <<
"\n";
660 hist << std::string(114,
'-') <<
"\n";
664 hist << std::setw(6) << std::left <<
"iter";
665 hist << std::setw(15) << std::left <<
"value";
666 hist << std::setw(15) << std::left <<
"gnorm";
667 hist << std::setw(15) << std::left <<
"snorm";
668 hist << std::setw(15) << std::left <<
"delta";
669 hist << std::setw(10) << std::left <<
"#fval";
670 hist << std::setw(10) << std::left <<
"#grad";
671 hist << std::setw(10) << std::left <<
"tr_flag";
673 hist << std::setw(10) << std::left <<
"iterCG";
674 hist << std::setw(10) << std::left <<
"flagCG";
685 std::stringstream hist;
717 std::stringstream hist;
718 hist << std::scientific << std::setprecision(6);
719 if ( algo_state.
iter == 0 ) {
722 if ( print_header ) {
725 if ( algo_state.
iter == 0 ) {
727 hist << std::setw(6) << std::left << algo_state.
iter;
728 hist << std::setw(15) << std::left << algo_state.
value;
729 hist << std::setw(15) << std::left << algo_state.
gnorm;
730 hist << std::setw(15) << std::left <<
" ";
731 hist << std::setw(15) << std::left << step_state->searchSize;
736 hist << std::setw(6) << std::left << algo_state.
iter;
737 hist << std::setw(15) << std::left << algo_state.
value;
738 hist << std::setw(15) << std::left << algo_state.
gnorm;
739 hist << std::setw(15) << std::left << algo_state.
snorm;
740 hist << std::setw(15) << std::left << step_state->searchSize;
741 hist << std::setw(10) << std::left << algo_state.
nfval;
742 hist << std::setw(10) << std::left << algo_state.
ngrad;
743 hist << std::setw(10) << std::left <<
TRflag_;
745 hist << std::setw(10) << std::left <<
SPiter_;
746 hist << std::setw(10) << std::left <<
SPflag_;
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 projectInterior(Vector< Real > &x)
Project optimization variables into the interior of the feasible set.
void computeProjectedGradient(Vector< Real > &g, const Vector< Real > &x)
Compute projected gradient.
virtual void project(Vector< Real > &x)
Project optimization variables onto the bounds.
Provides the interface to evaluate objective functions.
virtual void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
virtual Real value(const Vector< Real > &x, Real &tol)=0
Compute value.
virtual void invHessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply inverse Hessian approximation to vector.
virtual void update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update objective function.
Provides interface for and implements limited-memory secant operators.
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.
Provides the interface to compute optimization steps with trust regions.
TrustRegionStep(ROL::ParameterList &parlist)
Constructor.
int verbosity_
Print additional information to screen if > 0.
Ptr< Vector< Real > > gp_
Container for previous gradient vector.
Real beta_
Post-Smoothing rate for projected methods.
Real mu_
Post-Smoothing tolerance for projected methods.
Real scale0_
Scale for inexact gradient computation.
int SPiter_
Subproblem solver iteration count.
std::string print(AlgorithmState< Real > &algo_state, bool print_header=false) const
Print iterate status.
Real delMax_
Maximum trust-region radius.
void updateGradient(Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Update gradient to iteratively satisfy inexactness condition.
ETrustRegionModel TRmodel_
Trust-region subproblem model type.
Ptr< TrustRegion< Real > > trustRegion_
Container for trust-region solver object.
ESecant esec_
Secant type.
Ptr< TrustRegionModel< Real > > model_
Container for trust-region model.
TrustRegionStep(ROL::Ptr< Secant< Real > > &secant, ROL::ParameterList &parlist)
Constructor.
void initialize(Vector< Real > &x, const Vector< Real > &s, const Vector< Real > &g, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Initialize step.
Ptr< Vector< Real > > xold_
Container for previous iteration vector.
bool useProjectedGrad_
Flag whether to use the projected gradient criticality measure.
bool bndActive_
Flag whether bound is activated.
ETrustRegion etr_
Trust-region subproblem solver type.
Ptr< Secant< Real > > secant_
Container for secant approximation.
std::string printHeader(void) const
Print iterate header.
int max_fval_
Maximum function evaluations in line-search for projected methods.
int SPflag_
Subproblem solver termination flag.
bool useSecantPrecond_
Flag whether to use a secant preconditioner.
Real computeCriticalityMeasure(const Vector< Real > &g, const Vector< Real > &x, BoundConstraint< Real > &bnd)
Compute the criticality measure.
ETrustRegionFlag TRflag_
Trust-region exit flag.
Real alpha_init_
Initial line-search parameter for projected methods.
Real scaleEps_
Scaling for epsilon-active sets.
void update(Vector< Real > &x, const Vector< Real > &s, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Update step, if successful.
std::vector< bool > useInexact_
Flags for inexact (0) objective function, (1) gradient, (2) Hessian.
bool useSecantHessVec_
Flag whether to use a secant Hessian.
void compute(Vector< Real > &s, const Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Compute step.
virtual ~TrustRegionStep()
Ptr< Vector< Real > > xnew_
Container for updated iteration vector.
std::string printName(void) const
Print step name.
Real scale1_
Scale for inexact gradient computation.
void parseParameterList(ROL::ParameterList &parlist)
Parse input ParameterList.
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.
ETrustRegionModel StringToETrustRegionModel(std::string s)
std::string NumberToString(T Number)
ESecant StringToESecant(std::string s)
ETrustRegion StringToETrustRegion(std::string s)
bool isValidTrustRegionSubproblem(ETrustRegion etr, ETrustRegionModel etrm, bool isBnd)
std::string ETrustRegionModelToString(ETrustRegionModel tr)
@ TRUSTREGION_FLAG_POSPREDNEG
@ TRUSTREGION_FLAG_UNDEFINED
@ TRUSTREGION_FLAG_SUCCESS
std::string ESecantToString(ESecant tr)
std::string ETrustRegionFlagToString(ETrustRegionFlag trf)
std::string ETrustRegionToString(ETrustRegion tr)
@ TRUSTREGION_MODEL_COLEMANLI
@ TRUSTREGION_MODEL_KELLEYSACHS
@ TRUSTREGION_MODEL_LINMORE
std::string ECGFlagToString(ECGFlag cgf)
@ TRUSTREGION_DOUBLEDOGLEG
@ TRUSTREGION_TRUNCATEDCG
State for algorithm class. Will be used for restarts.
ROL::Ptr< Vector< Real > > iterateVec