46 #ifndef ROL_DYNAMICCONSTRAINT_HPP 47 #define ROL_DYNAMICCONSTRAINT_HPP 78 template<
typename Real>
83 Ptr<Vector<Real>>
jv_;
122 DEFAULT_rtol_ ( 1e0 ),
124 DEFAULT_factor_ ( 0.5 ),
125 DEFAULT_decr_ ( 1e-4 ),
126 DEFAULT_maxit_ ( 500 ),
127 DEFAULT_print_ ( false ),
128 DEFAULT_zero_ ( false ),
129 DEFAULT_solverType_ ( 0 ),
130 atol_ ( DEFAULT_atol_ ),
131 rtol_ ( DEFAULT_rtol_ ),
132 stol_ ( DEFAULT_stol_ ),
133 factor_ ( DEFAULT_factor_ ),
134 decr_ ( DEFAULT_decr_ ),
135 maxit_ ( DEFAULT_maxit_ ),
136 print_ ( DEFAULT_print_ ),
137 zero_ ( DEFAULT_zero_ ),
138 solverType_ ( DEFAULT_solverType_ ),
139 firstSolve_ ( true ) {}
141 virtual void update(
const V& uo,
const V& un,
const V& z,
const TS& ts ) {
151 virtual void value(
V& c,
const V& uo,
const V& un,
152 const V& z,
const TS& ts )
const = 0;
155 const V& z,
const TS& ts ) {
161 Real cnorm = c.
norm();
162 const Real ctol = std::min(atol_, rtol_*cnorm);
163 if (solverType_==0 || solverType_==3 || solverType_==4) {
169 Real alpha(1), tmp(0);
172 std::cout <<
"\n Default DynamicConstraint::solve\n";
174 std::cout << std::setw(6) << std::left <<
"iter";
175 std::cout << std::setw(15) << std::left <<
"rnorm";
176 std::cout << std::setw(15) << std::left <<
"alpha";
179 for (cnt = 0; cnt <
maxit_; ++cnt) {
183 unew_->axpy(-alpha, *jv_);
186 value(c,uo,*unew_,z,ts);
189 while ( tmp > (1.0-decr_*alpha)*cnorm &&
193 unew_->axpy(-alpha,*jv_);
196 value(c,uo,*unew_,z,ts);
201 std::cout << std::setw(6) << std::left << cnt;
202 std::cout << std::scientific << std::setprecision(6);
203 std::cout << std::setw(15) << std::left << tmp;
204 std::cout << std::scientific << std::setprecision(6);
205 std::cout << std::setw(15) << std::left << alpha;
218 if (solverType_==1 || (solverType_==3 && cnorm > ctol)) {
219 ROL::Ptr<DynamicConstraint<Real>> con_ptr = ROL::makePtrFromRef(*
this);
220 ROL::Ptr<const Vector<Real>> uo_ptr = ROL::makePtrFromRef(uo);
221 ROL::Ptr<const Vector<Real>> z_ptr = ROL::makePtrFromRef(z);
222 ROL::Ptr<const TimeStamp<Real>> ts_ptr = ROL::makePtrFromRef(ts);
223 ROL::Ptr<Objective<Real>> obj_ptr
224 = ROL::makePtr<NonlinearLeastSquaresObjective_Dynamic<Real>>(con_ptr,c,uo_ptr,z_ptr,ts_ptr,
true);
225 ROL::ParameterList parlist;
226 parlist.sublist(
"Status Test").set(
"Gradient Tolerance",ctol);
227 parlist.sublist(
"Status Test").set(
"Step Tolerance",stol_);
228 parlist.sublist(
"Status Test").set(
"Iteration Limit",maxit_);
229 parlist.sublist(
"Step").sublist(
"Trust Region").set(
"Subproblem Solver",
"Truncated CG");
230 parlist.sublist(
"General").sublist(
"Krylov").set(
"Iteration Limit",100);
231 ROL::Ptr<Algorithm<Real>> algo = ROL::makePtr<Algorithm<Real>>(
"Trust Region",parlist,
false);
232 algo->run(un,*obj_ptr,print_);
235 if (solverType_==2 || (solverType_==4 && cnorm > ctol)) {
236 ROL::Ptr<DynamicConstraint<Real>> con_ptr = ROL::makePtrFromRef(*
this);
237 ROL::Ptr<const Vector<Real>> uo_ptr = ROL::makePtrFromRef(uo);
238 ROL::Ptr<const Vector<Real>> z_ptr = ROL::makePtrFromRef(z);
239 ROL::Ptr<const TimeStamp<Real>> ts_ptr = ROL::makePtrFromRef(ts);
240 ROL::Ptr<Constraint<Real>> cn_ptr
241 = ROL::makePtr<Constraint_DynamicState<Real>>(con_ptr,uo_ptr,z_ptr,ts_ptr);
242 ROL::Ptr<Objective<Real>> obj_ptr
243 = ROL::makePtr<Objective_FSsolver<Real>>();
244 ROL::ParameterList parlist;
245 parlist.sublist(
"Status Test").set(
"Constraint Tolerance",ctol);
246 parlist.sublist(
"Status Test").set(
"Step Tolerance",stol_);
247 parlist.sublist(
"Status Test").set(
"Iteration Limit",maxit_);
248 ROL::Ptr<Algorithm<Real>> algo = ROL::makePtr<Algorithm<Real>>(
"Composite Step",parlist,
false);
249 ROL::Ptr<Vector<Real>> l = c.
dual().
clone();
250 algo->run(un,*l,*obj_ptr,*cn_ptr,print_);
253 if (solverType_ > 4 || solverType_ < 0) {
254 ROL_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
255 ">>> ERROR (ROL:DynamicConstraint:solve): Invalid solver type!");
280 ROL::ParameterList & list = parlist.sublist(
"Dynamic Constraint").sublist(
"Solve");
281 atol_ = list.get(
"Absolute Residual Tolerance", DEFAULT_atol_);
282 rtol_ = list.get(
"Relative Residual Tolerance", DEFAULT_rtol_);
283 maxit_ = list.get(
"Iteration Limit", DEFAULT_maxit_);
284 decr_ = list.get(
"Sufficient Decrease Tolerance", DEFAULT_decr_);
285 stol_ = list.get(
"Step Tolerance", DEFAULT_stol_);
286 factor_ = list.get(
"Backtracking Factor", DEFAULT_factor_);
287 print_ = list.get(
"Output Iteration History", DEFAULT_print_);
288 zero_ = list.get(
"Zero Initial Guess", DEFAULT_zero_);
289 solverType_ = list.get(
"Solver Type", DEFAULT_solverType_);
295 const V& un,
const V& z,
296 const TS& ts )
const {}
299 const V& un,
const V& z,
300 const TS& ts )
const {}
303 const V& un,
const V& z,
304 const TS& ts )
const {}
309 const V& un,
const V& z,
310 const TS& ts )
const {}
313 const V& un,
const V& z,
314 const TS& ts )
const {}
317 const V& un,
const V& z,
318 const TS& ts )
const {}
323 const V& un,
const V& z,
324 const TS& ts )
const {}
327 const V& un,
const V& z,
328 const TS& ts )
const {}
333 const V& uo,
const V& un,
334 const V& z,
const TS& ts )
const {
339 const V& uo,
const V& un,
340 const V& z,
const TS& ts )
const {
345 const V& uo,
const V& un,
346 const V& z,
const TS& ts )
const {
351 const V& uo,
const V& un,
352 const V& z,
const TS& ts )
const {
357 const V& uo,
const V& un,
358 const V& z,
const TS& ts )
const {
363 const V& uo,
const V& un,
364 const V& z,
const TS& ts )
const {
369 const V& uo,
const V& un,
370 const V& z,
const TS& ts )
const {
375 const V& uo,
const V& un,
376 const V& z,
const TS& ts )
const {
381 const V& uo,
const V& un,
382 const V& z,
const TS& ts )
const {
392 #endif // ROL_DYNAMICCONSTRAINT_HPP Ptr< Vector< Real > > jv_
virtual void update_un(const V &un, const TS &ts)
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
virtual void applyJacobian_z(V &jv, const V &vz, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void solve(V &c, const V &uo, V &un, const V &z, const TS &ts)
virtual void applyInverseJacobian_un(V &ijv, const V &vn, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyAdjointHessian_z_un(V &ahwv, const V &w, const V &vz, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyAdjointJacobian_un(V &ajv, const V &dualv, const V &uo, const V &un, const V &z, const TS &ts) const
Defines the time-dependent constraint operator interface for simulation-based optimization.
virtual void applyAdjointJacobian_uo(V &ajv, const V &dualv, const V &uo, const V &un, const V &z, const TS &ts) const
Defines the linear algebra of vector space on a generic partitioned vector.
Provides update interface, casting and vector management to DynamicConstraint and DynamicObjective...
Ptr< Vector< Real > > unew_
virtual void applyAdjointJacobian_z(V &ajv, const V &dualv, const V &uo, const V &un, const V &z, const TS &ts) const
Contains definitions of custom data types in ROL.
virtual void applyAdjointHessian_un_uo(V &ahwv, const V &w, const V &vn, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void update(const V &uo, const V &un, const V &z, const TS &ts)
Contains local time step information.
virtual void zero()
Set to zero vector.
Defines the linear algebra or vector space interface.
virtual void applyJacobian_un(V &jv, const V &vn, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void setSolveParameters(ROL::ParameterList &parlist)
Set solve parameters.
const int DEFAULT_solverType_
virtual void applyAdjointHessian_z_z(V &ahwv, const V &w, const V &vz, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyAdjointHessian_uo_un(V &ahwv, const V &w, const V &vo, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyAdjointHessian_un_un(V &ahwv, const V &wn, const V &vn, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void value(V &c, const V &uo, const V &un, const V &z, const TS &ts) const =0
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
virtual void update_z(const V &z, const TS &ts)
virtual void update_uo(const V &uo, const TS &ts)
virtual void applyAdjointHessian_uo_uo(V &ahwv, const V &w, const V &v, const V &uo, const V &un, const V &z, const TS &ts) const
const bool DEFAULT_print_
const Real DEFAULT_factor_
virtual void applyAdjointHessian_un_z(V &ahwv, const V &w, const V &vn, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyAdjointHessian_uo_z(V &ahwv, const V &w, const V &vo, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void set(const Vector &x)
Set where .
virtual ~DynamicConstraint()
virtual Real norm() const =0
Returns where .
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.
virtual void applyInverseAdjointJacobian_un(V &iajv, const V &vn, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyJacobian_uo(V &jv, const V &vo, const V &uo, const V &un, const V &z, const TS &ts) const
virtual void applyAdjointHessian_z_uo(V &ahwv, const V &w, const V &vz, const V &uo, const V &un, const V &z, const TS &ts) const