49#ifndef ROL_STDBOUNDCONSTRAINT_DEF_HPP
50#define ROL_STDBOUNDCONSTRAINT_DEF_HPP
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_));
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 =
120 for (
int i = 0; i <
dim_; ++i ) {
121 Real val = ((
x_lo_[i] < -tol) ? (one-eps)*
x_lo_[i]
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]
134 (*ex)[i] = ((*ex)[i] > val) ? val : (*ex)[i];
143 Ptr<const std::vector<Real>> ex =
145 Ptr<std::vector<Real>> ev =
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 =
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 =
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 =
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});
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];
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];
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0 zero)()
bool isLowerActivated(void) const
Check if lower bound are on.
bool isActivated(void) const
Check if bounds are on.
void activateLower(void)
Turn on lower bound.
void activate(void)
Turn on bounds.
void activateUpper(void)
Turn on upper bound.
bool isUpperActivated(void) const
Check if upper bound are on.
Ptr< Vector< Real > > lower_
Ptr< Vector< Real > > upper_
std::vector< Real > x_up_
void buildScalingFunction(Vector< Real > &d, const Vector< Real > &x, const Vector< Real > &g) const
bool isFeasible(const Vector< Real > &v) override
void applyScalingFunctionJacobian(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const override
void pruneLowerActive(Vector< Real > &v, const Vector< Real > &g, const Vector< Real > &x, Real xeps=Real(0), Real geps=Real(0)) override
std::vector< Real > x_lo_
void projectInterior(Vector< Real > &x) override
void applyInverseScalingFunction(Vector< Real > &dv, const Vector< Real > &v, const Vector< Real > &x, const Vector< Real > &g) const override
void project(Vector< Real > &x) override
StdBoundConstraint(std::vector< Real > &x, bool isLower=false, Real scale=Real(1), const Real feasTol=std::sqrt(ROL_EPSILON< Real >()))
void pruneUpperActive(Vector< Real > &v, const Vector< Real > &x, Real eps=Real(0)) override
Provides the ROL::Vector interface for scalar values, to be used, for example, with scalar constraint...
Defines the linear algebra or vector space interface.
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.