120 const Vector<Real> &multiplier,
121 const Real penaltyParameter,
122 const Vector<Real> &optVec,
123 const Vector<Real> &conVec,
124 const bool useScaling =
false,
125 const int HessianApprox = 0 )
126 :
con_(con), penaltyParameter_(penaltyParameter), cscale_(1), ncval_(0),
127 useScaling_(useScaling), HessianApprox_(HessianApprox), isConstraintComputed_(false) {
129 dualOptVector_ = optVec.dual().clone();
130 primalConVector_ = conVec.clone();
131 conValue_ = conVec.clone();
132 multiplier_ = multiplier.clone();
133 primalMultiplierVector_ = multiplier.clone();
145 virtual Real
value(
const Vector<Real> &x, Real &tol ) {
149 Real cval = cscale_*multiplier_->dot(conValue_->dual());
151 Real pval = cscale_*cscale_*conValue_->dot(*conValue_);
153 const Real half(0.5);
156 val = cval/penaltyParameter_ + half*pval;
159 val = cval + half*penaltyParameter_*pval;
164 virtual void gradient( Vector<Real> &g,
const Vector<Real> &x, Real &tol ) {
168 primalMultiplierVector_->set(conValue_->dual());
170 primalMultiplierVector_->scale(cscale_*cscale_);
171 primalMultiplierVector_->axpy(cscale_/penaltyParameter_,*multiplier_);
174 primalMultiplierVector_->scale(cscale_*cscale_*penaltyParameter_);
175 primalMultiplierVector_->axpy(cscale_,*multiplier_);
177 con_->applyAdjointJacobian(g,*primalMultiplierVector_,x,tol);
180 virtual void hessVec( Vector<Real> &hv,
const Vector<Real> &v,
const Vector<Real> &x, Real &tol ) {
182 if (HessianApprox_ < 3) {
184 con_->applyJacobian(*primalConVector_,v,x,tol);
185 con_->applyAdjointJacobian(hv,primalConVector_->dual(),x,tol);
187 hv.scale(cscale_*cscale_*penaltyParameter_);
190 hv.scale(cscale_*cscale_);
193 if (HessianApprox_ == 1) {
195 primalMultiplierVector_->set(*multiplier_);
197 primalMultiplierVector_->scale(cscale_/penaltyParameter_);
200 primalMultiplierVector_->scale(cscale_);
202 con_->applyAdjointHessian(*dualOptVector_,*primalMultiplierVector_,v,x,tol);
203 hv.plus(*dualOptVector_);
206 if (HessianApprox_ == 0) {
210 primalMultiplierVector_->set(conValue_->dual());
212 primalMultiplierVector_->scale(cscale_*cscale_);
213 primalMultiplierVector_->axpy(cscale_/penaltyParameter_,*multiplier_);
216 primalMultiplierVector_->scale(cscale_*cscale_*penaltyParameter_);
217 primalMultiplierVector_->axpy(cscale_,*multiplier_);
219 con_->applyAdjointHessian(*dualOptVector_,*primalMultiplierVector_,v,x,tol);
220 hv.plus(*dualOptVector_);
QuadraticPenalty(const ROL::Ptr< Constraint< Real > > &con, const Vector< Real > &multiplier, const Real penaltyParameter, const Vector< Real > &optVec, const Vector< Real > &conVec, const bool useScaling=false, const int HessianApprox=0)