44 #ifndef ROL_MEANDEVIATION_HPP 45 #define ROL_MEANDEVIATION_HPP 52 #include "Teuchos_ParameterList.hpp" 53 #include "Teuchos_Array.hpp" 59 typedef typename std::vector<Real>::size_type
uint;
96 dev0_.clear(); dev1_.clear(); dev2_.clear(); dev3_.clear();
97 des0_.clear(); des1_.clear(); des2_.clear(); des3_.clear();
99 gvp1_.clear(); gvp2_.clear(); gvp3_.clear();
100 gvs1_.clear(); gvs2_.clear(); gvs3_.clear();
102 dev0_.resize(NumMoments_,0.0); dev1_.resize(NumMoments_,0.0);
103 dev2_.resize(NumMoments_,0.0); dev3_.resize(NumMoments_,0.0);
104 des0_.resize(NumMoments_,0.0); des1_.resize(NumMoments_,0.0);
105 des2_.resize(NumMoments_,0.0); des3_.resize(NumMoments_,0.0);
106 devp_.resize(NumMoments_,0.0);
107 gvp1_.resize(NumMoments_,0.0); gvp2_.resize(NumMoments_,0.0);
108 gvp3_.resize(NumMoments_,0.0);
109 gvs1_.resize(NumMoments_,0.0); gvs2_.resize(NumMoments_,0.0);
110 gvs3_.resize(NumMoments_,0.0);
114 dev0_.assign(NumMoments_,0.0); dev1_.assign(NumMoments_,0.0);
115 dev2_.assign(NumMoments_,0.0); dev3_.assign(NumMoments_,0.0);
116 des0_.assign(NumMoments_,0.0); des1_.assign(NumMoments_,0.0);
117 des2_.assign(NumMoments_,0.0); des3_.assign(NumMoments_,0.0);
118 devp_.assign(NumMoments_,0.0);
119 gvp1_.assign(NumMoments_,0.0); gvp2_.assign(NumMoments_,0.0);
120 gvp3_.assign(NumMoments_,0.0);
121 gvs1_.assign(NumMoments_,0.0); gvs2_.assign(NumMoments_,0.0);
122 gvs3_.assign(NumMoments_,0.0);
124 value_storage_.clear();
125 gradient_storage_.clear();
126 gradvec_storage_.clear();
127 hessvec_storage_.clear();
135 :
RiskMeasure<Real>(), positiveFunction_(pf), firstReset_(true) {
136 order_.clear(); coeff_.clear();
137 order_.push_back((order < 2.0) ? 2.0 : order);
138 coeff_.push_back((coeff < 0.0) ? 1.0 : coeff);
139 NumMoments_ = order_.size();
145 :
RiskMeasure<Real>(), positiveFunction_(pf), firstReset_(true) {
146 order_.clear(); coeff_.clear();
147 NumMoments_ = order.size();
148 if ( NumMoments_ != coeff.size() ) {
149 coeff.resize(NumMoments_,1.0);
152 order_.push_back((order[i] < 2.0) ? 2.0 : order[i]);
153 coeff_.push_back((coeff[i] < 0.0) ? 1.0 : coeff[i]);
160 Teuchos::ParameterList &list
161 = parlist.sublist(
"SOL").sublist(
"Risk Measure").sublist(
"Mean Plus Deviation");
163 Teuchos::Array<Real> order
164 = Teuchos::getArrayFromStringParameter<double>(list,
"Orders");
165 Teuchos::Array<Real> coeff
166 = Teuchos::getArrayFromStringParameter<double>(list,
"Coefficients");
168 NumMoments_ = order.size();
169 order_.clear(); coeff_.clear();
170 if ( NumMoments_ != static_cast<uint>(coeff.size()) ) {
171 coeff.resize(NumMoments_,1.0);
174 order_.push_back((order[i] < 2.0) ? 2.0 : order[i]);
175 coeff_.push_back((coeff[i] < 0.0) ? 1.0 : coeff[i]);
178 if ( list.get(
"Deviation Type",
"Upper") ==
"Upper" ) {
190 dualVector1_ = (x0->dual()).clone();
191 dualVector2_ = (x0->dual()).clone();
194 dualVector1_->zero(); dualVector2_->zero();
205 void update(
const Real val,
const Real weight) {
207 value_storage_.push_back(val);
208 weights_.push_back(weight);
214 value_storage_.push_back(val);
215 gradient_storage_.push_back(g.
clone());
216 typename std::vector<Teuchos::RCP<Vector<Real> > >::iterator it = gradient_storage_.end();
219 weights_.push_back(weight);
228 value_storage_.push_back(val);
229 gradient_storage_.push_back(g.
clone());
230 typename std::vector<Teuchos::RCP<Vector<Real> > >::iterator it = gradient_storage_.end();
233 gradvec_storage_.push_back(gv);
234 hessvec_storage_.push_back(hv.
clone());
235 it = hessvec_storage_.end();
238 weights_.push_back(weight);
244 sampler.
sumAll(&val,&ev,1);
246 Real diff = 0.0, pf0 = 0.0, dev = 0.0;
247 for ( uint i = 0; i < weights_.size(); i++ ) {
248 diff = value_storage_[i]-ev;
249 pf0 = positiveFunction_->evaluate(diff,0);
251 dev0_[p] += std::pow(pf0,order_[p]) * weights_[i];
254 sampler.
sumAll(&dev0_[0],&des0_[0],NumMoments_);
256 dev += coeff_[p]*std::pow(des0_[p],1.0/order_[p]);
265 sampler.
sumAll(&val,&ev,1);
267 Real diff = 0.0, pf0 = 0.0, pf1 = 0.0, c = 0.0;
268 for ( uint i = 0; i < weights_.size(); i++ ) {
269 diff = value_storage_[i]-ev;
270 pf0 = positiveFunction_->evaluate(diff,0);
271 pf1 = positiveFunction_->evaluate(diff,1);
273 dev0_[p] += weights_[i] * std::pow(pf0,order_[p]);
274 dev1_[p] += weights_[i] * std::pow(pf0,order_[p]-1.0) * pf1;
277 sampler.
sumAll(&dev0_[0],&des0_[0],NumMoments_);
278 sampler.
sumAll(&dev1_[0],&des1_[0],NumMoments_);
280 dev0_[p] = std::pow(des0_[p],1.0-1.0/order_[p]);
283 for ( uint i = 0; i < weights_.size(); i++ ) {
285 diff = value_storage_[i]-ev;
286 pf0 = positiveFunction_->evaluate(diff,0);
287 pf1 = positiveFunction_->evaluate(diff,1);
289 if ( dev0_[p] > 0.0 ) {
290 c += coeff_[p]/dev0_[p] * (std::pow(pf0,order_[p]-1.0)*pf1 - des1_[p]);
293 dualVector1_->axpy(weights_[i]*c,*(gradient_storage_[i]));
296 sampler.
sumAll(*dualVector1_,*dualVector2_);
304 sampler.
sumAll(&val,&ev,1);
306 sampler.
sumAll(&gv,&egv,1);
308 Real diff = 0.0, pf0 = 0.0, pf1 = 0.0, pf2 = 0.0;
309 Real cg = 0.0, ch = 0.0, diff1 = 0.0, diff2 = 0.0, diff3 = 0.0;
310 for ( uint i = 0; i < weights_.size(); i++ ) {
311 diff = value_storage_[i]-ev;
312 pf0 = positiveFunction_->evaluate(diff,0);
313 pf1 = positiveFunction_->evaluate(diff,1);
314 pf2 = positiveFunction_->evaluate(diff,2);
316 dev0_[p] += weights_[i] * std::pow(pf0,order_[p]);
317 dev1_[p] += weights_[i] * std::pow(pf0,order_[p]-1.0) * pf1;
318 dev2_[p] += weights_[i] * std::pow(pf0,order_[p]-2.0) * pf1 * pf1;
319 dev3_[p] += weights_[i] * std::pow(pf0,order_[p]-1.0) * pf2;
322 sampler.
sumAll(&dev0_[0],&des0_[0],NumMoments_);
323 sampler.
sumAll(&dev1_[0],&des1_[0],NumMoments_);
324 sampler.
sumAll(&dev2_[0],&des2_[0],NumMoments_);
325 sampler.
sumAll(&dev3_[0],&des3_[0],NumMoments_);
327 devp_[p] = std::pow(des0_[p],2.0-1.0/order_[p]);
328 dev0_[p] = std::pow(des0_[p],1.0-1.0/order_[p]);
330 for ( uint i = 0; i < value_storage_.size(); i++ ) {
331 diff = value_storage_[i]-ev;
332 pf0 = positiveFunction_->evaluate(diff,0);
333 pf1 = positiveFunction_->evaluate(diff,1);
334 pf2 = positiveFunction_->evaluate(diff,2);
336 gvp1_[p] += weights_[i] * (std::pow(pf0,order_[p]-1.0)*pf1-des1_[p]) *
337 (gradvec_storage_[i] - egv);
338 gvp2_[p] += weights_[i] * (std::pow(pf0,order_[p]-2.0)*pf1*pf1-des2_[p]) *
339 (gradvec_storage_[i] - egv);
340 gvp3_[p] += weights_[i] * (std::pow(pf0,order_[p]-1.0)*pf2-des3_[p]) *
341 (gradvec_storage_[i] - egv);
344 sampler.
sumAll(&gvp1_[0],&gvs1_[0],NumMoments_);
345 sampler.
sumAll(&gvp2_[0],&gvs2_[0],NumMoments_);
346 sampler.
sumAll(&gvp3_[0],&gvs3_[0],NumMoments_);
348 for ( uint i = 0; i < weights_.size(); i++ ) {
351 diff = value_storage_[i]-ev;
352 pf0 = positiveFunction_->evaluate(diff,0);
353 pf1 = positiveFunction_->evaluate(diff,1);
354 pf2 = positiveFunction_->evaluate(diff,2);
356 if ( dev0_[p] > 0.0 ) {
357 diff1 = std::pow(pf0,order_[p]-1.0)*pf1-des1_[p];
358 diff2 = std::pow(pf0,order_[p]-2.0)*pf1*pf1*(gradvec_storage_[i]-egv)-gvs2_[p];
359 diff3 = std::pow(pf0,order_[p]-1.0)*pf2*(gradvec_storage_[i]-egv)-gvs3_[p];
360 cg += coeff_[p]*diff1/dev0_[p];
361 ch += coeff_[p]*(((order_[p]-1.0)*diff2+diff3)/dev0_[p] -
362 (order_[p]-1.0)*gvs1_[p]*diff1/devp_[p]);
365 dualVector1_->axpy(weights_[i]*ch,*(gradient_storage_[i]));
366 dualVector1_->axpy(weights_[i]*cg,*(hessvec_storage_[i]));
368 sampler.
sumAll(*dualVector1_,*dualVector2_);
Real getValue(SampleGenerator< Real > &sampler)
MeanDeviation(Real order, Real coeff, Teuchos::RCP< PositiveFunction< Real > > &pf)
std::vector< Real > dev2_
std::vector< Real > gvs3_
std::vector< Real > dev0_
std::vector< Real >::size_type uint
std::vector< Real > dev3_
Teuchos::RCP< Vector< Real > > dualVector2_
virtual Teuchos::RCP< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
std::vector< Real > des0_
Defines the linear algebra or vector space interface.
void sumAll(Real *input, Real *output, int dim) const
void getGradient(Vector< Real > &g, SampleGenerator< Real > &sampler)
void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x, Teuchos::RCP< Vector< Real > > &v0, const Vector< Real > &v)
std::vector< Real > gvp3_
Teuchos::RCP< const Vector< Real > > getVector() const
std::vector< Real > order_
MeanDeviation(Teuchos::ParameterList &parlist)
std::vector< Real > gvp2_
std::vector< Real > value_storage_
std::vector< Teuchos::RCP< Vector< Real > > > gradient_storage_
std::vector< Real > des3_
std::vector< Real > dev1_
std::vector< Real > gradvec_storage_
Teuchos::RCP< Vector< Real > > dualVector1_
std::vector< Real > des2_
std::vector< Real > devp_
void update(const Real val, const Real weight)
std::vector< Real > gvs2_
void update(const Real val, const Vector< Real > &g, const Real gv, const Vector< Real > &hv, const Real weight)
void update(const Real val, const Vector< Real > &g, const Real weight)
virtual void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x)
MeanDeviation(std::vector< Real > &order, std::vector< Real > &coeff, Teuchos::RCP< PositiveFunction< Real > > &pf)
Teuchos::RCP< PositiveFunction< Real > > positiveFunction_
std::vector< Real > des1_
std::vector< Real > gvp1_
void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x)
std::vector< Real > weights_
std::vector< Real > coeff_
std::vector< Teuchos::RCP< Vector< Real > > > hessvec_storage_
void getHessVec(Vector< Real > &hv, SampleGenerator< Real > &sampler)
std::vector< Real > gvs1_