10#ifndef ROL_SEMISMOOTHNEWTONPROJECTION_DEF_H
11#define ROL_SEMISMOOTHNEWTONPROJECTION_DEF_H
15template<
typename Real>
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);
61template<
typename Real>
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);
118template<
typename Real>
120 if (
con_ == nullPtr) {
128template<
typename Real>
132 con_->value(r,y,tol);
136template<
typename Real>
144 Ptr<Precond> M = makePtr<Precond>(mu);
146 krylov_->run(s,*J,r,*M,iter,flag);
149template<
typename Real>
156 con_->applyAdjointJacobian(*
xdual_,lam,x,tol);
161template<
typename Real>
165 std::ostream &stream)
const {
166 const Real
zero(0), half(0.5), one(1);
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());
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));
202 while ( tmp > (one-
decr_*alpha)*rnorm && alpha >
stol_ ) {
215 while ( tmp <
decr_*(one-rho)*mu*dd && alpha >
stol_ ) {
228 lam.
axpy(-alpha*tmp/(rnorm*rnorm),
res_->dual());
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;
252 stream <<
">>> ROL::PolyhedralProjection::project : Projection may be inaccurate! rnorm = ";
253 stream << rnorm <<
" rtol = " <<
ctol_ << std::endl;
256 stream.flags(streamFlags);
259template<
typename Real>
265 Real res0 = std::max(resl,resu);
266 if (res0 <
atol_) res0 =
static_cast<Real
>(1);
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0 zero)()
Provides the interface to apply upper and lower bound constraints.
Defines the general constraint operator interface.
const Ptr< Constraint< Real > > con_
Ptr< Vector< Real > > xprim_
const Ptr< BoundConstraint< Real > > bnd_
Ptr< Vector< Real > > mul_
Ptr< Vector< Real > > xdual_
Ptr< Vector< Real > > res_
PolyhedralProjection(const Ptr< BoundConstraint< Real > > &bnd)
Ptr< Vector< Real > > dlam_
Ptr< Vector< Real > > lnew_
Ptr< Vector< Real > > xnew_
void update_primal(Vector< Real > &y, const Vector< Real > &x, const Vector< Real > &lam) const
void solve_newton_system(Vector< Real > &s, const Vector< Real > &r, const Vector< Real > &y, const Real mu, const Real rho, int &iter, int &flag) const
void project_ssn(Vector< Real > &x, Vector< Real > &lam, Vector< Real > &dlam, std::ostream &stream=std::cout) const
SemismoothNewtonProjection(const Vector< Real > &xprim, const Vector< Real > &xdual, const Ptr< BoundConstraint< Real > > &bnd, const Ptr< Constraint< Real > > &con, const Vector< Real > &mul, const Vector< Real > &res)
Ptr< Krylov< Real > > krylov_
void project(Vector< Real > &x, std::ostream &stream=std::cout) override
Real compute_tolerance() const
Real residual(Vector< Real > &r, const Vector< Real > &y) const
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 plus(const Vector &x)=0
Compute , where .
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
virtual int dimension() const
Return dimension of the vector space.
virtual void axpy(const Real alpha, const Vector &x)
Compute where .
virtual Real dot(const Vector &x) const =0
Compute where .
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.
Ptr< Krylov< Real > > KrylovFactory(ParameterList &parlist)