44#ifndef ROL_RISK_BOUND_CONSTRAINT_H
45#define ROL_RISK_BOUND_CONSTRAINT_H
56 Ptr<BoundConstraint<Real>>
bc_;
72 mutable 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(
"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 != nullPtr) {
129 int size = parlist.size();
135 bool activated =
false;
136 for (
int i = 0; i < size; ++i) {
137 if ( parlist[i] != nullPtr ) {
138 bool augmented =
false;
140 std::vector<Real> lo, up;
180 if ( !activatedObj ) {
181 if ( bc == nullPtr || (bc != nullPtr && !bc->isActivated()) ) {
197 if ( !activatedCon ) {
198 if ( bc == nullPtr || (bc != nullPtr && !bc->isActivated()) ) {
206 std::vector<Ptr<ParameterList>> &parlistCon,
216 if ( !activatedObj && !activatedCon ) {
217 if ( bc == nullPtr || (bc != nullPtr && !bc->isActivated()) ) {
238 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
243 for (
int i = 0; i < size; ++i) {
245 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
250 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
251 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
252 bc_->update(*xv,flag,iter);
258 Ptr<StdVector<Real>> xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(0);
263 for (
int i = 0; i < size; ++i) {
265 Ptr<StdVector<Real>> xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(1,i);
270 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
278 Ptr<StdVector<Real>> xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(0);
283 for (
int i = 0; i < size; ++i) {
285 Ptr<StdVector<Real>> xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(1,i);
290 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
292 bc_->projectInterior(*xvec);
298 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
299 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
304 for (
int i = 0; i < size; ++i) {
306 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
307 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
312 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
314 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
315 bc_->pruneUpperActive(*vv,*xv,eps);
321 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
322 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
323 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
324 statObj_bc_->pruneUpperActive(*vs,*gs,*xs,xeps,geps);
328 for (
int i = 0; i < size; ++i) {
330 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
331 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
332 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
333 statCon_bc_[i]->pruneUpperActive(*vs,*gs,*xs,xeps,geps);
337 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
339 Ptr<const Vector<Real>> gv =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
340 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
341 bc_->pruneUpperActive(*vv,*gv,*xv,xeps,geps);
347 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
348 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
353 for (
int i = 0; i < size; ++i) {
355 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
356 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
361 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
363 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
364 bc_->pruneLowerActive(*vv,*xv,eps);
370 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
371 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
372 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
373 statObj_bc_->pruneLowerActive(*vs,*gs,*xs,xeps,geps);
377 for (
int i = 0; i < size; ++i) {
379 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
380 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
381 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
382 statCon_bc_[i]->pruneLowerActive(*vs,*gs,*xs,xeps,geps);
386 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
388 Ptr<const Vector<Real>> gv =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
389 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
390 bc_->pruneLowerActive(*vv,*gv,*xv,xeps,geps);
396 const Ptr<const Vector<Real>> vlo =
bc_->getLowerBound();
397 Ptr<std::vector<Real>> lowerObj = makePtr<std::vector<Real>>(
lowerObj_);
399 std::vector<Ptr<std::vector<Real>>> lowerCon(size);
400 for (
int i = 0; i < size; ++i) {
401 lowerCon[i] = makePtr<std::vector<Real>>(
lowerCon_[i]);
403 lo_ = makePtr<RiskVector<Real>>(constPtrCast<Vector<Real>>(vlo),
412 const Ptr<const Vector<Real>> vhi =
bc_->getUpperBound();
413 Ptr<std::vector<Real>> upperObj = makePtr<std::vector<Real>>(
upperObj_);
415 std::vector<Ptr<std::vector<Real>>> upperCon(size);
416 for (
int i = 0; i < size; ++i) {
417 upperCon[i] = makePtr<std::vector<Real>>(
upperCon_[i]);
419 hi_ = makePtr<RiskVector<Real>>(constPtrCast<Vector<Real>>(vhi),
427 bool flagstat =
true, flagcon =
true, flagvec =
true;
429 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
434 for (
int i = 0; i < size; ++i) {
436 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_ != nullPtr &&
bc_->isActivated() ) {
442 Ptr<const Vector<Real>> vv =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
443 flagvec =
bc_->isFeasible(*vv);
445 return (flagstat && flagcon && flagvec);
450 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(0);
451 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
452 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
453 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
454 statObj_bc_->applyInverseScalingFunction(*dvs,*vs,*xs,*gs);
458 for (
int i = 0; i < size; ++i) {
460 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(1,i);
461 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(1,i);
462 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
463 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
464 statCon_bc_[i]->applyInverseScalingFunction(*dvs,*vs,*xs,*gs);
468 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
470 Ptr<const Vector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
471 Ptr<const Vector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
472 Ptr<const Vector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
473 bc_->applyInverseScalingFunction(*dvs,*vs,*xs,*gs);
479 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(0);
480 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
481 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
482 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
483 statObj_bc_->applyScalingFunctionJacobian(*dvs,*vs,*xs,*gs);
487 for (
int i = 0; i < size; ++i) {
489 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(1,i);
490 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(1,i);
491 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
492 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
493 statCon_bc_[i]->applyScalingFunctionJacobian(*dvs,*vs,*xs,*gs);
497 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
499 Ptr<const Vector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
500 Ptr<const Vector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
501 Ptr<const Vector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
502 bc_->applyScalingFunctionJacobian(*dvs,*vs,*xs,*gs);
Contains definitions for std::vector bound constraints.
Contains definitions of custom data types in ROL.
Provides the interface to apply upper and lower bound constraints.
void deactivate(void)
Turn off bounds.
void activate(void)
Turn on bounds.
std::vector< bool > activatedCon_
RiskBoundConstraint(const Ptr< BoundConstraint< Real > > &bc)
bool isFeasible(const Vector< Real > &v)
Check if the vector, v, is feasible.
const Ptr< const Vector< Real > > getLowerBound(void) const
Return the ref count pointer to the lower bound vector.
void setBoundInfo(ParameterList &parlist, int &nStat, std::vector< Real > &lower, std::vector< Real > &upper, bool &augmented, bool &activated)
Ptr< RiskVector< Real > > hi_
std::vector< std::vector< Real > > upperCon_
RiskBoundConstraint(std::vector< Ptr< ParameterList > > &parlist, const Ptr< BoundConstraint< Real > > &bc=nullPtr)
std::vector< Real > upperObj_
std::vector< std::vector< Real > > lowerCon_
RiskBoundConstraint(Ptr< ParameterList > &parlist, const Ptr< BoundConstraint< Real > > &bc=nullPtr)
void project(Vector< Real > &x)
Project optimization variables onto the bounds.
void pruneLowerActive(Vector< Real > &v, const Vector< Real > &x, Real eps=Real(0))
Set variables to zero if they correspond to the lower -active set.
std::vector< Ptr< StdBoundConstraint< Real > > > statCon_bc_
const Ptr< const Vector< Real > > getUpperBound(void) const
Return the ref count pointer to the upper bound vector.
bool buildObjStatBnd(Ptr< ParameterList > &parlist)
Ptr< StdBoundConstraint< Real > > statObj_bc_
bool buildConStatBnd(std::vector< Ptr< ParameterList > > &parlist)
void pruneLowerActive(Vector< Real > &v, const Vector< Real > &g, const Vector< Real > &x, Real xeps=Real(0), Real geps=Real(0))
Set variables to zero if they correspond to the -binding set.
Ptr< BoundConstraint< Real > > bc_
void pruneUpperActive(Vector< Real > &v, const Vector< Real > &x, Real eps=Real(0))
Set variables to zero if they correspond to the upper -active set.
std::vector< Real > lowerObj_
RiskBoundConstraint(Ptr< ParameterList > &parlistObj, std::vector< Ptr< ParameterList > > &parlistCon, const Ptr< BoundConstraint< Real > > &bc=nullPtr)
void pruneUpperActive(Vector< Real > &v, const Vector< Real > &g, const Vector< Real > &x, Real xeps=Real(0), Real geps=Real(0))
Set variables to zero if they correspond to the upper -binding set.
void projectInterior(Vector< Real > &x)
Project optimization variables into the interior of the feasible set.
void applyInverseScalingFunction(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const
Apply inverse scaling function.
void update(const Vector< Real > &x, bool flag=true, int iter=-1)
void applyScalingFunctionJacobian(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const
Apply scaling function Jacobian.
Ptr< RiskVector< Real > > lo_
std::vector< int > nStatCon_
Defines the linear algebra or vector space interface.