10#ifndef ROL_TRUSTREGION_H
11#define ROL_TRUSTREGION_H
62 ROL::ParameterList list = parlist.sublist(
"Step").sublist(
"Trust Region");
63 std::string modelName = list.get(
"Subproblem Model",
"Kelley-Sachs");
65 eta0_ = list.get(
"Step Acceptance Threshold",
static_cast<Real
>(0.05));
66 eta1_ = list.get(
"Radius Shrinking Threshold",
static_cast<Real
>(0.05));
67 eta2_ = list.get(
"Radius Growing Threshold",
static_cast<Real
>(0.9));
68 gamma0_ = list.get(
"Radius Shrinking Rate (Negative rho)",
static_cast<Real
>(0.0625));
69 gamma1_ = list.get(
"Radius Shrinking Rate (Positive rho)",
static_cast<Real
>(0.25));
70 gamma2_ = list.get(
"Radius Growing Rate",
static_cast<Real
>(2.5));
71 mu0_ = list.get(
"Sufficient Decrease Parameter",
static_cast<Real
>(1.e-4));
72 TRsafe_ = list.get(
"Safeguard Size",
static_cast<Real
>(100.0));
75 ROL::ParameterList &glist = parlist.sublist(
"General");
78 bool inexactObj = glist.get(
"Inexact Objective Function",
false);
79 bool inexactGrad = glist.get(
"Inexact Gradient",
false);
80 bool inexactHessVec = glist.get(
"Inexact Hessian-Times-A-Vector",
false);
85 ROL::ParameterList &ilist = list.sublist(
"Inexact").sublist(
"Value");
86 scale_ = ilist.get(
"Tolerance Scaling",
static_cast<Real
>(1.e-1));
87 omega_ = ilist.get(
"Exponent",
static_cast<Real
>(0.9));
88 force_ = ilist.get(
"Forcing Sequence Initial Value",
static_cast<Real
>(1.0));
89 updateIter_ = ilist.get(
"Forcing Sequence Update Frequency",
static_cast<int>(10));
90 forceFactor_ = ilist.get(
"Forcing Sequence Reduction Factor",
static_cast<Real
>(0.1));
94 max_fval_ = list.sublist(
"Post-Smoothing").get(
"Function Evaluation Limit", 20);
95 alpha_init_ = list.sublist(
"Post-Smoothing").get(
"Initial Step Size",
static_cast<Real
>(1));
96 mu_ = list.sublist(
"Post-Smoothing").get(
"Tolerance",
static_cast<Real
>(0.9999));
97 beta_ = list.sublist(
"Post-Smoothing").get(
"Rate",
static_cast<Real
>(0.01));
120 Real tol = std::sqrt(ROL_EPSILON<Real>());
121 const Real one(1),
zero(0);
127 Real fold1 = fold, ftol = tol;
141 Real eta =
static_cast<Real
>(0.999)*std::min(
eta1_,one-
eta2_);
156 Real aRed = fold1 - fnew;
169 std::cout << std::endl;
170 std::cout <<
" Computation of actual and predicted reduction" << std::endl;
171 std::cout <<
" Current objective function value: " << fold1 << std::endl;
172 std::cout <<
" New objective function value: " << fnew << std::endl;
173 std::cout <<
" Actual reduction: " << aRed << std::endl;
174 std::cout <<
" Predicted reduction: " <<
pRed_ << std::endl;
178 Real EPS =
eps_*((one > std::abs(fold1)) ? one : std::abs(fold1));
179 Real aRed_safe = aRed + EPS, pRed_safe =
pRed_ + EPS;
181 if (((std::abs(aRed_safe) <
eps_) && (std::abs(pRed_safe) <
eps_)) || aRed ==
pRed_) {
185 else if ( std::isnan(aRed_safe) || std::isnan(pRed_safe) ) {
190 rho = aRed_safe/pRed_safe;
191 if (pRed_safe < zero && aRed_safe >
zero) {
194 else if (aRed_safe <= zero && pRed_safe >
zero) {
197 else if (aRed_safe <=
zero && pRed_safe <
zero) {
206 std::cout <<
" Safeguard: " <<
eps_ << std::endl;
207 std::cout <<
" Actual reduction with safeguard: " << aRed_safe << std::endl;
208 std::cout <<
" Predicted reduction with safeguard: " << pRed_safe << std::endl;
209 std::cout <<
" Ratio of actual and predicted reduction: " << rho << std::endl;
210 std::cout <<
" Trust-region flag: " << flagTR << std::endl;
221 if ( rho >=
eta0_ && (std::abs(aRed_safe) >
eps_) ) {
228 Real pgnorm =
prim_->norm();
232 Real lam = std::min(one, del/
prim_->norm());
238 pgnorm *=
prim_->norm();
240 decr = ( aRed_safe >=
mu0_*pgnorm );
244 std::cout <<
" Decrease lower bound (constraints): " <<
mu0_*pgnorm << std::endl;
245 std::cout <<
" Trust-region flag (constraints): " << flagTR << std::endl;
246 std::cout <<
" Is step feasible: " << bnd.
isFeasible(x) << std::endl;
258 std::cout <<
" Norm of step: " << snorm << std::endl;
259 std::cout <<
" Trust-region radius before update: " << del << std::endl;
272 Real modelVal = model.
value(s,tol);
274 Real theta = (one-
eta2_)*gs/((one-
eta2_)*(fold1+gs)+
eta2_*modelVal-fnew);
275 del = std::min(
gamma1_*std::min(snorm,del),std::max(
gamma0_,theta)*del);
277 std::cout <<
" Interpolation model value: " << modelVal << std::endl;
278 std::cout <<
" Interpolation step length: " << theta << std::endl;
282 del =
gamma1_*std::min(snorm,del);
308 while ( (ftmp-fnew) >=
mu_*aRed ) {
322 if (std::isnan(ftmp)) {
324 del =
gamma1_*std::min(snorm,del);
325 rho =
static_cast<Real
>(-1);
345 std::cout <<
" Trust-region radius after update: " << del << std::endl;
346 std::cout << std::endl;
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
Contains definitions of enums for trust region algorithms.
Contains definitions of custom data types in ROL.
Provides the interface to apply upper and lower bound constraints.
virtual bool isFeasible(const Vector< Real > &v)
Check if the vector, v, is feasible.
void pruneActive(Vector< Real > &v, const Vector< Real > &x, Real eps=Real(0))
Set variables to zero if they correspond to the -active set.
bool isActivated(void) const
Check if bounds are on.
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 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.
Provides the interface to evaluate trust-region model functions.
virtual void updatePredictedReduction(Real &pred, const Vector< Real > &s)
virtual void dualTransform(Vector< Real > &tv, const Vector< Real > &v)
virtual const Ptr< const Vector< Real > > getGradient(void) const
virtual void updateActualReduction(Real &ared, const Vector< Real > &s)
virtual Real value(const Vector< Real > &s, Real &tol)
Compute value.
Provides interface for and implements trust-region subproblem solvers.
ETrustRegionModel TRmodel_
Real mu_
Post-Smoothing tolerance for projected methods.
Real getPredictedReduction(void) const
ROL::Ptr< Vector< Real > > xtmp_
TrustRegion(ROL::ParameterList &parlist)
virtual void initialize(const Vector< Real > &x, const Vector< Real > &s, const Vector< Real > &g)
Real alpha_init_
Initial line-search parameter for projected methods.
ROL::Ptr< Vector< Real > > dual_
ROL::Ptr< Vector< Real > > prim_
virtual void run(Vector< Real > &s, Real &snorm, int &iflag, int &iter, const Real del, TrustRegionModel< Real > &model)=0
std::vector< bool > useInexact_
void setPredictedReduction(const Real pRed)
Real beta_
Post-Smoothing rate for projected methods.
virtual void update(Vector< Real > &x, Real &fnew, Real &del, int &nfval, int &ngrad, ETrustRegionFlag &flagTR, const Vector< Real > &s, const Real snorm, const Real fold, const Vector< Real > &g, int iter, Objective< Real > &obj, BoundConstraint< Real > &bnd, TrustRegionModel< Real > &model)
int max_fval_
Maximum function evaluations in line-search for projected methods.
Defines the linear algebra or vector space interface.
virtual void set(const Vector &x)
Set where .
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis,...
virtual void plus(const Vector &x)=0
Compute , where .
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
virtual Real dot(const Vector &x) const =0
Compute where .
ETrustRegionModel StringToETrustRegionModel(std::string s)
Real ROL_OVERFLOW(void)
Platform-dependent maximum double.
@ TRUSTREGION_FLAG_POSPREDNEG
@ TRUSTREGION_FLAG_NPOSPREDNEG
@ TRUSTREGION_FLAG_QMINSUFDEC
@ TRUSTREGION_FLAG_NPOSPREDPOS
@ TRUSTREGION_FLAG_SUCCESS
@ TRUSTREGION_MODEL_KELLEYSACHS