27 DEFAULT_factor_ (0.5),
28 DEFAULT_regscale_ (1e-4),
29 DEFAULT_errscale_ (1e-2),
30 DEFAULT_maxit_ (5000),
32 DEFAULT_verbosity_ (0),
33 DEFAULT_useproj_ (false),
34 atol_ (DEFAULT_atol_),
35 rtol_ (DEFAULT_rtol_),
36 stol_ (DEFAULT_stol_),
37 decr_ (DEFAULT_decr_),
38 factor_ (DEFAULT_factor_),
39 regscale_ (DEFAULT_regscale_),
40 errscale_ (DEFAULT_errscale_),
41 maxit_ (DEFAULT_maxit_),
42 lstype_ (DEFAULT_lstype_),
43 verbosity_ (DEFAULT_verbosity_),
44 useproj_ (DEFAULT_useproj_) {
51 list.sublist(
"General").sublist(
"Krylov").set(
"Type",
"Conjugate Gradients");
52 list.sublist(
"General").sublist(
"Krylov").set(
"Absolute Tolerance", 1e-6);
53 list.sublist(
"General").sublist(
"Krylov").set(
"Relative Tolerance", 1e-4);
54 list.sublist(
"General").sublist(
"Krylov").set(
"Iteration Limit",
dim_);
55 list.sublist(
"General").set(
"Inexact Hessian-Times-A-Vector",
false);
56 krylov_ = KrylovFactory<Real>(list);
74 DEFAULT_factor_ (0.5),
75 DEFAULT_regscale_ (1e-4),
76 DEFAULT_errscale_ (1e-2),
77 DEFAULT_maxit_ (5000),
79 DEFAULT_verbosity_ (0),
80 DEFAULT_useproj_ (false),
81 atol_ (DEFAULT_atol_),
82 rtol_ (DEFAULT_rtol_),
83 stol_ (DEFAULT_stol_),
84 decr_ (DEFAULT_decr_),
85 factor_ (DEFAULT_factor_),
86 regscale_ (DEFAULT_regscale_),
87 errscale_ (DEFAULT_errscale_),
88 maxit_ (DEFAULT_maxit_),
89 lstype_ (DEFAULT_lstype_),
90 verbosity_ (DEFAULT_verbosity_),
91 useproj_ (DEFAULT_useproj_) {
96 ParameterList &ppl = list.sublist(
"General").sublist(
"Polyhedral Projection");
100 decr_ = ppl.sublist(
"Semismooth Newton").get(
"Sufficient Decrease Tolerance",
DEFAULT_decr_);
111 klist.sublist(
"General").sublist(
"Krylov") = ppl.sublist(
"Semismooth Newton").sublist(
"Krylov");
112 klist.sublist(
"General").set(
"Inexact Hessian-Times-A-Vector",
false);
113 krylov_ = KrylovFactory<Real>(klist);
165 std::ostream &stream)
const {
166 const Real
zero(0), half(0.5), one(1);
168 update_primal(*xnew_,x,lam);
169 Real rnorm = residual(*res_,*xnew_);
174 Real alpha(1), tmp(0), mu(0), rho(1), dd(0);
175 int iter(0), flag(0);
176 std::ios_base::fmtflags streamFlags(stream.flags());
177 if (verbosity_ > 2) {
179 stream << std::scientific << std::setprecision(6);
180 stream <<
" Polyhedral Projection using Dual Semismooth Newton" << std::endl;
182 stream << std::setw(6) << std::left <<
"iter";
183 stream << std::setw(15) << std::left <<
"rnorm";
184 stream << std::setw(15) << std::left <<
"alpha";
185 stream << std::setw(15) << std::left <<
"mu";
186 stream << std::setw(15) << std::left <<
"rho";
187 stream << std::setw(15) << std::left <<
"rtol";
188 stream << std::setw(8) << std::left <<
"kiter";
189 stream << std::setw(8) << std::left <<
"kflag";
192 for (
int cnt = 0; cnt < maxit_; ++cnt) {
194 mu = regscale_*std::max(rnorm,std::sqrt(rnorm));
195 rho = std::min(half,errscale_*std::min(std::sqrt(rnorm),rnorm));
196 solve_newton_system(dlam,*res_,*xnew_,mu,rho,iter,flag);
197 lnew_->set(lam); lnew_->axpy(-alpha, dlam);
198 update_primal(*xnew_,x,*lnew_);
201 tmp = residual(*res_,*xnew_);
202 while ( tmp > (one-decr_*alpha)*rnorm && alpha > stol_ ) {
204 lnew_->set(lam); lnew_->axpy(-alpha, dlam);
205 update_primal(*xnew_,x,*lnew_);
206 tmp = residual(*res_,*xnew_);
211 rnorm = residual(*res_,*xnew_);
213 tmp = dlam.
apply(*res_);
215 while ( tmp < decr_*(one-rho)*mu*dd && alpha > stol_ ) {
217 lnew_->set(lam); lnew_->axpy(-alpha, dlam);
218 update_primal(*xnew_,x,*lnew_);
219 rnorm = residual(*res_,*xnew_);
221 tmp = dlam.
apply(*res_);
228 lam.
axpy(-alpha*tmp/(rnorm*rnorm),res_->dual());
229 update_primal(*xnew_,x,lam);
230 rnorm = residual(*res_,*xnew_);
232 if (verbosity_ > 2) {
234 stream << std::setw(6) << std::left << cnt;
235 stream << std::setw(15) << std::left << rnorm;
236 stream << std::setw(15) << std::left << alpha;
237 stream << std::setw(15) << std::left << mu;
238 stream << std::setw(15) << std::left << rho;
239 stream << std::setw(15) << std::left << ctol_;
240 stream << std::setw(8) << std::left << iter;
241 stream << std::setw(8) << std::left << flag;
244 if (rnorm <= ctol_)
break;
247 if (verbosity_ > 2) {
252 stream <<
">>> ROL::PolyhedralProjection::project : Projection may be inaccurate! rnorm = ";
253 stream << rnorm <<
" rtol = " << ctol_ << std::endl;
256 stream.flags(streamFlags);