45 #ifndef ROL_REDUCED_OBJECTIVE_SIMOPT_H 46 #define ROL_REDUCED_OBJECTIVE_SIMOPT_H 57 const Teuchos::RCP<Objective_SimOpt<Real> >
obj_;
58 const Teuchos::RCP<EqualityConstraint_SimOpt<Real> >
con_;
82 bool isComputed =
false;
87 if (!isComputed || !storage_) {
89 con_->update_2(z,updateFlag_,updateIter_);
91 con_->solve(*dualadjoint_,*state_,z,tol);
93 con_->update_1(*state_,updateFlag_,updateIter_);
95 obj_->update(*state_,z,updateFlag_,updateIter_);
109 bool isComputed =
false;
114 if (!isComputed || !storage_) {
116 obj_->gradient_1(*dualstate_,*state_,z,tol);
118 con_->applyInverseAdjointJacobian_1(*adjoint_,*dualstate_,*state_,z,tol);
119 adjoint_->scale(static_cast<Real>(-1));
133 con_->applyJacobian_2(*dualadjoint_,v,*state_,z,tol);
134 dualadjoint_->scale(static_cast<Real>(-1));
135 con_->applyInverseJacobian_1(*state_sens_,*dualadjoint_,*state_,z,tol);
147 obj_->hessVec_11(*dualstate_,*state_sens_,*state_,z,tol);
148 obj_->hessVec_12(*dualstate1_,v,*state_,z,tol);
149 dualstate_->plus(*dualstate1_);
151 con_->applyAdjointHessian_11(*dualstate1_,*adjoint_,*state_sens_,*state_,z,tol);
152 dualstate_->plus(*dualstate1_);
153 con_->applyAdjointHessian_21(*dualstate1_,*adjoint_,v,*state_,z,tol);
154 dualstate_->plus(*dualstate1_);
156 dualstate_->scale(static_cast<Real>(-1));
157 con_->applyInverseAdjointJacobian_1(*adjoint_sens_,*dualstate_,*state_,z,tol);
177 const bool storage =
true,
178 const bool useFDhessVec =
false)
179 : obj_(obj), con_(con),
180 storage_(storage), useFDhessVec_(useFDhessVec),
181 updateFlag_(true), updateIter_(0) {
184 state_ = state->clone();
185 adjoint_ = adjoint->clone();
186 state_sens_ = state->clone();
187 adjoint_sens_ = adjoint->clone();
188 dualstate_ = state->dual().clone();
189 dualstate1_ = state->dual().clone();
190 dualadjoint_ = adjoint->dual().clone();
191 dualcontrol_ = control->dual().clone();
216 const bool storage =
true,
217 const bool useFDhessVec =
false)
218 : obj_(obj), con_(con),
219 storage_(storage), useFDhessVec_(useFDhessVec),
220 updateFlag_(true), updateIter_(0) {
223 state_ = state->clone();
224 adjoint_ = adjoint->clone();
225 state_sens_ = state->clone();
226 adjoint_sens_ = adjoint->clone();
227 dualstate_ = dualstate->clone();
228 dualstate1_ = dualstate->clone();
229 dualadjoint_ = dualadjoint->clone();
230 dualcontrol_ = dualcontrol->clone();
251 const bool storage =
true,
252 const bool useFDhessVec =
false)
253 : obj_(obj), con_(con), stateStore_(stateStore),
254 storage_(storage), useFDhessVec_(useFDhessVec),
255 updateFlag_(true), updateIter_(0) {
257 state_ = state->clone();
258 adjoint_ = adjoint->clone();
259 state_sens_ = state->clone();
260 adjoint_sens_ = adjoint->clone();
261 dualstate_ = state->dual().clone();
262 dualstate1_ = state->dual().clone();
263 dualadjoint_ = adjoint->dual().clone();
264 dualcontrol_ = control->dual().clone();
291 const bool storage =
true,
292 const bool useFDhessVec =
false)
293 : obj_(obj), con_(con), stateStore_(stateStore),
294 storage_(storage), useFDhessVec_(useFDhessVec),
295 updateFlag_(true), updateIter_(0) {
297 state_ = state->clone();
298 adjoint_ = adjoint->clone();
299 state_sens_ = state->clone();
300 adjoint_sens_ = adjoint->clone();
301 dualstate_ = dualstate->clone();
302 dualstate1_ = dualstate->clone();
303 dualadjoint_ = dualadjoint->clone();
304 dualcontrol_ = dualcontrol->clone();
312 stateStore_->objectiveUpdate(
true);
313 adjointStore_->objectiveUpdate(flag);
324 return obj_->value(*state_,z,tol);
338 obj_->gradient_2(*dualcontrol_,*state_,z,tol);
340 con_->applyAdjointJacobian_2(g,*adjoint_,*state_,z,tol);
341 g.
plus(*dualcontrol_);
348 if ( useFDhessVec_ ) {
361 con_->applyAdjointJacobian_2(hv,*adjoint_sens_,*state_,z,tol);
362 obj_->hessVec_21(*dualcontrol_,*state_sens_,*state_,z,tol);
363 hv.
plus(*dualcontrol_);
364 obj_->hessVec_22(*dualcontrol_,v,*state_,z,tol);
365 hv.
plus(*dualcontrol_);
366 con_->applyAdjointHessian_12(*dualcontrol_,*adjoint_,*state_sens_,*state_,z,tol);
367 hv.
plus(*dualcontrol_);
368 con_->applyAdjointHessian_22(*dualcontrol_,*adjoint_,v,*state_,z,tol);
369 hv.
plus(*dualcontrol_);
383 con_->setParameter(param);
384 obj_->setParameter(param);
Provides the interface to evaluate objective functions.
Provides the interface to evaluate simulation-based objective functions.
virtual void precond(Vector< Real > &Pv, const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Apply a reduced Hessian preconditioner.
virtual void plus(const Vector &x)=0
Compute , where .
Teuchos::RCP< SimController< Real > > adjointStore_
Reduced_Objective_SimOpt(const Teuchos::RCP< Objective_SimOpt< Real > > &obj, const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &con, const Teuchos::RCP< Vector< Real > > &state, const Teuchos::RCP< Vector< Real > > &control, const Teuchos::RCP< Vector< Real > > &adjoint, const Teuchos::RCP< Vector< Real > > &dualstate, const Teuchos::RCP< Vector< Real > > &dualcontrol, const Teuchos::RCP< Vector< Real > > &dualadjoint, const bool storage=true, const bool useFDhessVec=false)
Secondary, general constructor for use with dual optimization vector spaces where the user does not d...
void setParameter(const std::vector< Real > ¶m)
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
Teuchos::RCP< Vector< Real > > state_
Teuchos::RCP< Vector< Real > > adjoint_sens_
Teuchos::RCP< Vector< Real > > state_sens_
void solve_state_equation(const Vector< Real > &z, Real &tol)
Defines the linear algebra or vector space interface.
Defines the equality constraint operator interface for simulation-based optimization.
void update(const Vector< Real > &z, bool flag=true, int iter=-1)
Update the SimOpt objective function and equality constraint.
Teuchos::RCP< Vector< Real > > adjoint_
void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Given , evaluate the Hessian of the objective function in the direction .
void solve_adjoint_sensitivity(const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Given , the adjoint variable , and a direction , solve the adjoint sensitvity equation for ...
void gradient(Vector< Real > &g, const Vector< Real > &z, Real &tol)
Given , evaluate the gradient of the objective function where solves .
Teuchos::RCP< Vector< Real > > dualstate_
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
Reduced_Objective_SimOpt(const Teuchos::RCP< Objective_SimOpt< Real > > &obj, const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &con, const Teuchos::RCP< SimController< Real > > &stateStore, const Teuchos::RCP< Vector< Real > > &state, const Teuchos::RCP< Vector< Real > > &control, const Teuchos::RCP< Vector< Real > > &adjoint, const bool storage=true, const bool useFDhessVec=false)
Constructor.
Real value(const Vector< Real > &z, Real &tol)
Given , evaluate the objective function where solves .
void solve_adjoint_equation(const Vector< Real > &z, Real &tol)
Given which solves the state equation, solve the adjoint equation for .
virtual void setParameter(const std::vector< Real > ¶m)
const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > con_
Teuchos::RCP< Vector< Real > > dualcontrol_
Reduced_Objective_SimOpt(const Teuchos::RCP< Objective_SimOpt< Real > > &obj, const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &con, const Teuchos::RCP< Vector< Real > > &state, const Teuchos::RCP< Vector< Real > > &control, const Teuchos::RCP< Vector< Real > > &adjoint, const bool storage=true, const bool useFDhessVec=false)
Constructor.
virtual void set(const Vector &x)
Set where .
const Teuchos::RCP< Objective_SimOpt< Real > > obj_
void solve_state_sensitivity(const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Given which solves the state equation and a direction , solve the state senstivity equation for ...
Reduced_Objective_SimOpt(const Teuchos::RCP< Objective_SimOpt< Real > > &obj, const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &con, const Teuchos::RCP< SimController< Real > > &stateStore, const Teuchos::RCP< Vector< Real > > &state, const Teuchos::RCP< Vector< Real > > &control, const Teuchos::RCP< Vector< Real > > &adjoint, const Teuchos::RCP< Vector< Real > > &dualstate, const Teuchos::RCP< Vector< Real > > &dualcontrol, const Teuchos::RCP< Vector< Real > > &dualadjoint, const bool storage=true, const bool useFDhessVec=false)
Secondary, general constructor for use with dual optimization vector spaces where the user does not d...
Teuchos::RCP< Vector< Real > > dualstate1_
Teuchos::RCP< Vector< Real > > dualadjoint_
Teuchos::RCP< SimController< Real > > stateStore_