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_029_HPP 45 #define HS_PROBLEM_029_HPP 46 47 #include "ROL_NonlinearProgram.hpp" 48 49 namespace HS { 50 51 namespace HS_029 { 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 return -x[0]*x[1]*x[2]; 58 } 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] -2*x[1]*x[1] -4*x[2]*x[2] + 48; 70 } 71 }; 72 } 73 74 75 template<class Real> 76 class Problem_029 : public ROL::NonlinearProgram<Real> { 77 78 79 80 typedef ROL::NonlinearProgram<Real> NP; 81 typedef ROL::Vector<Real> V; 82 typedef ROL::Objective<Real> OBJ; 83 typedef ROL::Constraint<Real> CON; 84 85 public: 86 Problem_029()87 Problem_029() : NP( dimension_x() ) { 88 NP::noBound(); 89 } 90 dimension_x()91 int dimension_x() { return 3; } dimension_ci()92 int dimension_ci() { return 1; } 93 getObjective()94 const ROL::Ptr<OBJ> getObjective() { 95 return ROL::makePtr<ROL::Sacado_StdObjective<Real,HS_029::Obj>>(); 96 } 97 getInequalityConstraint()98 const ROL::Ptr<CON> getInequalityConstraint() { 99 return ROL::makePtr<ROL::Sacado_StdConstraint<Real,HS_029::InCon>>(); 100 } 101 getInitialGuess()102 const ROL::Ptr<const V> getInitialGuess() { 103 Real x[] = {1.0,1.0,1.0}; 104 return NP::createOptVector(x); 105 }; 106 initialGuessIsFeasible()107 bool initialGuessIsFeasible() { return true; } 108 getInitialObjectiveValue()109 Real getInitialObjectiveValue() { 110 return Real(-1.0); 111 } 112 getSolutionObjectiveValue()113 Real getSolutionObjectiveValue() { 114 return Real(-16*std::sqrt(2)); 115 } 116 getSolutionSet()117 ROL::Ptr<const V> getSolutionSet() { 118 Real a = 4; Real b = 2*std::sqrt(2); Real c = 2; 119 120 Real x1[] = { a, b, c}; 121 Real x2[] = { a,-b,-c}; 122 Real x3[] = {-a, b,-c}; 123 Real x4[] = {-a,-b, c}; 124 125 return ROL::CreatePartitionedVector(NP::createOptVector(x1), 126 NP::createOptVector(x2), 127 NP::createOptVector(x3), 128 NP::createOptVector(x4)); 129 } 130 131 }; 132 133 } // namespace HS 134 135 #endif // HS_PROBLEM_029_HPP 136