44 #ifndef ROL_KLDIVERGENCE_HPP 45 #define ROL_KLDIVERGENCE_HPP 71 :
RiskMeasure<Real>(), eps_(eps > 0 ? eps : 1.e-2), firstReset_(true) {}
75 Teuchos::ParameterList &list
76 = parlist.sublist(
"SOL").sublist(
"Risk Measure").sublist(
"KL Divergence");
77 Real eps = list.get(
"Threshold",1.e-2);
78 eps_ = eps > 0 ? eps : 1.e-2;
85 scaledGradient_ = (x0->dual()).clone();
86 scaledHessVec_ = (x0->dual()).clone();
87 dualVector1_ = (x0->dual()).clone();
88 dualVector2_ = (x0->dual()).clone();
91 gval_ = 0.0; gvval_ = 0.0; hval_ = 0.0;
92 scaledGradient_->zero(); scaledHessVec_->zero();
93 dualVector1_->zero(); dualVector2_->zero();
103 void update(
const Real val,
const Real weight) {
108 Real ev = std::exp(val/xstat_);
111 gval_ += weight*ev*val;
116 Real ev = std::exp(val/xstat_);
121 scaledGradient_->axpy(weight*ev*gv,g);
122 scaledHessVec_->axpy(weight*ev*val,g);
123 gval_ += weight*ev*val;
124 gvval_ += weight*ev*val*gv;
125 hval_ += weight*ev*val*val;
131 sampler.
sumAll(&val,&ev,1);
132 return xstat_*(eps_ + std::log(ev));
136 std::vector<Real> local(2,0.0), global(2,0.0);
139 sampler.
sumAll(&local[0],&global[0],2);
141 Real egval = global[1];
144 dualVector1_->scale(1.0/ev);
146 Real gstat = eps_ + std::log(ev) - egval/(ev*
xstat_);
153 std::vector<Real> local(5,0.0), global(5,0.0);
159 sampler.
sumAll(&local[0],&global[0],5);
161 Real egv = global[1];
162 Real egval = global[2];
163 Real egvval = global[3];
164 Real ehval = global[4];
168 sampler.
sumAll(*scaledGradient_,*dualVector2_);
169 dualVector1_->axpy(1.0/xstat_,*dualVector2_);
170 dualVector1_->scale(1.0/ev);
172 dualVector2_->zero();
174 dualVector1_->axpy((vstat_*egval/xstat_ - egv)/(xstat_*ev*ev),*dualVector2_);
176 dualVector2_->zero();
177 sampler.
sumAll(*scaledHessVec_,*dualVector2_);
178 dualVector1_->axpy(-vstat_/(xstat_*xstat_*ev),*dualVector2_);
182 Real hstat = vstat_/(xstat_*xstat_*xstat_*ev) * (ehval - egval*egval/ev)
183 + (egv*egval/ev - egvval)/(ev*xstat_*xstat_);
Real getValue(SampleGenerator< Real > &sampler)
void update(const Real val, const Real weight)
Teuchos::RCP< Vector< Real > > dualVector1_
void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x)
void getHessVec(Vector< Real > &hv, SampleGenerator< Real > &sampler)
Defines the linear algebra or vector space interface.
KLDivergence(Teuchos::ParameterList &parlist)
void getGradient(Vector< Real > &g, SampleGenerator< Real > &sampler)
void sumAll(Real *input, Real *output, int dim) const
void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x, Teuchos::RCP< Vector< Real > > &v0, const Vector< Real > &v)
Teuchos::RCP< Vector< Real > > scaledGradient_
void update(const Real val, const Vector< Real > &g, const Real weight)
Teuchos::RCP< Vector< Real > > scaledHessVec_
virtual void reset(Teuchos::RCP< Vector< Real > > &x0, const Vector< Real > &x)
KLDivergence(const Real eps=1.e-2)
Teuchos::RCP< Vector< Real > > dualVector2_
void update(const Real val, const Vector< Real > &g, const Real gv, const Vector< Real > &hv, const Real weight)