51 #ifndef ROL_SIMPLEEQCONSTRAINED_HPP
52 #define ROL_SIMPLEEQCONSTRAINED_HPP
57 #include "Teuchos_SerialDenseVector.hpp"
58 #include "Teuchos_SerialDenseSolver.hpp"
66 template<
class Real,
class XPrim=StdVector<Real>,
class XDual=StdVector<Real> >
73 Teuchos::RCP<const std::vector<Real> > xp =
74 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
77 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, objective value): "
78 "Primal vector x must be of length 5.");
86 Real val = exp(x1*x2*x3*x4*x5) - 0.5 * pow( (pow(x1,3)+pow(x2,3)+1.0), 2);
92 Teuchos::RCP<const std::vector<Real> > xp =
93 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
94 Teuchos::RCP<std::vector<Real> > gp =
95 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<XDual>(g)).getVector());
98 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, objective gradient): "
99 " Primal vector x must be of length 5.");
102 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, objective gradient): "
103 "Gradient vector g must be of length 5.");
111 Real expxi = exp(x1*x2*x3*x4*x5);
113 (*gp)[0] = x2*x3*x4*x5 * expxi - 3*pow(x1,2) * (pow(x1,3) + pow(x2,3) + 1);
114 (*gp)[1] = x1*x3*x4*x5 * expxi - 3*pow(x2,2) * (pow(x1,3) + pow(x2,3) + 1);
115 (*gp)[2] = x1*x2*x4*x5 * expxi;
116 (*gp)[3] = x1*x2*x3*x5 * expxi;
117 (*gp)[4] = x1*x2*x3*x4 * expxi;
121 Teuchos::RCP<const std::vector<Real> > xp =
122 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
123 Teuchos::RCP<const std::vector<Real> > vp =
124 (Teuchos::dyn_cast<
const XPrim>(v)).getVector();
125 Teuchos::RCP<std::vector<Real> > hvp =
126 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<XDual>(hv)).getVector());
129 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, objective hessVec): "
130 "Primal vector x must be of length 5.");
133 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, objective hessVec): "
134 "Input vector v must be of length 5.");
137 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, objective hessVec): "
138 "Output vector hv must be of length 5.");
152 Real expxi = exp(x1*x2*x3*x4*x5);
154 (*hvp)[0] = ( pow(x2,2)*pow(x3,2)*pow(x4,2)*pow(x5,2)*expxi-9.0*pow(x1,4)-6.0*(pow(x1,3)+pow(x2,3)+1.0)*x1 ) * v1 +
155 ( x3*x4*x5*expxi+x2*pow(x3,2)*pow(x4,2)*pow(x5,2)*x1*expxi-9.0*pow(x2,2)*pow(x1,2) ) * v2 +
156 ( x2*x4*x5*expxi+pow(x2,2)*x3*pow(x4,2)*pow(x5,2)*x1*expxi ) * v3 +
157 ( x2*x3*x5*expxi+pow(x2,2)*pow(x3,2)*x4*pow(x5,2)*x1*expxi ) * v4 +
158 ( x2*x3*x4*expxi+pow(x2,2)*pow(x3,2)*pow(x4,2)*x5*x1*expxi ) * v5;
160 (*hvp)[1] = ( x3*x4*x5*expxi+x2*pow(x3,2)*pow(x4,2)*pow(x5,2)*x1*expxi-9.0*pow(x2,2)*pow(x1,2) ) * v1 +
161 ( pow(x1,2)*pow(x3,2)*pow(x4,2)*pow(x5,2)*expxi-9.0*pow(x2,4)-6.0*(pow(x1,3)+pow(x2,3)+1.0)*x2 ) * v2 +
162 ( x1*x4*x5*expxi+pow(x1,2)*x3*pow(x4,2)*pow(x5,2)*x2*expxi ) * v3 +
163 ( x1*x3*x5*expxi+pow(x1,2)*pow(x3,2)*x4*pow(x5,2)*x2*expxi ) * v4 +
164 ( x1*x3*x4*expxi+pow(x1,2)*pow(x3,2)*pow(x4,2)*x5*x2*expxi ) * v5;
166 (*hvp)[2] = ( x2*x4*x5*expxi+pow(x2,2)*x3*pow(x4,2)*pow(x5,2)*x1*expxi ) * v1 +
167 ( x1*x4*x5*expxi+pow(x1,2)*x3*pow(x4,2)*pow(x5,2)*x2*expxi ) * v2 +
168 ( pow(x1,2)*pow(x2,2)*pow(x4,2)*pow(x5,2)*expxi ) * v3 +
169 ( x1*x2*x5*expxi+pow(x1,2)*pow(x2,2)*x4*pow(x5,2)*x3*expxi ) * v4 +
170 ( x1*x2*x4*expxi+pow(x1,2)*pow(x2,2)*pow(x4,2)*x5*x3*expxi ) * v5;
172 (*hvp)[3] = ( x2*x3*x5*expxi+pow(x2,2)*pow(x3,2)*x4*pow(x5,2)*x1*expxi ) * v1 +
173 ( x1*x3*x5*expxi+pow(x1,2)*pow(x3,2)*x4*pow(x5,2)*x2*expxi ) * v2 +
174 ( x1*x2*x5*expxi+pow(x1,2)*pow(x2,2)*x4*pow(x5,2)*x3*expxi ) * v3 +
175 ( pow(x1,2)*pow(x2,2)*pow(x3,2)*pow(x5,2)*expxi ) * v4 +
176 ( x1*x2*x3*expxi+pow(x1,2)*pow(x2,2)*pow(x3,2)*x5*x4*expxi ) * v5;
178 (*hvp)[4] = ( x2*x3*x4*expxi+pow(x2,2)*pow(x3,2)*pow(x4,2)*x5*x1*expxi ) * v1 +
179 ( x1*x3*x4*expxi+pow(x1,2)*pow(x3,2)*pow(x4,2)*x5*x2*expxi ) * v2 +
180 ( x1*x2*x4*expxi+pow(x1,2)*pow(x2,2)*pow(x4,2)*x5*x3*expxi ) * v3 +
181 ( x1*x2*x3*expxi+pow(x1,2)*pow(x2,2)*pow(x3,2)*x5*x4*expxi ) * v4 +
182 ( pow(x1,2)*pow(x2,2)*pow(x3,2)*pow(x4,2)*expxi ) * v5;
193 template<
class Real,
class XPrim=StdVector<Real>,
class XDual=StdVector<Real>,
class CPrim=StdVector<Real>,
class CDual=StdVector<Real> >
200 Teuchos::RCP<const std::vector<Real> > xp =
201 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
202 Teuchos::RCP<std::vector<Real> > cp =
203 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<CPrim>(c)).getVector());
206 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint value): "
207 "Primal vector x must be of length 5.");
210 TEUCHOS_TEST_FOR_EXCEPTION( (m != 3), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint value): "
211 "Constraint vector c must be of length 3.");
219 (*cp)[0] = x1*x1+x2*x2+x3*x3+x4*x4+x5*x5 - 10.0;
220 (*cp)[1] = x2*x3 - 5.0*x4*x5;
221 (*cp)[2] = x1*x1*x1 + x2*x2*x2 + 1.0;
225 Teuchos::RCP<const std::vector<Real> > xp =
226 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
227 Teuchos::RCP<const std::vector<Real> > vp =
228 (Teuchos::dyn_cast<
const XPrim>(v)).getVector();
229 Teuchos::RCP<std::vector<Real> > jvp =
230 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<CPrim>(jv)).getVector());
233 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyJacobian): "
234 "Primal vector x must be of length 5.");
237 TEUCHOS_TEST_FOR_EXCEPTION( (d != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyJacobian): "
238 "Input vector v must be of length 5.");
240 TEUCHOS_TEST_FOR_EXCEPTION( (d != 3), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyJacobian): "
241 "Output vector jv must be of length 3.");
255 (*jvp)[0] = 2.0*(x1*v1+x2*v2+x3*v3+x4*v4+x5*v5);
256 (*jvp)[1] = x3*v2+x2*v3-5.0*x5*v4-5.0*x4*v5;
257 (*jvp)[2] = 3.0*x1*x1*v1+3.0*x2*x2*v2;
262 Teuchos::RCP<const std::vector<Real> > xp =
263 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
264 Teuchos::RCP<const std::vector<Real> > vp =
265 (Teuchos::dyn_cast<
const CDual>(v)).getVector();
266 Teuchos::RCP<std::vector<Real> > ajvp =
267 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<XDual>(ajv)).getVector());
270 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointJacobian): "
271 "Primal vector x must be of length 5.");
274 TEUCHOS_TEST_FOR_EXCEPTION( (d != 3), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointJacobian): "
275 "Input vector v must be of length 3.");
278 TEUCHOS_TEST_FOR_EXCEPTION( (d != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointJacobian): "
279 "Output vector ajv must be of length 5.");
291 (*ajvp)[0] = 2.0*x1*v1+3.0*x1*x1*v3;
292 (*ajvp)[1] = 2.0*x2*v1+x3*v2+3.0*x2*x2*v3;
293 (*ajvp)[2] = 2.0*x3*v1+x2*v2;
294 (*ajvp)[3] = 2.0*x4*v1-5.0*x5*v2;
295 (*ajvp)[4] = 2.0*x5*v1-5.0*x4*v2;
300 Teuchos::RCP<const std::vector<Real> > xp =
301 (Teuchos::dyn_cast<
const XPrim>(x)).getVector();
302 Teuchos::RCP<const std::vector<Real> > up =
303 (Teuchos::dyn_cast<
const CDual>(u)).getVector();
304 Teuchos::RCP<const std::vector<Real> > vp =
305 (Teuchos::dyn_cast<
const XPrim>(v)).getVector();
306 Teuchos::RCP<std::vector<Real> > ahuvp =
307 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<XDual>(ahuv)).getVector());
310 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointHessian): "
311 "Primal vector x must be of length 5.");
314 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointHessian): "
315 "Direction vector v must be of length 5.");
318 TEUCHOS_TEST_FOR_EXCEPTION( (n != 5), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointHessian): "
319 "Output vector ahuv must be of length 5.");
321 TEUCHOS_TEST_FOR_EXCEPTION( (d != 3), std::invalid_argument,
">>> ERROR (ROL_SimpleEqConstrained, constraint applyAdjointHessian): "
322 "Dual constraint vector u must be of length 3.");
337 (*ahuvp)[0] = 2.0*u1*v1 + 6.0*u3*x1*v1;
338 (*ahuvp)[1] = 2.0*u1*v2 + u2*v3 + 6.0*u3*x2*v2;
339 (*ahuvp)[2] = 2.0*u1*v3 + u2*v2;
340 (*ahuvp)[3] = 2.0*u1*v4 - 5.0*u2*v5;
341 (*ahuvp)[4] = 2.0*u1*v5 - 5.0*u2*v4;
406 template<
class Real,
class XPrim,
class XDual,
class CPrim,
class CDual>
412 Teuchos::RCP<std::vector<Real> > x0p =
413 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<XPrim>(x0)).getVector());
414 Teuchos::RCP<std::vector<Real> > solp =
415 Teuchos::rcp_const_cast<std::vector<Real> >((Teuchos::dyn_cast<XPrim>(sol)).getVector());
435 (*solp)[0] = -1.717143570394391e+00;
436 (*solp)[1] = 1.595709690183565e+00;
437 (*solp)[2] = 1.827245752927178e+00;
438 (*solp)[3] = -7.636430781841294e-01;
439 (*solp)[4] = -7.636430781841294e-01;
Provides the interface to evaluate objective functions.
EqualityConstraint_SimpleEqConstrained()
Equality constraints c_i(x) = 0, where: c1(x) = x1^2+x2^2+x3^2+x4^2+x5^2 - 10 c2(x) = x2*x3-5*x4*x5 c...
void value(Vector< Real > &c, const Vector< Real > &x, Real &tol)
Evaluate the constraint operator at .
void applyJacobian(Vector< Real > &jv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply the constraint Jacobian at , , to vector .
Defines the linear algebra or vector space interface.
void applyAdjointJacobian(Vector< Real > &ajv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply the adjoint of the the constraint Jacobian at , , to vector .
Defines the equality constraint operator interface.
void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
void getSimpleEqConstrained(Teuchos::RCP< Objective< Real > > &obj, Teuchos::RCP< EqualityConstraint< Real > > &constr, Vector< Real > &x0, Vector< Real > &sol)
void applyAdjointHessian(Vector< Real > &ahuv, const Vector< Real > &u, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply the derivative of the adjoint of the constraint Jacobian at to vector in direction ...
Real value(const Vector< Real > &x, Real &tol)
Compute value.
Objective_SimpleEqConstrained()
Objective function: f(x) = exp(x1*x2*x3*x4*x5) + 0.5*(x1^3+x2^3+1)^2.