ROL
ROL_ConstraintFromObjective.hpp
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 #ifndef ROL_CONSTRAINTFROMOBJECTIVE_H
45 #define ROL_CONSTRAINTFROMOBJECTIVE_H
46 
47 #include "ROL_Objective.hpp"
48 #include "ROL_Constraint.hpp"
49 #include "ROL_SingletonVector.hpp"
50 
61 namespace ROL {
62 
63 template<class Real>
64 class ConstraintFromObjective : public Constraint<Real> {
65 
67 
68 private:
69 
70  const ROL::Ptr<Objective<Real> > obj_;
71  ROL::Ptr<V> dualVector_;
72  const Real offset_;
74 
75  Real getValue( const V& x ) {
76  return dynamic_cast<const SingletonVector<Real>&>(x).getValue();
77  }
78 
79  void setValue( V& x, Real val ) {
80  dynamic_cast<SingletonVector<Real>&>(x).setValue(val);
81  }
82 
83 public:
84 
85  ConstraintFromObjective( const ROL::Ptr<Objective<Real> > &obj, const Real offset = 0 ) :
86  obj_(obj), dualVector_(ROL::nullPtr), offset_(offset), isDualInitialized_(false) {}
87 
88  const ROL::Ptr<Objective<Real> > getObjective(void) const { return obj_; }
89 
90 
91  void setParameter( const std::vector<Real> &param ) {
92  obj_->setParameter(param);
94  }
95 
96 
99  void update( const V& x, bool flag = true, int iter = -1 ) {
100  obj_->update(x,flag,iter);
101  }
102 
105  void value( V& c, const V& x, Real& tol ) {
106  setValue(c, obj_->value(x,tol) - offset_ );
107  }
108 
115  void applyJacobian( V& jv, const V& v, const V& x, Real& tol ) {
116  if ( !isDualInitialized_ ) {
117  dualVector_ = x.dual().clone();
118  isDualInitialized_ = true;
119  }
120  obj_->gradient(*dualVector_,x,tol);
121  setValue(jv,v.dot(dualVector_->dual()));
122  }
123 
130  void applyAdjointJacobian( V& ajv, const V& v, const V& x, Real& tol ) {
131  obj_->gradient(ajv,x,tol);
132  ajv.scale(getValue(v));
133  }
134 
141  void applyAdjointHessian( V& ahuv, const V& u, const V& v, const V& x, Real& tol ) {
142  obj_->hessVec(ahuv,v,x,tol);
143  ahuv.scale(getValue(u));
144  }
145 
146 }; // ConstraintFromObjective
147 
148 } // namespace ROL
149 
150 #endif // ROL_CONSTRAINTFROMOBJECTIVE_H
Provides the interface to evaluate objective functions.
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
Definition: ROL_Vector.hpp:226
virtual void scale(const Real alpha)=0
Compute where .
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
Creates a constraint from an objective function and a offset value.
void applyJacobian(V &jv, const V &v, const V &x, Real &tol)
Apply the constraint Jacobian at , , to vector . .
Defines the linear algebra or vector space interface.
Definition: ROL_Vector.hpp:80
const ROL::Ptr< Objective< Real > > obj_
virtual Real dot(const Vector &x) const =0
Compute where .
Vector< Real > V
void update(const V &x, bool flag=true, int iter=-1)
Update constraint.
virtual 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 ...
void value(V &c, const V &x, Real &tol)
Evaluate constraint c(x) = f(x)-offset.
virtual void setParameter(const std::vector< Real > &param)
void setParameter(const std::vector< Real > &param)
Defines the general constraint operator interface.
void applyAdjointJacobian(V &ajv, const V &v, const V &x, Real &tol)
Apply the adjoint of the the constraint Jacobian at , , to vector .
const ROL::Ptr< Objective< Real > > getObjective(void) const
ConstraintFromObjective(const ROL::Ptr< Objective< Real > > &obj, const Real offset=0)