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 #pragma once
45 #ifndef ROL_DYNAMICOBJECTIVE_HPP
46 #define ROL_DYNAMICOBJECTIVE_HPP
47 
48 #include "ROL_DynamicFunction.hpp"
49 
50 
51 /** @ingroup func_group
52     \class ROL::DynamicObjective
53     \brief Defines the time-dependent objective function interface for simulation-based optimization.
54            Computes time-local contributions of value, gradient, Hessian-vector product etc to a
55            larger composite objective defined over the simulation time. In contrast to other
56            objective classes Objective_TimeSimOpt has a default implementation of value which
57            returns zero, as time-dependent simulation based optimization problems may have an
58            objective value which depends only on the final state of the system.
59 
60            Often in applications, the objective is separable into a state objective and a
61            control objective so the state-control cross terms in the Hessian are zero.
62 
63            A typical use case involves quadratic terms for the state and control,
64            such that all of the diagonal blocks of the Hessian are nonzero
65            and the off-diagonal blocks are zero.
66 
67 */
68 
69 namespace ROL {
70 
71 template<typename Real>
72 class DynamicObjective : public DynamicFunction<Real> {
73 public:
74 
75   using V  = Vector<Real>;
76   using TS = TimeStamp<Real>;
77 
78 
DynamicObjective(std::initializer_list<std::string> zero_deriv_terms={} )79   DynamicObjective( std::initializer_list<std::string> zero_deriv_terms={} ) :
80     DynamicFunction<Real>( zero_deriv_terms ) {}
81 
~DynamicObjective()82   virtual ~DynamicObjective() {}
83 
update(const V & uo,const V & un,const V & z,const TS & timeStamp)84   virtual void update( const V& uo, const V& un, const V& z, const TS& timeStamp ) {
85     update_uo( uo, timeStamp );
86     update_un( un, timeStamp );
87     update_z( z, timeStamp );
88   }
89 
90   using DynamicFunction<Real>::update_uo;
91   using DynamicFunction<Real>::update_un;
92   using DynamicFunction<Real>::update_z;
93 
94   virtual Real value( const V& uo, const V& un,
95                       const V& z, const TS& timeStamp ) const = 0;
96 
97   //----------------------------------------------------------------------------
98   // Gradient Terms
gradient_uo(V & g,const V & uo,const V & un,const V & z,const TS & timeStamp) const99   virtual void gradient_uo( V& g, const V& uo, const V& un,
100                             const V& z, const TS& timeStamp ) const {}
101 
gradient_un(V & g,const V & uo,const V & un,const V & z,const TS & timeStamp) const102   virtual void gradient_un( V& g, const V& uo, const V& un,
103                             const V& z, const TS& timeStamp ) const {}
104 
gradient_z(V & g,const V & uo,const V & un,const V & z,const TS & timeStamp) const105   virtual void gradient_z( V& g, const V& uo, const V& un,
106                            const V& z, const TS& timeStamp ) const {}
107 
108   //----------------------------------------------------------------------------
109   // Hessian-Vector product terms
hessVec_uo_uo(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const110   virtual void hessVec_uo_uo( V& hv, const V& v, const V& uo, const V& un,
111                               const V& z, const TS& timeStamp ) const {}
112 
hessVec_uo_un(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const113   virtual void hessVec_uo_un( V& hv, const V& v, const V& uo, const V& un,
114                               const V& z, const TS& timeStamp ) const {}
115 
hessVec_uo_z(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const116   virtual void hessVec_uo_z( V& hv, const V& v, const V& uo, const V& un,
117                              const V& z, const TS& timeStamp ) const {}
118 
119 
hessVec_un_uo(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const120   virtual void hessVec_un_uo( V& hv, const V& v, const V& uo, const V& un,
121                               const V& z, const TS& timeStamp ) const {}
122 
hessVec_un_un(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const123   virtual void hessVec_un_un( V& hv, const V& v, const V& uo, const V& un,
124                               const V& z, const TS& timeStamp ) const {}
125 
hessVec_un_z(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const126   virtual void hessVec_un_z( V& hv, const V& v, const V& uo, const V& un,
127                              const V& z, const TS& timeStamp ) const {}
128 
129 
hessVec_z_uo(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const130   virtual void hessVec_z_uo( V& hv, const V& v, const V& uo, const V& un,
131                               const V& z, const TS& timeStamp ) const {}
132 
hessVec_z_un(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const133   virtual void hessVec_z_un( V& hv, const V& v, const V& uo, const V& un,
134                               const V& z, const TS& timeStamp ) const {}
135 
hessVec_z_z(V & hv,const V & v,const V & uo,const V & un,const V & z,const TS & timeStamp) const136   virtual void hessVec_z_z( V& hv, const V& v, const V& uo, const V& un,
137                              const V& z, const TS& timeStamp ) const {}
138 };
139 
140 } // namespace ROL
141 
142 
143 #endif // ROL_DYNAMICOBJECTIVE_HPP
144 
145