49 #ifndef ROL_STDBOUNDCONSTRAINT_DEF_HPP
50 #define ROL_STDBOUNDCONSTRAINT_DEF_HPP
56 : scale_(scale), feasTol_(feasTol), min_diff_(
ROL_INF<Real>()){
60 x_lo_.assign(x.begin(),x.end());
66 x_up_.assign(x.begin(),x.end());
70 lower_ = makePtr<StdVector<Real>>(makePtrFromRef(
x_lo_));
71 upper_ = makePtr<StdVector<Real>>(makePtrFromRef(
x_up_));
76 : x_lo_(l), x_up_(u), scale_(scale), feasTol_(feasTol) {
79 for (
int i = 0; i <
dim_; i++ ) {
89 lower_ = makePtr<StdVector<Real>>(makePtrFromRef(
x_lo_));
90 upper_ = makePtr<StdVector<Real>>(makePtrFromRef(
x_up_));
96 Ptr<std::vector<Real>> ex =
99 for (
int i = 0; i < dim_; ++i ) {
100 (*ex)[i] = std::max(x_lo_[i],(*ex)[i]);
104 for (
int i = 0; i < dim_; ++i ) {
105 (*ex)[i] = std::min(x_up_[i],(*ex)[i]);
114 Ptr<std::vector<Real>> ex =
116 const Real eps = feasTol_;
117 const Real tol = 100.0*ROL_EPSILON<Real>();
120 for (
int i = 0; i < dim_; ++i ) {
121 Real val = ((x_lo_[i] < -tol) ? (one-eps)*x_lo_[i]
122 : ((x_lo_[i] > tol) ? (one+eps)*x_lo_[i]
124 val = std::min(x_lo_[i]+eps*min_diff_, val);
125 (*ex)[i] = ((*ex)[i] < val) ? val : (*ex)[i];
129 for (
int i = 0; i < dim_; ++i ) {
130 Real val = ((x_up_[i] < -tol) ? (one+eps)*x_up_[i]
131 : ((x_up_[i] > tol) ? (one-eps)*x_up_[i]
133 val = std::max(x_up_[i]-eps*min_diff_, val);
134 (*ex)[i] = ((*ex)[i] > val) ? val : (*ex)[i];
143 Ptr<const std::vector<Real>> ex =
145 Ptr<std::vector<Real>> ev =
147 Real epsn = std::min(scale_*eps,min_diff_);
148 for (
int i = 0; i < dim_; ++i ) {
149 if ( ((*ex)[i] >= x_up_[i]-epsn) ) {
150 (*ev)[i] =
static_cast<Real
>(0);
159 Ptr<const std::vector<Real>> ex =
161 Ptr<const std::vector<Real>> eg =
163 Ptr<std::vector<Real>> ev =
165 Real epsn = std::min(scale_*xeps,min_diff_);
166 for (
int i = 0; i < dim_; ++i ) {
167 if ( (*ex)[i] >= x_up_[i]-epsn && (*eg)[i] < -geps ) {
168 (*ev)[i] =
static_cast<Real
>(0);
177 Ptr<const std::vector<Real>> ex =
179 Ptr<std::vector<Real>> ev =
181 Real epsn = std::min(scale_*eps,min_diff_);
182 for (
int i = 0; i < dim_; ++i ) {
183 if ( ((*ex)[i] <= x_lo_[i]+epsn) ) {
184 (*ev)[i] =
static_cast<Real
>(0);
193 Ptr<const std::vector<Real>> ex =
195 Ptr<const std::vector<Real>> eg =
197 Ptr<std::vector<Real>> ev =
199 Real epsn = std::min(scale_*xeps,this->min_diff_);
200 for (
int i = 0; i < dim_; ++i ) {
201 if ( (*ex)[i] <= x_lo_[i]+epsn && (*eg)[i] > geps ) {
202 (*ev)[i] =
static_cast<Real
>(0);
210 bool lflag =
true, uflag =
true;
212 Ptr<const std::vector<Real>> ex =
215 for (
int i = 0; i < dim_; ++i ) {
216 if ( (*ex)[i] < x_lo_[i] ) {
223 for (
int i = 0; i < dim_; ++i ) {
224 if ( (*ex)[i] > x_up_[i] ) {
231 return (lflag && uflag);
236 Ptr<std::vector<Real>> ed =
238 Ptr<const std::vector<Real>> ex =
240 Ptr<const std::vector<Real>> eg =
243 Real grad, lodiff, updiff, c;
245 for (
int i = 0; i < dim_; ++i ) {
247 lodiff = (*ex)[i] - x_lo_[i];
248 updiff = x_up_[i] - (*ex)[i];
250 if (-grad > lodiff) {
251 if (lodiff <= updiff) {
252 (*ed)[i] = std::min(std::abs(grad), c);
256 if (+grad > updiff) {
257 if (updiff <= lodiff) {
258 (*ed)[i] = std::min(std::abs(grad), c);
262 (*ed)[i] = std::min({lodiff, updiff, c});
268 buildScalingFunction(dv, x, g);
270 Ptr<std::vector<Real>> edv =
272 Ptr<const std::vector<Real>> ev =
275 for (
int i = 0; i < dim_; ++i ) {
276 (*edv)[i] = (*ev)[i]/(*edv)[i];
282 buildScalingFunction(dv, x, g);
284 Ptr<std::vector<Real>> edv =
286 Ptr<const std::vector<Real>> ev =
288 Ptr<const std::vector<Real>> ex =
290 Ptr<const std::vector<Real>> eg =
293 Real
zero(0), one(1), indicator, d1prime;
295 for (
int i = 0; i < dim_; ++i ) {
296 indicator = (*edv)[i] < buildC(i) ? one :
zero;
298 if (indicator ==
zero) {
305 d1prime = sgn((*eg)[i]);
306 if (d1prime ==
zero) {
308 if (x_up_[i] - (*ex)[i] < (*ex)[i] - x_lo_[i])
311 (*edv)[i] = d1prime*(*eg)[i]*(*ev)[i];
Ptr< Vector< Real > > upper_
void projectInterior(Vector< Real > &x) override
Project optimization variables into the interior of the feasible set.
void activateLower(void)
Turn on lower bound.
void activate(void)
Turn on bounds.
std::vector< Real > x_lo_
void buildScalingFunction(Vector< Real > &d, const Vector< Real > &x, const Vector< Real > &g) const
bool isFeasible(const Vector< Real > &v) override
Check if the vector, v, is feasible.
Defines the linear algebra or vector space interface.
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
void activateUpper(void)
Turn on upper bound.
Ptr< Vector< Real > > lower_
void applyInverseScalingFunction(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const override
Apply inverse scaling function.
void pruneUpperActive(Vector< Real > &v, const Vector< Real > &x, Real eps=Real(0)) override
Set variables to zero if they correspond to the upper -active set.
void project(Vector< Real > &x) override
Project optimization variables onto the bounds.
StdBoundConstraint(std::vector< Real > &x, bool isLower=false, Real scale=Real(1), const Real feasTol=std::sqrt(ROL_EPSILON< Real >()))
Provides the interface to apply upper and lower bound constraints.
void applyScalingFunctionJacobian(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const override
Apply scaling function Jacobian.
void pruneLowerActive(Vector< Real > &v, const Vector< Real > &g, const Vector< Real > &x, Real xeps=Real(0), Real geps=Real(0)) override
Set variables to zero if they correspond to the -binding set.
std::vector< Real > x_up_