44 #ifndef ROL_MEANDEVIATION_HPP 45 #define ROL_MEANDEVIATION_HPP 48 #include "ROL_ParameterList.hpp" 124 NumMoments_ = order_.size();
126 dev0_.clear(); dev1_.clear(); dev2_.clear(); dev3_.clear();
127 des0_.clear(); des1_.clear(); des2_.clear(); des3_.clear();
129 gvp1_.clear(); gvp2_.clear(); gvp3_.clear();
130 gvs1_.clear(); gvs2_.clear(); gvs3_.clear();
132 dev0_.resize(NumMoments_); dev1_.resize(NumMoments_);
133 dev2_.resize(NumMoments_); dev3_.resize(NumMoments_);
134 des0_.resize(NumMoments_); des1_.resize(NumMoments_);
135 des2_.resize(NumMoments_); des3_.resize(NumMoments_);
136 devp_.resize(NumMoments_);
137 gvp1_.resize(NumMoments_); gvp2_.resize(NumMoments_);
138 gvp3_.resize(NumMoments_);
139 gvs1_.resize(NumMoments_); gvs2_.resize(NumMoments_);
140 gvs3_.resize(NumMoments_);
142 values_ = makePtr<SampledScalar<Real>>();
143 gradvecs_ = makePtr<SampledScalar<Real>>();
144 gradients_ = makePtr<SampledVector<Real>>();
145 hessvecs_ = makePtr<SampledVector<Real>>();
153 dev0_.assign(NumMoments_,zero); dev1_.assign(NumMoments_,zero);
154 dev2_.assign(NumMoments_,zero); dev3_.assign(NumMoments_,zero);
155 des0_.assign(NumMoments_,zero); des1_.assign(NumMoments_,zero);
156 des2_.assign(NumMoments_,zero); des3_.assign(NumMoments_,zero);
157 devp_.assign(NumMoments_,zero);
158 gvp1_.assign(NumMoments_,zero); gvp2_.assign(NumMoments_,zero);
159 gvp3_.assign(NumMoments_,zero);
160 gvs1_.assign(NumMoments_,zero); gvs2_.assign(NumMoments_,zero);
161 gvs3_.assign(NumMoments_,zero);
168 int oSize = order_.size(), cSize = coeff_.size();
169 ROL_TEST_FOR_EXCEPTION((oSize!=cSize),std::invalid_argument,
170 ">>> ERROR (ROL::MeanDeviation): Order and coefficient arrays have different sizes!");
171 Real
zero(0), two(2);
172 for (
int i = 0; i < oSize; i++) {
173 ROL_TEST_FOR_EXCEPTION((order_[i] < two), std::invalid_argument,
174 ">>> ERROR (ROL::MeanDeviation): Element of order array out of range!");
175 ROL_TEST_FOR_EXCEPTION((coeff_[i] <
zero), std::invalid_argument,
176 ">>> ERROR (ROL::MeanDeviation): Element of coefficient array out of range!");
178 ROL_TEST_FOR_EXCEPTION(positiveFunction_ == nullPtr, std::invalid_argument,
179 ">>> ERROR (ROL::MeanDeviation): PositiveFunction pointer is null!");
196 order_.clear(); order_.push_back(order);
197 coeff_.clear(); coeff_.push_back(coeff);
211 const std::vector<Real> &coeff,
214 order_.clear(); coeff_.clear();
215 for ( uint i = 0; i < order.size(); i++ ) {
216 order_.push_back(order[i]);
218 for ( uint i = 0; i < coeff.size(); i++ ) {
219 coeff_.push_back(coeff[i]);
237 ROL::ParameterList &list
238 = parlist.sublist(
"SOL").sublist(
"Risk Measure").sublist(
"Mean Plus Deviation");
241 order_ = ROL::getArrayFromStringParameter<double>(list,
"Orders");
243 coeff_ = ROL::getArrayFromStringParameter<double>(list,
"Coefficients");
246 std::string type = list.get<std::string>(
"Deviation Type");
247 if ( type ==
"Upper" ) {
248 positiveFunction_ = makePtr<PlusFunction<Real>>(list);
250 else if ( type ==
"Absolute" ) {
251 positiveFunction_ = makePtr<AbsoluteValue<Real>>(list);
254 ROL_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
255 ">>> (ROL::MeanDeviation): Deviation type is not recoginized!");
263 values_ = value_storage;
264 gradients_ = gradient_storage;
270 gradvecs_ = gradvec_storage;
271 hessvecs_ = hessvec_storage;
282 const std::vector<Real> &xstat,
290 const std::vector<Real> &xstat,
300 const std::vector<Real> &vstat,
302 const std::vector<Real> &xstat,
314 const std::vector<Real> &xstat,
320 Real diff(0), pf0(0), dev(0), one(1), weight(0);
325 pf0 = positiveFunction_->evaluate(diff,0);
327 dev0_[p] += std::pow(pf0,order_[p]) * weight;
330 sampler.
sumAll(&dev0_[0],&des0_[0],NumMoments_);
332 dev += coeff_[p]*std::pow(des0_[p],one/order_[p]);
339 std::vector<Real> &gstat,
341 const std::vector<Real> &xstat,
347 Real diff(0), pf0(0), pf1(0), c(0), one(1),
zero(0), weight(0);
352 pf0 = positiveFunction_->evaluate(diff,0);
353 pf1 = positiveFunction_->evaluate(diff,1);
355 dev0_[p] += weight * std::pow(pf0,order_[p]);
356 dev1_[p] += weight * std::pow(pf0,order_[p]-one) * pf1;
359 sampler.
sumAll(&dev0_[0],&des0_[0],NumMoments_);
360 sampler.
sumAll(&dev1_[0],&des1_[0],NumMoments_);
362 dev0_[p] = std::pow(des0_[p],one-one/order_[p]);
370 pf0 = positiveFunction_->evaluate(diff,0);
371 pf1 = positiveFunction_->evaluate(diff,1);
374 if ( dev0_[p] >
zero ) {
375 c += coeff_[p]/dev0_[p] * (std::pow(pf0,order_[p]-one)*pf1 - des1_[p]);
385 std::vector<Real> &hvstat,
387 const std::vector<Real> &vstat,
389 const std::vector<Real> &xstat,
392 std::vector<Real> myval(2), val(2);
395 sampler.
sumAll(&myval[0],&val[0],2);
396 Real ev = val[0], egv = val[1];
398 Real diff(0), pf0(0), pf1(0), pf2(0),
zero(0), one(1), two(2);
399 Real cg(0), ch(0), diff1(0), diff2(0), diff3(0), weight(0), gv(0);
404 pf0 = positiveFunction_->evaluate(diff,0);
405 pf1 = positiveFunction_->evaluate(diff,1);
406 pf2 = positiveFunction_->evaluate(diff,2);
408 dev0_[p] += weight * std::pow(pf0,order_[p]);
409 dev1_[p] += weight * std::pow(pf0,order_[p]-one) * pf1;
410 dev2_[p] += weight * std::pow(pf0,order_[p]-two) * pf1 * pf1;
411 dev3_[p] += weight * std::pow(pf0,order_[p]-one) * pf2;
414 sampler.
sumAll(&dev0_[0],&des0_[0],NumMoments_);
415 sampler.
sumAll(&dev1_[0],&des1_[0],NumMoments_);
416 sampler.
sumAll(&dev2_[0],&des2_[0],NumMoments_);
417 sampler.
sumAll(&dev3_[0],&des3_[0],NumMoments_);
419 devp_[p] = std::pow(des0_[p],two-one/order_[p]);
420 dev0_[p] = std::pow(des0_[p],one-one/order_[p]);
427 pf0 = positiveFunction_->evaluate(diff,0);
428 pf1 = positiveFunction_->evaluate(diff,1);
429 pf2 = positiveFunction_->evaluate(diff,2);
431 gvp1_[p] += weight * (std::pow(pf0,order_[p]-one)*pf1-des1_[p]) *
433 gvp2_[p] += weight * (std::pow(pf0,order_[p]-two)*pf1*pf1-des2_[p]) *
435 gvp3_[p] += weight * (std::pow(pf0,order_[p]-one)*pf2-des3_[p]) *
439 sampler.
sumAll(&gvp1_[0],&gvs1_[0],NumMoments_);
440 sampler.
sumAll(&gvp2_[0],&gvs2_[0],NumMoments_);
441 sampler.
sumAll(&gvp3_[0],&gvs3_[0],NumMoments_);
449 pf0 = positiveFunction_->evaluate(diff,0);
450 pf1 = positiveFunction_->evaluate(diff,1);
451 pf2 = positiveFunction_->evaluate(diff,2);
455 if ( dev0_[p] >
zero ) {
456 diff1 = std::pow(pf0,order_[p]-one)*pf1-des1_[p];
457 diff2 = std::pow(pf0,order_[p]-two)*pf1*pf1*(gv-egv)-gvs2_[p];
458 diff3 = std::pow(pf0,order_[p]-one)*pf2*(gv-egv)-gvs3_[p];
459 cg += coeff_[p]*diff1/dev0_[p];
460 ch += coeff_[p]*(((order_[p]-one)*diff2+diff3)/dev0_[p] -
461 (order_[p]-one)*gvs1_[p]*diff1/devp_[p]);
virtual void setHessVecStorage(const Ptr< SampledScalar< Real >> &gradvec_storage, const Ptr< SampledVector< Real >> &hessvec_storage)
Provides the interface to evaluate objective functions.
virtual std::vector< Real > getMyPoint(const int i) const
void computeHessVec(Vector< Real > &hv, Objective< Real > &obj, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
typename PV< Real >::size_type size_type
std::vector< Real > dev2_
std::vector< Real > gvs3_
void updateValue(Objective< Real > &obj, const Vector< Real > &x, const std::vector< Real > &xstat, Real &tol)
Update internal storage for value computation.
MeanDeviation(const std::vector< Real > &order, const std::vector< Real > &coeff, const Ptr< PositiveFunction< Real > > &pf)
Constructor.
Real computeValue(Objective< Real > &obj, const Vector< Real > &x, Real &tol)
std::vector< Real > dev0_
void updateHessVec(Objective< Real > &obj, const Vector< Real > &v, const std::vector< Real > &vstat, const Vector< Real > &x, const std::vector< Real > &xstat, Real &tol)
Update internal risk measure storage for Hessian-time-a-vector computation.
Ptr< Vector< Real > > hv_
void getGradient(Vector< Real > &g, std::vector< Real > &gstat, const Vector< Real > &x, const std::vector< Real > &xstat, SampleGenerator< Real > &sampler)
Return risk measure (sub)gradient.
std::vector< Real >::size_type uint
Ptr< SampledVector< Real > > gradients_
std::vector< Real > dev3_
void sumAll(Real *input, Real *output, int dim) const
MeanDeviation(const Real order, const Real coeff, const Ptr< PositiveFunction< Real > > &pf)
Constructor.
Ptr< Vector< Real > > dualVector_
std::vector< Real > des0_
Defines the linear algebra or vector space interface.
MeanDeviation(ROL::ParameterList &parlist)
Constructor.
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
Provides an interface for the mean plus a sum of arbitrary order deviations.
std::vector< Real > gvp3_
virtual void setStorage(const Ptr< SampledScalar< Real >> &value_storage, const Ptr< SampledVector< Real >> &gradient_storage)
virtual Real getMyWeight(const int i) const
Ptr< SampledScalar< Real > > gradvecs_
std::vector< Real > order_
void getHessVec(Vector< Real > &hv, std::vector< Real > &hvstat, const Vector< Real > &v, const std::vector< Real > &vstat, const Vector< Real > &x, const std::vector< Real > &xstat, SampleGenerator< Real > &sampler)
Return risk measure Hessian-times-a-vector.
void setStorage(const Ptr< SampledScalar< Real >> &value_storage, const Ptr< SampledVector< Real >> &gradient_storage)
void initialize(const Vector< Real > &x)
Initialize temporary variables.
std::vector< Real > gvp2_
virtual int numMySamples(void) const
std::vector< Real > des3_
std::vector< Real > dev1_
void updateGradient(Objective< Real > &obj, const Vector< Real > &x, const std::vector< Real > &xstat, Real &tol)
Update internal risk measure storage for gradient computation.
std::vector< Real > des2_
std::vector< Real > devp_
Ptr< SampledVector< Real > > hessvecs_
Real getValue(const Vector< Real > &x, const std::vector< Real > &xstat, SampleGenerator< Real > &sampler)
Return risk measure value.
void setHessVecStorage(const Ptr< SampledScalar< Real >> &gradvec_storage, const Ptr< SampledVector< Real >> &hessvec_storage)
void computeGradient(Vector< Real > &g, Objective< Real > &obj, const Vector< Real > &x, Real &tol)
std::vector< Real > gvs2_
Real computeGradVec(Vector< Real > &g, Objective< Real > &obj, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Ptr< SampledScalar< Real > > values_
Provides the interface to implement any functional that maps a random variable to a (extended) real n...
std::vector< Real > des1_
std::vector< Real > gvp1_
std::vector< Real > coeff_
void initializeStorage(void)
virtual void initialize(const Vector< Real > &x)
Initialize temporary variables.
std::vector< Real > gvs1_
Ptr< PositiveFunction< Real > > positiveFunction_