44#ifndef ROL_TYPEP_TRUSTREGIONALGORITHM_DEF_HPP
45#define ROL_TYPEP_TRUSTREGIONALGORITHM_DEF_HPP
53template<
typename Real>
60 ParameterList &trlist = list.sublist(
"Step").sublist(
"Trust Region");
62 state_->searchSize = trlist.get(
"Initial Radius", -1.0);
64 eta0_ = trlist.get(
"Step Acceptance Threshold", 0.05);
65 eta1_ = trlist.get(
"Radius Shrinking Threshold", 0.05);
66 eta2_ = trlist.get(
"Radius Growing Threshold", 0.9);
67 gamma0_ = trlist.get(
"Radius Shrinking Rate (Negative rho)", 0.0625);
68 gamma1_ = trlist.get(
"Radius Shrinking Rate (Positive rho)", 0.25);
69 gamma2_ = trlist.get(
"Radius Growing Rate", 2.5);
70 TRsafe_ = trlist.get(
"Safeguard Size", 100.0);
72 interpRad_ = trlist.get(
"Use Radius Interpolation",
false);
73 verbosity_ = trlist.sublist(
"General").get(
"Output Level", 0);
74 initProx_ = trlist.get(
"Apply Prox to Initial Guess",
false);
75 t0_ = list.sublist(
"Status Test").get(
"Proximal Gradient Parameter", 1.0);
77 storageNM_ = trlist.get(
"Nonmonotone Storage Size", 0);
80 ROL::ParameterList &lmlist = trlist.sublist(
"TRN");
81 mu0_ = lmlist.get(
"Sufficient Decrease Parameter", 1e-2);
82 spexp_ = lmlist.get(
"Relative Tolerance Exponent", 1.0);
83 spexp_ = std::max(
static_cast<Real
>(1),std::min(
spexp_,
static_cast<Real
>(2)));
84 redlim_ = lmlist.sublist(
"Cauchy Point").get(
"Maximum Number of Reduction Steps", 10);
85 explim_ = lmlist.sublist(
"Cauchy Point").get(
"Maximum Number of Expansion Steps", 10);
86 alpha_ = lmlist.sublist(
"Cauchy Point").get(
"Initial Step Size", 1.0);
87 normAlpha_ = lmlist.sublist(
"Cauchy Point").get(
"Normalize Initial Step Size",
false);
88 interpf_ = lmlist.sublist(
"Cauchy Point").get(
"Reduction Rate", 0.1);
89 extrapf_ = lmlist.sublist(
"Cauchy Point").get(
"Expansion Rate", 10.0);
90 qtol_ = lmlist.sublist(
"Cauchy Point").get(
"Decrease Tolerance", 1e-8);
92 lambdaMin_ = lmlist.sublist(
"Solver").get(
"Minimum Spectral Step Size", 1e-8);
93 lambdaMax_ = lmlist.sublist(
"Solver").get(
"Maximum Spectral Step Size", 1e8);
94 gamma_ = lmlist.sublist(
"Solver").get(
"Sufficient Decrease Tolerance", 1e-4);
95 maxSize_ = lmlist.sublist(
"Solver").get(
"Maximum Storage Size", 10);
96 maxit_ = lmlist.sublist(
"Solver").get(
"Iteration Limit", 25);
97 tol1_ = lmlist.sublist(
"Solver").get(
"Absolute Tolerance", 1e-4);
98 tol2_ = lmlist.sublist(
"Solver").get(
"Relative Tolerance", 1e-2);
100 useMin_ = lmlist.sublist(
"Solver").get(
"Use Smallest Model Iterate",
true);
101 useNMSP_ = lmlist.sublist(
"Solver").get(
"Use Nonmonotone Search",
false);
102 std::string ssname = lmlist.sublist(
"Solver").get(
"Subproblem Solver",
"SPG");
105 ncgType_ = lmlist.sublist(
"Solver").sublist(
"NCG").get(
"Nonlinear CG Type", 4);
106 etaNCG_ = lmlist.sublist(
"Solver").sublist(
"NCG").get(
"Truncation Parameter for HZ CG", 1e-2);
107 desPar_ = lmlist.sublist(
"Solver").sublist(
"NCG").get(
"Descent parameter for Nonlinear CG", 1.0);
109 ParameterList &glist = list.sublist(
"General");
111 useInexact_.push_back(glist.get(
"Inexact Objective Function",
false));
112 useInexact_.push_back(glist.get(
"Inexact Gradient",
false));
113 useInexact_.push_back(glist.get(
"Inexact Hessian-Times-A-Vector",
false));
115 ParameterList &ilist = trlist.sublist(
"Inexact").sublist(
"Gradient");
116 scale0_ = ilist.get(
"Tolerance Scaling",
static_cast<Real
>(0.1));
117 scale1_ = ilist.get(
"Relative Tolerance",
static_cast<Real
>(2));
119 ParameterList &vlist = trlist.sublist(
"Inexact").sublist(
"Value");
120 scale_ = vlist.get(
"Tolerance Scaling",
static_cast<Real
>(1.e-1));
121 omega_ = vlist.get(
"Exponent",
static_cast<Real
>(0.9));
122 force_ = vlist.get(
"Forcing Sequence Initial Value",
static_cast<Real
>(1.0));
123 updateIter_ = vlist.get(
"Forcing Sequence Update Frequency",
static_cast<int>(10));
124 forceFactor_ = vlist.get(
"Forcing Sequence Reduction Factor",
static_cast<Real
>(0.1));
126 verbosity_ = list.sublist(
"General").get(
"Output Level",0);
129 useSecantPrecond_ = list.sublist(
"General").sublist(
"Secant").get(
"Use as Preconditioner",
false);
130 useSecantHessVec_ = list.sublist(
"General").sublist(
"Secant").get(
"Use as Hessian",
false);
135 model_ = makePtr<TrustRegionModel_U<Real>>(list,secant,mode);
136 if (secant == nullPtr) {
137 esec_ =
StringToESecant(list.sublist(
"General").sublist(
"Secant").get(
"Type",
"Limited-Memory BFGS"));
141template<
typename Real>
149 std::ostream &outStream) {
169 if (
state_->searchSize <=
static_cast<Real
>(0) )
175template<
typename Real>
188 Real eta =
static_cast<Real
>(0.999)*std::min(
eta1_,one-
eta2_);
190 if (inTol > outTol) {
200template<
typename Real>
209 std::ostream &outStream)
const {
214 Real gtol0 = gtol1 + one;
215 while ( gtol0 > gtol1 ) {
218 pgstep(px, step, nobj, x, dg,
t0_, gtol1);
221 gtol1 =
scale0_*std::min(gnorm,del);
228 pgstep(px, step, nobj, x, dg,
t0_, gtol);
234template<
typename Real>
239 std::ostream &outStream ) {
240 const Real
zero(0), one(1);
243 Real strial(0), ntrial(0), smodel(0), Ftrial(0), pRed(0), rho(1);
245 std::vector<std::string> output;
246 Ptr<Vector<Real>> gmod = g.
clone();
247 Ptr<Vector<Real>> px = x.
clone();
248 Ptr<Vector<Real>> dg = x.
clone();
250 initialize(x,g,inTol,sobj,nobj, *px, *dg, outStream);
252 Ptr<Vector<Real>> pwa1 = x.
clone(), pwa2 = x.
clone();
253 Ptr<Vector<Real>> pwa3 = x.
clone(), pwa4 = x.
clone();
254 Ptr<Vector<Real>> pwa5 = x.
clone(), pwa6 = x.
clone();
255 Ptr<Vector<Real>> pwa7 = x.
clone();
256 Ptr<Vector<Real>> dwa1 = g.
clone(), dwa2 = g.
clone();
258 Real rhoNM(0), sigmac(0), sigmar(0);
271 gmod->set(*
state_->gradientVec);
280 *
model_, nobj, *px, *dwa1, *dwa2, outStream);
287 *
model_,nobj,*pwa1,*pwa2,*pwa3,*pwa4,*pwa5,*pwa6,*pwa7,*dwa1,
289 pRed =
state_->value - (smodel+ntrial);
292 dspg2(x,smodel, ntrial, pRed, *gmod, *
state_->iterateVec,
294 *pwa1, *pwa2, *px, *dwa1, outStream);
298 *
model_,nobj,*pwa1,*pwa2,*pwa3,*pwa4,*pwa5,*pwa6,*dwa1,
300 pRed =
state_->value - (smodel+ntrial);
311 Ftrial = strial + ntrial;
319 rho = (rho < rhoNM ? rhoNM : rho );
348 sigmac += pRed; sigmar += pRed;
349 if (Ftrial < fmin) { fmin = Ftrial; fc = fmin; sigmac =
zero; L = 0; }
352 if (Ftrial > fc) { fc = Ftrial; sigmac =
zero; }
353 if (L ==
storageNM_) { fr = fc; sigmar = sigmac; }
359 dwa1->set(*
state_->gradientVec);
361 state_->iterateVec->set(x);
373template<
typename Real>
386 std::ostream &outStream) {
387 const Real half(0.5), sold(sval), nold(nval);
390 Real gs(0), snorm(0), Qk(0), pRed(0);
392 pgstep(px, s, nobj, x, g, alpha, tol);
402 sval = sold + gs + half * s.
apply(dwa);
403 pRed = (sold + nold) - (sval + nval);
404 Qk = gs + nval - nold;
405 interp = (pRed < -
mu0_*Qk);
413 pgstep(px, s, nobj, x, g, alpha, tol);
420 sval = sold + gs + half * s.
apply(dwa);
421 pRed = (sold + nold) - (sval + nval);
422 Qk = gs + nval - nold;
436 pgstep(px, s, nobj, x, g, alpha, tol);
438 if (snorm <= del && cnt <
explim_){
443 sval = sold + gs + half * s.
apply(dwa);
444 pRed = (sold + nold) - (sval + nval);
445 Qk = gs + nval - nold;
446 if (pRed >= -
mu0_*Qk && std::abs(pRed-mvals) >
qtol_*std::abs(mvals)) {
466 pgstep(px, s, nobj, x, g, alpha, tol);
470 outStream <<
" Cauchy point" << std::endl;
471 outStream <<
" Step length (alpha): " << alpha << std::endl;
472 outStream <<
" Step length (alpha*g): " << snorm << std::endl;
473 outStream <<
" Model decrease (pRed): " << pRed << std::endl;
475 outStream <<
" Number of extrapolation steps: " << cnt << std::endl;
480template<
typename Real>
494 std::ostream &outStream) {
503 const Real mprev(sval+nval);
505 Real coeff(1), alpha(1), alphaMax(1), lambda(1), lambdaTmp(1);
506 Real gs(0), ss(0), gnorm(0), s0s0(0), ss0(0), sHs(0), snorm(0), nold(nval);
513 coeff = one / gmod.
norm();
515 pgstep(pwa2, pwa, nobj, y, gmod.
dual(), lambda, tol);
516 gs = gmod.
apply(pwa);
518 snorm = std::sqrt(ss);
519 gnorm = snorm / lambda;
522 const Real gtol = std::min(
tol1_,
tol2_*gnorm);
525 outStream <<
" Spectral Projected Gradient" << std::endl;
533 sHs = dwa.
apply(pwa);
541 if (snorm >= del-safeguard) {
543 alphaMax = std::min(one, (-ss0 + std::sqrt(ss0*ss0 - ss*(s0s0-del*del)))/ss);
545 alpha = (sHs <= safeguard) ? alphaMax : std::min(alphaMax, -(gs + nval - nold)/sHs);
550 sval += gs + half * sHs;
557 sval += alpha * (gs + half * alpha * sHs);
558 gmod.
axpy(alpha,dwa);
561 pRed = mprev - (sval+nval);
564 pwa1.
set(y); pwa1.
axpy(-one,x);
565 s0s0 = pwa1.
dot(pwa1);
566 snorm = std::sqrt(s0s0);
569 outStream << std::endl;
570 outStream <<
" Iterate: " <<
SPiter_ << std::endl;
571 outStream <<
" Spectral step length (lambda): " << lambda << std::endl;
572 outStream <<
" Step length (alpha): " << alpha << std::endl;
573 outStream <<
" Model decrease (pRed): " << pRed << std::endl;
574 outStream <<
" Optimality criterion: " << gnorm << std::endl;
575 outStream <<
" Step norm: " << snorm << std::endl;
576 outStream << std::endl;
579 if (snorm >= del - safeguard) {
SPflag_ = 2;
break; }
582 lambdaTmp = (sHs <= safeguard) ? one/gmod.
norm() : ss/sHs;
585 pgstep(pwa2, pwa, nobj, y, gmod.
dual(), alpha, tol);
586 gs = gmod.
apply(pwa);
588 gnorm = std::sqrt(ss) / lambda;
590 if (gnorm <= gtol) {
SPflag_ = 0;
break; }
595template<
typename Real>
612 std::ostream &outStream) {
620 const Real half(0.5), one(1);
621 const Real mval(sval+nval);
623 Real mcomp(0), mval_min(0), sval_min(0), nval_min(0);
624 Real alpha(1), coeff(1), lambda(1), lambdaTmp(1);
625 Real snew(sval), nnew(nval), mnew(mval);
626 Real sold(sval), nold(nval), mold(mval);
627 Real sHs(0), ss(0), gs(0), Qk(0), gnorm(0);
628 std::deque<Real> mqueue; mqueue.push_back(mold);
631 mval_min = mval; sval_min = sval; nval_min = nval; ymin.
set(y);
637 dprox(pwa,x,
t0_,del,nobj,pwa2,pwa3,pwa4,pwa5,outStream);
640 const Real gtol = std::min(
tol1_,
tol2_*gnorm);
643 coeff = one / gmod.
norm();
647 outStream <<
" Spectral Projected Gradient" << std::endl;
655 pwa.
set(y); pwa.
axpy(-lambda,pwa1);
656 dprox(pwa,x,lambda,del,nobj,pwa2,pwa3,pwa4,pwa5,outStream);
665 sHs = dwa.
apply(pwa);
666 gs = gmod.
apply(pwa);
667 snew = half * sHs + gs + sold;
669 Qk = gs + nnew - nold;
672 mcomp =
useNMSP_ ? *std::max_element(mqueue.begin(),mqueue.end()) : mold;
673 while( mnew > mcomp +
mu0_*Qk) {
675 pwa2.
set(y); pwa2.
axpy(alpha,pwa);
678 snew = half * alpha * alpha * sHs + alpha * gs + sold;
680 Qk = alpha * gs + nnew - nold;
688 gmod.
axpy(alpha,dwa);
693 if (
static_cast<int>(mqueue.size())==
maxSize_) mqueue.pop_front();
694 mqueue.push_back(sval+nval);
695 if (
useMin_ && mval <= mval_min) {
696 mval_min = mval; sval_min = sval; nval_min = nval; ymin.
set(y);
703 dprox(pwa,x,
t0_,del,nobj,pwa2,pwa3,pwa4,pwa5,outStream);
708 outStream << std::endl;
709 outStream <<
" Iterate: " <<
SPiter_ << std::endl;
710 outStream <<
" Spectral step length (lambda): " << lambda << std::endl;
711 outStream <<
" Step length (alpha): " << alpha << std::endl;
712 outStream <<
" Model decrease (pRed): " << mval-mold << std::endl;
713 outStream <<
" Optimality criterion: " << gnorm << std::endl;
714 outStream << std::endl;
716 if (gnorm < gtol)
break;
719 lambdaTmp = (sHs == 0 ? coeff : ss / sHs);
723 sval = sval_min; nval = nval_min; y.
set(ymin);
726 sval = sold; nval = nold;
731template<
typename Real>
741 std::ostream &outStream)
const {
743 const Real
zero(0), half(0.5), one(1), two(2), three(3);
745 Real f0(0), f1(0), fc(0), t0(0), t1(1), tc(0), d1(1), d2(1), tol(1);
746 Real p(0), q(0), r(0), s(0), m(0);
749 pwa.
set(y1); pwa.
axpy(-one,x0);
756 tc = t0; fc = f0; yc.
set(y0);
760 if (std::abs(fc-del) < std::abs(f1-del)) {
761 t0 = t1; t1 = tc; tc = t0;
762 f0 = f1; f1 = fc; fc = f0;
765 tol = two*eps*std::abs(t1) + half*tol0;
767 if (std::abs(m) <= tol) { code = 1;
break; }
768 if ((f1 >= fudge*del && f1 <= del))
break;
769 if (std::abs(d1) < tol || std::abs(f0-del) <= std::abs(f1-del)) {
773 s = (f1-del)/(f0-del);
779 q = (f0-del)/(fc-del);
780 r = (f1-del)/(fc-del);
781 p = s*(two*m*q*(q-r)-(t1-t0)*(r-one));
782 q = (q-one)*(r-one)*(s-one);
784 if (p >
zero) q = -q;
788 if (two*p < three*m*q-std::abs(tol*q) && p < std::abs(half*s*q)) {
795 t0 = t1; f0 = f1; y0.
set(y1);
796 if (std::abs(d2) > tol) t1 += d2;
797 else if (m >
zero) t1 += tol;
800 nobj.
prox(y1, pwa, t1*t, tol);
state_->nprox++;
801 pwa.
set(y1); pwa.
axpy(-one,x0);
803 if ((f1 > del && fc > del) || (f1 <= del && fc <= del)) {
804 tc = t0; fc = f0; yc.
set(y0);
808 if (code==1 && f1>del) x.
set(yc);
811 outStream << std::endl;
812 outStream <<
" Trust-Region Subproblem Proximity Operator" << std::endl;
813 outStream <<
" Number of proxes: " <<
state_->nprox-cnt << std::endl;
814 if (code == 1 && f1 > del) {
815 outStream <<
" Transformed Multiplier: " << tc << std::endl;
816 outStream <<
" Dual Residual: " << fc-del << std::endl;
819 outStream <<
" Transformed Multiplier: " << t1 << std::endl;
820 outStream <<
" Dual Residual: " << f1-del << std::endl;
822 outStream <<
" Exit Code: " << code << std::endl;
823 outStream << std::endl;
828template<
typename Real>
844 std::ostream &outStream) {
864 const Real
zero(0), half(0.5), one(1), two(2);
866 Real mold(sval+nval), nold(nval);
867 Real snorm(0), snorm0(0), gnorm(0), gnorm0(0), gnorm2(0);
868 Real alpha(1), beta(1), lambdaTmp(1), lambda(1), eta(
etaNCG_), gamma(1), gammaMax(1);
869 Real sy(0), gg(0), sHs(0), gs(0), ds(0), ss(0);
881 pgstep(pwa1, pwa2, nobj, y, gmod.
dual(), lambda, tol);
882 pwa2.
scale(one/lambda);
886 snorm = lambda * gnorm;
891 const Real gtol = std::min(
tol1_,
tol2_*gnorm);
894 outStream <<
" Nonlinear Conjugate Gradient" << std::endl;
903 if (snorm >= (one - safeguard)*del){
905 gammaMax = std::min(one, (-ds + std::sqrt(ds*ds + ss*(del*del - snorm0*snorm0)))/(lambda * ss));
911 gamma = (sHs <= safeguard) ? gammaMax : std::min(gammaMax, -(lambda * gs + nval - nold)/(lambda * lambda * sHs));
912 alpha = gamma * lambda;
916 gmod.
axpy(alpha, dwa);
917 sval += alpha*gs + half*alpha*alpha*sHs;
922 pwa3.
set(y); pwa3.
axpy(-one,x);
923 snorm0 = pwa3.
norm();
924 if (snorm0 >= (one-safeguard)*del) {
SPflag_ = 2;
break; }
927 lambdaTmp = (sHs <= safeguard) ?
t0_/gmod.
norm() : ss/sHs;
932 pgstep(pwa1, pwa2, nobj, y, gmod.
dual(), lambda, tol);
933 pwa2.
scale(one/lambda);
938 if (gnorm <= gtol) {
SPflag_ = 0;
break; }
940 gnorm2 = gnorm * gnorm;
943 beta = gnorm2/(gnorm0 * gnorm0);
947 pwa5.
set(pwa4); pwa5.
axpy(-one,pwa2);
948 beta = std::max(
zero, -pwa5.
dot(pwa2)/(gnorm0*gnorm0));
951 pwa5.
set(pwa4); pwa5.
axpy(-one,pwa2);
955 beta = std::max(eta, (gnorm2-gg-two*pwa2.
dot(s)*(gnorm2-two*gg+(gnorm0*gnorm0))/sy)/sy);
958 pwa5.
set(pwa4); pwa5.
axpy(-one,pwa2);
959 beta = std::max(
zero, -pwa2.
dot(pwa5)/s.
dot(pwa5));
962 pwa5.
set(pwa4); pwa5.
axpy(-one,pwa2);
963 beta = std::max(
zero, gnorm2/s.
dot(pwa5));
966 pwa5.
set(pwa4); pwa5.
axpy(-one,pwa2);
967 beta = std::max(-gnorm2, std::min(gnorm2, -pwa5.
dot(pwa2)))/(gnorm0*gnorm0);
970 pwa5.
set(pwa4); pwa5.
axpy(-one,pwa2);
971 beta = std::max(
zero, std::min(-pwa2.
dot(pwa5), gnorm2)/s.
dot(pwa5));
980 pwa4.
axpy(lambda,pwa5);
983 gs = gmod.
apply(pwa5);
984 if (lambda * gs + nval - nold <= -(one -
desPar_)*gnorm2*lambda){
991 pwa4.
set(pwa1); pwa4.
axpy(-one,x);
1001 outStream << std::endl;
1002 outStream <<
" Iterate: " <<
SPiter_ << std::endl;
1003 outStream <<
" Spectral step length (lambda): " << lambda << std::endl;
1004 outStream <<
" Step length (alpha): " << alpha << std::endl;
1005 outStream <<
" NCG parameter (beta): " << beta << std::endl;
1006 outStream <<
" Model decrease (pRed): " << mold-(sval+nold) << std::endl;
1007 outStream <<
" Step size: " << snorm0 << std::endl;
1008 outStream <<
" Optimality criterion: " << gnorm << std::endl;
1009 outStream <<
" Optimality tolerance: " << gtol << std::endl;
1010 outStream << std::endl;
1016template<
typename Real>
1018 std::stringstream hist;
1020 hist << std::string(114,
'-') << std::endl;
1027 hist <<
"trust-region method status output definitions" << std::endl << std::endl;
1028 hist <<
" iter - Number of iterates (steps taken)" << std::endl;
1029 hist <<
" value - Objective function value" << std::endl;
1030 hist <<
" gnorm - Norm of the gradient" << std::endl;
1031 hist <<
" snorm - Norm of the step (update to optimization vector)" << std::endl;
1032 hist <<
" delta - Trust-Region radius" << std::endl;
1033 hist <<
" #sval - Number of times the smooth objective function was evaluated" << std::endl;
1034 hist <<
" #nval - Number of times the nonsmooth objective function was evaluated" << std::endl;
1035 hist <<
" #grad - Number of times the gradient was computed" << std::endl;
1036 hist <<
" #hess - Number of times the Hessian was applied" << std::endl;
1037 hist <<
" #prox - Number of times the proximal operator was computed" << std::endl;
1039 hist <<
" tr_flag - Trust-Region flag" << std::endl;
1045 hist <<
" iterSP - Number of Spectral Projected Gradient iterations" << std::endl << std::endl;
1046 hist <<
" flagSP - Trust-Region Spectral Projected Gradient flag" << std::endl;
1047 hist <<
" 0 - Converged" << std::endl;
1048 hist <<
" 1 - Iteration Limit Exceeded" << std::endl;
1049 hist << std::string(114,
'-') << std::endl;
1052 hist << std::setw(6) << std::left <<
"iter";
1053 hist << std::setw(15) << std::left <<
"value";
1054 hist << std::setw(15) << std::left <<
"gnorm";
1055 hist << std::setw(15) << std::left <<
"snorm";
1056 hist << std::setw(15) << std::left <<
"delta";
1057 hist << std::setw(10) << std::left <<
"#sval";
1058 hist << std::setw(10) << std::left <<
"#nval";
1059 hist << std::setw(10) << std::left <<
"#grad";
1060 hist << std::setw(10) << std::left <<
"#hess";
1061 hist << std::setw(10) << std::left <<
"#prox";
1062 hist << std::setw(10) << std::left <<
"tr_flag";
1063 hist << std::setw(10) << std::left <<
"iterSP";
1064 hist << std::setw(10) << std::left <<
"flagSP";
1069template<
typename Real>
1071 std::stringstream hist;
1079 hist <<
"Trust-Region Method (Type P)" << std::endl;
1083template<
typename Real>
1085 std::stringstream hist;
1086 hist << std::scientific << std::setprecision(6);
1089 if (
state_->iter == 0 ) {
1091 hist << std::setw(6) << std::left <<
state_->iter;
1092 hist << std::setw(15) << std::left <<
state_->value;
1093 hist << std::setw(15) << std::left <<
state_->gnorm;
1094 hist << std::setw(15) << std::left <<
"---";
1095 hist << std::setw(15) << std::left <<
state_->searchSize;
1096 hist << std::setw(10) << std::left <<
state_->nsval;
1097 hist << std::setw(10) << std::left <<
state_->nnval;
1098 hist << std::setw(10) << std::left <<
state_->ngrad;
1099 hist << std::setw(10) << std::left <<
nhess_;
1100 hist << std::setw(10) << std::left <<
state_->nprox;
1101 hist << std::setw(10) << std::left <<
"---";
1102 hist << std::setw(10) << std::left <<
"---";
1103 hist << std::setw(10) << std::left <<
"---";
1108 hist << std::setw(6) << std::left <<
state_->iter;
1109 hist << std::setw(15) << std::left <<
state_->value;
1110 hist << std::setw(15) << std::left <<
state_->gnorm;
1111 hist << std::setw(15) << std::left <<
state_->snorm;
1112 hist << std::setw(15) << std::left <<
state_->searchSize;
1113 hist << std::setw(10) << std::left <<
state_->nsval;
1114 hist << std::setw(10) << std::left <<
state_->nnval;
1115 hist << std::setw(10) << std::left <<
state_->ngrad;
1116 hist << std::setw(10) << std::left <<
nhess_;
1117 hist << std::setw(10) << std::left <<
state_->nprox;
1118 hist << std::setw(10) << std::left <<
TRflag_;
1119 hist << std::setw(10) << std::left <<
SPiter_;
1120 hist << std::setw(10) << std::left <<
SPflag_;
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0 zero)()
virtual void initialize(const Vector< Real > &x)
Initialize temporary variables.
Provides the interface to evaluate objective functions.
virtual void prox(Vector< Real > &Pv, const Vector< Real > &v, Real t, Real &tol)
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 interface for and implements limited-memory secant operators.
Provides an interface to check status of optimization algorithms.
Provides the interface to evaluate trust-region model functions.
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &s, Real &tol) override
void pgstep(Vector< Real > &pgiter, Vector< Real > &pgstep, Objective< Real > &nobj, const Vector< Real > &x, const Vector< Real > &dg, Real t, Real &tol) const
const Ptr< AlgorithmState< Real > > state_
virtual void writeExitStatus(std::ostream &os) const
const Ptr< CombinedStatusTest< Real > > status_
void initialize(const Vector< Real > &x, const Vector< Real > &g)
TRUtils::ETRFlag TRflag_
Trust-region exit flag.
void dncg(Vector< Real > &y, Real &sval, Real &nval, Vector< Real > &gmod, const Vector< Real > &x, Real del, TrustRegionModel_U< Real > &model, Objective< Real > &nobj, Vector< Real > &s, Vector< Real > &pwa1, Vector< Real > &pwa2, Vector< Real > &pwa3, Vector< Real > &pwa4, Vector< Real > &pwa5, Vector< Real > &dwa, std::ostream &outStream=std::cout)
unsigned verbosity_
Output level (default: 0).
TrustRegionAlgorithm(ParameterList &list, const Ptr< Secant< Real > > &secant=nullPtr)
ESecant esec_
Secant type (default: Limited-Memory BFGS).
Real gamma1_
Radius decrease rate (positive rho) (default: 0.25).
void dprox(Vector< Real > &x, const Vector< Real > &x0, Real t, Real del, Objective< Real > &nobj, Vector< Real > &y0, Vector< Real > &y1, Vector< Real > &yc, Vector< Real > &pwa, std::ostream &outStream=std::cout) const
void dspg(Vector< Real > &y, Real &sval, Real &nval, Vector< Real > &gmod, const Vector< Real > &x, Real del, TrustRegionModel_U< Real > &model, Objective< Real > &nobj, Vector< Real > &ymin, Vector< Real > &pwa, Vector< Real > &pwa1, Vector< Real > &pwa2, Vector< Real > &pwa3, Vector< Real > &pwa4, Vector< Real > &pwa5, Vector< Real > &dwa, std::ostream &outStream=std::cout)
void initialize(Vector< Real > &x, const Vector< Real > &g, Real ftol, Objective< Real > &sobj, Objective< Real > &nobj, Vector< Real > &px, Vector< Real > &dg, std::ostream &outStream=std::cout)
void writeName(std::ostream &os) const override
Print step name.
Real gamma0_
Radius decrease rate (negative rho) (default: 0.0625).
void writeOutput(std::ostream &os, bool write_header=false) const override
Print iterate status.
bool interpRad_
Interpolate the trust-region radius if ratio is negative (default: false).
int SPiter_
Subproblem solver iteration count.
int explim_
Maximum number of Cauchy point expansion steps (default: 10).
Real computeValue(Real inTol, Real &outTol, Real pRed, Real &fold, int iter, const Vector< Real > &x, const Vector< Real > &xold, Objective< Real > &obj)
Real tol1_
Absolute tolerance for truncated CG (default: 1e-4).
Real mu0_
Sufficient decrease parameter (default: 1e-2).
Real qtol_
Relative tolerance for computed decrease in Cauchy point computation (default: 1-8).
Real interpf_
Backtracking rate for Cauchy point computation (default: 1e-1).
Real delMax_
Maximum trust-region radius (default: ROL_INF).
Real alpha_
Initial Cauchy point step length (default: 1.0).
Real dcauchy(Vector< Real > &s, Real &alpha, Real &sval, Real &nval, const Vector< Real > &x, const Vector< Real > &g, Real del, TrustRegionModel_U< Real > &model, Objective< Real > &nobj, Vector< Real > &px, Vector< Real > &dwa, Vector< Real > &dwa1, std::ostream &outStream=std::cout)
Real computeGradient(const Vector< Real > &x, Vector< Real > &g, Vector< Real > &px, Vector< Real > &dg, Vector< Real > &pwa, Real del, Objective< Real > &sobj, Objective< Real > &nobj, std::ostream &outStream=std::cout) const
bool normAlpha_
Normalize initial Cauchy point step length (default: false).
Real TRsafe_
Safeguard size for numerically evaluating ratio (default: 1e2).
Real extrapf_
Extrapolation rate for Cauchy point computation (default: 1e1).
std::vector< bool > useInexact_
Real eta2_
Radius increase threshold (default: 0.9).
void writeHeader(std::ostream &os) const override
Print iterate header.
Ptr< TrustRegionModel_U< Real > > model_
Container for trust-region model.
Real eps_
Safeguard for numerically evaluating ratio.
int redlim_
Maximum number of Cauchy point reduction steps (default: 10).
void run(Vector< Real > &x, const Vector< Real > &g, Objective< Real > &sobj, Objective< Real > &nobj, std::ostream &outStream=std::cout) override
Run algorithm on unconstrained problems (Type-U). This general interface supports the use of dual opt...
bool writeHeader_
Flag to write header at every iteration.
Real tol2_
Relative tolerance for truncated CG (default: 1e-2).
Real spexp_
Relative tolerance exponent for subproblem solve (default: 1, range: [1,2]).
Real eta1_
Radius decrease threshold (default: 0.05).
int SPflag_
Subproblem solver termination flag.
bool useSecantHessVec_
Flag to use secant as Hessian (default: false).
Real eta0_
Step acceptance threshold (default: 0.05).
int maxit_
Maximum number of CG iterations (default: 25).
bool useSecantPrecond_
Flag to use secant as a preconditioner (default: false).
Real gamma2_
Radius increase rate (default: 2.5).
int nhess_
Number of Hessian applications.
void dspg2(Vector< Real > &y, Real &sval, Real &nval, Real &pRed, Vector< Real > &gmod, const Vector< Real > &x, Real del, TrustRegionModel_U< Real > &model, Objective< Real > &nobj, Vector< Real > &pwa, Vector< Real > &pwa1, Vector< Real > &pwa2, Vector< Real > &dwa, std::ostream &outStream=std::cout)
Defines the linear algebra or vector space interface.
virtual Real apply(const Vector< Real > &x) const
Apply to a dual vector. This is equivalent to the call .
virtual Real norm() const =0
Returns where .
virtual void set(const Vector &x)
Set where .
virtual void scale(const Real alpha)=0
Compute 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 void zero()
Set to zero vector.
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
virtual void axpy(const Real alpha, const Vector &x)
Compute where .
virtual Real dot(const Vector &x) const =0
Compute where .
void analyzeRatio(Real &rho, ETRFlag &flag, const Real fold, const Real ftrial, const Real pRed, const Real epsi, std::ostream &outStream=std::cout, const bool print=false)
std::string ETRFlagToString(ETRFlag trf)
Real interpolateRadius(const Vector< Real > &g, const Vector< Real > &s, const Real snorm, const Real pRed, const Real fold, const Real ftrial, const Real del, const Real gamma0, const Real gamma1, const Real eta2, std::ostream &outStream=std::cout, const bool print=false)
ETrustRegionP StringToETrustRegionP(std::string s)
std::string NumberToString(T Number)
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.
ESecant StringToESecant(std::string s)
Real ROL_OVERFLOW(void)
Platform-dependent maximum double.