44#ifndef ROL_AUGMENTEDLAGRANGIANOBJECTIVE_H
45#define ROL_AUGMENTEDLAGRANGIANOBJECTIVE_H
90 const Ptr<Objective<Real>>
obj_;
91 const Ptr<Constraint<Real>>
con_;
102 Ptr<ScalarController<Real,int>>
fval_;
121 const Ptr<Constraint<Real>> &con,
122 const Real penaltyParameter,
123 const Vector<Real> &dualOptVec,
124 const Vector<Real> &primConVec,
125 const Vector<Real> &dualConVec,
126 ParameterList &parlist)
127 :
obj_(obj),
con_(con), penaltyParameter_(penaltyParameter),
128 fscale_(1), cscale_(1), nfval_(0), ngval_(0), ncval_(0) {
130 fval_ = makePtr<ScalarController<Real,int>>();
131 gradient_ = makePtr<VectorController<Real,int>>();
132 conValue_ = makePtr<VectorController<Real,int>>();
134 multiplier_ = dualConVec.clone();
135 dualOptVector_ = dualOptVec.clone();
136 dualConVector_ = dualConVec.clone();
137 primConVector_ = primConVec.clone();
139 ParameterList& sublist = parlist.sublist(
"Step").sublist(
"Augmented Lagrangian");
140 scaleLagrangian_ = sublist.get(
"Use Scaled Augmented Lagrangian",
false);
141 HessianApprox_ = sublist.get(
"Level of Hessian Approximation", 0);
145 const Ptr<Constraint<Real>> &con,
146 const Real penaltyParameter,
147 const Vector<Real> &dualOptVec,
148 const Vector<Real> &primConVec,
149 const Vector<Real> &dualConVec,
150 const bool scaleLagrangian,
151 const int HessianApprox)
152 :
obj_(obj),
con_(con), penaltyParameter_(penaltyParameter),
153 fscale_(1), cscale_(1), nfval_(0), ngval_(0), ncval_(0),
154 scaleLagrangian_(scaleLagrangian), HessianApprox_(HessianApprox) {
156 fval_ = makePtr<ScalarController<Real,int>>();
157 gradient_ = makePtr<VectorController<Real,int>>();
158 conValue_ = makePtr<VectorController<Real,int>>();
160 multiplier_ = dualConVec.clone();
161 dualOptVector_ = dualOptVec.clone();
162 dualConVector_ = dualConVec.clone();
163 primConVector_ = primConVec.clone();
169 fval_->objectiveUpdate(
type);
170 gradient_->objectiveUpdate(
type);
171 conValue_->objectiveUpdate(
type);
174 void setScaling(
const Real fscale = 1.0,
const Real cscale = 1.0) {
179 Real
value(
const Vector<Real> &x, Real &tol ) {
184 const Real half(0.5);
185 primConVector_->set(multiplier_->dual());
186 primConVector_->axpy(half*cscale_*penaltyParameter_,*
getConstraintVec(x,tol));
189 if (scaleLagrangian_) {
190 val /= penaltyParameter_;
195 void gradient( Vector<Real> &g,
const Vector<Real> &x, Real &tol ) {
200 dualConVector_->set(*multiplier_);
201 dualConVector_->axpy(cscale_*penaltyParameter_,
getConstraintVec(x,tol)->dual());
202 con_->applyAdjointJacobian(*dualOptVector_,*dualConVector_,x,tol);
203 g.axpy(cscale_,*dualOptVector_);
205 if ( scaleLagrangian_ ) {
207 g.scale(one/penaltyParameter_);
211 void hessVec( Vector<Real> &hv,
const Vector<Real> &v,
const Vector<Real> &x, Real &tol ) {
213 obj_->hessVec(hv,v,x,tol);
216 if (HessianApprox_ < 3) {
217 con_->applyJacobian(*primConVector_,v,x,tol);
218 con_->applyAdjointJacobian(*dualOptVector_,primConVector_->dual(),x,tol);
219 hv.axpy(cscale_*cscale_*penaltyParameter_,*dualOptVector_);
220 if (HessianApprox_ == 1) {
221 dualConVector_->set(*multiplier_);
222 con_->applyAdjointHessian(*dualOptVector_,*dualConVector_,v,x,tol);
223 hv.axpy(cscale_,*dualOptVector_);
225 if (HessianApprox_ == 0) {
226 dualConVector_->set(*multiplier_);
227 dualConVector_->axpy(cscale_*penaltyParameter_,
getConstraintVec(x,tol)->dual());
228 con_->applyAdjointHessian(*dualOptVector_,*dualConVector_,v,x,tol);
229 hv.axpy(cscale_,*dualOptVector_);
236 if ( scaleLagrangian_ ) {
237 hv.scale(
static_cast<Real
>(1)/penaltyParameter_);
245 bool isComputed = fval_->get(val,key);
247 val =
obj_->value(x,tol); nfval_++;
256 if (!gradient_->isComputed(key)) {
257 if (gradient_->isNull(key)) gradient_->allocate(*dualOptVector_,key);
258 obj_->gradient(*gradient_->set(key),x,tol); ngval_++;
260 return gradient_->get(key);
266 if (!conValue_->isComputed(key)) {
267 if (conValue_->isNull(key)) conValue_->allocate(*primConVector_,key);
268 con_->value(*conValue_->set(key),x,tol); ncval_++;
270 return conValue_->get(key);
289 void reset(
const Vector<Real> &multiplier,
const Real penaltyParameter) {
290 nfval_ = 0; ngval_ = 0; ncval_ = 0;
291 multiplier_->set(multiplier);
292 penaltyParameter_ = penaltyParameter;
const Ptr< Constraint_SimOpt< Real > > con_
Contains definitions of custom data types in ROL.
Provides the interface to evaluate the augmented Lagrangian.
void update(const Vector< Real > &x, UpdateType type, int iter=-1)
Ptr< VectorController< Real, int > > conValue_
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
void setScaling(const Real fscale=1.0, const Real cscale=1.0)
const Ptr< const Vector< Real > > getConstraintVec(const Vector< Real > &x, Real &tol)
Ptr< Vector< Real > > primConVector_
int getNumberConstraintEvaluations(void) const
const Ptr< const Vector< Real > > getObjectiveGradient(const Vector< Real > &x, Real &tol)
const Ptr< Objective< Real > > obj_
const Ptr< Constraint< Real > > con_
Ptr< Vector< Real > > dualOptVector_
AugmentedLagrangianObjective(const Ptr< Objective< Real > > &obj, const Ptr< Constraint< Real > > &con, const Real penaltyParameter, const Vector< Real > &dualOptVec, const Vector< Real > &primConVec, const Vector< Real > &dualConVec, const bool scaleLagrangian, const int HessianApprox)
Real getObjectiveValue(const Vector< Real > &x, Real &tol)
Ptr< Vector< Real > > multiplier_
Real value(const Vector< Real > &x, Real &tol)
void reset(const Vector< Real > &multiplier, const Real penaltyParameter)
int getNumberFunctionEvaluations(void) const
int getNumberGradientEvaluations(void) const
Ptr< ScalarController< Real, int > > fval_
Ptr< Vector< Real > > dualConVector_
AugmentedLagrangianObjective(const Ptr< Objective< Real > > &obj, const Ptr< Constraint< Real > > &con, const Real penaltyParameter, const Vector< Real > &dualOptVec, const Vector< Real > &primConVec, const Vector< Real > &dualConVec, ParameterList &parlist)
Ptr< VectorController< Real, int > > gradient_