ROL
step/interiorpoint/test_01.cpp
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
10#include "Teuchos_GlobalMPISession.hpp"
11
12#include "Teuchos_GlobalMPISession.hpp"
13
15#include "ROL_RandomVector.hpp"
16#include "ROL_StdVector.hpp"
17#include "ROL_Bounds.hpp"
18#include "ROL_ParameterList.hpp"
19
20#include <iomanip>
21
22
28template<class Real>
29class NullObjective : public ROL::Objective<Real> {
31public:
32 Real value( const V &x, Real &tol ) {
33 return Real(0.0);
34 }
35 void gradient( V &g, const V &x, Real &tol ) {
36 g.zero();
37 }
38 void hessVec( V &hv, const V &v, const V &x, Real &tol ) {
39 hv.zero();
40 }
41};
42
43template<class Real>
44void printVector( const ROL::Vector<Real> &x, std::ostream &outStream ) {
45 ROL::Ptr<const std::vector<Real> > xp =
46 dynamic_cast<const ROL::StdVector<Real>&>(x).getVector();
47
48 for( size_t i=0; i<xp->size(); ++i ) {
49 outStream << (*xp)[i] << std::endl;
50 }
51}
52
53
54
55
56typedef double RealT;
57
58int main(int argc, char *argv[]) {
59
60 typedef std::vector<RealT> vector;
61
62 typedef ROL::Vector<RealT> V;
63 typedef ROL::StdVector<RealT> SV;
64 typedef ROL::Objective<RealT> OBJ;
66
67 typedef ROL::ParameterList PL;
68
69 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
70
71 int iprint = argc - 1;
72 ROL::Ptr<std::ostream> outStream;
73 ROL::nullstream bhs;
74 if( iprint > 0 )
75 outStream = ROL::makePtrFromRef(std::cout);
76 else
77 outStream = ROL::makePtrFromRef(bhs);
78
79 int errorFlag = 0;
80
81 try {
82
83 PL parlist;
84 PL &iplist = parlist.sublist("Step").sublist("Primal Dual Interior Point");
85 PL &lblist = iplist.sublist("Barrier Objective");
86
87 RealT mu = 1.e2;
88 RealT kappaD = 1.e-4;
89 bool useLinearDamping = true;
90
91 lblist.set("Use Linear Damping", useLinearDamping);
92 lblist.set("Linear Damping Coefficient",kappaD);
93 lblist.set("Initial Barrier Parameter",mu);
94
95 RealT ninf = ROL::ROL_NINF<RealT>();
96 RealT inf = ROL::ROL_INF<RealT>();
97
98 int dim = 4;
99 int numTestVectors = 19;
100
101 ROL::Ptr<vector> x_ptr = ROL::makePtr<vector>(dim, 0.0);
102 ROL::Ptr<vector> d_ptr = ROL::makePtr<vector>(dim, 0.0);
103 ROL::Ptr<vector> v_ptr = ROL::makePtr<vector>(dim, 0.0);
104 ROL::Ptr<vector> l_ptr = ROL::makePtr<vector>(dim, 0.0);
105 ROL::Ptr<vector> u_ptr = ROL::makePtr<vector>(dim, 0.0);
106 ROL::Ptr<vector> e0_ptr = ROL::makePtr<vector>(dim, 0.0); // First canonical vector
107
108 (*e0_ptr)[0] = 1.0;
109
110 SV e0(e0_ptr);
111
112 // Lower Bounds // Upper Bounds
113 (*l_ptr)[0] = ninf; (*u_ptr)[0] = 5.0;
114 (*l_ptr)[1] = ninf; (*u_ptr)[1] = inf;
115 (*l_ptr)[2] = -5.0; (*u_ptr)[2] = inf;
116 (*l_ptr)[3] = -5.0; (*u_ptr)[3] = 5.0;
117
118 RealT left = -1.0; RealT right = 1.0;
119
120 RealT xmax = 4.99;
121
122 ROL::Ptr<V> x = ROL::makePtr<SV>( x_ptr );
123 ROL::Ptr<V> d = ROL::makePtr<SV>( d_ptr );
124 ROL::Ptr<V> v = ROL::makePtr<SV>( v_ptr );
125 ROL::Ptr<V> l = ROL::makePtr<SV>( l_ptr );
126 ROL::Ptr<V> u = ROL::makePtr<SV>( u_ptr );
127
128 ROL::Ptr<const V> maskL, maskU;
129
130 ROL::RandomizeVector(*d,left,right);
131 ROL::RandomizeVector(*v,left,right);
132
133 std::vector<RealT> values(numTestVectors); // Computed objective value for each
134 std::vector<RealT> exact_values(numTestVectors);
135
136 std::vector<ROL::Ptr<V> > x_test;
137
138 for(int i=0; i<numTestVectors; ++i) {
139 x_test.push_back(x->clone());
140 RealT t = static_cast<RealT>(i)/static_cast<RealT>(numTestVectors-1);
141 RealT fillValue = xmax*(2.0*t-1.0);
142 x_test[i]->applyUnary(ROL::Elementwise::Fill<RealT>(fillValue));
143 }
144
145 ROL::Ptr<OBJ> obj = ROL::makePtr<NullObjective<RealT>>();
146 ROL::Ptr<BND> bnd = ROL::makePtr<ROL::Bounds<RealT>>(l,u);
147
148 ROL::InteriorPointPenalty<RealT> ipobj(obj,bnd,parlist);
149
150 maskL = ipobj.getLowerMask();
151 maskU = ipobj.getUpperMask();
152
153 ROL::Ptr<const std::vector<RealT> > maskL_ptr = dynamic_cast<const SV&>(*maskL).getVector();
154 ROL::Ptr<const std::vector<RealT> > maskU_ptr = dynamic_cast<const SV&>(*maskU).getVector();
155
156 *outStream << "\nLower bound vector" << std::endl;
157 printVector(*l,*outStream);
158
159 *outStream << "\nUpper bound vector" << std::endl;
160 printVector(*u,*outStream);
161
162 *outStream << "\nLower mask vector" << std::endl;
163 printVector(*maskL, *outStream);
164
165 *outStream << "\nUpper mask vector" << std::endl;
166 printVector(*maskU, *outStream);
167
168 *outStream << "\nChecking Objective value" << std::endl;
169
170 RealT tol = std::sqrt(ROL::ROL_EPSILON<RealT>());
171 *outStream << std::setw(16) << "x[i], i=0,1,2,3"
172 << std::setw(20) << "Computed Objective"
173 << std::setw(20) << "Exact Objective" << std::endl;
174
175 RealT valueError(0.0);
176
177 for(int i=0; i<numTestVectors; ++i) {
178 values[i] = ipobj.value(*(x_test[i]),tol);
179
180 exact_values[i] = 0;
181
182 // Extract the value from the test vector that is in every element
183 RealT xval = x_test[i]->dot(e0);
184
185
186 for(int j=0; j<dim; ++j) {
187 if( (*maskL_ptr)[j] ) {
188 RealT diff = xval-(*l_ptr)[j];
189 exact_values[i] -= mu*std::log(diff);
190
191 if( useLinearDamping && !(*maskU_ptr)[j] ) {
192 exact_values[i] += mu*kappaD*diff;
193 }
194
195 }
196 if( (*maskU_ptr)[j] ) {
197 RealT diff = (*u_ptr)[j]-xval;
198 exact_values[i] -= mu*std::log(diff);
199
200 if(useLinearDamping && !(*maskL_ptr)[j] ) {
201 exact_values[i] += mu*kappaD*diff;
202 }
203
204 }
205 } // end loop over elements
206
207 *outStream << std::setw(16) << xval
208 << std::setw(20) << values[i]
209 << std::setw(20) << exact_values[i] << std::endl;
210 RealT valDiff = exact_values[i] - values[i];
211 valueError += valDiff*valDiff;
212 } // end loop over vectors
213
214 if(valueError>ROL::ROL_EPSILON<RealT>()) {
215 errorFlag++;
216 }
217
218 *outStream << "\nPerforming finite difference checks" << std::endl;
219
220 ipobj.checkGradient(*x,*v,true,*outStream); *outStream << std::endl;
221 ipobj.checkHessVec(*x,*d,true,*outStream); *outStream << std::endl;
222 ipobj.checkHessSym(*x,*d,*v,true,*outStream); *outStream << std::endl;
223
224 }
225 catch (std::logic_error& err) {
226 *outStream << err.what() << std::endl;
227 errorFlag = -1000;
228 }
229
230 if (errorFlag != 0)
231 std::cout << "End Result: TEST FAILED" << std::endl;
232 else
233 std::cout << "End Result: TEST PASSED" << std::endl;
234
235 return 0;
236}
Vector< Real > V
void gradient(V &g, const V &x, Real &tol)
Compute gradient.
void hessVec(V &hv, const V &v, const V &x, Real &tol)
Apply Hessian approximation to vector.
Real value(const V &x, Real &tol)
Compute value.
Provides the interface to apply upper and lower bound constraints.
Provides the interface to evaluate the Interior Pointy log barrier penalty function with upper and lo...
Provides the interface to evaluate objective functions.
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.
void RandomizeVector(Vector< Real > &x, const Real &lower=0.0, const Real &upper=1.0)
Fill a ROL::Vector with uniformly-distributed random numbers in the interval [lower,...
int main(int argc, char *argv[])
void printVector(const ROL::Vector< Real > &x, std::ostream &outStream)
constexpr auto dim