ROL
ROL_ReduceLinearConstraint_Def.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
10#ifndef ROL_REDUCE_LINEAR_CONSTRAINT_DEF_H
11#define ROL_REDUCE_LINEAR_CONSTRAINT_DEF_H
12
13namespace ROL {
14
15template<typename Real>
17 const Ptr<Vector<Real>> &x,
18 const Ptr<const Vector<Real>> &c)
19 : lcon_(lcon), x_(x),
20 storage_(makePtr<VectorController<Real>>()),
21 nsop_(makePtr<NullSpaceOperator<Real>>(lcon,x_,c)) {
22 feasible(c);
23}
24
25template<typename Real>
26Ptr<Objective<Real>> ReduceLinearConstraint<Real>::transform(const Ptr<Objective<Real>> &obj) const {
27 return makePtr<AffineTransformObjective<Real>>(obj,nsop_,x_,storage_);
28}
29
30template<typename Real>
31Ptr<Constraint<Real>> ReduceLinearConstraint<Real>::transform(const Ptr<Constraint<Real>> &con) const {
32 return makePtr<AffineTransformConstraint<Real>>(con,nsop_,x_,storage_);
33}
34
35template<typename Real>
36Ptr<Constraint<Real>> ReduceLinearConstraint<Real>::getLinearConstraint(void) const {
37 return lcon_;
38}
39
40template<typename Real>
41Ptr<const Vector<Real>> ReduceLinearConstraint<Real>::getFeasibleVector(void) const {
42 return x_;
43}
44
45template<typename Real>
47 Real tol = std::sqrt(ROL_EPSILON<Real>());
48 nsop_->apply(x,y,tol);
49}
50
51template<typename Real>
52void ReduceLinearConstraint<Real>::project(const Ptr<Vector<Real>> &x, const Ptr<const Vector<Real>> &y) const {
53 project(*x,*y);
54}
55
56template<typename Real>
58 Real tol = std::sqrt(ROL_EPSILON<Real>());
59 Ptr<Vector<Real>> ran = c->clone();
60 lcon_->value(*ran,*x_,tol);
61 Real cnorm = ran->norm();
62 if ( cnorm > static_cast<Real>(1e-4)*tol ) {
63 RangeSpaceOperator<Real> rsop(lcon_,x_,c);
64 Ptr<Vector<Real>> xzero = x_->clone(); xzero->zero();
65 lcon_->value(*ran,*xzero,tol);
66 ran->scale(static_cast<Real>(-1));
67 nsop_->apply(*xzero,*x_,tol);
68 rsop.apply(*x_,*ran,tol);
69 x_->plus(*xzero);
70 //throw Exception::NotImplemented(">>> ReduceLinearConstraint::feasible : Input x is not feasible!");
71 }
72}
73
74} // namespace ROL
75
76#endif
Defines the general constraint operator interface.
Projects on to the null space of a linear constraint.
Provides the interface to evaluate objective functions.
Projects on to the null space of a linear constraint.
virtual void apply(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const
Apply linear operator.
Ptr< const Vector< Real > > getFeasibleVector(void) const
Ptr< Objective< Real > > transform(const Ptr< Objective< Real > > &obj) const
ReduceLinearConstraint(const Ptr< Constraint< Real > > &lcon, const Ptr< Vector< Real > > &x, const Ptr< const Vector< Real > > &c)
void feasible(const Ptr< const Vector< Real > > &c)
void project(Vector< Real > &x, const Vector< Real > &y) const
Ptr< Constraint< Real > > getLinearConstraint(void) const
Defines the linear algebra or vector space interface.