10#ifndef ROL_TYPEG_INTERIORPOINTALGORITHM_DEF_H
11#define ROL_TYPEG_INTERIORPOINTALGORITHM_DEF_H
18template<
typename Real>
21 list_(list), subproblemIter_(0), print_(false) {
27 ParameterList& steplist = list.sublist(
"Step").sublist(
"Interior Point");
28 state_->searchSize = steplist.get(
"Initial Barrier Parameter", 1.0);
29 mumin_ = steplist.get(
"Minimum Barrier Parameter", 1e-4);
30 mumax_ = steplist.get(
"Maximum Barrier Parameter", 1e8);
31 rho_ = steplist.get(
"Barrier Penalty Reduction Factor", 0.5);
33 kappaD_ = steplist.get(
"Linear Damping Coefficient", 1.e-4);
34 print_ = steplist.sublist(
"Subproblem").get(
"Print History",
false);
36 gtol_ = steplist.sublist(
"Subproblem").get(
"Initial Optimality Tolerance", 1e-2);
37 ctol_ = steplist.sublist(
"Subproblem").get(
"Initial Feasibility Tolerance", 1e-2);
39 int maxit = steplist.sublist(
"Subproblem").get(
"Iteration Limit", 1000);
40 list_.sublist(
"Status Test").set(
"Iteration Limit", maxit);
42 gtolrate_ = steplist.sublist(
"Subproblem").get(
"Optimality Tolerance Reduction Factor", 0.1);
43 ctolrate_ = steplist.sublist(
"Subproblem").get(
"Feasibility Tolerance Reduction Factor", 0.1);
44 mingtol_ =
static_cast<Real
>(1e-2)*list.sublist(
"Status Test").get(
"Gradient Tolerance", 1e-8);
45 minctol_ =
static_cast<Real
>(1e-2)*list.sublist(
"Status Test").get(
"Constraint Tolerance", 1e-8);
47 stepname_ = steplist.sublist(
"Subproblem").get(
"Step Type",
"Augmented Lagrangian");
50 verbosity_ = list.sublist(
"General").get(
"Output Level", 0);
56template<
typename Real>
66 std::ostream &outStream) {
68 if (proj_ == nullPtr) {
69 proj_ = makePtr<PolyhedralProjection<Real>>(makePtrFromRef(bnd));
72 proj_->project(x,outStream);
80 updateState(x,l,ipobj,bnd,con,pwa,dwa,outStream);
84template<
typename Real>
92 std::ostream &outStream) {
94 Real zerotol = std::sqrt(ROL_EPSILON<Real>());
96 if (state_->iter == 0) {
107 ipobj.
gradient(*state_->gradientVec, x, zerotol);
109 state_->gradientVec->plus(dwa);
112 pwa.
axpy(-one,state_->gradientVec->dual());
113 proj_->project(pwa,outStream);
115 state_->gnorm = pwa.
norm();
117 con.
value(*state_->constraintVec, x, zerotol);
118 state_->cnorm = state_->constraintVec->norm();
125template<
typename Real>
133 std::ostream &outStream ) {
135 Ptr<Vector<Real>> pwa = x.
clone(), dwa = g.
clone();
138 x,g,useLinearDamping_,kappaD_,
140 initialize(x,g,emul,eres,ipobj,bnd,econ,*pwa,*dwa,outStream);
141 Ptr<TypeE::Algorithm<Real>> algo;
144 if (verbosity_ > 0) writeOutput(outStream,
true);
146 while (status_->check(*state_)) {
148 list_.sublist(
"Status Test").set(
"Gradient Tolerance", gtol_);
149 list_.sublist(
"Status Test").set(
"Constraint Tolerance", ctol_);
150 list_.sublist(
"Status Test").set(
"Step Tolerance", stol_);
151 algo = TypeE::AlgorithmFactory<Real>(list_,secant_);
152 if (hasPolyProj_) algo->run(x,g,ipobj,econ,emul,eres,
153 *proj_->getLinearConstraint(),
154 *proj_->getMultiplier(),
155 *proj_->getResidual(),outStream);
156 else algo->run(x,g,ipobj,econ,emul,eres,outStream);
157 subproblemIter_ = algo->getState()->iter;
158 state_->nfval += algo->getState()->nfval;
159 state_->ngrad += algo->getState()->ngrad;
160 state_->ncval += algo->getState()->ncval;
163 state_->stepVec->set(x);
164 state_->stepVec->axpy(-one,*state_->iterateVec);
165 state_->lagmultVec->axpy(-one,emul);
166 state_->snorm = state_->stepVec->norm();
167 state_->snorm += state_->lagmultVec->norm();
170 state_->iterateVec->set(x);
171 state_->lagmultVec->set(emul);
178 if( (rho_< one && state_->searchSize > mumin_) || (rho_ > one && state_->searchSize < mumax_) ) {
179 state_->searchSize *= rho_;
182 gtol_ *= gtolrate_; gtol_ = std::max(gtol_,mingtol_);
183 ctol_ *= ctolrate_; ctol_ = std::max(ctol_,minctol_);
184 stol_ =
static_cast<Real
>(1e-6)*std::min(gtol_,ctol_);
188 updateState(x,emul,ipobj,bnd,econ,*pwa,*dwa);
191 if (verbosity_ > 0) writeOutput(outStream,printHeader_);
196template<
typename Real>
198 std::ios_base::fmtflags osFlags(os.flags());
199 if (verbosity_ > 1) {
200 os << std::string(109,
'-') << std::endl;
201 os <<
"Interior Point Solver";
202 os <<
" status output definitions" << std::endl << std::endl;
203 os <<
" iter - Number of iterates (steps taken)" << std::endl;
204 os <<
" fval - Objective function value" << std::endl;
205 os <<
" cnorm - Norm of the constraint" << std::endl;
206 os <<
" gLnorm - Norm of the gradient of the Lagrangian" << std::endl;
207 os <<
" snorm - Norm of the step (update to optimization vector)" << std::endl;
208 os <<
" penalty - Penalty parameter for bound constraints" << std::endl;
209 os <<
" #fval - Cumulative number of times the objective function was evaluated" << std::endl;
210 os <<
" #grad - Cumulative number of times the gradient was computed" << std::endl;
211 os <<
" #cval - Cumulative number of times the constraint was evaluated" << std::endl;
212 os <<
" optTol - Subproblem optimality tolerance" << std::endl;
213 os <<
" feasTol - Subproblem feasibility tolerance" << std::endl;
214 os <<
" subiter - Number of subproblem iterations" << std::endl;
215 os << std::string(109,
'-') << std::endl;
219 os << std::setw(6) << std::left <<
"iter";
220 os << std::setw(15) << std::left <<
"fval";
221 os << std::setw(15) << std::left <<
"cnorm";
222 os << std::setw(15) << std::left <<
"gLnorm";
223 os << std::setw(15) << std::left <<
"snorm";
224 os << std::setw(10) << std::left <<
"penalty";
225 os << std::setw(8) << std::left <<
"#fval";
226 os << std::setw(8) << std::left <<
"#grad";
227 os << std::setw(8) << std::left <<
"#cval";
228 os << std::setw(10) << std::left <<
"optTol";
229 os << std::setw(10) << std::left <<
"feasTol";
230 os << std::setw(8) << std::left <<
"subIter";
235template<
typename Real>
237 std::ios_base::fmtflags osFlags(os.flags());
238 os << std::endl <<
"Interior Point Solver (Type G, General Constraints)";
240 os <<
"Subproblem Solver: " << stepname_ << std::endl;
244template<
typename Real>
246 std::ios_base::fmtflags osFlags(os.flags());
247 os << std::scientific << std::setprecision(6);
248 if ( state_->iter == 0 ) writeName(os);
249 if ( print_header ) writeHeader(os);
250 if ( state_->iter == 0 ) {
252 os << std::setw(6) << std::left << state_->iter;
253 os << std::setw(15) << std::left << state_->value;
254 os << std::setw(15) << std::left << state_->cnorm;
255 os << std::setw(15) << std::left << state_->gnorm;
256 os << std::setw(15) << std::left <<
"---";
257 os << std::scientific << std::setprecision(2);
258 os << std::setw(10) << std::left << state_->searchSize;
259 os << std::setw(8) << std::left << state_->nfval;
260 os << std::setw(8) << std::left << state_->ngrad;
261 os << std::setw(8) << std::left << state_->ncval;
262 os << std::setw(10) << std::left <<
"---";
263 os << std::setw(10) << std::left <<
"---";
264 os << std::setw(8) << std::left <<
"---";
269 os << std::setw(6) << std::left << state_->iter;
270 os << std::setw(15) << std::left << state_->value;
271 os << std::setw(15) << std::left << state_->cnorm;
272 os << std::setw(15) << std::left << state_->gnorm;
273 os << std::setw(15) << std::left << state_->snorm;
274 os << std::scientific << std::setprecision(2);
275 os << std::setw(10) << std::left << state_->searchSize;
276 os << std::scientific << std::setprecision(6);
277 os << std::setw(8) << std::left << state_->nfval;
278 os << std::setw(8) << std::left << state_->ngrad;
279 os << std::setw(8) << std::left << state_->ncval;
280 os << std::scientific << std::setprecision(2);
281 os << std::setw(10) << std::left << gtol_;
282 os << std::setw(10) << std::left << ctol_;
283 os << std::scientific << std::setprecision(6);
284 os << std::setw(8) << std::left << subproblemIter_;
Provides the interface to apply upper and lower bound constraints.
virtual void projectInterior(Vector< Real > &x)
Project optimization variables into the interior of the feasible set.
Provides an interface to check status of optimization algorithms for problems with equality constrain...
Defines the general constraint operator interface.
virtual void value(Vector< Real > &c, const Vector< Real > &x, Real &tol)=0
Evaluate the constraint operator at .
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 update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update constraint function.
void update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update objective function.
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
void updatePenalty(const Real mu)
Real getObjectiveValue(const Vector< Real > &x, Real &tol)
Provides the interface to evaluate objective functions.
Provides interface for and implements limited-memory secant operators.
Provides an interface to run general constrained optimization algorithms.
void initialize(const Vector< Real > &x, const Vector< Real > &g, const Vector< Real > &mul, const Vector< Real > &c)
virtual void writeExitStatus(std::ostream &os) const
const Ptr< CombinedStatusTest< Real > > status_
const Ptr< AlgorithmState< Real > > state_
InteriorPointAlgorithm(ParameterList &list, const Ptr< Secant< Real > > &secant_=nullPtr)
void updateState(const Vector< Real > &x, const Vector< Real > &l, InteriorPointObjective< Real > &ipobj, BoundConstraint< Real > &bnd, Constraint< Real > &con, Vector< Real > &pwa, Vector< Real > &dwa, std::ostream &outStream=std::cout)
void writeName(std::ostream &os) const override
Print step name.
void writeHeader(std::ostream &os) const override
Print iterate header.
void writeOutput(std::ostream &os, const bool print_header=false) const override
Print iterate status.
void run(Vector< Real > &x, const Vector< Real > &g, Objective< Real > &obj, BoundConstraint< Real > &bnd, Constraint< Real > &econ, Vector< Real > &emul, const Vector< Real > &eres, std::ostream &outStream=std::cout) override
Run algorithm on general constrained problems (Type-G). This is the primary Type-G interface.
void initialize(Vector< Real > &x, const Vector< Real > &g, const Vector< Real > &l, const Vector< Real > &c, InteriorPointObjective< Real > &ipobj, BoundConstraint< Real > &bnd, Constraint< Real > &con, Vector< Real > &pwa, Vector< Real > &dwa, std::ostream &outStream=std::cout)
Defines the linear algebra or vector space interface.
virtual Real norm() const =0
Returns where .
virtual void set(const Vector &x)
Set where .
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 .