44 #ifndef ROL_QUADRATICPENALTY_H 45 #define ROL_QUADRATICPENALTY_H 51 #include "ROL_Ptr.hpp" 87 const ROL::Ptr<Constraint<Real> >
con_;
111 if ( !isConstraintComputed_ ) {
113 con_->value(*conValue_,x,tol); ncval_++;
114 isConstraintComputed_ =
true;
121 const Real penaltyParameter,
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();
141 con_->update(x,flag,iter);
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;
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);
182 if (HessianApprox_ < 3) {
183 con_->applyJacobian(*primalConVector_,v,x,tol);
184 con_->applyAdjointJacobian(hv,primalConVector_->
dual(),x,tol);
186 hv.
scale(cscale_*cscale_*penaltyParameter_);
189 hv.
scale(cscale_*cscale_);
192 if (HessianApprox_ == 1) {
194 primalMultiplierVector_->set(*multiplier_);
196 primalMultiplierVector_->scale(cscale_/penaltyParameter_);
199 primalMultiplierVector_->scale(cscale_);
201 con_->applyAdjointHessian(*dualOptVector_,*primalMultiplierVector_,v,x,tol);
202 hv.
plus(*dualOptVector_);
205 if (HessianApprox_ == 0) {
209 primalMultiplierVector_->set(conValue_->dual());
211 primalMultiplierVector_->scale(cscale_*cscale_);
212 primalMultiplierVector_->axpy(cscale_/penaltyParameter_,*multiplier_);
215 primalMultiplierVector_->scale(cscale_*cscale_*penaltyParameter_);
216 primalMultiplierVector_->axpy(cscale_,*multiplier_);
218 con_->applyAdjointHessian(*dualOptVector_,*primalMultiplierVector_,v,x,tol);
219 hv.
plus(*dualOptVector_);
229 Real tol = std::sqrt(ROL_EPSILON<Real>());
243 multiplier_->set(multiplier);
244 penaltyParameter_ = penaltyParameter;
Provides the interface to evaluate objective functions.
virtual void scale(const Real alpha)=0
Compute where .
virtual void reset(const Vector< Real > &multiplier, const Real penaltyParameter)
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
virtual void plus(const Vector &x)=0
Compute , where .
ROL::Ptr< Vector< Real > > primalConVector_
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)
Provides the interface to evaluate the quadratic constraint penalty.
Contains definitions of custom data types in ROL.
virtual void zero()
Set to zero vector.
Defines the linear algebra or vector space interface.
const ROL::Ptr< Constraint< Real > > con_
void evaluateConstraint(const Vector< Real > &x, Real &tol)
virtual void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
ROL::Ptr< Vector< Real > > multiplier_
virtual int getNumberConstraintEvaluations(void) const
virtual Real value(const Vector< Real > &x, Real &tol)
Compute value.
bool isConstraintComputed_
void setScaling(const Real cscale=1)
ROL::Ptr< Vector< Real > > conValue_
virtual void set(const Vector &x)
Set where .
virtual void update(const Vector< Real > &x, bool flag=true, int iter=-1)
Update objective function.
virtual void getConstraintVec(Vector< Real > &c, const Vector< Real > &x)
ROL::Ptr< Vector< Real > > primalMultiplierVector_
Defines the general constraint operator interface.
ROL::Ptr< Vector< Real > > dualOptVector_