44 #ifndef ROL_MOREAUYOSIDAPENALTY_H 45 #define ROL_MOREAUYOSIDAPENALTY_H 51 #include "ROL_Ptr.hpp" 67 const ROL::Ptr<Objective<Real> >
obj_;
68 const ROL::Ptr<BoundConstraint<Real> >
con_;
70 ROL::Ptr<Vector<Real> >
g_;
71 ROL::Ptr<Vector<Real> >
l_;
72 ROL::Ptr<Vector<Real> >
u_;
73 ROL::Ptr<Vector<Real> >
l1_;
74 ROL::Ptr<Vector<Real> >
u1_;
75 ROL::Ptr<Vector<Real> >
dl1_;
76 ROL::Ptr<Vector<Real> >
du1_;
78 ROL::Ptr<Vector<Real> >
v_;
79 ROL::Ptr<Vector<Real> >
dv_;
80 ROL::Ptr<Vector<Real> >
dv2_;
81 ROL::Ptr<Vector<Real> >
lam_;
82 ROL::Ptr<Vector<Real> >
tmp_;
93 if ( con_->isActivated() ) {
95 if ( !isConEvaluated_ ) {
97 xlam_->axpy(one/mu_,*lam_);
99 if ( con_->isFeasible(*xlam_) ) {
100 l1_->zero(); dl1_->zero();
101 u1_->zero(); du1_->zero();
106 con_->pruneLowerInactive(*l1_,*xlam_);
108 con_->pruneLowerInactive(*tmp_,*xlam_);
109 l1_->axpy(-one,*tmp_);
113 con_->pruneUpperInactive(*u1_,*xlam_);
115 con_->pruneUpperInactive(*tmp_,*xlam_);
116 u1_->axpy(-one,*tmp_);
119 dl1_->set(l1_->dual());
120 con_->pruneLowerInactive(*dl1_,*xlam_);
123 du1_->set(u1_->dual());
124 con_->pruneUpperInactive(*du1_,*xlam_);
127 isConEvaluated_ =
true;
134 g_ = x.
dual().clone();
137 dl1_ = x.
dual().clone();
140 du1_ = x.
dual().clone();
143 dv_ = x.
dual().clone();
144 dv2_ = x.
dual().clone();
148 l_->set(*con_->getLowerBound());
149 u_->set(*con_->getUpperBound());
164 : obj_(obj), con_(con), mu_(mu),
165 fval_(0), isConEvaluated_(false), nfval_(0), ngval_(0),
166 updateMultiplier_(true), updatePenalty_(true) {
173 ROL::ParameterList &parlist)
174 : obj_(obj), con_(con),
175 fval_(0), isConEvaluated_(false), nfval_(0), ngval_(0) {
177 ROL::ParameterList &list = parlist.sublist(
"Step").sublist(
"Moreau-Yosida Penalty");
178 updateMultiplier_ = list.get(
"Update Multiplier",
true);
179 updatePenalty_ = list.get(
"Update Penalty",
true);
180 mu_ = list.get(
"Initial Penalty Parameter",1e1);
187 ROL::ParameterList &parlist)
188 : obj_(obj), con_(con),
189 fval_(0), isConEvaluated_(false), nfval_(0), ngval_(0) {
192 ROL::ParameterList &list = parlist.sublist(
"Step").sublist(
"Moreau-Yosida Penalty");
193 updateMultiplier_ = list.get(
"Update Multiplier",
true);
194 updatePenalty_ = list.get(
"Update Penalty",
true);
195 mu_ = list.get(
"Initial Penalty Parameter",1e1);
199 if ( con_->isActivated() ) {
200 if ( updateMultiplier_ ) {
204 lam_->axpy(-one,*l1_);
207 if ( updatePenalty_ ) {
211 nfval_ = 0; ngval_ = 0;
212 isConEvaluated_ =
false;
218 nfval_ = 0; ngval_ = 0;
219 isConEvaluated_ =
false;
224 if (con_->isActivated()) {
228 tmp_->axpy(static_cast<Real>(-1), *l_);
229 Real lower = mu_*std::abs(tmp_->dot(*l1_));
232 tmp_->axpy(static_cast<Real>(-1), *u_);
233 Real upper = mu_*std::abs(tmp_->dot(*u1_));
236 con_->project(*tmp_);
237 tmp_->axpy(static_cast<Real>(-1), x);
238 Real xnorm = tmp_->norm();
240 val = std::max(xnorm,std::max(lower,upper));
269 obj_->update(x,flag,iter);
270 con_->update(x,flag,iter);
271 isConEvaluated_ =
false;
283 fval_ = obj_->value(x,tol);
287 if ( con_->isActivated() ) {
289 fval += half*mu_*(l1_->dot(*l1_) + u1_->dot(*u1_));
303 obj_->gradient(*g_,x,tol);
307 if ( con_->isActivated() ) {
324 obj_->hessVec(hv,v,x,tol);
326 if ( con_->isActivated() ) {
331 con_->pruneLowerActive(*v_,*xlam_);
334 dv_->set(v_->dual());
336 con_->pruneLowerActive(*dv_,*xlam_);
342 con_->pruneUpperActive(*v_,*xlam_);
345 dv_->set(v_->dual());
347 con_->pruneUpperActive(*dv_,*xlam_);
358 obj_->setParameter(param);
Provides the interface to evaluate objective functions.
ROL::Ptr< Vector< Real > > g_
ROL::Ptr< Vector< Real > > l1_
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
ROL::Ptr< Vector< Real > > du1_
void setParameter(const std::vector< Real > ¶m)
virtual void axpy(const Real alpha, const Vector &x)
Compute where .
int getNumberGradientEvaluations(void)
Contains definitions of custom data types in ROL.
Real value(const Vector< Real > &x, Real &tol)
Compute value.
ROL::Ptr< Vector< Real > > xlam_
void updateMultipliers(Real mu, const ROL::Vector< Real > &x)
ROL::Ptr< Vector< Real > > dv_
Defines the linear algebra or vector space interface.
void initialize(const ROL::Vector< Real > &x, const ROL::Ptr< ROL::BoundConstraint< Real > > &con)
ROL::Ptr< Vector< Real > > getGradient(void) const
void computePenalty(const Vector< Real > &x)
ROL::Ptr< Vector< Real > > dl1_
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
const ROL::Ptr< BoundConstraint< Real > > con_
ROL::Ptr< Vector< Real > > tmp_
MoreauYosidaPenalty(const ROL::Ptr< Objective< Real > > &obj, const ROL::Ptr< BoundConstraint< Real > > &con, const ROL::Vector< Real > &x, const ROL::Vector< Real > &lam, ROL::ParameterList &parlist)
const ROL::Ptr< Objective< Real > > obj_
Provides the interface to evaluate the Moreau-Yosida penalty function.
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
MoreauYosidaPenalty(const ROL::Ptr< Objective< Real > > &obj, const ROL::Ptr< BoundConstraint< Real > > &con, const ROL::Vector< Real > &x, ROL::ParameterList &parlist)
Provides the interface to apply upper and lower bound constraints.
ROL::Ptr< Vector< Real > > l_
int getNumberFunctionEvaluations(void)
ROL::Ptr< Vector< Real > > u_
virtual void setParameter(const std::vector< Real > ¶m)
ROL::Ptr< Vector< Real > > v_
void update(const Vector< Real > &x, bool flag=true, int iter=-1)
Update Moreau-Yosida penalty function.
virtual void set(const Vector &x)
Set where .
void reset(const Real mu)
ROL::Ptr< Vector< Real > > lam_
ROL::Ptr< Vector< Real > > dv2_
void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
Real getObjectiveValue(void) const
ROL::Ptr< Vector< Real > > u1_
Real testComplementarity(const ROL::Vector< Real > &x)
MoreauYosidaPenalty(const ROL::Ptr< Objective< Real > > &obj, const ROL::Ptr< BoundConstraint< Real > > &con, const ROL::Vector< Real > &x, const Real mu=1e1)