86 :
RiskMeasure<Real>(), plusFunction_(pf), xvar_(0.0), vvar_(0.0),
87 pnorm_(0.0), dpnorm_(0.0), dpnorm1_(0.0), pgv_(0.0), pgv1_(0.0),
89 prob_ = ((prob >= 0.0) ? ((prob <= 1.0) ? prob : 0.5) : 0.5);
90 coeff_ = ((coeff >= 0.0) ? ((coeff <= 1.0) ? coeff : 1.0) : 1.0);
91 order_ = ((order < 2) ? 2 : order);
103 dualVector_ = (x0->dual()).clone();
104 pHMdualVec0_ = (x0->dual()).clone();
105 HMdualVec0_ = (x0->dual()).clone();
106 pHMdualVec1_ = (x0->dual()).clone();
107 HMdualVec1_ = (x0->dual()).clone();
108 pHMdualVec2_ = (x0->dual()).clone();
109 HMdualVec2_ = (x0->dual()).clone();
110 pHMdualVec3_ = (x0->dual()).clone();
111 HMdualVec3_ = (x0->dual()).clone();
116 pHMdualVec0_->zero(); HMdualVec0_->zero();
130 pHMdualVec1_->zero(); HMdualVec1_->zero();
131 pHMdualVec2_->zero(); HMdualVec2_->zero();
132 pHMdualVec3_->zero(); HMdualVec3_->zero();
139 void update(
const Real val,
const Real weight) {
143 Real pf = plusFunction_->evaluate(val-xvar_,0);
144 pnorm_ += weight*std::pow(pf,(Real)order_);
151 Real pf0 = plusFunction_->evaluate(val-xvar_,0);
152 Real pf1 = plusFunction_->evaluate(val-xvar_,1);
154 Real rorder0 = (Real)order_;
155 Real rorder1 = (Real)order_-1.0;
157 Real pf0p0 = std::pow(pf0,rorder0);
158 Real pf0p1 = std::pow(pf0,rorder1);
160 pnorm_ += weight*pf0p0;
161 dpnorm_ += weight*pf0p1*pf1;
163 pHMdualVec0_->axpy(weight*pf0p1*pf1,g);
171 Real pf0 = plusFunction_->evaluate(val-xvar_,0);
172 Real pf1 = plusFunction_->evaluate(val-xvar_,1);
173 Real pf2 = plusFunction_->evaluate(val-xvar_,2);
175 Real rorder0 = (Real)order_;
176 Real rorder1 = (Real)order_-1.0;
177 Real rorder2 = (Real)order_-2.0;
179 Real pf0p0 = std::pow(pf0,rorder0);
180 Real pf0p1 = std::pow(pf0,rorder1);
181 Real pf0p2 = std::pow(pf0,rorder2);
183 Real coeff1 = pf0p1*pf1;
184 Real coeff2 = rorder1*pf0p2*pf1*pf1 + pf0p1*pf2;
186 pnorm_ += weight*pf0p0;
187 dpnorm_ += weight*coeff1;
188 dpnorm1_ += weight*coeff2;
189 pgv_ += weight*coeff1*gv;
190 pgv1_ += weight*coeff2*gv;
192 pHMdualVec0_->axpy(weight*coeff1,g);
193 pHMdualVec1_->axpy(weight*coeff2,g);
194 pHMdualVec2_->axpy(weight*coeff1,hv);
195 pHMdualVec3_->axpy(weight*coeff2*gv,g);
199 std::vector<Real> val_in(2,0.0), val_out(2,0.0);
202 sampler.
sumAll(&val_in[0],&val_out[0],2);
203 return (1.0-coeff_)*val_out[0]
204 + coeff_*(xvar_ + std::pow(val_out[1],1.0/(Real)order_)/(1.0-
prob_));
210 std::vector<Real> val_in(3,0.0), val_out(3,0.0);
214 sampler.
sumAll(&val_in[0],&val_out[0],3);
216 sampler.
sumAll(*pHMdualVec0_,*HMdualVec0_);
218 Real denom = (1.0-
prob_)*std::pow(val_out[1],((Real)order_-1.0)/(Real)order_);
220 Real var = coeff_*(1.0 - val_out[2]/denom);
222 dualVector_->scale(1.0-coeff_);
223 dualVector_->axpy(coeff_/denom,*HMdualVec0_);
232 std::vector<Real> val_in(6,0.0), val_out(6,0.0);
238 sampler.
sumAll(&val_in[0],&val_out[0],6);
240 sampler.
sumAll(*pHMdualVec0_,*HMdualVec0_);
241 sampler.
sumAll(*pHMdualVec1_,*HMdualVec1_);
242 sampler.
sumAll(*pHMdualVec2_,*HMdualVec2_);
243 sampler.
sumAll(*pHMdualVec3_,*HMdualVec3_);
245 Real rorder0 = (Real)order_;
246 Real rorder1 = (Real)order_-1.0;
247 Real rorder2 = (Real)(2*order_)-1.0;
249 Real denom1 = (1.0-
prob_)*std::pow(val_out[1],rorder1/rorder0);
250 Real denom2 = (1.0-
prob_)*std::pow(val_out[1],rorder2/rorder0);
252 Real var = coeff_*((val_out[3]/denom1 - rorder1*val_out[2]*val_out[2]/denom2)*vvar_
253 -(val_out[5]/denom1 - rorder1*val_out[4]*val_out[2]/denom2));
255 dualVector_->scale(1.0-coeff_);
256 dualVector_->axpy(coeff_*(-vvar_/denom1),*HMdualVec1_);
257 dualVector_->axpy(coeff_*(vvar_*rorder1*val_out[2]/denom2),*HMdualVec0_);
258 dualVector_->axpy(coeff_/denom1,*HMdualVec3_);
259 dualVector_->axpy(coeff_/denom1,*HMdualVec2_);
260 dualVector_->axpy(coeff_*(-rorder1*val_out[4]/denom2),*HMdualVec0_);
HMCR(Real prob, Real coeff, unsigned order, Teuchos::RCP< PlusFunction< Real > > &pf)
Teuchos::RCP< PlusFunction< Real > > plusFunction_
Teuchos::RCP< Vector< Real > > dualVector_
void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x)
Teuchos::RCP< Vector< Real > > HMdualVec1_
Teuchos::RCP< Vector< Real > > pHMdualVec2_
void getGradient(Vector< Real > &g, SampleGenerator< Real > &sampler)
Defines the linear algebra or vector space interface.
void sumAll(Real *input, Real *output, int dim) const
const Real getVaR() const
Teuchos::RCP< Vector< Real > > HMdualVec2_
Teuchos::RCP< const Vector< Real > > getVector() const
void setVaR(const Real var)
Teuchos::RCP< Vector< Real > > HMdualVec0_
Teuchos::RCP< Vector< Real > > HMdualVec3_
Teuchos::RCP< Vector< Real > > pHMdualVec1_
void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x, Teuchos::RCP< Vector< Real > > &v0, const Vector< Real > &v)
void update(const Real val, const Real weight)
void update(const Real val, const Vector< Real > &g, const Real weight)
void update(const Real val, const Vector< Real > &g, const Real gv, const Vector< Real > &hv, const Real weight)
Teuchos::RCP< Vector< Real > > pHMdualVec0_
virtual void update(const Real val, const Real weight)
Real getValue(SampleGenerator< Real > &sampler)
void setVector(const Vector< Real > &vec)
virtual void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x)
void getHessVec(Vector< Real > &hv, SampleGenerator< Real > &sampler)
Teuchos::RCP< Vector< Real > > pHMdualVec3_