44 #ifndef ROL_MOMENTOBJECTIVE_H 45 #define ROL_MOMENTOBJECTIVE_H 57 const std::vector<std::vector<std::pair<size_t, Real> > >
moments_;
61 Real val = 0., xpt = 0., xwt = 0.;
62 for (
size_t k = 0; k < numSamples; k++) {
64 val += xwt * ((power==1) ? xpt : std::pow(xpt,power));
66 return 0.5*std::pow((val-moment)/moment,2);
69 void momentGradient(std::vector<Real> &gradx, std::vector<Real> &gradp, Real &scale,
70 const size_t dim,
const Real power,
const Real moment,
const SROMVector<Real> &x)
const {
72 gradx.resize(numSamples,0.); gradp.resize(numSamples,0.);
74 Real xpt = 0., xwt = 0., xpow = 0.;
75 for (
size_t k = 0; k < numSamples; k++) {
77 xpow = ((power==1) ? 1. : ((power==2) ? xpt : std::pow(xpt,power-1)));
78 scale += xwt * xpow * xpt;
79 gradx[k] = xwt * xpow * power;
80 gradp[k] = xpow * xpt;
83 scale /= std::pow(moment,2);
86 void momentHessVec(std::vector<Real> &hvx1, std::vector<Real> &hvx2, std::vector<Real> &hvx3,
87 std::vector<Real> &hvp1, std::vector<Real> &hvp2,
88 Real &scale1, Real &scale2, Real &scale3,
89 const size_t dim,
const Real power,
const Real moment,
92 hvx1.resize(numSamples,0.); hvx2.resize(numSamples,0.); hvx3.resize(numSamples,0.);
93 hvp1.resize(numSamples,0.); hvp2.resize(numSamples,0.);
94 scale1 = 0.; scale2 = 0.; scale3 = 0.;
95 Real xpt = 0., xwt = 0., vpt = 0., vwt = 0.;
96 Real xpow0 = 0., xpow1 = 0., xpow2 = 0.;
97 const Real moment2 = std::pow(moment,2);
98 for (
size_t k = 0; k < numSamples; k++) {
101 xpow2 = ((power==1) ? 0. : ((power==2) ? 1. : ((power==3) ? xpt :
102 std::pow(xpt,power-2))));
103 xpow1 = ((power==1) ? 1. : xpow2 * xpt);
105 scale1 += xwt * xpow1 * vpt;
106 scale2 += xwt * xpow0;
107 scale3 += vwt * xpow0;
108 hvx1[k] = power * xwt * xpow1;
109 hvx2[k] = power * (power-1.) * xwt * xpow2 * vpt;
110 hvx3[k] = power * vwt * xpow1;
112 hvp2[k] = power * xpow1 * vpt;
114 scale1 *= power/moment2;
122 :
Objective<Real>(), moments_(moments) {}
128 std::vector<std::pair<size_t, Real> > data;
129 for (
size_t d = 0; d < dimension; d++) {
131 for (
size_t m = 0; m < data.size(); m++) {
132 val +=
momentValue(d,(Real)data[m].first,data[m].second,ex);
142 size_t numSamples = ex.getNumSamples();
143 std::vector<Real> gradx(numSamples,0.), gradp(numSamples,0.);
145 std::vector<std::pair<size_t, Real> > data;
146 std::vector<Real> val_wt(numSamples,0.), tmp(dimension,0.);
147 std::vector<std::vector<Real> > val_pt(numSamples,tmp);
148 for (
size_t d = 0; d < dimension; d++) {
150 for (
size_t m = 0; m < data.size(); m++) {
151 momentGradient(gradx,gradp,scale,d,(Real)data[m].first,data[m].second,ex);
152 for (
size_t k = 0; k < numSamples; k++) {
153 (val_pt[k])[d] += scale*gradx[k];
154 val_wt[k] += scale*gradp[k];
158 for (
size_t k = 0; k < numSamples; k++) {
169 const size_t numSamples = ex.getNumSamples();
170 std::vector<Real> hvx1(numSamples,0.), hvx2(numSamples,0.), hvx3(numSamples,0.);
171 std::vector<Real> hvp1(numSamples,0.), hvp2(numSamples,0.);
172 Real scale1 = 0., scale2 = 0., scale3 = 0.;
173 std::vector<std::pair<size_t, Real> > data;
174 std::vector<Real> val_wt(numSamples,0.), tmp(dimension,0.);
175 std::vector<std::vector<Real> > val_pt(numSamples,tmp);
176 for (
size_t d = 0; d < dimension; d++) {
178 for (
size_t m = 0; m < data.size(); m++) {
180 d,(Real)data[m].first,data[m].second,ex,ev);
181 for (
size_t k = 0; k < numSamples; k++) {
182 (val_pt[k])[d] += (scale1+scale3)*hvx1[k] + scale2*(hvx2[k]+hvx3[k]);
183 val_wt[k] += (scale1+scale3)*hvp1[k] + scale2*hvp2[k];
187 for (
size_t k = 0; k < numSamples; k++) {
Provides the interface to evaluate objective functions.
void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
Teuchos::RCP< const std::vector< Element > > getPoint(const size_t i) const
const size_t getDimension(void) const
const Element getWeight(const size_t i) const
void setWeight(const size_t i, const Element wt)
Contains definitions of custom data types in ROL.
Defines the linear algebra or vector space interface.
Real momentValue(const size_t dim, const Real power, const Real moment, const SROMVector< Real > &x) const
const size_t getNumSamples(void) const
const std::vector< std::vector< std::pair< size_t, Real > > > moments_
Provides the std::vector implementation of the ROL::Vector interface.
void momentHessVec(std::vector< Real > &hvx1, std::vector< Real > &hvx2, std::vector< Real > &hvx3, std::vector< Real > &hvp1, std::vector< Real > &hvp2, Real &scale1, Real &scale2, Real &scale3, const size_t dim, const Real power, const Real moment, const SROMVector< Real > &x, const SROMVector< Real > &v) const
Real value(const Vector< Real > &x, Real &tol)
Compute value.
void momentGradient(std::vector< Real > &gradx, std::vector< Real > &gradp, Real &scale, const size_t dim, const Real power, const Real moment, const SROMVector< Real > &x) const
MomentObjective(const std::vector< std::vector< std::pair< size_t, Real > > > &moments)
void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
void setPoint(const size_t i, const std::vector< Element > &pt)