ROL
function/test_08.cpp
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#include "ROL_Stream.hpp"
45#include "Teuchos_GlobalMPISession.hpp"
46
47#include "ROL_StdVector.hpp"
48#include "ROL_StdObjective.hpp"
51
52typedef double RealT;
53
54template<class Real>
56public:
57 Real value( const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
58 ROL::Ptr<const std::vector<Real> > up
59 = dynamic_cast<const ROL::StdVector<Real>&>(u).getVector();
60 ROL::Ptr<const std::vector<Real> > zp
61 = dynamic_cast<const ROL::StdVector<Real>&>(z).getVector();
62 Real half(0.5), quadu(0), quadz(0);
63 unsigned usize = up->size();
64 for ( unsigned i = 0; i < usize; i++ ) {
65 quadu += (*up)[i]*(*up)[i];
66 }
67 unsigned zsize = zp->size();
68 for ( unsigned i = 0; i < zsize; i++ ) {
69 quadz += (*zp)[i]*(*zp)[i];
70 }
71 return half*(quadu + quadz);
72 }
73
74 void gradient_1( ROL::Vector<Real> &g, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
75 ROL::Ptr<std::vector<Real> > gp
76 = dynamic_cast<ROL::StdVector<Real>&>(g).getVector();
77 ROL::Ptr<const std::vector<Real> > up
78 = dynamic_cast<const ROL::StdVector<Real>&>(u).getVector();
79 gp->assign(up->begin(),up->end());
80 }
81
82 void gradient_2( ROL::Vector<Real> &g, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
83 ROL::Ptr<std::vector<Real> > gp
84 = dynamic_cast<ROL::StdVector<Real>&>(g).getVector();
85 ROL::Ptr<const std::vector<Real> > zp
86 = dynamic_cast<const ROL::StdVector<Real>&>(z).getVector();
87 gp->assign(zp->begin(),zp->end());
88 }
89
91 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
92 ROL::Ptr<std::vector<Real> > hvp
93 = dynamic_cast<ROL::StdVector<Real>&>(hv).getVector();
94 ROL::Ptr<const std::vector<Real> > vp
95 = dynamic_cast<const ROL::StdVector<Real>&>(v).getVector();
96 hvp->assign(vp->begin(),vp->end());
97 }
98
100 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
101 hv.zero();
102 }
103
105 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
106 hv.zero();
107 }
108
110 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
111 ROL::Ptr<std::vector<Real> > hvp
112 = dynamic_cast<ROL::StdVector<Real>&>(hv).getVector();
113 ROL::Ptr<const std::vector<Real> > vp
114 = dynamic_cast<const ROL::StdVector<Real>&>(v).getVector();
115 hvp->assign(vp->begin(),vp->end());
116 }
117};
118
119template<class Real>
121public:
122 Real value( const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
123 ROL::Ptr<const std::vector<Real> > up
124 = dynamic_cast<const ROL::StdVector<Real>&>(u).getVector();
125 ROL::Ptr<const std::vector<Real> > zp
126 = dynamic_cast<const ROL::StdVector<Real>&>(z).getVector();
127 Real linu(0), linz(0);
128 unsigned usize = up->size();
129 for ( unsigned i = 0; i < usize; i++ ) {
130 linu += (*up)[i];
131 }
132 unsigned zsize = zp->size();
133 for ( unsigned i = 0; i < zsize; i++ ) {
134 linz += (*zp)[i];
135 }
136 return linu + linz;
137 }
138
139 void gradient_1( ROL::Vector<Real> &g, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
140 ROL::Ptr<std::vector<Real> > gp
141 = dynamic_cast<ROL::StdVector<Real>&>(g).getVector();
142 ROL::Ptr<const std::vector<Real> > up
143 = dynamic_cast<const ROL::StdVector<Real>&>(u).getVector();
144 gp->assign(up->size(),1);
145 }
146
147 void gradient_2( ROL::Vector<Real> &g, const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
148 ROL::Ptr<std::vector<Real> > gp
149 = dynamic_cast<ROL::StdVector<Real>&>(g).getVector();
150 ROL::Ptr<const std::vector<Real> > zp
151 = dynamic_cast<const ROL::StdVector<Real>&>(z).getVector();
152 gp->assign(zp->size(),1);
153 }
154
156 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
157 hv.zero();
158 }
159
161 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
162 hv.zero();
163 }
164
166 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
167 hv.zero();
168 }
169
171 const ROL::Vector<Real> &u, const ROL::Vector<Real> &z, Real &tol ) {
172 hv.zero();
173 }
174};
175
176template<class Real>
178public:
179 Real value( const std::vector<Real> &x, Real &tol ) {
180 return std::log(x[0]) * std::exp(x[1]);
181 }
182
183 void gradient( std::vector<Real> &g, const std::vector<Real> &x, Real &tol ) {
184 g[0] = std::exp(x[1])/x[0];
185 g[1] = std::exp(x[1]) * std::log(x[0]);
186 }
187
188 void hessVec( std::vector<Real> &hv, const std::vector<Real> &v, const std::vector<Real> &x, Real &tol ) {
189 Real H11 = -std::exp(x[1])/(x[0]*x[0]);
190 Real H12 = std::exp(x[1])/x[0];
191 Real H21 = std::exp(x[1])/x[0];
192 Real H22 = std::exp(x[1]) * std::log(x[0]);
193 hv[0] = H11*v[0] + H12*v[1];
194 hv[1] = H21*v[0] + H22*v[1];
195 }
196};
197
198void setRandomVector(std::vector<RealT> &x) {
199 unsigned dim = x.size();
200 for ( unsigned i = 0; i < dim; i++ ) {
201 x[i] = (RealT)rand()/(RealT)RAND_MAX;
202 }
203}
204
205int main(int argc, char* argv[]) {
206
207 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
208
209 // This little trick lets us print to std::cout only if a (dummy) command-line argument is provided.
210 int iprint = argc - 1;
211 ROL::Ptr<std::ostream> outStream;
212 ROL::nullstream bhs; // outputs nothing
213 if (iprint > 0)
214 outStream = ROL::makePtrFromRef(std::cout);
215 else
216 outStream = ROL::makePtrFromRef(bhs);
217
218 int errorFlag = 0;
219
220 try {
221 /**********************************************************************************************/
222 /************************* CONSTRUCT SOL COMPONENTS *******************************************/
223 /**********************************************************************************************/
224 // Build vectors
225 unsigned dim = 2;
226 ROL::Ptr<std::vector<RealT> > u_ptr = ROL::makePtr<std::vector<RealT>>(dim,0.0);
227 ROL::Ptr<ROL::Vector<RealT> > u = ROL::makePtr<ROL::StdVector<RealT>>(u_ptr);
228 setRandomVector(*u_ptr);
229 ROL::Ptr<std::vector<RealT> > z_ptr = ROL::makePtr<std::vector<RealT>>(dim,0.0);
230 ROL::Ptr<ROL::Vector<RealT> > z = ROL::makePtr<ROL::StdVector<RealT>>(z_ptr);
231 setRandomVector(*z_ptr);
232 ROL::Ptr<ROL::Vector<RealT> > x = ROL::makePtr<ROL::Vector_SimOpt<RealT>>(u,z);
233 ROL::Ptr<std::vector<RealT> > du_ptr = ROL::makePtr<std::vector<RealT>>(dim,0.0);
234 ROL::Ptr<ROL::Vector<RealT> > du = ROL::makePtr<ROL::StdVector<RealT>>(du_ptr);
235 setRandomVector(*du_ptr);
236 ROL::Ptr<std::vector<RealT> > dz_ptr = ROL::makePtr<std::vector<RealT>>(dim,0.0);
237 ROL::Ptr<ROL::Vector<RealT> > dz = ROL::makePtr<ROL::StdVector<RealT>>(dz_ptr);
238 setRandomVector(*dz_ptr);
239 ROL::Ptr<ROL::Vector<RealT> > d = ROL::makePtr<ROL::Vector_SimOpt<RealT>>(du,dz);
240 // Build objective function
241 std::vector<ROL::Ptr<ROL::Objective_SimOpt<RealT> > > vec_obj(2,ROL::nullPtr);
242 vec_obj[0] = ROL::makePtr<ObjectiveFunctionTest08_1<RealT>>();
243 vec_obj[1] = ROL::makePtr<ObjectiveFunctionTest08_2<RealT>>();
244 ROL::Ptr<ROL::StdObjective<RealT> > obj_scalarize
245 = ROL::makePtr<ObjectiveFunctionTest08_scalarize<RealT>>();
246 ROL::Ptr<ROL::CompositeObjective_SimOpt<RealT> > obj
247 = ROL::makePtr<ROL::CompositeObjective_SimOpt<RealT>>(vec_obj,obj_scalarize);
248 // Test parametrized objective functions
249 *outStream << "Check Derivatives of CompositeObjective_SimOpt\n";
250 obj->checkGradient(*x,*d,true,*outStream);
251 obj->checkHessVec(*x,*d,true,*outStream);
252 }
253 catch (std::logic_error& err) {
254 *outStream << err.what() << "\n";
255 errorFlag = -1000;
256 }; // end try
257
258 if (errorFlag != 0)
259 std::cout << "End Result: TEST FAILED\n";
260 else
261 std::cout << "End Result: TEST PASSED\n";
262
263 return 0;
264}
Defines a no-output stream class ROL::NullStream and a function makeStreamPtr which either wraps a re...
void hessVec_21(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
void hessVec_12(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Real value(const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Compute value.
void hessVec_11(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Apply Hessian approximation to vector.
void gradient_1(ROL::Vector< Real > &g, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Compute gradient with respect to first component.
void gradient_2(ROL::Vector< Real > &g, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Compute gradient with respect to second component.
void hessVec_22(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
void hessVec_12(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
void hessVec_22(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
void gradient_2(ROL::Vector< Real > &g, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Compute gradient with respect to second component.
void hessVec_21(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Real value(const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Compute value.
void gradient_1(ROL::Vector< Real > &g, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Compute gradient with respect to first component.
void hessVec_11(ROL::Vector< Real > &hv, const ROL::Vector< Real > &v, const ROL::Vector< Real > &u, const ROL::Vector< Real > &z, Real &tol)
Apply Hessian approximation to vector.
void gradient(std::vector< Real > &g, const std::vector< Real > &x, Real &tol)
Real value(const std::vector< Real > &x, Real &tol)
void hessVec(std::vector< Real > &hv, const std::vector< Real > &v, const std::vector< Real > &x, Real &tol)
Provides the interface to evaluate simulation-based objective functions.
Specializes the ROL::Objective interface for objective functions that operate on ROL::StdVector's.
Provides the ROL::Vector interface for scalar values, to be used, for example, with scalar constraint...
Defines the linear algebra or vector space interface.
virtual void zero()
Set to zero vector.
int main(int argc, char *argv[])
void setRandomVector(std::vector< RealT > &x)
double RealT
constexpr auto dim