44 #ifndef ROL_TYPEE_COMPOSITESTEPALGORITHM_DEF_H
45 #define ROL_TYPEE_COMPOSITESTEPALGORITHM_DEF_H
50 template<
typename Real>
61 Real one(1), two(2), p8(0.8),
zero(0), oem8(1.e-8);
62 ParameterList& cslist =
list_.sublist(
"Step").sublist(
"Composite Step");
65 tolOSS_ = cslist.sublist(
"Optimality System Solver").get(
"Nominal Relative Tolerance", 1e-8);
66 tolOSSfixed_ = cslist.sublist(
"Optimality System Solver").get(
"Fix Tolerance",
true);
67 maxiterCG_ = cslist.sublist(
"Tangential Subproblem Solver").get(
"Iteration Limit", 20);
68 tolCG_ = cslist.sublist(
"Tangential Subproblem Solver").get(
"Relative Tolerance", 1e-2);
69 Delta_ = cslist.get(
"Initial Radius", 1e2);
70 useConHess_ = cslist.get(
"Use Constraint Hessian",
true);
115 template<
typename Real>
123 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
125 ROL::Ptr<Vector<Real> > n = xvec_->clone();
126 ROL::Ptr<Vector<Real> > c = cvec_->clone();
127 ROL::Ptr<Vector<Real> > t = xvec_->clone();
128 ROL::Ptr<Vector<Real> > tCP = xvec_->clone();
129 ROL::Ptr<Vector<Real> > g = gvec_->clone();
130 ROL::Ptr<Vector<Real> > gf = gvec_->clone();
131 ROL::Ptr<Vector<Real> > Wg = xvec_->clone();
132 ROL::Ptr<Vector<Real> > ajl = gvec_->clone();
135 ROL::Ptr<Vector<Real> > l_new = lvec_->clone();
136 ROL::Ptr<Vector<Real> > c_new = cvec_->clone();
137 ROL::Ptr<Vector<Real> > g_new = gvec_->clone();
138 ROL::Ptr<Vector<Real> > gf_new = gvec_->clone();
141 f = obj.
value(x, zerotol);
146 con.
value(*c, x, zerotol);
149 computeQuasinormalStep(*n, *c, x, zeta_*Delta_, con, os);
158 solveTangentialSubproblem(*t, *tCP, *Wg, x, *g, *n, l, Delta_, obj, con, os);
159 totalIterCG_ += iterCG_;
162 accept(s, *n, *t, f_new, *c_new, *gf_new, *l_new, *g_new, x, l, f, *gf, *c, *g, *tCP, *Wg, obj, con, os);
166 template<
typename Real>
174 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
175 std::vector<Real> augiters;
179 os <<
"\n Lagrange multiplier step\n";
184 Ptr<Vector<Real> > ajl = gvec_->clone();
188 Ptr<Vector<Real> > b1 = gvec_->clone();
189 Ptr<Vector<Real> > b2 = cvec_->clone();
191 b1->set(gf); b1->plus(*ajl); b1->scale(-one);
196 Ptr<Vector<Real> > v1 = xvec_->clone();
197 Ptr<Vector<Real> > v2 = lvec_->clone();
200 Real b1norm = b1->norm();
201 Real tol = setTolOSS(lmhtol_*b1norm);
206 totalIterLS_ = totalIterLS_ + augiters.size();
207 printInfoLS(augiters, os);
216 template<
typename Real>
226 os <<
"\n Quasi-normal step\n";
232 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
233 std::vector<Real> augiters;
236 Ptr<Vector<Real> > nCP = xvec_->clone();
237 Ptr<Vector<Real> > nCPdual = gvec_->clone();
238 Ptr<Vector<Real> > nN = xvec_->clone();
239 Ptr<Vector<Real> > ctemp = cvec_->clone();
240 Ptr<Vector<Real> > dualc0 = lvec_->clone();
241 dualc0->set(c.
dual());
243 nCP->set(nCPdual->dual());
246 Real normsquare_ctemp = ctemp->dot(*ctemp);
247 if (normsquare_ctemp != zero) {
248 nCP->scale( -(nCP->dot(*nCP))/normsquare_ctemp );
253 Real norm_nCP = nCP->norm();
254 if (norm_nCP >= delta) {
256 n.
scale( delta/norm_nCP );
259 os <<
" taking partial Cauchy step\n";
270 Real tol = setTolOSS(qntol_*ctemp->norm());
273 nCPdual->set(nCP->dual());
274 nCPdual->scale(-one);
276 Ptr<Vector<Real> > dn = xvec_->clone();
277 Ptr<Vector<Real> > y = lvec_->clone();
281 totalIterLS_ = totalIterLS_ + augiters.size();
282 printInfoLS(augiters, os);
289 Real norm_nN = nN->norm();
290 if (norm_nN <= delta) {
295 os <<
" taking full Newton step\n";
303 Real aa = dn->dot(*dn);
304 Real bb = dn->dot(*nCP);
305 Real cc = norm_nCP*norm_nCP - delta*delta;
306 Real tau = (-bb+sqrt(bb*bb-aa*cc))/aa;
311 os <<
" taking dogleg step\n";
319 template<
typename Real>
333 bool orthocheck =
true;
335 Real tol_ortho = 0.5;
342 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
343 std::vector<Real> augiters;
348 Ptr<Vector<Real> > r = gvec_->clone();
349 Ptr<Vector<Real> > pdesc = xvec_->clone();
350 Ptr<Vector<Real> > tprev = xvec_->clone();
351 Ptr<Vector<Real> > Wr = xvec_->clone();
352 Ptr<Vector<Real> > Hp = gvec_->clone();
353 Ptr<Vector<Real> > xtemp = xvec_->clone();
354 Ptr<Vector<Real> > gtemp = gvec_->clone();
355 Ptr<Vector<Real> > ltemp = lvec_->clone();
356 Ptr<Vector<Real> > czero = cvec_->clone();
359 obj.
hessVec(*gtemp, n, x, zerotol);
365 Real normg = r->norm();
373 std::vector<Real> normWr(maxiterCG_+1, zero);
375 std::vector<Ptr<Vector<Real > > > p;
376 std::vector<Ptr<Vector<Real > > > Hps;
377 std::vector<Ptr<Vector<Real > > > rs;
378 std::vector<Ptr<Vector<Real > > > Wrs;
383 std::ios_base::fmtflags osFlags(os.flags());
384 os <<
"\n Tangential subproblem\n";
385 os << std::setw(6) << std::right <<
"iter" << std::setw(18) <<
"||Wr||/||Wr0||" << std::setw(15) <<
"||s||";
386 os << std::setw(15) <<
"delta" << std::setw(15) <<
"||c'(x)s||" <<
"\n";
393 os <<
" >>> Tangential subproblem: Initial gradient is zero! \n";
396 iterCG_ = 0; Wg.
zero(); flagCG_ = 0;
401 while (iterCG_ < maxiterCG_) {
411 Real tol = setTolOSS(pgtol_);
414 totalIterLS_ = totalIterLS_ + augiters.size();
415 printInfoLS(augiters, os);
420 Wrs.push_back(xvec_->clone());
421 (Wrs[iterCG_-1])->set(*Wr);
424 if (normWg == zero) {
429 os <<
" Initial projected residual is close to zero! \n";
438 rs.push_back(xvec_->clone());
440 (rs[0])->set(r->dual());
445 Real tol = setTolOSS(projtol_);
448 totalIterLS_ = totalIterLS_ + augiters.size();
449 printInfoLS(augiters, os);
452 Wrs.push_back(xvec_->clone());
453 (Wrs[iterCG_-1])->set(*Wr);
457 normWr[iterCG_-1] = Wr->norm();
460 Ptr<Vector<Real> > ct = cvec_->clone();
462 Real linc = ct->norm();
463 std::ios_base::fmtflags osFlags(os.flags());
464 os << std::scientific << std::setprecision(6);
465 os << std::setw(6) << std::right << iterCG_-1 << std::setw(18) << normWr[iterCG_-1]/normWg << std::setw(15) << t.
norm();
466 os << std::setw(15) << delta << std::setw(15) << linc <<
"\n";
471 if (normWr[iterCG_-1]/normWg < tolCG_) {
476 os <<
" || W(g + H*(n+s)) || <= cgtol*|| W(g + H*n)|| \n";
484 LA::Matrix<Real> Wrr(iterCG_,iterCG_);
485 LA::Matrix<Real> T(iterCG_,iterCG_);
486 LA::Matrix<Real> Tm1(iterCG_,iterCG_);
487 for (
int i=0; i<iterCG_; i++) {
488 for (
int j=0; j<iterCG_; j++) {
489 Wrr(i,j) = (Wrs[i])->dot(*rs[j]);
490 T(i,j) = Wrr(i,j)/(normWr[i]*normWr[j]);
493 Tm1(i,j) = Tm1(i,j) - one;
497 if (Tm1.normOne() >= tol_ortho) {
498 LAPACK<int,Real> lapack;
499 std::vector<int> ipiv(iterCG_);
501 std::vector<Real> work(3*iterCG_);
503 lapack.GETRF(iterCG_, iterCG_, T.values(), T.stride(), &ipiv[0], &info);
504 lapack.GETRI(iterCG_, T.values(), T.stride(), &ipiv[0], &work[0], 3*iterCG_, &info);
506 for (
int i=0; i<iterCG_; i++) {
507 Tm1(i,i) = Tm1(i,i) - one;
509 if (Tm1.normOne() > S_max) {
513 os <<
" large nonorthogonality in W(R)'*R detected \n";
522 p.push_back(xvec_->clone());
523 (p[iterCG_-1])->set(*Wr);
524 (p[iterCG_-1])->scale(-one);
525 for (
int j=1; j<iterCG_; j++) {
526 Real scal = (p[iterCG_-1])->dot(*(Hps[j-1])) / (p[j-1])->dot(*(Hps[j-1]));
527 Ptr<Vector<Real> > pj = xvec_->clone();
530 (p[iterCG_-1])->plus(*pj);
534 Hps.push_back(xvec_->clone());
536 obj.
hessVec(*Hp, *(p[iterCG_-1]), x, zerotol);
543 (Hps[iterCG_-1])->set(Hp->dual());
545 pHp = (p[iterCG_-1])->dot(*(Hps[iterCG_-1]));
547 rp = (p[iterCG_-1])->dot(*(rs[iterCG_-1]));
549 normp = (p[iterCG_-1])->norm();
554 pdesc->set(*(p[iterCG_-1]));
555 if ((std::abs(rp) >= rptol*normp*normr) && (sgn(rp) == 1)) {
559 Real a = pdesc->dot(*pdesc);
560 Real b = pdesc->dot(t);
561 Real c = t.
dot(t) - delta*delta;
563 Real theta = (-b + std::sqrt(b*b - a*c)) / a;
564 xtemp->set(*(p[iterCG_-1]));
573 os <<
" negative curvature detected \n";
580 if (std::abs(rp) < rptol*normp*normr) {
584 os <<
" Zero alpha due to inexactness. \n";
594 xtemp->set(*(p[iterCG_-1]));
600 if (normt >= delta) {
601 pdesc->set(*(p[iterCG_-1]));
605 Real a = pdesc->dot(*pdesc);
606 Real b = pdesc->dot(*tprev);
607 Real c = tprev->dot(*tprev) - delta*delta;
609 Real theta = (-b + std::sqrt(b*b - a*c)) / a;
610 xtemp->set(*(p[iterCG_-1]));
621 os <<
" trust-region condition active \n";
628 xtemp->set(*(Hps[iterCG_-1]));
631 r->plus(xtemp->dual());
634 rs.push_back(xvec_->clone());
636 (rs[iterCG_])->set(r->dual());
646 os <<
" maximum number of iterations reached \n";
653 template<
typename Real>
661 Real tol_red_tang = 1e-3;
662 Real tol_red_all = 1e-1;
665 Real tol_fdiff = 1e-12;
670 Real rpred_over_pred = 0.5*(1-eta_);
674 os <<
"\n Composite step acceptance\n";
682 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
683 std::vector<Real> augiters;
688 Real part_pred =
zero;
689 Real linc_preproj =
zero;
690 Real linc_postproj =
zero;
691 Real tangtol_start =
zero;
692 Real tangtol = tangtol_;
696 bool try_tCP =
false;
699 Ptr<Vector<Real> > xtrial = xvec_->clone();
700 Ptr<Vector<Real> > Jl = gvec_->clone();
701 Ptr<Vector<Real> > gfJl = gvec_->clone();
702 Ptr<Vector<Real> > Jnc = cvec_->clone();
703 Ptr<Vector<Real> > t_orig = xvec_->clone();
704 Ptr<Vector<Real> > t_dual = gvec_->clone();
705 Ptr<Vector<Real> > Jt_orig = cvec_->clone();
706 Ptr<Vector<Real> > t_m_tCP = xvec_->clone();
707 Ptr<Vector<Real> > ltemp = lvec_->clone();
708 Ptr<Vector<Real> > xtemp = xvec_->clone();
709 Ptr<Vector<Real> > rt = cvec_->clone();
710 Ptr<Vector<Real> > Hn = gvec_->clone();
711 Ptr<Vector<Real> > Hto = gvec_->clone();
712 Ptr<Vector<Real> > cxxvec = gvec_->clone();
713 Ptr<Vector<Real> > czero = cvec_->clone();
715 Real Jnc_normsquared =
zero;
716 Real c_normsquared =
zero;
723 Jnc_normsquared = Jnc->dot(*Jnc);
724 c_normsquared = c.
dot(c);
726 for (
int ct=0; ct<ct_max; ct++) {
730 t_m_tCP->scale(-one);
732 if (t_m_tCP->norm() ==
zero) {
738 linc_preproj = Jt_orig->norm();
740 rpred = two*rpred_over_pred*pred;
743 tangtol_start = tangtol;
745 while (std::abs(rpred)/pred > rpred_over_pred) {
748 tangtol = tol_red_tang*tangtol;
750 if (tangtol < mintol) {
753 os <<
"\n The projection of the tangential step cannot be done with sufficient precision.\n";
754 os <<
" Is the quasi-normal step very small? Continuing with no global convergence guarantees.\n";
761 Real tol = setTolOSS(tangtol);
763 t_dual->set(t_orig->dual());
766 totalIterLS_ = totalIterLS_ + augiters.size();
767 printInfoLS(augiters, os);
770 linc_postproj = rt->norm();
777 obj.
hessVec(*Hn, n, x, zerotol);
782 obj.
hessVec(*Hto, *t_orig, x, zerotol);
793 f_new = obj.
value(*xtrial, zerotol);
794 obj.
gradient(gf_new, *xtrial, zerotol);
795 con.
value(c_new, *xtrial, zerotol);
797 computeLagrangeMultiplier(l_new, *xtrial, gf_new, con, os);
800 part_pred = - Wg.
dot(*t_orig);
805 part_pred -= n.
apply(*gfJl);
808 part_pred -= half*n.
apply(*Hn);
811 part_pred -= half*t_orig->apply(*Hto);
813 ltemp->axpy(-one, l);
816 part_pred -= Jnc->apply(*ltemp);
818 if ( part_pred < -half*penalty_*(c_normsquared-Jnc_normsquared) ) {
819 penalty_ = ( -two * part_pred / (c_normsquared-Jnc_normsquared) ) + beta;
822 pred = part_pred + penalty_*(c_normsquared-Jnc_normsquared);
827 rpred = - rt->apply(*ltemp) - penalty_ * rt->dot(*rt) - two * penalty_ * rt->dot(*Jnc);
835 tangtol = tangtol_start;
841 if ( t_orig->norm()/xtemp->norm() < tntmax_ ) {
845 t_m_tCP->set(*t_orig);
846 t_m_tCP->scale(-one);
848 if ((t_m_tCP->norm() > 0) && try_tCP) {
851 os <<
" ---> now trying tangential Cauchy point\n";
859 os <<
" ---> recomputing quasi-normal step and re-solving tangential subproblem\n";
879 lmhtol_ *= tol_red_all;
880 qntol_ *= tol_red_all;
881 pgtol_ *= tol_red_all;
882 projtol_ *= tol_red_all;
883 tangtol_ *= tol_red_all;
886 computeQuasinormalStep(n, c, x, zeta_*Delta_, con, os);
888 solveTangentialSubproblem(t, tCP, Wg, x, g, n, l, Delta_, obj, con, os);
889 totalIterCG_ += iterCG_;
904 if (std::abs(fdiff / (f+em24)) < tol_fdiff) {
910 ared = fdiff + (c.
apply(l) - c_new.
apply(l_new)) + penalty_*(c.
dot(c) - c_new.
dot(c_new));
923 std::ios_base::fmtflags osFlags(os.flags());
924 os << std::scientific << std::setprecision(6);
925 os <<
"\n Trial step info ...\n";
926 os <<
" n_norm = " << nnorm_ <<
"\n";
927 os <<
" t_norm = " << tnorm_ <<
"\n";
928 os <<
" s_norm = " << snorm_ <<
"\n";
929 os <<
" xtrial_norm = " << xtrial->norm() <<
"\n";
930 os <<
" f_old = " << f <<
"\n";
931 os <<
" f_trial = " << f_new <<
"\n";
932 os <<
" f_old-f_trial = " << f-f_new <<
"\n";
933 os <<
" ||c_old|| = " << c.
norm() <<
"\n";
934 os <<
" ||c_trial|| = " << c_new.
norm() <<
"\n";
935 os <<
" ||Jac*t_preproj|| = " << linc_preproj <<
"\n";
936 os <<
" ||Jac*t_postproj|| = " << linc_postproj <<
"\n";
937 os <<
" ||t_tilde||/||t|| = " << t_orig->norm() / t.
norm() <<
"\n";
938 os <<
" ||t_tilde||/||n+t|| = " << t_orig->norm() / snorm_ <<
"\n";
939 os <<
" # projections = " << num_proj <<
"\n";
940 os <<
" penalty param = " << penalty_ <<
"\n";
941 os <<
" ared = " << ared_ <<
"\n";
942 os <<
" pred = " << pred_ <<
"\n";
943 os <<
" ared/pred = " << ared_/pred_ <<
"\n";
949 template<
typename Real>
964 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
967 Ptr<Vector<Real> > g = gvec_->clone();
968 Ptr<Vector<Real> > ajl = gvec_->clone();
969 Ptr<Vector<Real> > gl = gvec_->clone();
970 Ptr<Vector<Real> > c = cvec_->clone();
975 if ((std::abs(ared_) < em12) && std::abs(pred_) < em12) {
981 Delta_ = std::max(seven*snorm_, Delta_);
983 else if (ratio >= zp8) {
984 Delta_ = std::max(two*snorm_, Delta_);
991 Delta_ = half*std::max(nnorm_, tnorm_);
997 Real val = obj.
value(x, zerotol);
1000 computeLagrangeMultiplier(l, x, *g, con, os);
1002 gl->set(*g); gl->plus(*ajl);
1004 con.
value(*c, x, zerotol);
1006 state_->gradientVec->set(*gl);
1007 state_->constraintVec->set(*c);
1009 state_->value = val;
1010 state_->gnorm = gl->norm();
1011 state_->cnorm = c->norm();
1013 state_->snorm = snorm_;
1020 template<
typename Real>
1028 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
1041 Ptr<Vector<Real> > ajl = gvec_->clone();
1042 Ptr<Vector<Real> > gl = gvec_->clone();
1046 state_->value = obj.
value(x, zerotol);
1049 con.
value(*cvec_, x, zerotol);
1050 state_->cnorm = cvec_->norm();
1055 computeLagrangeMultiplier(l, x, *gvec_, con, os);
1057 gl->set(*gvec_); gl->plus(*ajl);
1059 state_->gnorm = gl->norm();
1063 template<
typename Real>
1070 std::ostream &outStream) {
1072 initialize(x, g, emul, eres, obj, econ, outStream);
1075 if (verbosity_ > 0) writeOutput(outStream,
true);
1078 Ptr<Vector<Real> > s = x.
clone();
1080 while (status_->check(*state_)) {
1081 computeTrial(*s, x, emul, obj, econ, outStream);
1082 updateRadius(x, emul, *s, obj, econ, outStream);
1085 if (verbosity_ > 0) writeOutput(outStream, printHeader_);
1092 template<
typename Real>
1094 std::ios_base::fmtflags osFlags(os.flags());
1096 os << std::string(144,
'-') << std::endl;
1097 os <<
"Composite Step status output definitions" << std::endl << std::endl;
1098 os <<
" iter - Number of iterates (steps taken)" << std::endl;
1099 os <<
" fval - Objective function value" << std::endl;
1100 os <<
" cnorm - Norm of the constraint violation" << std::endl;
1101 os <<
" gLnorm - Norm of the gradient of the Lagrangian" << std::endl;
1102 os <<
" snorm - Norm of the step" << std::endl;
1103 os <<
" delta - Trust-region radius" << std::endl;
1104 os <<
" nnorm - Norm of the quasinormal step" << std::endl;
1105 os <<
" tnorm - Norm of the tangential step" << std::endl;
1106 os <<
" #fval - Number of times the objective was computed" << std::endl;
1107 os <<
" #grad - Number of times the gradient was computed" << std::endl;
1108 os <<
" iterCG - Number of projected CG iterations" << std::endl;
1109 os <<
" flagCG - Flag returned by projected CG" << std::endl;
1110 os <<
" accept - Acceptance flag for the trial step" << std::endl;
1111 os <<
" linsys - Number of augmented solver calls/iterations" << std::endl;
1112 os << std::string(144,
'-') << std::endl;
1115 os << std::setw(6) << std::left <<
"iter";
1116 os << std::setw(15) << std::left <<
"fval";
1117 os << std::setw(15) << std::left <<
"cnorm";
1118 os << std::setw(15) << std::left <<
"gLnorm";
1119 os << std::setw(15) << std::left <<
"snorm";
1120 os << std::setw(10) << std::left <<
"delta";
1121 os << std::setw(10) << std::left <<
"nnorm";
1122 os << std::setw(10) << std::left <<
"tnorm";
1123 os << std::setw(8) << std::left <<
"#fval";
1124 os << std::setw(8) << std::left <<
"#grad";
1125 os << std::setw(8) << std::left <<
"iterCG";
1126 os << std::setw(8) << std::left <<
"flagCG";
1127 os << std::setw(8) << std::left <<
"accept";
1128 os << std::setw(8) << std::left <<
"linsys";
1134 template<
typename Real>
1136 std::ios_base::fmtflags osFlags(os.flags());
1137 os << std::endl <<
"Composite-Step Trust-Region Solver (Type E, Equality Constraints)";
1143 template<
typename Real>
1145 std::ios_base::fmtflags osFlags(os.flags());
1146 os << std::scientific << std::setprecision(6);
1147 if (state_->iter == 0) writeName(os);
1148 if (print_header) writeHeader(os);
1149 if (state_->iter == 0 ) {
1151 os << std::setw(6) << std::left << state_->iter;
1152 os << std::setw(15) << std::left << state_->value;
1153 os << std::setw(15) << std::left << state_->cnorm;
1154 os << std::setw(15) << std::left << state_->gnorm;
1155 os << std::setw(15) << std::left <<
"---";
1156 os << std::setw(10) << std::left <<
"---";
1157 os << std::setw(10) << std::left <<
"---";
1158 os << std::setw(10) << std::left <<
"---";
1159 os << std::setw(8) << std::left <<
"---";
1160 os << std::setw(8) << std::left <<
"---";
1161 os << std::setw(8) << std::left <<
"---";
1162 os << std::setw(8) << std::left <<
"---";
1163 os << std::setw(8) << std::left <<
"---";
1164 os << std::setw(8) << std::left <<
"---";
1169 os << std::setw(6) << std::left << state_->iter;
1170 os << std::setw(15) << std::left << state_->value;
1171 os << std::setw(15) << std::left << state_->cnorm;
1172 os << std::setw(15) << std::left << state_->gnorm;
1173 os << std::setw(15) << std::left << state_->snorm;
1174 os << std::scientific << std::setprecision(2);
1175 os << std::setw(10) << std::left << Delta_;
1176 os << std::setw(10) << std::left << nnorm_;
1177 os << std::setw(10) << std::left << tnorm_;
1178 os << std::scientific << std::setprecision(6);
1179 os << std::setw(8) << std::left << state_->nfval;
1180 os << std::setw(8) << std::left << state_->ngrad;
1181 os << std::setw(8) << std::left << iterCG_;
1182 os << std::setw(8) << std::left << flagCG_;
1183 os << std::setw(8) << std::left << flagAC_;
1184 os << std::left << totalCallLS_ <<
"/" << totalIterLS_;
1191 template<
typename Real>
1192 template<
typename T>
1194 return (T(0) < val) - (val < T(0));
1198 template<
typename Real>
1201 std::ios_base::fmtflags osFlags(os.flags());
1202 os << std::scientific << std::setprecision(8);
1203 os << std::endl <<
" Augmented System Solver:" << std::endl;
1204 os <<
" True Residual" << std::endl;
1205 for (
unsigned j=0; j<res.size(); j++) {
1206 os <<
" " << std::left << std::setw(14) << res[j] << std::endl;
1214 template<
typename Real>
1216 return tolOSSfixed_ ? tolOSS_ : intol;
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...
virtual void applyJacobian(Vector< Real > &jv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply the constraint Jacobian at , , to vector .
virtual void scale(const Real alpha)=0
Compute where .
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
virtual Real apply(const Vector< Real > &x) const
Apply to a dual vector. This is equivalent to the call .
virtual void plus(const Vector &x)=0
Compute , where .
virtual void update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update constraint function.
void computeTrial(Vector< Real > &s, const Vector< Real > &x, const Vector< Real > &l, Objective< Real > &obj, Constraint< Real > &con, std::ostream &os)
Compute trial step.
virtual void axpy(const Real alpha, const Vector &x)
Compute where .
CompositeStepAlgorithm(ParameterList &list)
virtual Real value(const Vector< Real > &x, Real &tol)=0
Compute value.
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
void accept(Vector< Real > &s, Vector< Real > &n, Vector< Real > &t, Real f_new, Vector< Real > &c_new, Vector< Real > &gf_new, Vector< Real > &l_new, Vector< Real > &g_new, const Vector< Real > &x, const Vector< Real > &l, Real f, const Vector< Real > &gf, const Vector< Real > &c, const Vector< Real > &g, Vector< Real > &tCP, Vector< Real > &Wg, Objective< Real > &obj, Constraint< Real > &con, std::ostream &os)
Check acceptance of subproblem solutions, adjust merit function penalty parameter, ensure global convergence.
virtual void writeHeader(std::ostream &os) const override
Print iterate header.
virtual void zero()
Set to zero vector.
Defines the linear algebra or vector space interface.
virtual void value(Vector< Real > &c, const Vector< Real > &x, Real &tol)=0
Evaluate the constraint operator at .
virtual void update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update objective function.
virtual Real dot(const Vector &x) const =0
Compute where .
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
Provides an interface to check status of optimization algorithms for problems with equality constrain...
virtual void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
virtual void run(Vector< Real > &x, const Vector< Real > &g, Objective< Real > &obj, Constraint< Real > &econ, Vector< Real > &emul, const Vector< Real > &eres, std::ostream &outStream=std::cout) override
Run algorithm on equality constrained problems (Type-E). This general interface supports the use of d...
virtual void applyAdjointHessian(Vector< Real > &ahuv, const Vector< Real > &u, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply the derivative of the adjoint of the constraint Jacobian at to vector in direction ...
const Ptr< CombinedStatusTest< Real > > status_
void computeQuasinormalStep(Vector< Real > &n, const Vector< Real > &c, const Vector< Real > &x, Real delta, Constraint< Real > &con, std::ostream &os)
Compute quasi-normal step by minimizing the norm of the linearized constraint.
void updateRadius(Vector< Real > &x, Vector< Real > &l, const Vector< Real > &s, Objective< Real > &obj, Constraint< Real > &con, std::ostream &os)
Update trust-region radius, take step, etc.
virtual void applyAdjointJacobian(Vector< Real > &ajv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply the adjoint of the the constraint Jacobian at , , to vector .
virtual void writeName(std::ostream &os) const override
Print step name.
virtual void writeExitStatus(std::ostream &os) const
void initialize(Vector< Real > &x, const Vector< Real > &g, Vector< Real > &l, const Vector< Real > &c, Objective< Real > &obj, Constraint< Real > &con, std::ostream &outStream=std::cout)
Initialize algorithm by computing a few quantities.
virtual std::vector< Real > solveAugmentedSystem(Vector< Real > &v1, Vector< Real > &v2, const Vector< Real > &b1, const Vector< Real > &b2, const Vector< Real > &x, Real &tol)
Approximately solves the augmented system where , , , , is an identity or Riesz operator...
void initialize(const Vector< Real > &x, const Vector< Real > &g, const Vector< Real > &mul, const Vector< Real > &c)
virtual void set(const Vector &x)
Set where .
virtual Real norm() const =0
Returns where .
void computeLagrangeMultiplier(Vector< Real > &l, const Vector< Real > &x, const Vector< Real > &gf, Constraint< Real > &con, std::ostream &os)
Compute Lagrange multipliers by solving the least-squares problem minimizing the gradient of the Lagr...
void solveTangentialSubproblem(Vector< Real > &t, Vector< Real > &tCP, Vector< Real > &Wg, const Vector< Real > &x, const Vector< Real > &g, const Vector< Real > &n, const Vector< Real > &l, Real delta, Objective< Real > &obj, Constraint< Real > &con, std::ostream &os)
Solve tangential subproblem.
void printInfoLS(const std::vector< Real > &res, std::ostream &os) const
virtual void writeOutput(std::ostream &os, const bool print_header=false) const override
Print iterate status.
Defines the general constraint operator interface.
Real setTolOSS(const Real intol) const