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