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.
Definition: ROL_Vector.hpp:84
virtual void zero()
Set to zero vector.
Definition: ROL_Vector.hpp:167
int main(int argc, char *argv[])
void setRandomVector(std::vector< RealT > &x)
double RealT
constexpr auto dim