ROL
ROL_HS25.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Rapid Optimization Library (ROL) Package
4//
5// Copyright 2014 NTESS and the ROL contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
14
15#ifndef USE_HESSVEC
16#define USE_HESSVEC 1
17#endif
18
19#ifndef ROL_HS25_HPP
20#define ROL_HS25_HPP
21
23#include "ROL_TestProblem.hpp"
24#include "ROL_Bounds.hpp"
25#include "ROL_Types.hpp"
26
27namespace ROL {
28namespace ZOO {
29
32template<class Real>
33class Objective_HS25 : public Objective<Real> {
34
35typedef typename std::vector<Real>::size_type uint;
36
37private:
38 std::vector<Real> u_vec_;
40
41public:
43 u_size_ = 99;
44 for ( uint i = 0; i < u_size_; i++ ) {
45 u_vec_.push_back(static_cast<Real>(25)
46 + std::pow((static_cast<Real>(-50)
47 *std::log(static_cast<Real>(0.01)*static_cast<Real>(i+1))),
48 static_cast<Real>(2)/static_cast<Real>(3)));
49 }
50 }
51
52 Real value( const Vector<Real> &x, Real &tol ) {
53 Ptr<const std::vector<Real> > ex
54 = dynamic_cast<const PrimalScaledStdVector<Real>&>(x).getVector();
55
56 Real val(0), f(0), u(0);
57 Real x1 = (*ex)[0], x2 = (*ex)[1], x3 = (*ex)[2];
58 for ( uint i = 0; i < u_size_; i++ ) {
59 u = u_vec_[i];
60 f = -static_cast<Real>(0.01)*static_cast<Real>(i+1)
61 + std::exp(-std::pow(u-x2,x3)/x1);
62 val += f*f;
63 }
64 return val;
65 }
66
67 void gradient( Vector<Real> &g, const Vector<Real> &x, Real &tol ) {
68 Ptr<std::vector<Real> > eg
69 = dynamic_cast<DualScaledStdVector<Real>&>(g).getVector();
70 Ptr<const std::vector<Real> > ex
71 = dynamic_cast<const PrimalScaledStdVector<Real>&>(x).getVector();
72 g.zero();
73
74 Real f(0), df1(0), df2(0), df3(0);
75 Real u(0), tmp(0), tmp0(0), tmp1(0);
76 Real x1 = (*ex)[0], x2 = (*ex)[1], x3 = (*ex)[2];
77 Real x1sqr = x1*x1;
78 for ( uint i = 0; i < u_size_; i++ ) {
79 u = u_vec_[i];
80 tmp0 = std::pow(u-x2,x3);
81 tmp1 = std::pow(u-x2,x3-static_cast<Real>(1));
82 tmp = std::exp(-tmp0/x1);
83
84 f = -static_cast<Real>(0.01)*static_cast<Real>(i+1) + tmp;
85
86 df1 = tmp*tmp0/x1sqr;
87 df2 = tmp*x3*tmp1/x1;
88 df3 = tmp*tmp0*std::log(u-x2)/x1;
89
90 (*eg)[0] += static_cast<Real>(2)*f*df1;
91 (*eg)[1] += static_cast<Real>(2)*f*df2;
92 (*eg)[2] += static_cast<Real>(2)*f*df3;
93 }
94 }
95#if USE_HESSVEC
96 void hessVec( Vector<Real> &hv, const Vector<Real> &v, const Vector<Real> &x, Real &tol ) {
97 Ptr<std::vector<Real> > ehv
98 = dynamic_cast<DualScaledStdVector<Real>&>(hv).getVector();
99 Ptr<const std::vector<Real> > ev
100 = dynamic_cast<const PrimalScaledStdVector<Real>&>(v).getVector();
101 Ptr<const std::vector<Real> > ex
102 = dynamic_cast<const PrimalScaledStdVector<Real>&>(x).getVector();
103 hv.zero();
104
105 Real f(0);
106 Real df1(0), df2(0), df3(0);
107 Real df11(0), df12(0), df13(0);
108 Real df21(0), df22(0), df23(0);
109 Real df31(0), df32(0), df33(0);
110 Real u(0), tmp(0), tmp0(0), tmp1(0), tmp2(0), tmp3(0), tmp4(0);
111 Real x1 = (*ex)[0], x2 = (*ex)[1], x3 = (*ex)[2];
112 Real v1 = (*ev)[0], v2 = (*ev)[1], v3 = (*ev)[2];
113 Real x1sqr = x1*x1, x1cub = x1sqr*x1, x1quar = x1cub*x1;
114 for ( uint i = 0; i < u_size_; i++ ) {
115 u = u_vec_[i];
116 tmp0 = std::pow(u-x2,x3);
117 tmp1 = std::pow(u-x2,x3-static_cast<Real>(1));
118 tmp2 = std::pow(u-x2,static_cast<Real>(2)*(x3-static_cast<Real>(1)));
119 tmp3 = std::pow(u-x2,x3-static_cast<Real>(2));
120 tmp4 = std::pow(u-x2,static_cast<Real>(2)*x3-static_cast<Real>(1));
121 tmp = std::exp(-tmp0/x1);
122
123 f = -static_cast<Real>(0.01)*static_cast<Real>(i+1) + tmp;
124
125 df1 = tmp*tmp0/x1sqr;
126 df2 = tmp*x3*tmp1/x1;
127 df3 = tmp*tmp0*std::log(u-x2)/x1;
128
129 df11 = tmp0*tmp*(tmp0-static_cast<Real>(2)*x1)/x1quar;
130 df12 = x3*tmp1*tmp*(tmp0-x1)/x1cub;
131 df13 = tmp0*std::log(u-x2)*tmp*(x1-tmp0)/x1cub;
132
133 df21 = df12;
134 df22 = x3*x3*tmp2*tmp/(x1*x1)
135 -(x3-static_cast<Real>(1))*x3*tmp3*tmp/x1;
136 df23 = -x3*tmp4*std::log(u-x2)*tmp/x1sqr
137 +tmp1*tmp/x1 + x3*tmp1*std::log(u-x2)*tmp/x1;
138
139 df31 = df13;
140 df32 = df23;
141 df33 = tmp0*std::pow(std::log(u-x2),2)*tmp*(tmp0-x1)/x1sqr;
142
143 (*ehv)[0] += static_cast<Real>(2)*(f*(df11*v1 + df12*v2 + df13*v3)
144 + df1*(df1*v1 + df2*v2 + df3*v3));
145 (*ehv)[1] += static_cast<Real>(2)*(f*(df21*v1 + df22*v2 + df23*v3)
146 + df2*(df1*v1 + df2*v2 + df3*v3));
147 (*ehv)[2] += static_cast<Real>(2)*(f*(df31*v1 + df32*v2 + df33*v3)
148 + df3*(df1*v1 + df2*v2 + df3*v3));
149 }
150 }
151#endif
152};
153
154template<class Real>
155class getHS25 : public TestProblem<Real> {
156private:
157 int n_;
158 Ptr<std::vector<Real> > scale_;
159
160public:
161 getHS25(void) {
162 // Problem dimension
163 n_ = 3;
164 // Set up vector scaling
165 scale_ = makePtr<std::vector<Real>>(n_,0);
166 (*scale_)[0] = static_cast<Real>(1.e-4);
167 (*scale_)[1] = static_cast<Real>(1.e-3);
168 (*scale_)[2] = static_cast<Real>(0.5);
169 }
170
171 Ptr<Objective<Real>> getObjective(void) const {
172 // Instantiate Objective Function
173 return makePtr<Objective_HS25<Real>>();
174 }
175
176 Ptr<Vector<Real>> getInitialGuess(void) const {
177 // Get Initial Guess
178 Ptr<std::vector<Real> > x0p = makePtr<std::vector<Real>>(n_,0);
179 (*x0p)[0] = static_cast<Real>(100);
180 (*x0p)[1] = static_cast<Real>(12.5);
181 (*x0p)[2] = static_cast<Real>(3);
182 return makePtr<PrimalScaledStdVector<Real>>(x0p,scale_);
183 }
184
185 Ptr<Vector<Real>> getSolution(const int i = 0) const {
186 // Get Solution
187 Ptr<std::vector<Real> > xp = makePtr<std::vector<Real>>(n_,0);
188 (*xp)[0] = static_cast<Real>(50);
189 (*xp)[1] = static_cast<Real>(25);
190 (*xp)[2] = static_cast<Real>(1.5);
191 return makePtr<PrimalScaledStdVector<Real>>(xp,scale_);
192 }
193
194 Ptr<BoundConstraint<Real>> getBoundConstraint(void) const {
195 // Instantiate BoundConstraint
196 Ptr<std::vector<Real> > lp = makePtr<std::vector<Real>>(n_,0);
197 (*lp)[0] = static_cast<Real>(0.1);
198 (*lp)[1] = static_cast<Real>(0);
199 (*lp)[2] = static_cast<Real>(0);
200 Ptr<Vector<Real> > l = makePtr<StdVector<Real>>(lp);
201 Ptr<std::vector<Real> > up = makePtr<std::vector<Real>>(n_,0);
202 (*up)[0] = static_cast<Real>(100);
203 (*up)[1] = static_cast<Real>(25.6);
204 (*up)[2] = static_cast<Real>(5);
205 Ptr<Vector<Real> > u = makePtr<StdVector<Real>>(up);
206 return makePtr<Bounds<Real>>(l,u);
207 }
208};
209
210} // End ZOO Namespace
211} // End ROL Namespace
212
213#endif
Contains definitions of test objective functions.
Contains definitions of custom data types in ROL.
Provides the std::vector implementation of the ROL::Vector interface that handles scalings in the inn...
Provides the std::vector implementation of the ROL::Vector interface that handles scalings in the inn...
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
Defines the linear algebra or vector space interface.
virtual void zero()
Set to zero vector.
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Definition ROL_HS25.hpp:67
std::vector< Real > u_vec_
Definition ROL_HS25.hpp:38
std::vector< Real >::size_type uint
Definition ROL_HS25.hpp:35
Real value(const Vector< Real > &x, Real &tol)
Definition ROL_HS25.hpp:52
Ptr< std::vector< Real > > scale_
Definition ROL_HS25.hpp:158
Ptr< Vector< Real > > getInitialGuess(void) const
Definition ROL_HS25.hpp:176
Ptr< Objective< Real > > getObjective(void) const
Definition ROL_HS25.hpp:171
Ptr< Vector< Real > > getSolution(const int i=0) const
Definition ROL_HS25.hpp:185
Ptr< BoundConstraint< Real > > getBoundConstraint(void) const
Definition ROL_HS25.hpp:194