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 HS_PROBLEM_011_HPP 45 #define HS_PROBLEM_011_HPP 46 47 #include "ROL_NonlinearProgram.hpp" 48 49 namespace HS { 50 51 namespace HS_011 { 52 template<class Real> 53 class Obj { 54 public: 55 template<class ScalarT> value(const std::vector<ScalarT> & x,Real & tol)56 ScalarT value( const std::vector<ScalarT> &x, Real &tol ) { 57 ScalarT a = x[0]-5.0; 58 return a*a+x[1]*x[1]-25.0; 59 } 60 }; 61 62 template<class Real> 63 class InCon { 64 public: 65 template<class ScalarT> value(std::vector<ScalarT> & c,const std::vector<ScalarT> & x,Real & tol)66 void value( std::vector<ScalarT> &c, 67 const std::vector<ScalarT> &x, 68 Real &tol ) { 69 c[0] = -x[0]*x[0]+x[1]; 70 } 71 }; 72 } 73 74 75 76 template<class Real> 77 class Problem_011 : public ROL::NonlinearProgram<Real> { 78 79 80 81 typedef ROL::Vector<Real> V; 82 typedef ROL::Objective<Real> OBJ; 83 typedef ROL::Constraint<Real> CON; 84 typedef ROL::NonlinearProgram<Real> NP; 85 86 87 public: 88 Problem_011()89 Problem_011() : NP( dimension_x() ) { 90 NP::noBound(); 91 } 92 dimension_x()93 int dimension_x() { return 2; } dimension_ci()94 int dimension_ci() { return 1; } 95 getObjective()96 const ROL::Ptr<OBJ> getObjective() { 97 return ROL::makePtr<ROL::Sacado_StdObjective<Real,HS_011::Obj>>(); 98 } 99 getInequalityConstraint()100 const ROL::Ptr<CON> getInequalityConstraint() { 101 return ROL::makePtr<ROL::Sacado_StdConstraint<Real,HS_011::InCon>>(); 102 } 103 getInitialGuess()104 const ROL::Ptr<const V> getInitialGuess() { 105 Real x[] = {4.9,0.1}; 106 return NP::createOptVector(x); 107 }; 108 initialGuessIsFeasible()109 bool initialGuessIsFeasible() { return false; } 110 getInitialObjectiveValue()111 Real getInitialObjectiveValue() { 112 return Real(-24.98); 113 } 114 getSolutionObjectiveValue()115 Real getSolutionObjectiveValue() { 116 return Real(-8.498464223); 117 } 118 getSolutionSet()119 ROL::Ptr<const V> getSolutionSet() { 120 Real a = 7.5*std::sqrt(6) + std::sqrt(338.5); 121 Real x[] = {(a-1/a)/std::sqrt(6), 122 (a*a-2+1/(a*a))/6.0}; 123 return ROL::CreatePartitionedVector(NP::createOptVector(x)); 124 } 125 126 }; 127 128 } // namespace HS 129 130 #endif // HS_PROBLEM_011_HPP 131