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<StdVector<Real>> xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(0);
243 for (
int i = 0; i < size; ++i) {
245 Ptr<StdVector<Real>> xs =
dynamic_cast<RiskVector<Real>&
>(x).getStatisticVector(1,i);
250 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
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() ) {
272 bc_->projectInterior(*xvec);
278 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
279 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
284 for (
int i = 0; i < size; ++i) {
286 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
287 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
292 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
294 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
295 bc_->pruneUpperActive(*vv,*xv,eps);
301 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
302 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
303 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
304 statObj_bc_->pruneUpperActive(*vs,*gs,*xs,xeps,geps);
308 for (
int i = 0; i < size; ++i) {
310 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
311 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
312 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
313 statCon_bc_[i]->pruneUpperActive(*vs,*gs,*xs,xeps,geps);
317 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
319 Ptr<const Vector<Real>> gv =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
320 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
321 bc_->pruneUpperActive(*vv,*gv,*xv,xeps,geps);
327 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
328 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
333 for (
int i = 0; i < size; ++i) {
335 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
336 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
341 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
343 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
344 bc_->pruneLowerActive(*vv,*xv,eps);
350 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(0);
351 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
352 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
353 statObj_bc_->pruneLowerActive(*vs,*gs,*xs,xeps,geps);
357 for (
int i = 0; i < size; ++i) {
359 Ptr<StdVector<Real>> vs =
dynamic_cast<RiskVector<Real>&
>(v).getStatisticVector(1,i);
360 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
361 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
362 statCon_bc_[i]->pruneLowerActive(*vs,*gs,*xs,xeps,geps);
366 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
368 Ptr<const Vector<Real>> gv =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
369 Ptr<const Vector<Real>> xv =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
370 bc_->pruneLowerActive(*vv,*gv,*xv,xeps,geps);
376 const Ptr<const Vector<Real>> vlo =
bc_->getLowerBound();
377 Ptr<std::vector<Real>> lowerObj = makePtr<std::vector<Real>>(
lowerObj_);
379 std::vector<Ptr<std::vector<Real>>> lowerCon(size);
380 for (
int i = 0; i < size; ++i) {
381 lowerCon[i] = makePtr<std::vector<Real>>(
lowerCon_[i]);
383 lo_ = makePtr<RiskVector<Real>>(constPtrCast<Vector<Real>>(vlo),
392 const Ptr<const Vector<Real>> vhi =
bc_->getUpperBound();
393 Ptr<std::vector<Real>> upperObj = makePtr<std::vector<Real>>(
upperObj_);
395 std::vector<Ptr<std::vector<Real>>> upperCon(size);
396 for (
int i = 0; i < size; ++i) {
397 upperCon[i] = makePtr<std::vector<Real>>(
upperCon_[i]);
399 hi_ = makePtr<RiskVector<Real>>(constPtrCast<Vector<Real>>(vhi),
407 bool flagstat =
true, flagcon =
true, flagvec =
true;
409 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
414 for (
int i = 0; i < size; ++i) {
416 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(1,i);
417 flagcon = (!
statCon_bc_[i]->isFeasible(*vs) ?
false : flagcon);
421 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
422 Ptr<const Vector<Real>> vv =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
423 flagvec =
bc_->isFeasible(*vv);
425 return (flagstat && flagcon && flagvec);
430 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(0);
431 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
432 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
433 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
434 statObj_bc_->applyInverseScalingFunction(*dvs,*vs,*xs,*gs);
438 for (
int i = 0; i < size; ++i) {
440 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(1,i);
441 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(1,i);
442 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
443 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
444 statCon_bc_[i]->applyInverseScalingFunction(*dvs,*vs,*xs,*gs);
448 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
450 Ptr<const Vector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
451 Ptr<const Vector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
452 Ptr<const Vector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
453 bc_->applyInverseScalingFunction(*dvs,*vs,*xs,*gs);
459 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(0);
460 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(0);
461 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(0);
462 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(0);
463 statObj_bc_->applyScalingFunctionJacobian(*dvs,*vs,*xs,*gs);
467 for (
int i = 0; i < size; ++i) {
469 Ptr<StdVector<Real>> dvs =
dynamic_cast<RiskVector<Real>&
>(dv).getStatisticVector(1,i);
470 Ptr<const StdVector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getStatisticVector(1,i);
471 Ptr<const StdVector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getStatisticVector(1,i);
472 Ptr<const StdVector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getStatisticVector(1,i);
473 statCon_bc_[i]->applyScalingFunctionJacobian(*dvs,*vs,*xs,*gs);
477 if (
bc_ != nullPtr &&
bc_->isActivated() ) {
479 Ptr<const Vector<Real>> vs =
dynamic_cast<const RiskVector<Real>&
>(v).getVector();
480 Ptr<const Vector<Real>> xs =
dynamic_cast<const RiskVector<Real>&
>(x).getVector();
481 Ptr<const Vector<Real>> gs =
dynamic_cast<const RiskVector<Real>&
>(g).getVector();
482 bc_->applyScalingFunctionJacobian(*dvs,*vs,*xs,*gs);
Contains definitions for std::vector bound constraints.
std::vector< bool > activatedCon_
RiskBoundConstraint(const Ptr< BoundConstraint< Real >> &bc)
RiskBoundConstraint(Ptr< ParameterList > &parlistObj, std::vector< Ptr< ParameterList >> &parlistCon, const Ptr< BoundConstraint< Real >> &bc=nullPtr)
void activate(void)
Turn on bounds.
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.
Contains definitions of custom data types in ROL.
std::vector< Real > lowerObj_
Defines the linear algebra or vector space interface.
bool buildObjStatBnd(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.
std::vector< std::vector< Real > > lowerCon_
Ptr< RiskVector< Real > > lo_
RiskBoundConstraint(std::vector< Ptr< ParameterList >> &parlist, const Ptr< BoundConstraint< Real >> &bc=nullPtr)
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.
void applyScalingFunctionJacobian(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const
Apply scaling function Jacobian.
void setBoundInfo(ParameterList &parlist, int &nStat, std::vector< Real > &lower, std::vector< Real > &upper, bool &augmented, bool &activated)
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.
RiskBoundConstraint(Ptr< ParameterList > &parlist, const Ptr< BoundConstraint< Real >> &bc=nullPtr)
std::vector< int > nStatCon_
const Ptr< const Vector< Real > > getLowerBound(void) const
Return the ref count pointer to the lower bound vector.
std::vector< std::vector< Real > > upperCon_
bool isFeasible(const Vector< Real > &v)
Check if the vector, v, is feasible.
const Ptr< const Vector< Real > > getUpperBound(void) const
Return the ref count pointer to the upper bound vector.
Ptr< StdBoundConstraint< Real > > statObj_bc_
Provides the interface to apply upper and lower bound constraints.
bool buildConStatBnd(std::vector< Ptr< ParameterList >> &parlist)
std::vector< Real > upperObj_
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 deactivate(void)
Turn off bounds.
void project(Vector< Real > &x)
Project optimization variables onto the bounds.
Ptr< BoundConstraint< Real > > bc_
Ptr< RiskVector< Real > > hi_
std::vector< Ptr< StdBoundConstraint< Real > > > statCon_bc_