50 #include "Teuchos_RCP.hpp" 73 Teuchos::RCP<Vector<Real> >
tG_;
74 Teuchos::RCP<Vector<Real> >
eG_;
75 Teuchos::RCP<Vector<Real> >
yG_;
76 Teuchos::RCP<Vector<Real> >
gx_;
77 Teuchos::RCP<Vector<Real> >
ge_;
88 void remove(
const std::vector<unsigned> &ind) {
90 for (
unsigned j = ind.back()+1; j <
size_; ++j) {
91 (subgradients_[j-1])->
set(*(subgradients_[j]));
92 linearizationErrors_[j-1] = linearizationErrors_[j];
93 distanceMeasures_[j-1] = distanceMeasures_[j];
94 dualVariables_[j-1] = dualVariables_[j];
96 (subgradients_[size_-1])->zero();
97 linearizationErrors_[size_-1] = ROL_OVERFLOW<Real>();
98 distanceMeasures_[size_-1] = ROL_OVERFLOW<Real>();
99 dualVariables_[size_-1] = zero;
100 for (
unsigned i = ind.size()-1; i > 0; --i) {
101 for (
unsigned j = ind[i-1]+1; j <
size_; ++j) {
102 (subgradients_[j-1])->
set(*(subgradients_[j]));
103 linearizationErrors_[j-1] = linearizationErrors_[j];
104 distanceMeasures_[j-1] = distanceMeasures_[j];
105 dualVariables_[j-1] = dualVariables_[j];
113 (subgradients_[
size_])->
set(g);
114 linearizationErrors_[
size_] = le;
115 distanceMeasures_[
size_] = dm;
116 dualVariables_[
size_] = zero;
127 const Real coeff = 0.0,
128 const Real omega = 2.0,
129 const unsigned remSize = 2)
130 : size_(0), maxSize_(maxSize), remSize_(remSize),
131 coeff_(coeff), omega_(omega), isInitialized_(false) {
133 remSize_ = ((remSize_ < 2) ? 2 : ((remSize_ > maxSize_-1) ? maxSize_-1 : remSize_));
134 coeff_ = std::max(static_cast<Real>(0),coeff_);
135 omega_ = std::max(static_cast<Real>(1),omega_);
136 subgradients_.clear();
137 subgradients_.assign(maxSize,Teuchos::null);
138 linearizationErrors_.clear();
139 linearizationErrors_.assign(maxSize_,ROL_OVERFLOW<Real>());
140 distanceMeasures_.clear();
141 distanceMeasures_.assign(maxSize_,ROL_OVERFLOW<Real>());
142 dualVariables_.clear();
143 dualVariables_.assign(maxSize_,zero);
147 if ( !isInitialized_ ) {
148 Real zero(0), one(1);
149 for (
unsigned i = 0; i <
maxSize_; ++i) {
150 subgradients_[i] = g.
clone();
152 (subgradients_[0])->
set(g);
153 linearizationErrors_[0] = zero;
154 distanceMeasures_[0] = zero;
155 dualVariables_[0] = one;
157 isInitialized_ =
true;
166 virtual unsigned solveDual(
const Real t,
const unsigned maxit = 1000,
const Real tol = 1.e-8) = 0;
169 return linearizationErrors_[i];
173 return distanceMeasures_[i];
177 return *(subgradients_[i]);
181 return dualVariables_[i];
185 dualVariables_[i] = val;
190 dualVariables_.assign(size_,zero);
195 if ( coeff_ > ROL_EPSILON<Real>() ) {
196 alpha = std::max(coeff_*std::pow(dm,omega_),le);
201 const Real
alpha(
const unsigned i)
const {
202 return computeAlpha(distanceMeasures_[i],linearizationErrors_[i]);
210 Real zero(0), one(1);
211 aggSubGrad.
zero(); aggLinErr = zero; aggDistMeas = zero; eG_->zero();
212 Real eLE(0), eDM(0), yLE(0), yDM(0), tLE(0), tDM(0);
213 for (
unsigned i = 0; i <
size_; ++i) {
216 yG_->set(*subgradients_[i]); yG_->scale(dualVariables_[i]); yG_->axpy(-one,*eG_);
217 tG_->set(aggSubGrad); tG_->plus(*yG_);
218 eG_->set(*tG_); eG_->axpy(-one,aggSubGrad); eG_->axpy(-one,*yG_);
219 aggSubGrad.
set(*tG_);
222 yLE = dualVariables_[i]*linearizationErrors_[i] - eLE;
223 tLE = aggLinErr + yLE;
224 eLE = (tLE - aggLinErr) - yLE;
228 yDM = dualVariables_[i]*distanceMeasures_[i] - eDM;
229 tDM = aggDistMeas + yDM;
230 eDM = (tDM - aggDistMeas) - yDM;
236 if (size_ == maxSize_) {
238 unsigned loc =
size_, cnt = 0;
239 std::vector<unsigned> ind(remSize_,0);
240 for (
unsigned i = size_; i > 0; --i) {
241 if ( std::abs(linearizationErrors_[i-1]) < ROL_EPSILON<Real>() ) {
246 for (
unsigned i = 0; i <
size_; ++i) {
251 if (cnt == remSize_) {
262 void update(
const bool flag,
const Real linErr,
const Real distMeas,
267 for (
unsigned i = 0; i <
size_; ++i) {
268 linearizationErrors_[i] += linErr - subgradients_[i]->dot(s.
dual());
269 distanceMeasures_[i] += distMeas;
271 linearizationErrors_[
size_] = zero;
272 distanceMeasures_[
size_] = zero;
276 linearizationErrors_[
size_] = linErr;
277 distanceMeasures_[
size_] = distMeas;
280 (subgradients_[
size_])->
set(g);
282 dualVariables_[
size_] = zero;
288 const Real
GiGj(
const unsigned i,
const unsigned j)
const {
301 Real one(1), half(0.5);
302 gx_->zero(); eG_->zero();
303 for (
unsigned i = 0; i < Bundle<Real>::size(); ++i) {
306 yG_->set(
subgradient(i)); yG_->scale(x[i]); yG_->axpy(-one,*eG_);
307 tG_->set(*gx_); tG_->plus(*yG_);
308 eG_->set(*tG_); eG_->axpy(-one,*gx_); eG_->axpy(-one,*yG_);
311 Real Hx(0), val(0), err(0), tmp(0), y(0);
312 for (
unsigned i = 0; i <
size(); ++i) {
317 y = x[i]*(half*Hx +
alpha(i)/t) - err;
319 err = (tmp - val) - y;
322 g[i] = Hx +
alpha(i)/t;
327 unsigned solveDual_dim1(
const Real t,
const unsigned maxit = 1000,
const Real tol = 1.e-8) {
333 unsigned solveDual_dim2(
const Real t,
const unsigned maxit = 1000,
const Real tol = 1.e-8) {
334 Real diffg = gx_->dot(*gx_), zero(0), one(1), half(0.5);
336 if ( std::abs(diffg) > ROL_EPSILON<Real>() ) {
338 Real gdiffg =
dotGi(1,*gx_);
343 if ( std::abs(
alpha(0)-
alpha(1)) > ROL_EPSILON<Real>() ) {
void resetDualVariables(void)
void update(const bool flag, const Real linErr, const Real distMeas, const Vector< Real > &g, const Vector< Real > &s)
virtual void axpy(const Real alpha, const Vector &x)
Compute where .
Teuchos::RCP< Vector< Real > > yG_
const Real alpha(const unsigned i) const
void setDualVariable(const unsigned i, const Real val)
Contains definitions of custom data types in ROL.
const Vector< Real > & subgradient(const unsigned i) const
virtual Teuchos::RCP< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
const Real GiGj(const unsigned i, const unsigned j) const
void reset(const Vector< Real > &g, const Real le, const Real dm)
virtual void zero()
Set to zero vector.
Defines the linear algebra or vector space interface.
virtual Real dot(const Vector &x) const =0
Compute where .
std::vector< Real > dualVariables_
const Real getDualVariable(const unsigned i) const
const Real distanceMeasure(const unsigned i) const
Teuchos::RCP< Vector< Real > > ge_
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
std::vector< Teuchos::RCP< Vector< Real > > > subgradients_
Bundle(const unsigned maxSize=10, const Real coeff=0.0, const Real omega=2.0, const unsigned remSize=2)
const Real dotGi(const unsigned i, const Vector< Real > &x) const
std::vector< Real > distanceMeasures_
unsigned size(void) const
virtual void initialize(const Vector< Real > &g)
const Real computeAlpha(const Real dm, const Real le) const
virtual unsigned solveDual(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)=0
unsigned solveDual_dim1(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)
Teuchos::RCP< Vector< Real > > eG_
Teuchos::RCP< Vector< Real > > tG_
virtual void set(const Vector &x)
Set where .
std::vector< Real > linearizationErrors_
unsigned solveDual_dim2(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)
void add(const Vector< Real > &g, const Real le, const Real dm)
Real evaluateObjective(std::vector< Real > &g, const std::vector< Real > &x, const Real t) const
Teuchos::RCP< Vector< Real > > gx_
void addGi(const unsigned i, const Real a, Vector< Real > &x) const
const Real linearizationError(const unsigned i) const
Provides the interface for and implements a bundle.
void aggregate(Vector< Real > &aggSubGrad, Real &aggLinErr, Real &aggDistMeas) const