10#ifndef ROL_TYPE_ALGORITHM_DEF_H
11#define ROL_TYPE_ALGORITHM_DEF_H
21template<
typename Real>
23 : status_(makePtr<CombinedStatusTest<Real>>()),
26 status_->add(makePtr<ConstraintStatusTest<Real>>());
29template<
typename Real>
30void Algorithm<Real>::initialize(
const Vector<Real> &x,
31 const Vector<Real> &g,
32 const Vector<Real> &mul,
33 const Vector<Real> &c) {
34 if (state_->iterateVec == nullPtr) {
35 state_->iterateVec = x.clone();
37 state_->iterateVec->set(x);
38 if (state_->lagmultVec == nullPtr) {
39 state_->lagmultVec = mul.clone();
41 state_->lagmultVec->set(mul);
42 if (state_->stepVec == nullPtr) {
43 state_->stepVec = x.clone();
45 state_->stepVec->zero();
46 if (state_->gradientVec == nullPtr) {
47 state_->gradientVec = g.clone();
49 state_->gradientVec->set(g);
50 if (state_->constraintVec == nullPtr) {
51 state_->constraintVec = c.clone();
53 state_->constraintVec->zero();
54 if (state_->minIterVec == nullPtr) {
55 state_->minIterVec = x.clone();
57 state_->minIterVec->set(x);
58 state_->minIter = state_->iter;
59 state_->minValue = state_->value;
62template<
typename Real>
63void Algorithm<Real>::setStatusTest(
const Ptr<StatusTest<Real>> &status,
64 const bool combineStatus) {
71template<
typename Real>
72void Algorithm<Real>::run( Problem<Real> &problem,
73 std::ostream &outStream ) {
74 if (problem.getProblemType() == TYPE_E) {
75 run(*problem.getPrimalOptimizationVector(),
76 *problem.getDualOptimizationVector(),
77 *problem.getObjective(),
78 *problem.getConstraint(),
79 *problem.getMultiplierVector(),
80 *problem.getResidualVector(),
82 problem.finalizeIteration();
85 throw Exception::NotImplemented(
">>> ROL::Algorithm::run : Optimization problem is not Type E!");
89template<
typename Real>
90void Algorithm<Real>::run( Vector<Real> &x,
92 Constraint<Real> &econ,
94 std::ostream &outStream ) {
95 Problem<Real> problem(makePtrFromRef(obj), makePtrFromRef(x));
96 problem.addConstraint(
"NEC",makePtrFromRef(econ),makePtrFromRef(emul));
97 problem.finalize(
false,
false,outStream);
98 run(problem,outStream);
102template<
typename Real>
103void Algorithm<Real>::run( Vector<Real> &x,
104 Objective<Real> &obj,
105 Constraint<Real> &econ,
107 Constraint<Real> &linear_econ,
108 Vector<Real> &linear_emul,
109 std::ostream &outStream ) {
110 Problem<Real> problem(makePtrFromRef(obj), makePtrFromRef(x));
111 problem.addConstraint(
"NEC",makePtrFromRef(econ),makePtrFromRef(emul));
112 problem.addLinearConstraint(
"LEC",makePtrFromRef(linear_econ),makePtrFromRef(linear_emul));
113 problem.finalize(
false,
false,outStream);
114 run(problem,outStream);
118template<
typename Real>
119void Algorithm<Real>::run( Vector<Real> &x,
120 const Vector<Real> &g,
121 Objective<Real> &obj,
122 Constraint<Real> &econ,
124 const Vector<Real> &eres,
125 Constraint<Real> &linear_econ,
126 Vector<Real> &linear_emul,
127 const Vector<Real> &linear_eres,
128 std::ostream &outStream ) {
129 Ptr<Vector<Real>> gp = g.clone(), erp = eres.clone(), lerp = linear_eres.clone();
130 Problem<Real> problem(makePtrFromRef(obj), makePtrFromRef(x), gp);
131 problem.addConstraint(
"NEC",makePtrFromRef(econ),makePtrFromRef(emul),erp,
false);
132 problem.addLinearConstraint(
"LEC",makePtrFromRef(linear_econ),makePtrFromRef(linear_emul),lerp,
false);
133 problem.finalize(
false,
false,outStream);
134 run(problem,outStream);
145template<
typename Real>
146void Algorithm<Real>::writeHeader( std::ostream& os )
const {
147 std::ios_base::fmtflags osFlags(os.flags());
149 os << std::setw(6) << std::left <<
"iter";
150 os << std::setw(15) << std::left <<
"value";
151 os << std::setw(15) << std::left <<
"cnorm";
152 os << std::setw(15) << std::left <<
"gLnorm";
153 os << std::setw(15) << std::left <<
"snorm";
154 os << std::setw(10) << std::left <<
"#fval";
155 os << std::setw(10) << std::left <<
"#grad";
160template<
typename Real>
161void Algorithm<Real>::writeName( std::ostream& os )
const {
162 throw Exception::NotImplemented(
">>> ROL::TypeE::Algorithm::writeName() is not implemented!");
165template<
typename Real>
166void Algorithm<Real>::writeOutput( std::ostream& os,
bool write_header )
const {
167 std::ios_base::fmtflags osFlags(os.flags());
168 os << std::scientific << std::setprecision(6);
169 if ( write_header ) writeHeader(os);
170 if ( state_->iter == 0 ) {
172 os << std::setw(6) << std::left << state_->iter;
173 os << std::setw(15) << std::left << state_->value;
174 os << std::setw(15) << std::left << state_->cnorm;
175 os << std::setw(15) << std::left << state_->gnorm;
180 os << std::setw(6) << std::left << state_->iter;
181 os << std::setw(15) << std::left << state_->value;
182 os << std::setw(15) << std::left << state_->cnorm;
183 os << std::setw(15) << std::left << state_->gnorm;
184 os << std::setw(15) << std::left << state_->snorm;
185 os << std::setw(10) << std::left << state_->nfval;
186 os << std::setw(10) << std::left << state_->ngrad;
192template<
typename Real>
193void Algorithm<Real>::writeExitStatus( std::ostream& os )
const {
194 std::ios_base::fmtflags osFlags(os.flags());
195 os <<
"Optimization Terminated with Status: ";
201template<
typename Real>
202Ptr<const AlgorithmState<Real>> Algorithm<Real>::getState()
const {
207template<
typename Real>
208void Algorithm<Real>::reset() {
Contains definitions of custom data types in ROL.
Algorithm()
Constructor, given a step and a status test.
std::string EExitStatusToString(EExitStatus tr)