ROL
ROL_ReducedDynamicStationaryControlsObjective.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_REDUCEDDYNAMICSTATIONARYCONTROLSOBJECTIVE_HPP
45 #define ROL_REDUCEDDYNAMICSTATIONARYCONTROLSOBJECTIVE_HPP
46 
47 #include "ROL_Ptr.hpp"
50 
51 namespace ROL
52 {
53 
54 template <typename Real>
56 {
57 public:
60  virtual void
61  preValue(const Vector<Real> &x) const = 0;
62  virtual void
63  postValue(Real val) const = 0;
64  virtual void
65  preGradient(const Vector<Real> &x) const = 0;
66  virtual void
67  postGradient(const Vector<Real> &g) const = 0;
68 };
69 
76 template <typename Real>
78 {
79 public:
81 
83  const Ptr<ReducedDynamicObjective<Real>> &red_dyn_obj,
84  const Ptr<Vector<Real>> &x,
85  const size_type Nt,
86  const Ptr<ReducedDynamicStationaryControlsObjectiveHook<Real>> &hook = nullPtr)
87  : red_dyn_obj_(red_dyn_obj), Nt_(Nt), hook_(hook)
88  {
92  }
93 
95 
96  void
97  update( const Vector<Real> &x, UpdateType type, int iter = -1 ) override
98  {
99  for (size_type i = 0; i < Nt_; ++i)
100  (*x_dyn_)[i].set(x);
101  red_dyn_obj_->update(*x_dyn_, true, iter);
102  }
103 
104  void
105  update(const Vector<Real> &x, bool flag = true, int iter = -1) override
106  {
107  for (size_type i = 0; i < Nt_; ++i)
108  (*x_dyn_)[i].set(x);
109  red_dyn_obj_->update(*x_dyn_, flag, iter);
110  }
111 
112  Real
113  value(const Vector<Real> &x, Real &tol) override
114  {
115  if (hook_ != nullPtr)
116  hook_->preValue(x);
117  for (size_type i = 0; i < Nt_; ++i)
118  (*x_dyn_)[i].set(x);
119  Real val = red_dyn_obj_->value(*x_dyn_, tol);
120  if (hook_ != nullPtr)
121  hook_->postValue(val);
122  return val;
123  }
124 
125  void
126  gradient(Vector<Real> &g, const Vector<Real> &x, Real &tol) override
127  {
128  if (hook_ != nullPtr)
129  hook_->preGradient(x);
130  for (size_type i = 0; i < Nt_; ++i)
131  (*x_dyn_)[i].set(x);
132  red_dyn_obj_->gradient(*g_dyn_, *x_dyn_, tol);
133  g.zero();
134  for (size_type i = 0; i < Nt_; ++i)
135  g.axpy(1.0, (*g_dyn_)[i]);
136  if (hook_ != nullPtr)
137  hook_->postGradient(g);
138  }
139 
140  void
141  hessVec(Vector<Real> &hv, const Vector<Real> &v, const Vector<Real> &x, Real &tol) override
142  {
143  for (size_type i = 0; i < Nt_; ++i)
144  {
145  (*x_dyn_)[i].set(x);
146  (*v_dyn_)[i].set(v);
147  }
148  red_dyn_obj_->hessVec(*g_dyn_, *v_dyn_, *x_dyn_, tol);
149  hv.zero();
150  for (size_type i = 0; i < Nt_; ++i)
151  hv.axpy(1.0, (*g_dyn_)[i]);
152  }
153 
154 private:
155  Ptr<ReducedDynamicObjective<Real>> red_dyn_obj_;
157  Ptr<ReducedDynamicStationaryControlsObjectiveHook<Real>> hook_;
158  Ptr<PartitionedVector<Real>> x_dyn_;
159  Ptr<PartitionedVector<Real>> v_dyn_;
160  Ptr<PartitionedVector<Real>> g_dyn_;
161 };
162 } // namespace ROL
163 
164 #endif
Provides the interface to evaluate objective functions.
static Ptr< PartitionedVector > create(std::initializer_list< Vp > vs)
typename PV< Real >::size_type size_type
virtual void preGradient(const Vector< Real > &x) const =0
Defines the reduced time-dependent objective function interface for simulation-based optimization...
virtual void axpy(const Real alpha, const Vector &x)
Compute where .
Definition: ROL_Vector.hpp:153
virtual void zero()
Set to zero vector.
Definition: ROL_Vector.hpp:167
Defines the linear algebra or vector space interface.
Definition: ROL_Vector.hpp:80
virtual void postGradient(const Vector< Real > &g) const =0
Ptr< ReducedDynamicStationaryControlsObjectiveHook< Real > > hook_
virtual void preValue(const Vector< Real > &x) const =0
void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol) override
Apply Hessian approximation to vector.
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol) override
Compute gradient.
virtual void postValue(Real val) const =0
Real value(const Vector< Real > &x, Real &tol) override
Compute value.
Defines the reduced time-dependent objective function interface for simulation-based optimization whe...
void update(const Vector< Real > &x, bool flag=true, int iter=-1) override
Update objective function.
ReducedDynamicStationaryControlsObjective(const Ptr< ReducedDynamicObjective< Real >> &red_dyn_obj, const Ptr< Vector< Real >> &x, const size_type Nt, const Ptr< ReducedDynamicStationaryControlsObjectiveHook< Real >> &hook=nullPtr)
void update(const Vector< Real > &x, UpdateType type, int iter=-1) override
Update objective function.