46#ifndef ROL_CONSTRAINT_SERIALSIMOPT_HPP
47#define ROL_CONSTRAINT_SERIALSIMOPT_HPP
78template<
typename Real>
100 const V&
partition(
const V& x )
const {
return static_cast<const PV&
>(x); }
110 u0_->zero(); z0_->zero();
121 virtual void value(
V& c,
const V& u,
const V& z, Real& tol )
override {
128 con_->value( *(cp.get(0)), *
ui_, *(zp.get(0)), tol );
131 con_->value( *(cp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)), tol );
135 virtual void solve(
V& c,
V& u,
const V& z, Real& tol )
override {
142 con_->solve( *(cp.get(0)), *
ui_, *(zp.get(0)), tol );
145 con_->solve( *(cp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)), tol );
149 virtual void applyJacobian_1(
V& jv,
const V& v,
const V& u,
const V& z, Real& tol )
override {
156 con_->applyJacobian_1_new( *(jvp.get(0)), *(vp.get(0)), *u0_, *(up.get(0)), *(zp.get(0)), tol );
159 con_->applyJacobian_1_new( *(jvp.get(k)), *(vp.get(k)), *(up.get(k)), *(up.get(k-1)), *(zp.get(k)), tol );
160 con_->applyJacobian_1_old( *tmp, *(vp.get(k)), *(up.get(k)), *(up.get(k-1)), *(zp.get(k)), tol );
165 virtual void applyJacobian_2(
V& jv,
const V& v,
const V& u,
const V& z, Real& tol)
override {
171 con_->applyJacobian_2( *(jvp.get(k)), *(vp.get(k)), *(up.get(k)), *(up.get(k-1)), *(zp.get(k)), tol );
176 virtual void applyInverseJacobian_1(
V& ijv,
const V& v,
const V& u,
177 const V& z, Real& tol )
override {
183 con_->applyInverseJacobian_1_new( *(ijvp.get(0)), *(vp.get(0), *u0_, *(up.get(0)), *(zp.get(0)), tol );
185 auto tmp = workspace.clone( vp.get(0) );
189 con_->applyJacobian_1_old( *tmp, *(ijvp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)), tol );
191 tmp->plus( *(vp.get(k) );
193 con_->applyInverseJacobian_1_new( *(ijvp.get(k)), *tmp, *(up.get(k-1)), *(up.get(k)), *(zp.get(k)), tol );
199 virtual void applyAdjointJacobian_1(
V& ajv,
const V& v,
const V& u,
200 const V& z, Real& tol)
override {
205 auto tmp = workspace.clone( ajvp.get(0) );
210 con_->applyAdjointJacobian_1_new( *(ajvp.get(0)), *(vp.get(0)), *u0_, *(up.get(0)), *(zp.get(0)) );
211 con_->applyAdjointJacobian_1_old( *(ajvp.get(0)), *(vp.get(1)), *u0_, *(up.get(0)), *(zp.get(0)) );
214 con_->applyAdjointJacobian_1_new( *(ajvp.get(k)), *(vp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)) );
215 con_->applyAdjointJacobian_1_old( *tmp, *(vp.get(k+1)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)) );
220 con_->applyAdjointJacobian_1_new( *(ajvp.get(k)), *(vp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)) );
226 virtual void applyAdjointJacobian_1(
V& ajv,
const V& v,
const V& u,
const V &z,
227 const V& dualv, Real& tol)
override {
231 auto tmp = workspace.clone( ajvp.get(0) );
236 con_->applyAdjointJacobian_1_new( *(ajvp.get(0)), *(vp.get(0)), *u0_, *(up.get(0)), *(zp.get(0)) );
237 con_->applyAdjointJacobian_1_old( *(ajvp.get(0)), *(vp.get(1)), *u0_, *(up.get(0)), *(zp.get(0)) );
240 con_->applyAdjointJacobian_1_new( *(ajvp.get(k)), *(vp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)) );
241 con_->applyAdjointJacobian_1_old( *tmp, *(vp.get(k+1)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)) );
246 con_->applyAdjointJacobian_1_new( *(ajvp.get(k)), *(vp.get(k)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)) );
252 virtual void applyAdjointJacobian_2(
V& ajv,
const V& v,
const V& u,
253 const V& z, Real& tol)
override {
258 con_->applyAdjointJacobian_2_time( *(jvp.get(k)), *(vp.get(k)), *(up.get(k)), *(up.get(k-1)), *(zp.get(k)), tol );
263 virtual void applyAdjointJacobian_2(
V& ajv,
const V& v,
const V& u,
const V& z,
264 const V& dualv, Real& tol)
override {
270 con_->applyAdjointJacobian_2_time( *(jvp.get(k)), *(vp.get(k)), *(up.get(k)), *(up.get(k-1)), *(zp.get(k)), tol );
275 virtual void applyInverseAdjointJacobian_1(
V& iajv,
const V& v,
const V& u,
276 const V& z, Real& tol)
override {
284 con_->applyInverseAdjointJacobian_1_new( *(iajvp.get(N)), *(vp.get(N)), *(up.get(N-1)), *(up.get(N)), *(zp.get(N)), tol );
289 con_->applyAdjointJacobian_1_old( *tmp, *(iajvp.get(k+1)), *(up.get(k-1)), *(up.get(k)), *(zp.get(k)), tol );
292 tmp->plus( *(vp.get(k) );
294 con_->applyAdjointJacobian_1_new( *(iajvp.get(k)), *tmp, *(up.get(k-1)), *(up.get(k)), *(zp.get(k)), tol );
298 con_->applyAdjointJacobian_1_old( *tmp, *(iajvp.get(1)), *u0_, *(up.get(0)), *(zp.get(0)), tol );
301 tmp->plus( *(vp.get(0) );
303 con_->applyAdjointJacobian_1_new( *(iajvp.get(0)), *tmp, *u0_, *(up.get(0)), *(zp.get(0)), tol );
307 virtual void applyAdjointHessian_11(
V& ahwv,
const V& w,
const V& v,
308 const V& u,
const V& z, Real& tol)
override {
313 virtual void applyAdjointHessian_11(
V& ahwv,
const V& w,
const V& v,
314 const V& u,
const V& z, Real& tol)
override {
318 virtual void applyAdjointHessian_11(
V& ahwv,
const V& w,
const V& v,
319 const V& u,
const V& z, Real& tol)
override {
323 virtual void applyAdjointHessian_11(
V& ahwv,
const V& w,
const V& v,
324 const V& u,
const V& z, Real& tol)
override {
PartitionedVector< Real > PV
VectorWorkspace< Real > workspace_
PV & partition(V &x) const
virtual void solve(Vector< Real > &c, Vector< Real > &u, const Vector< Real > &z) override
virtual Real value(const Vector< Real > &u_old, const Vector< Real > &u_new, const Vector< Real > &z, Real &tol)
Compute contribution to objective value from this time step.
Unifies the constraint defined on a single time step that are defined through the Constraint_TimeSimO...
Defines the time dependent constraint operator interface for simulation-based optimization.
Defines the linear algebra of vector space on a generic partitioned vector.
size_type numVectors() const
const Ptr< Constraint< Real > > con_
const Ptr< Constraint< Real > > con_
ROL::Ptr< V > clone() const
Clone to make a new (uninitialized) vector.
virtual void zero()
Set to zero vector.