ROL
ROL_OptimizationSolver.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ************************************************************************
3 //
4 // Rapid Optimization Library (ROL) Package
5 // Copyright (2014) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact lead developers:
38 // Drew Kouri (dpkouri@sandia.gov) and
39 // Denis Ridzal (dridzal@sandia.gov)
40 //
41 // ************************************************************************
42 // @HEADER
43 
44 #ifndef ROL_OPTIMIZATIONSOLVER_HPP
45 #define ROL_OPTIMIZATIONSOLVER_HPP
46 
47 #include "ROL_Algorithm.hpp"
48 #include "ROL_StepFactory.hpp"
52 
53 #include "ROL_Stream.hpp"
54 
60 namespace ROL {
61 
62 template<class Real>
64 private:
65 
66  ROL::Ptr<Algorithm<Real> > algo_;
67  ROL::Ptr<Step<Real> > step_;
68  ROL::Ptr<StatusTest<Real> > status0_;
69  ROL::Ptr<CombinedStatusTest<Real> > status_;
70  ROL::Ptr<AlgorithmState<Real> > state_;
71 
72  ROL::Ptr<Vector<Real> > x_;
73  ROL::Ptr<Vector<Real> > g_;
74  ROL::Ptr<Vector<Real> > l_;
75  ROL::Ptr<Vector<Real> > c_;
76 
77  ROL::Ptr<Objective<Real> > obj_;
78  ROL::Ptr<BoundConstraint<Real> > bnd_;
79  ROL::Ptr<Constraint<Real> > con_;
80 
81  std::vector<std::string> output_;
82 
85  std::string stepname_;
86 
87  Real pen_;
88 
89 public:
90 
99  ROL::ParameterList &parlist ) {
100 
101  // Get optimization problem type: U, E, B, EB
103 
104  // Initialize AlgorithmState
105  state_ = ROL::makePtr<AlgorithmState<Real>>();
106 
107  // Get step name from parameterlist
108  stepname_ = parlist.sublist("Step").get("Type","Last Type (Dummy)");
110 
111  // Set default algorithm if provided step is incompatible with problem type
113  switch ( problemType_ ) {
114  case TYPE_U:
115  stepType_ = STEP_TRUSTREGION; break;
116  case TYPE_B:
117  stepType_ = STEP_TRUSTREGION; break;
118  case TYPE_E:
119  stepType_ = STEP_COMPOSITESTEP; break;
120  case TYPE_EB:
122  case TYPE_LAST:
123  default:
124  throw Exception::NotImplemented(">>> ROL::OptimizationSolver: Unknown problem type!");
125  }
126  }
128 
129  // Build status test
130  StatusTestFactory<Real> statusTestFactory;
131  status0_ = statusTestFactory.getStatusTest(stepname_,parlist);
132  status_ = ROL::makePtr<CombinedStatusTest<Real>>();
133 
134  // Get optimization vector and a vector for the gradient
135  x_ = opt.getSolutionVector();
136  g_ = x_->dual().clone();
137 
138  // Initialize Step
140  step_ = stepFactory.getStep(stepname_,parlist);
141 
142  // If there is an equality constraint, get the multiplier and create a constraint vector
143  if( problemType_ == TYPE_E || problemType_ == TYPE_EB ) {
144  l_ = opt.getMultiplierVector();
145  c_ = l_->dual().clone();
146  }
147 
148  // Create modified objectives if needed
149  const Real one(1), ten(10);
151  ROL::Ptr<Objective<Real> > raw_obj = opt.getObjective();
152  con_ = opt.getConstraint();
153  // TODO: Provide access to change initial penalty
154  obj_ = ROL::makePtr<AugmentedLagrangian<Real>>(raw_obj,con_,*l_,1.0,*x_,*c_,parlist);
155  bnd_ = opt.getBoundConstraint();
156  pen_ = parlist.sublist("Step").sublist("Augmented Lagrangian").get("Initial Penalty Parameter",ten);
157  }
158  else if( stepType_ == STEP_MOREAUYOSIDAPENALTY ) {
159  ROL::Ptr<Objective<Real> > raw_obj = opt.getObjective();
160  bnd_ = opt.getBoundConstraint();
161  con_ = opt.getConstraint();
162  // TODO: Provide access to change initial penalty
163  obj_ = ROL::makePtr<MoreauYosidaPenalty<Real>>(raw_obj,bnd_,*x_,parlist);
164  pen_ = parlist.sublist("Step").sublist("Moreau-Yosida Penalty").get("Initial Penalty Parameter",ten);
165  }
166  else if( stepType_ == STEP_INTERIORPOINT ) {
167  ROL::Ptr<Objective<Real> > raw_obj = opt.getObjective();
168  bnd_ = opt.getBoundConstraint();
169  con_ = opt.getConstraint();
170  // TODO: Provide access to change initial penalty
171  obj_ = ROL::makePtr<InteriorPoint::PenalizedObjective<Real>>(raw_obj,bnd_,*x_,parlist);
172  pen_ = parlist.sublist("Step").sublist("Interior Point").get("Initial Barrier Parameter",ten);
173  }
174  else if( stepType_ == STEP_FLETCHER ) {
175  ROL::Ptr<Objective<Real> > raw_obj = opt.getObjective();
176  bnd_ = opt.getBoundConstraint();
177  con_ = opt.getConstraint();
178  if( bnd_->isActivated() ) {
179  obj_ = ROL::makePtr<BoundFletcher<Real> >(raw_obj,con_,bnd_,*x_,*c_,parlist);
180  }
181  else {
182  obj_ = ROL::makePtr<Fletcher<Real> >(raw_obj,con_,*x_,*c_,parlist);
183  }
184  pen_ = parlist.sublist("Step").sublist("Fletcher").get("Penalty Parameter",one);
185  }
186  else {
187  obj_ = opt.getObjective();
188  bnd_ = opt.getBoundConstraint();
189  con_ = opt.getConstraint();
190  if( stepType_ == STEP_TRUSTREGION ) {
191  pen_ = parlist.sublist("Step").sublist("Trust Region").get("Initial Radius",ten);
192  }
193  else if( stepType_ == STEP_BUNDLE ) {
194  pen_ = parlist.sublist("Step").sublist("Bundle").get("Initial Trust-Region Parameter",ten);
195  }
196  }
197  }
198 
203  std::vector<std::string> getOutput(void) const {
204  return output_;
205  }
206 
214  int solve(const ROL::Ptr<StatusTest<Real> > &status = ROL::nullPtr,
215  const bool combineStatus = true) {
216  ROL::nullstream bhs;
217  return solve(bhs,status,combineStatus);
218  }
219 
228  int solve( std::ostream &outStream,
229  const ROL::Ptr<StatusTest<Real> > &status = ROL::nullPtr,
230  const bool combineStatus = true ) {
231  // Build algorithm
232  status_->reset(); // Clear previous status test
233  status_->add(status0_); // Default StatusTest
234  if (status != ROL::nullPtr) {
235  if (!combineStatus) { // Use only user-defined StatusTest
236  status_->reset();
237  }
238  status_->add(status); // Add user-defined StatusTest
239  }
240  algo_ = ROL::makePtr<Algorithm<Real>>( step_, status_, state_ );
241 
242  switch(problemType_) {
243  case TYPE_U:
244  output_ = algo_->run(*x_,*g_,*obj_,true,outStream);
245  break;
246  case TYPE_B:
247  output_ = algo_->run(*x_,*g_,*obj_,*bnd_,true,outStream);
248  break;
249  case TYPE_E:
250  output_ = algo_->run(*x_,*g_,*l_,*c_,*obj_,*con_,true,outStream);
251  break;
252  case TYPE_EB:
253  output_ = algo_->run(*x_,*g_,*l_,*c_,*obj_,*con_,*bnd_,true,outStream);
254  break;
255  case TYPE_LAST:
256  ROL_TEST_FOR_EXCEPTION(true,std::invalid_argument,
257  "Error in OptimizationSolver::solve() : Unsupported problem type");
258  break;
259  }
260 
261  // TODO: Interrogate AlgorithmState and StatusTest to generate a return code
262  // that indicates why the solver has stopped
263 
264  // Return an integer code
265  return 0;
266  }
267 
272  ROL::Ptr<const AlgorithmState<Real> > getAlgorithmState(void) const {
273  return state_;
274  }
275 
282  void resetAlgorithmState(void) {
283  state_ = ROL::makePtr<AlgorithmState<Real>>();
284  }
285 
297  void reset(const bool resetAlgo = true) {
298  // Reset AlgorithmState
299  if (resetAlgo) {
301  }
302  // Reset StepState
303  step_->reset(pen_);
304  // Reset penalty objectives
306  ROL::dynamicPtrCast<AugmentedLagrangian<Real> >(obj_)->reset(*l_,pen_);
307  }
308  else if( stepType_ == STEP_MOREAUYOSIDAPENALTY ) {
309  ROL::dynamicPtrCast<MoreauYosidaPenalty<Real> >(obj_)->reset(pen_);
310  }
311  else if( stepType_ == STEP_INTERIORPOINT ) {
312  ROL::dynamicPtrCast<InteriorPoint::PenalizedObjective<Real> >(obj_)->updatePenalty(pen_);
313  }
314  }
315 
324  std::string getStepName(void) const {
325  return stepname_;
326  }
327 
328 }; // class OptimizationSolver
329 
330 
331 template<typename Real>
332 inline Ptr<OptimizationSolver<Real>>
334  ParameterList& parlist ) {
335  return makePtr<OptimizationSolver<Real>>(opt,parlist);
336 }
337 
338 template<typename Real>
339 inline Ptr<OptimizationSolver<Real>>
341  ParameterList& parlist ) {
342  return makePtr<OptimizationSolver<Real>>(*opt,parlist);
343 }
344 
345 template<typename Real>
346 inline Ptr<OptimizationSolver<Real>>
348  const Ptr<ParameterList>& parlist ) {
349  return makePtr<OptimizationSolver<Real>>(opt,*parlist);
350 }
351 
352 template<typename Real>
353 inline Ptr<OptimizationSolver<Real>>
355  const Ptr<ParameterList>& parlist ) {
356  return makePtr<OptimizationSolver<Real>>(*opt,*parlist);
357 }
358 
359 } // namespace ROL
360 
361 #endif // ROL_OPTIMIZATIONSOLVER_HPP
362 
363 
ROL::make_OptimizationSolver
Ptr< OptimizationSolver< Real > > make_OptimizationSolver(OptimizationProblem< Real > &opt, ParameterList &parlist)
Definition: ROL_OptimizationSolver.hpp:333
ROL::STEP_AUGMENTEDLAGRANGIAN
@ STEP_AUGMENTEDLAGRANGIAN
Definition: ROL_Types.hpp:275
ROL_StepFactory.hpp
ROL::STEP_FLETCHER
@ STEP_FLETCHER
Definition: ROL_Types.hpp:283
ROL::OptimizationProblem::getProblemType
EProblem getProblemType(void)
Definition: ROL_OptimizationProblem.hpp:540
ROL::StatusTestFactory
Definition: ROL_StatusTestFactory.hpp:59
ROL_OptimizationProblem.hpp
ROL::OptimizationSolver::resetAlgorithmState
void resetAlgorithmState(void)
Reset the AlgorithmState.
Definition: ROL_OptimizationSolver.hpp:282
ROL::STEP_MOREAUYOSIDAPENALTY
@ STEP_MOREAUYOSIDAPENALTY
Definition: ROL_Types.hpp:279
ROL::OptimizationSolver::l_
ROL::Ptr< Vector< Real > > l_
Definition: ROL_OptimizationSolver.hpp:74
ROL::OptimizationSolver::getStepName
std::string getStepName(void) const
Grab step name (after check for consistency).
Definition: ROL_OptimizationSolver.hpp:324
ROL::OptimizationSolver
Provides a simplified interface for solving a wide range of optimization problems.
Definition: ROL_OptimizationSolver.hpp:63
ROL::OptimizationSolver::getAlgorithmState
ROL::Ptr< const AlgorithmState< Real > > getAlgorithmState(void) const
Return the AlgorithmState.
Definition: ROL_OptimizationSolver.hpp:272
ROL::OptimizationSolver::reset
void reset(const bool resetAlgo=true)
Reset both Algorithm and Step.
Definition: ROL_OptimizationSolver.hpp:297
ROL::stepFactory
void stepFactory(ROL::ParameterList &parlist, ROL::Ptr< ROL::Step< Real > > &step)
A minimalist step factory which specializes the Step Type depending on whether a Trust-Region or Line...
Definition: json/example_01.hpp:207
ROL::OptimizationSolver::c_
ROL::Ptr< Vector< Real > > c_
Definition: ROL_OptimizationSolver.hpp:75
ROL::OptimizationSolver::solve
int solve(const ROL::Ptr< StatusTest< Real > > &status=ROL::nullPtr, const bool combineStatus=true)
Solve optimization problem with no iteration output.
Definition: ROL_OptimizationSolver.hpp:214
ROL::TYPE_LAST
@ TYPE_LAST
Definition: ROL_Types.hpp:260
ROL::OptimizationSolver::con_
ROL::Ptr< Constraint< Real > > con_
Definition: ROL_OptimizationSolver.hpp:79
ROL::EStepToString
std::string EStepToString(EStep tr)
Definition: ROL_Types.hpp:287
ROL::TYPE_EB
@ TYPE_EB
Definition: ROL_Types.hpp:259
ROL::OptimizationSolver::obj_
ROL::Ptr< Objective< Real > > obj_
Definition: ROL_OptimizationSolver.hpp:77
ROL::details::nullstream
basic_nullstream< char, char_traits< char > > nullstream
Definition: ROL_Stream.hpp:72
ROL::OptimizationProblem::getMultiplierVector
virtual Ptr< Vector< Real > > getMultiplierVector(void)
Definition: ROL_OptimizationProblem.hpp:533
ROL::TYPE_B
@ TYPE_B
Definition: ROL_Types.hpp:257
ROL::STEP_BUNDLE
@ STEP_BUNDLE
Definition: ROL_Types.hpp:276
ROL::OptimizationSolver::output_
std::vector< std::string > output_
Definition: ROL_OptimizationSolver.hpp:81
ROL::StepFactory
Definition: ROL_StepFactory.hpp:66
ROL::StatusTestFactory::getStatusTest
ROL::Ptr< StatusTest< Real > > getStatusTest(const std::string step, ROL::ParameterList &parlist)
Definition: ROL_StatusTestFactory.hpp:63
ROL::OptimizationProblem::getConstraint
virtual Ptr< Constraint< Real > > getConstraint(void)
Definition: ROL_OptimizationProblem.hpp:526
ROL::OptimizationProblem::getObjective
virtual Ptr< Objective< Real > > getObjective(void)
Definition: ROL_OptimizationProblem.hpp:499
ROL::OptimizationSolver::solve
int solve(std::ostream &outStream, const ROL::Ptr< StatusTest< Real > > &status=ROL::nullPtr, const bool combineStatus=true)
Solve optimization problem.
Definition: ROL_OptimizationSolver.hpp:228
ROL::OptimizationSolver::problemType_
EProblem problemType_
Definition: ROL_OptimizationSolver.hpp:83
ROL::OptimizationSolver::OptimizationSolver
OptimizationSolver(OptimizationProblem< Real > &opt, ROL::ParameterList &parlist)
Constructor.
Definition: ROL_OptimizationSolver.hpp:98
ROL::OptimizationSolver::status_
ROL::Ptr< CombinedStatusTest< Real > > status_
Definition: ROL_OptimizationSolver.hpp:69
ROL::OptimizationSolver::state_
ROL::Ptr< AlgorithmState< Real > > state_
Definition: ROL_OptimizationSolver.hpp:70
ROL::OptimizationSolver::stepType_
EStep stepType_
Definition: ROL_OptimizationSolver.hpp:84
ROL::OptimizationSolver::step_
ROL::Ptr< Step< Real > > step_
Definition: ROL_OptimizationSolver.hpp:67
ROL_Algorithm.hpp
ROL::OptimizationSolver::bnd_
ROL::Ptr< BoundConstraint< Real > > bnd_
Definition: ROL_OptimizationSolver.hpp:78
ROL::STEP_TRUSTREGION
@ STEP_TRUSTREGION
Definition: ROL_Types.hpp:281
ROL::TYPE_E
@ TYPE_E
Definition: ROL_Types.hpp:258
ROL
Definition: ROL_ElementwiseVector.hpp:61
ROL::OptimizationSolver::pen_
Real pen_
Definition: ROL_OptimizationSolver.hpp:87
ROL_CombinedStatusTest.hpp
ROL::OptimizationProblem::getSolutionVector
virtual Ptr< Vector< Real > > getSolutionVector(void)
Definition: ROL_OptimizationProblem.hpp:509
ROL::StringToEStep
EStep StringToEStep(std::string s)
Definition: ROL_Types.hpp:389
ROL::OptimizationSolver::g_
ROL::Ptr< Vector< Real > > g_
Definition: ROL_OptimizationSolver.hpp:73
ROL::TYPE_U
@ TYPE_U
Definition: ROL_Types.hpp:256
ROL::STEP_INTERIORPOINT
@ STEP_INTERIORPOINT
Definition: ROL_Types.hpp:282
ROL::OptimizationSolver::algo_
ROL::Ptr< Algorithm< Real > > algo_
Definition: ROL_OptimizationSolver.hpp:66
ROL::Exception::NotImplemented
Definition: ROL_Types.hpp:912
ROL::OptimizationProblem::getBoundConstraint
virtual Ptr< BoundConstraint< Real > > getBoundConstraint(void)
Definition: ROL_OptimizationProblem.hpp:519
ROL::STEP_COMPOSITESTEP
@ STEP_COMPOSITESTEP
Definition: ROL_Types.hpp:277
ROL::EProblem
EProblem
Definition: ROL_Types.hpp:255
ROL::EStep
EStep
Enumeration of step types.
Definition: ROL_Types.hpp:274
ROL::OptimizationSolver::getOutput
std::vector< std::string > getOutput(void) const
Returns iteration history as a vector of strings.
Definition: ROL_OptimizationSolver.hpp:203
ROL::OptimizationProblem
Definition: ROL_OptimizationProblem.hpp:88
ROL::OptimizationSolver::stepname_
std::string stepname_
Definition: ROL_OptimizationSolver.hpp:85
ROL::StatusTest
Provides an interface to check status of optimization algorithms.
Definition: ROL_StatusTest.hpp:58
ROL::isCompatibleStep
bool isCompatibleStep(EProblem p, EStep s)
Definition: ROL_Types.hpp:305
ROL_StatusTestFactory.hpp
ROL::OptimizationSolver::x_
ROL::Ptr< Vector< Real > > x_
Definition: ROL_OptimizationSolver.hpp:72
ROL_Stream.hpp
Defines a no-output stream class ROL::NullStream and a function makeStreamPtr which either wraps a re...
ROL::OptimizationSolver::status0_
ROL::Ptr< StatusTest< Real > > status0_
Definition: ROL_OptimizationSolver.hpp:68