45 #ifndef ROL_REDUCED_EQUALITYCONSTRAINT_SIMOPT_H 46 #define ROL_REDUCED_EQUALITYCONSTRAINT_SIMOPT_H 56 const Teuchos::RCP<EqualityConstraint_SimOpt<Real> >
conVal_;
57 const Teuchos::RCP<EqualityConstraint_SimOpt<Real> >
conRed_;
83 bool isComputed =
false;
88 if (!isComputed || !storage_) {
90 conRed_->update_2(z,updateFlag_,updateIter_);
92 conRed_->solve(*dualadjoint_,*state_,z,tol);
94 conRed_->update_1(*state_,updateFlag_,updateIter_);
96 conVal_->update(*state_,z,updateFlag_,updateIter_);
110 bool isComputed =
false;
115 if (!isComputed || !storage_) {
117 conVal_->applyAdjointJacobian_1(*dualstate_,w,*state_,z,tol);
119 conRed_->applyInverseAdjointJacobian_1(*adjoint_,*dualstate_,*state_,z,tol);
120 adjoint_->scale(static_cast<Real>(-1));
134 conRed_->applyJacobian_2(*dualadjoint_,v,*state_,z,tol);
135 dualadjoint_->scale(static_cast<Real>(-1));
136 conRed_->applyInverseJacobian_1(*state_sens_,*dualadjoint_,*state_,z,tol);
148 conVal_->applyAdjointHessian_11(*dualstate_,w,*state_sens_,*state_,z,tol);
149 conVal_->applyAdjointHessian_12(*dualstate1_,w,v,*state_,z,tol);
150 dualstate_->plus(*dualstate1_);
152 conRed_->applyAdjointHessian_11(*dualstate1_,*adjoint_,*state_sens_,*state_,z,tol);
153 dualstate_->plus(*dualstate1_);
154 conRed_->applyAdjointHessian_21(*dualstate1_,*adjoint_,v,*state_,z,tol);
155 dualstate_->plus(*dualstate1_);
157 dualstate_->scale(static_cast<Real>(-1));
158 conRed_->applyInverseAdjointJacobian_1(*adjoint_sens_,*dualstate_,*state_,z,tol);
181 const bool storage =
true,
182 const bool useFDhessVec =
false)
183 : conVal_(conVal), conRed_(conRed), stateStore_(stateStore),
184 storage_(storage), useFDhessVec_(useFDhessVec),
185 updateFlag_(true), updateIter_(0) {
187 state_ = state->clone();
188 adjoint_ = adjoint->clone();
189 residual_ = residual->clone();
190 state_sens_ = state->clone();
191 adjoint_sens_ = adjoint->clone();
192 dualstate_ = state->dual().clone();
193 dualstate1_ = state->dual().clone();
194 dualadjoint_ = adjoint->dual().clone();
195 dualcontrol_ = control->dual().clone();
196 dualresidual_ = residual->dual().clone();
225 const bool storage =
true,
226 const bool useFDhessVec =
false)
227 : conVal_(conVal), conRed_(conRed), stateStore_(stateStore),
228 storage_(storage), useFDhessVec_(useFDhessVec),
229 updateFlag_(true), updateIter_(0) {
231 state_ = state->clone();
232 adjoint_ = adjoint->clone();
233 residual_ = residual->clone();
234 state_sens_ = state->clone();
235 adjoint_sens_ = adjoint->clone();
236 dualstate_ = dualstate->clone();
237 dualstate1_ = dualstate->clone();
238 dualadjoint_ = dualadjoint->clone();
239 dualcontrol_ = dualcontrol->clone();
240 dualresidual_ = dualresidual->clone();
248 stateStore_->equalityConstraintUpdate(
true);
249 adjointStore_->equalityConstraintUpdate(flag);
260 conVal_->value(c,*state_,z,tol);
275 conVal_->applyJacobian_1(*residual_,*state_sens_,*state_,z,tol);
277 conVal_->applyJacobian_2(jv,v,*state_,z,tol);
288 conVal_->applyAdjointJacobian_2(*dualcontrol_,w,*state_,z,tol);
290 conRed_->applyAdjointJacobian_2(ajw,*adjoint_,*state_,z,tol);
291 ajw.
plus(*dualcontrol_);
300 if ( useFDhessVec_ ) {
313 conRed_->applyAdjointJacobian_2(ahwv,*adjoint_sens_,*state_,z,tol);
314 conVal_->applyAdjointHessian_21(*dualcontrol_,w,*state_sens_,*state_,z,tol);
315 ahwv.
plus(*dualcontrol_);
316 conVal_->applyAdjointHessian_22(*dualcontrol_,w,v,*state_,z,tol);
317 ahwv.
plus(*dualcontrol_);
318 conRed_->applyAdjointHessian_12(*dualcontrol_,*adjoint_,*state_sens_,*state_,z,tol);
319 ahwv.
plus(*dualcontrol_);
320 conRed_->applyAdjointHessian_22(*dualcontrol_,*adjoint_,v,*state_,z,tol);
321 ahwv.
plus(*dualcontrol_);
329 conVal_->setParameter(param);
330 conRed_->setParameter(param);
virtual void plus(const Vector &x)=0
Compute , where .
Teuchos::RCP< Vector< Real > > dualstate1_
void solve_adjoint_sensitivity(const Vector< Real > &w, const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Given , the adjoint variable , and a direction , solve the adjoint sensitvity equation for ...
const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > conRed_
virtual void setParameter(const std::vector< Real > ¶m)
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 ...
Teuchos::RCP< SimController< Real > > adjointStore_
Reduced_EqualityConstraint_SimOpt(const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &conVal, const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &conRed, 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 > > &residual, const Teuchos::RCP< Vector< Real > > &dualstate, const Teuchos::RCP< Vector< Real > > &dualcontrol, const Teuchos::RCP< Vector< Real > > &dualadjoint, const Teuchos::RCP< Vector< Real > > &dualresidual, const bool storage=true, const bool useFDhessVec=false)
Secondary, general constructor for use with dual optimization vector spaces where the user does not d...
Defines the linear algebra or vector space interface.
void solve_adjoint_equation(const Vector< Real > &w, const Vector< Real > &z, Real &tol)
Given which solves the state equation, solve the adjoint equation for .
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 > > dualresidual_
Teuchos::RCP< Vector< Real > > dualadjoint_
Teuchos::RCP< Vector< Real > > state_sens_
Defines the equality constraint operator interface.
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 ...
const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > conVal_
Teuchos::RCP< Vector< Real > > adjoint_
Teuchos::RCP< Vector< Real > > state_
void solve_state_equation(const Vector< Real > &z, Real &tol)
Teuchos::RCP< Vector< Real > > dualcontrol_
Teuchos::RCP< Vector< Real > > adjoint_sens_
void applyAdjointJacobian(Vector< Real > &ajw, const Vector< Real > &w, const Vector< Real > &z, Real &tol)
Apply the adjoint of the the constraint Jacobian at , , to vector .
Teuchos::RCP< Vector< Real > > dualstate_
void value(Vector< Real > &c, const Vector< Real > &z, Real &tol)
Given , evaluate the equality constraint where solves .
void applyJacobian(Vector< Real > &jv, const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Given , apply the Jacobian to a vector where solves .
void applyAdjointHessian(Vector< Real > &ahwv, const Vector< Real > &w, const Vector< Real > &v, const Vector< Real > &z, Real &tol)
Given , evaluate the Hessian of the objective function in the direction .
Reduced_EqualityConstraint_SimOpt(const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &conVal, const Teuchos::RCP< EqualityConstraint_SimOpt< Real > > &conRed, 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 > > &residual, const bool storage=true, const bool useFDhessVec=false)
Constructor.
Teuchos::RCP< Vector< Real > > residual_
const Teuchos::RCP< SimController< Real > > stateStore_
void setParameter(const std::vector< Real > ¶m)