10#ifndef ROL_TYPEG_INTERIORPOINTALGORITHM_DEF_H
11#define ROL_TYPEG_INTERIORPOINTALGORITHM_DEF_H
18template<
typename Real>
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);
84template<
typename Real>
92 std::ostream &outStream) {
109 state_->gradientVec->plus(dwa);
113 proj_->project(pwa,outStream);
125template<
typename Real>
133 std::ostream &outStream ) {
135 Ptr<Vector<Real>> pwa = x.
clone(), dwa = g.
clone();
140 initialize(x,g,emul,eres,ipobj,bnd,econ,*pwa,*dwa,outStream);
141 Ptr<TypeE::Algorithm<Real>> algo;
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_);
153 *
proj_->getLinearConstraint(),
154 *
proj_->getMultiplier(),
155 *
proj_->getResidual(),outStream);
156 else algo->run(x,g,ipobj,econ,emul,eres,outStream);
158 state_->nfval += algo->getState()->nfval;
159 state_->ngrad += algo->getState()->ngrad;
160 state_->ncval += algo->getState()->ncval;
165 state_->lagmultVec->axpy(-one,emul);
170 state_->iterateVec->set(x);
171 state_->lagmultVec->set(emul);
196template<
typename Real>
198 std::ios_base::fmtflags osFlags(os.flags());
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);
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);
virtual void initialize(const Vector< Real > &x)
Initialize temporary variables.
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 update(const Vector< Real > &x, UpdateType type, int iter=-1)
Update constraint function.
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 .
void update(const Vector< Real > &x, UpdateType type, int iter=-1)
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
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.
Algorithm()
Constructor, given a step and a status test.
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_
Ptr< PolyhedralProjection< Real > > proj_
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.
const Ptr< Secant< Real > > secant_
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 .
Ptr< TypeE::Algorithm< Real > > AlgorithmFactory(ParameterList &parlist, const Ptr< Secant< Real > > &secant=nullPtr)
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.