44 #ifndef ROL_RISK_BOUND_CONSTRAINT_H 45 #define ROL_RISK_BOUND_CONSTRAINT_H 56 ROL::Ptr<BoundConstraint<Real> >
bc_;
61 std::vector<ROL::Ptr<StdBoundConstraint<Real> > >
statCon_bc_;
72 mutable ROL::Ptr<RiskVector<Real> >
lo_,
hi_;
76 std::vector<Real> &lower,
77 std::vector<Real> &upper,
80 lower.clear(); upper.clear();
82 std::string optType = parlist.sublist(
"SOL").get(
"Stochastic Component Type",
"Risk Averse");
83 if ( optType ==
"Risk Averse" ||
84 optType ==
"Deviation" ||
85 optType ==
"Regret" ||
87 optType ==
"Probability" ) {
89 RandVarFunctionalInfo<Real>(parlist,name,nStat,lower,upper,activated);
90 augmented = (nStat > 0) ?
true :
false;
92 else if ( optType ==
"Risk Neutral" || optType ==
"Mean Value" ) {
98 ROL_TEST_FOR_EXCEPTION(
true,std::invalid_argument,
99 ">>> (ROL::RiskBoundConstraint): Invalid stochastic optimization type!" << optType);
105 if (parlist != ROL::nullPtr) {
106 setBoundInfo(*parlist,nStatObj_,lowerObj_,upperObj_,augmentedObj_,activatedObj_);
108 if ( augmentedObj_ ) {
113 augmentedObj_ =
false;
114 activatedObj_ =
false;
116 statObj_bc_ = ROL::nullPtr;
119 if ( !activatedObj_ ) {
120 if ( statObj_bc_ != ROL::nullPtr ) {
121 statObj_bc_->deactivate();
129 int size = parlist.size();
130 nStatCon_.clear(); nStatCon_.resize(size,0);
131 lowerCon_.clear(); lowerCon_.resize(size);
132 upperCon_.clear(); upperCon_.resize(size);
133 activatedCon_.clear(); activatedCon_.resize(size,
false);
134 statCon_bc_.clear(); statCon_bc_.resize(size,ROL::nullPtr);
135 bool activated =
false;
136 for (
int i = 0; i < size; ++i) {
137 if ( parlist[i] != ROL::nullPtr ) {
138 bool augmented =
false;
140 std::vector<Real> lo, up;
143 nStatCon_[i] = nStat;
146 activatedCon_[i] = act;
150 statCon_bc_[i] = ROL::makePtr<StdBoundConstraint<Real>>(lowerCon_[i],upperCon_[i]);
154 activatedCon_[i] =
false;
156 statCon_bc_[i] = ROL::nullPtr;
158 if ( !activatedCon_[i] ) {
159 if ( statCon_bc_[i] != ROL::nullPtr ) {
160 statCon_bc_[i]->deactivate();
163 activated = (activatedCon_[i] ? true : activated);
174 augmentedObj_(false), activatedObj_(false),
175 augmentedCon_(false),
176 isLOinitialized_(false), isHIinitialized_(false) {
180 if ( !activatedObj ) {
181 if ( bc == ROL::nullPtr || (bc != ROL::nullPtr && !bc->isActivated()) ) {
191 augmentedObj_(false), activatedObj_(false),
192 augmentedCon_(false),
193 isLOinitialized_(false), isHIinitialized_(false) {
197 if ( !activatedCon ) {
198 if ( bc == ROL::nullPtr || (bc != ROL::nullPtr && !bc->isActivated()) ) {
206 std::vector<ROL::Ptr<ROL::ParameterList> > &parlistCon,
209 augmentedObj_(false), activatedObj_(false),
210 augmentedCon_(false),
211 isLOinitialized_(false), isHIinitialized_(false) {
216 if ( !activatedObj && !activatedCon ) {
217 if ( bc == ROL::nullPtr || (bc != ROL::nullPtr && !bc->isActivated()) ) {
226 augmentedObj_(false), activatedObj_(false),
227 augmentedCon_(false),
228 isLOinitialized_(false), isHIinitialized_(false) {
231 if (!activatedObj_) {
237 if ( augmentedObj_ && activatedObj_ ) {
238 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
239 statObj_bc_->update(*xs,flag,iter);
242 int size = statCon_bc_.size();
243 for (
int i = 0; i < size; ++i) {
244 if (activatedCon_[i]) {
245 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
246 statCon_bc_[i]->update(*xs,flag,iter);
250 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
251 ROL::Ptr<const Vector<Real> > xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
252 bc_->update(*xv,flag,iter);
257 if ( augmentedObj_ && activatedObj_ ) {
258 ROL::Ptr<StdVector<Real> > xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(0);
259 statObj_bc_->project(*xs);
262 int size = statCon_bc_.size();
263 for (
int i = 0; i < size; ++i) {
264 if (activatedCon_[i]) {
265 ROL::Ptr<StdVector<Real> > xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(1,i);
266 statCon_bc_[i]->project(*xs);
270 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
271 ROL::Ptr<Vector<Real> > xvec =
dynamic_cast<RiskVector<Real>&
>(x).getVector();
277 if ( augmentedObj_ && activatedObj_ ) {
278 ROL::Ptr<StdVector<Real> > xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(0);
279 statObj_bc_->projectInterior(*xs);
282 int size = statCon_bc_.size();
283 for (
int i = 0; i < size; ++i) {
284 if (activatedCon_[i]) {
285 ROL::Ptr<StdVector<Real> > xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(1,i);
286 statCon_bc_[i]->projectInterior(*xs);
290 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
291 ROL::Ptr<Vector<Real> > xvec =
dynamic_cast<RiskVector<Real>&
>(x).getVector();
292 bc_->projectInterior(*xvec);
297 if ( augmentedObj_ && activatedObj_ ) {
298 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
299 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
300 statObj_bc_->pruneUpperActive(*vs,*xs,eps);
303 int size = statCon_bc_.size();
304 for (
int i = 0; i < size; ++i) {
305 if (activatedCon_[i]) {
306 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
307 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
308 statCon_bc_[i]->pruneUpperActive(*vs,*xs,eps);
312 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
313 ROL::Ptr<Vector<Real> > vv =
dynamic_cast<RiskVector<Real>&
>(v).getVector();
314 ROL::Ptr<const Vector<Real> > xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
315 bc_->pruneUpperActive(*vv,*xv,eps);
320 if ( augmentedObj_ && activatedObj_ ) {
321 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
322 ROL::Ptr<const StdVector<Real> > gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
323 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
324 statObj_bc_->pruneUpperActive(*vs,*gs,*xs,eps);
327 int size = statCon_bc_.size();
328 for (
int i = 0; i < size; ++i) {
329 if (activatedCon_[i]) {
330 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
331 ROL::Ptr<const StdVector<Real> > gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
332 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
333 statCon_bc_[i]->pruneUpperActive(*vs,*gs,*xs,eps);
337 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
338 ROL::Ptr<Vector<Real> > vv =
dynamic_cast<RiskVector<Real>&
>(v).getVector();
339 ROL::Ptr<const Vector<Real> > gv =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
340 ROL::Ptr<const Vector<Real> > xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
341 bc_->pruneUpperActive(*vv,*gv,*xv,eps);
346 if ( augmentedObj_ && activatedObj_ ) {
347 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
348 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
349 statObj_bc_->pruneLowerActive(*vs,*xs,eps);
352 int size = statCon_bc_.size();
353 for (
int i = 0; i < size; ++i) {
354 if (activatedCon_[i]) {
355 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
356 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
357 statCon_bc_[i]->pruneLowerActive(*vs,*xs,eps);
361 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
362 ROL::Ptr<Vector<Real> > vv =
dynamic_cast<RiskVector<Real>&
>(v).getVector();
363 ROL::Ptr<const Vector<Real> > xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
364 bc_->pruneLowerActive(*vv,*xv,eps);
369 if ( augmentedObj_ && activatedObj_ ) {
370 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
371 ROL::Ptr<const StdVector<Real> > gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
372 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
373 statObj_bc_->pruneLowerActive(*vs,*gs,*xs,eps);
376 int size = statCon_bc_.size();
377 for (
int i = 0; i < size; ++i) {
378 if (activatedCon_[i]) {
379 ROL::Ptr<StdVector<Real> > vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
380 ROL::Ptr<const StdVector<Real> > gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
381 ROL::Ptr<const StdVector<Real> > xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
382 statCon_bc_[i]->pruneLowerActive(*vs,*gs,*xs,eps);
386 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
387 ROL::Ptr<Vector<Real> > vv =
dynamic_cast<RiskVector<Real>&
>(v).getVector();
388 ROL::Ptr<const Vector<Real> > gv =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
389 ROL::Ptr<const Vector<Real> > xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
390 bc_->pruneLowerActive(*vv,*gv,*xv,eps);
395 if (!isLOinitialized_) {
396 const ROL::Ptr<const Vector<Real> > vlo = bc_->getLowerBound();
397 ROL::Ptr<std::vector<Real> > lowerObj = ROL::makePtr<std::vector<Real>>(
lowerObj_);
398 int size = statCon_bc_.size();
399 std::vector<ROL::Ptr<std::vector<Real> > > lowerCon(size);
400 for (
int i = 0; i < size; ++i) {
401 lowerCon[i] = ROL::makePtr<std::vector<Real>>(lowerCon_[i]);
403 lo_ = ROL::makePtr<RiskVector<Real>>(ROL::constPtrCast<Vector<Real>>(vlo),
405 isLOinitialized_ =
true;
411 if (!isHIinitialized_) {
412 const ROL::Ptr<const Vector<Real> > vhi = bc_->getUpperBound();
413 ROL::Ptr<std::vector<Real> > upperObj = ROL::makePtr<std::vector<Real>>(
upperObj_);
414 int size = statCon_bc_.size();
415 std::vector<ROL::Ptr<std::vector<Real> > > upperCon(size);
416 for (
int i = 0; i < size; ++i) {
417 upperCon[i] = ROL::makePtr<std::vector<Real>>(upperCon_[i]);
419 hi_ = ROL::makePtr<RiskVector<Real>>(ROL::constPtrCast<Vector<Real>>(vhi),
421 isHIinitialized_ =
true;
427 bool flagstat =
true, flagcon =
true, flagvec =
true;
428 if ( augmentedObj_ && activatedObj_ ) {
429 ROL::Ptr<const StdVector<Real> > vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
430 flagstat = statObj_bc_->isFeasible(*vs);
433 int size = statCon_bc_.size();
434 for (
int i = 0; i < size; ++i) {
435 if (activatedCon_[i]) {
436 ROL::Ptr<const StdVector<Real> > vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(1,i);
437 flagcon = (!statCon_bc_[i]->isFeasible(*vs) ? false : flagcon);
441 if ( bc_ != ROL::nullPtr && bc_->isActivated() ) {
442 ROL::Ptr<const Vector<Real> > vv =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
443 flagvec = bc_->isFeasible(*vv);
445 return (flagstat && flagcon && flagvec);
Contains definitions for std::vector bound constraints.
std::vector< bool > activatedCon_
const ROL::Ptr< const Vector< Real > > getLowerBound(void) const
Return the ref count pointer to the lower bound vector.
RiskBoundConstraint(const Ptr< BoundConstraint< Real > > &bc)
void pruneLowerActive(Vector< Real > &v, const Vector< Real > &x, Real eps=0)
Set variables to zero if they correspond to the lower -active set.
void activate(void)
Turn on bounds.
bool buildConStatBnd(std::vector< ROL::Ptr< ROL::ParameterList > > &parlist)
Contains definitions of custom data types in ROL.
ROL::Ptr< RiskVector< Real > > lo_
bool isActivated(void) const
Check if bounds are on.
std::vector< Real > lowerObj_
ROL::Ptr< StdBoundConstraint< Real > > statObj_bc_
Defines the linear algebra or vector space interface.
ROL::Ptr< RiskVector< Real > > hi_
std::vector< std::vector< Real > > lowerCon_
void update(const Vector< Real > &x, bool flag=true, int iter=-1)
Update bounds.
const ROL::Ptr< const Vector< Real > > getUpperBound(void) const
Return the ref count pointer to the upper bound vector.
void pruneUpperActive(Vector< Real > &v, const Vector< Real > &x, Real eps=0)
Set variables to zero if they correspond to the upper -active set.
bool buildObjStatBnd(ROL::Ptr< ROL::ParameterList > &parlist)
std::vector< int > nStatCon_
void pruneUpperActive(Vector< Real > &v, const Vector< Real > &g, const Vector< Real > &x, Real eps=0)
Set variables to zero if they correspond to the upper -binding set.
RiskBoundConstraint(ROL::Ptr< ROL::ParameterList > &parlist, const ROL::Ptr< BoundConstraint< Real > > &bc=ROL::nullPtr)
std::vector< std::vector< Real > > upperCon_
bool isFeasible(const Vector< Real > &v)
Check if the vector, v, is feasible.
std::vector< ROL::Ptr< StdBoundConstraint< Real > > > statCon_bc_
Provides the interface to apply upper and lower bound constraints.
std::vector< Real > upperObj_
void projectInterior(Vector< Real > &x)
Project optimization variables into the interior of the feasible set.
ROL::Ptr< BoundConstraint< Real > > bc_
void setBoundInfo(ROL::ParameterList &parlist, int &nStat, std::vector< Real > &lower, std::vector< Real > &upper, bool &augmented, bool &activated)
void deactivate(void)
Turn off bounds.
void project(Vector< Real > &x)
Project optimization variables onto the bounds.
RiskBoundConstraint(ROL::Ptr< ROL::ParameterList > &parlistObj, std::vector< ROL::Ptr< ROL::ParameterList > > &parlistCon, const ROL::Ptr< BoundConstraint< Real > > &bc=ROL::nullPtr)
void pruneLowerActive(Vector< Real > &v, const Vector< Real > &g, const Vector< Real > &x, Real eps=0)
Set variables to zero if they correspond to the -binding set.
RiskBoundConstraint(std::vector< ROL::Ptr< ROL::ParameterList > > &parlist, const ROL::Ptr< BoundConstraint< Real > > &bc=ROL::nullPtr)