50 #include "Teuchos_RCP.hpp"
73 Teuchos::RCP<Vector<Real> >
tG_;
74 Teuchos::RCP<Vector<Real> >
eG_;
75 Teuchos::RCP<Vector<Real> >
yG_;
85 void remove(
const std::vector<unsigned> &ind) {
86 for (
unsigned j = ind.back()+1; j <
size_; j++) {
96 for (
unsigned i = ind.size()-1; i > 0; --i) {
97 for (
unsigned j = ind[i-1]+1; j <
size_; j++) {
120 Bundle(
const unsigned maxSize = 10,
const Real coeff = 0.0,
const unsigned remSize = 2)
135 for (
unsigned i = 0; i <
maxSize_; i++) {
167 alpha = std::max(
coeff_*std::pow(dm,2.0),le);
172 const Real
alpha(
const unsigned i)
const {
181 aggSubGrad.
zero(); aggLinErr = 0.0; aggDistMeas = 0.0;
eG_->zero();
182 Real eLE = 0.0, eDM = 0.0, yLE = 0.0, yDM = 0.0, tLE = 0.0, tDM = 0.0;
183 for (
unsigned i = 0; i <
size_; i++) {
185 tG_->set(aggSubGrad);
192 aggLinErr = tLE + yLE;
193 eLE = (tLE - aggLinErr) + yLE;
197 aggDistMeas = tDM + yDM;
198 eDM = (tDM - aggDistMeas) + yDM;
205 unsigned loc =
size_, cnt = 0;
206 std::vector<unsigned> ind(
remSize_,0);
207 for (
unsigned i =
size_; i > 0; --i) {
213 for (
unsigned i = 0; i <
size_; i++) {
214 if ( i < loc || i > loc ) {
229 void update(
const bool flag,
const Real linErr,
const Real distMeas,
233 for (
unsigned i = 0; i <
size_; i++) {
257 Teuchos::RCP<Vector<Real> >
gx_;
258 Teuchos::RCP<Vector<Real> >
ge_;
275 Real sum = 0.0, err = 0.0, tmp = 0.0, y = 0.0;
276 for (
unsigned i = 0; i <
size_; i++) {
281 err = (tmp - sum) + y;
283 for (
unsigned i = 0; i <
size_; i++) {
288 for (
unsigned i = 0; i <
size_; i++) {
300 for (
unsigned i = 0; i <
size_; i++) {
307 Real Hx = 0.0, val = 0.0, err = 0.0, tmp = 0.0, y = 0.0;
308 for (
unsigned i = 0; i <
size_; i++) {
313 y = x[i]*(0.5*Hx +
alpha(i)/t) + err;
315 err = (tmp - val) + y;
317 g[i] = Hx +
alpha(i)/t;
324 for (
unsigned i = 0; i <
size_; i++) {
331 for (
unsigned i = 0; i <
size_; i++) {
337 void applyMatrix(std::vector<Real> &Hx,
const std::vector<Real> &x)
const {
340 typename std::set<unsigned>::iterator it =
nworkingSet_.begin();
341 for (
unsigned i = 0; i < n; i++) {
350 for (
unsigned i = 0; i < n; i++) {
356 void computeLagMult(std::vector<Real> &lam,
const Real mu,
const std::vector<Real> &g)
const {
360 typename std::set<unsigned>::iterator it =
workingSet_.begin();
361 for (
unsigned i = 0; i < n; i++) {
362 lam[i] = g[*it] - mu; it++;
375 typename std::set<unsigned>::iterator it =
workingSet_.begin();
376 for (
unsigned i = 0; i < n; i++) {
388 Real
computeAlpha(
unsigned &ind,
const std::vector<Real> &x,
const std::vector<Real> &p)
const {
390 typename std::set<unsigned>::iterator it;
393 tmp = -x[*it]/p[*it];
394 if ( alpha >= tmp ) {
400 return std::max(0.0,alpha);
404 const std::vector<Real> &g,
const Real tol)
const {
410 std::vector<Real> gk(n,0.0);
411 typename std::set<unsigned>::iterator it =
nworkingSet_.begin();
412 for (
unsigned i = 0; i < n; i++) {
413 gk[i] = g[*it]; it++;
415 std::vector<Real> sk(n,0.0);
418 for (
unsigned i = 0; i < n; i++) {
419 s[*it] = sk[i]; it++;
427 std::vector<Real> tmp(Px.size(),0.0);
436 void applyG(std::vector<Real> &Gx,
const std::vector<Real> &x)
const {
447 Real sum = 0.0, err = 0.0, tmp = 0.0, y = 0.0;
448 for (
unsigned i = 0; i < dim; i++) {
453 err = (tmp - sum) + y;
456 for (
unsigned i = 0; i < dim; i++) {
462 Gx.assign(x.begin(),x.end());
467 Real eHe = 0.0, sum = 0.0;
468 Real errX = 0.0, tmpX = 0.0, yX = 0.0, errE = 0.0, tmpE = 0.0, yE = 0.0;
469 std::vector<Real> gg(dim,0.0);
470 typename std::set<unsigned>::iterator it =
nworkingSet_.begin();
471 for (
unsigned i = 0; i < dim; i++) {
475 yX = x[i]*gg[i] + errX;
477 errX = (tmpX - sum) + yX;
482 errE = (tmpE - eHe) + yE;
485 for (
unsigned i = 0; i < dim; i++) {
486 Px[i] = (x[i]-sum)*gg[i];
490 void applyG_Jacobi(std::vector<Real> &Gx,
const std::vector<Real> &x)
const {
492 typename std::set<unsigned>::iterator it =
nworkingSet_.begin();
493 for (
unsigned i = 0; i < dim; i++) {
502 Real eHx = 0.0, eHe = 0.0;
504 std::vector<Real> x1(dim,0.0), e1(dim,0.0),gg(dim,0.0);
505 typename std::set<unsigned>::iterator it, jt;
507 for (
int i = 0; i < dim; i++) {
509 for (
int j = 0; j < i; j++) {
520 for (
int i = 0; i < dim; i++) {
525 std::vector<Real> Hx(dim,0.0), He(dim,0.0); it =
nworkingSet_.end();
526 for (
int i = dim-1; i >= 0; --i) {
529 for (
int j = dim-1; j >= i+1; --j) {
541 for (
int i = 0; i < dim; i++) {
542 Px[i] = Hx[i] - (eHx/eHe)*He[i];
546 void applyG_SymGS(std::vector<Real> &Gx,
const std::vector<Real> &x)
const {
548 typename std::set<unsigned>::iterator it =
nworkingSet_.begin();
549 for (
unsigned i = 0; i < dim; i++) {
555 unsigned n = g.size();
556 std::vector<Real> Gg(n,0.0);
557 Real y = 0.0, ytmp = 0.0, yprt = 0.0, yerr = 0.0;
561 for (
unsigned i = 0; i < n; i++) {
563 yprt = (r[i] - Gg[i]) + yerr;
565 yerr = (ytmp - y) + yprt;
568 for (
unsigned i = 0; i < n; i++) {
574 unsigned projectedCG(std::vector<Real> &x, Real &mu,
const std::vector<Real> &b,
const Real tol)
const {
576 std::vector<Real> r(n,0.0), r0(n,0.0), g(n,0.0), d(n,0.0), Ad(n,0.0);
580 r0.assign(r.begin(),r.end());
583 Real rg =
dot(r,g), rg0 = 0.0;
586 Real
alpha = 0.0, kappa = 0.0, beta = 0.0;
587 Real CGtol = std::min(tol,1.e-2*rg);
589 while (rg > CGtol && cnt < 2*n+1) {
606 Real err = 0.0, tmp = 0.0, y = 0.0;
607 for (
unsigned i = 0; i < n; i++) {
611 err = (tmp - mu) + y;
618 Real
dot(
const std::vector<Real> &x,
const std::vector<Real> &y)
const {
620 Real val = 0.0, err = 0.0, tmp = 0.0, y0 = 0.0;
621 unsigned n = std::min(x.size(),y.size());
622 for (
unsigned i = 0; i < n; i++) {
624 y0 = x[i]*y[i] + err;
626 err = (tmp - val) + y0;
631 Real
norm(
const std::vector<Real> &x)
const {
632 return std::sqrt(
dot(x,x));
635 void axpy(
const Real a,
const std::vector<Real> &x, std::vector<Real> &y)
const {
636 unsigned n = std::min(y.size(),x.size());
637 for (
unsigned i = 0; i < n; i++) {
642 void scale(std::vector<Real> &x,
const Real a)
const {
643 for (
unsigned i = 0; i < x.size(); i++) {
648 void scale(std::vector<Real> &x,
const Real a,
const std::vector<Real> &y)
const {
649 unsigned n = std::min(x.size(),y.size());
650 for (
unsigned i = 0; i < n; i++) {
655 unsigned solveDual_dim1(
const Real t,
const unsigned maxit = 1000,
const Real tol = 1.e-8) {
661 unsigned solveDual_dim2(
const Real t,
const unsigned maxit = 1000,
const Real tol = 1.e-8) {
663 Real diffg =
gx_->dot(*
gx_);
667 dualVariables_[0] = std::min(1.0,std::max(0.0,-(gdiffg+diffa)/diffg));
690 unsigned ind = 0, i = 0, CGiter = 0;
691 Real snorm = 0.0,
alpha = 0.0, mu = 0.0;
695 for (i = 0; i < maxit; i++) {
733 unsigned solveDual(
const Real t,
const unsigned maxit = 1000,
const Real tol = 1.e-8) {
738 else if (
size_ == 2) {
751 void project(std::vector<Real> &x,
const std::vector<Real> &v)
const {
752 std::vector<Real> vsort(
size_,0.0);
753 vsort.assign(v.begin(),v.end());
754 std::sort(vsort.begin(),vsort.end());
755 Real sum = -1.0, lam = 0.0;
756 for (
int i =
size_-1; i > 0; i--) {
758 if ( sum >= ((Real)(
size_-i))*vsort[i-1] ) {
759 lam = sum/(Real)(
size_-i);
764 lam = (sum+vsort[0])/(Real)
size_;
766 for (
int i = 0; i <
size_; i++) {
767 x[i] = std::max(0.0,v[i] - lam);
772 std::vector<Real> x(
size_,0.0), Px(
size_,0.0);
void initializeDualSolver(void)
void applyPreconditioner_Jacobi(std::vector< Real > &Px, const std::vector< Real > &x) const
void scale(std::vector< Real > &x, const Real a) const
std::set< unsigned > workingSet_
virtual void plus(const Vector &x)=0
Compute , where .
void update(const bool flag, const Real linErr, const Real distMeas, const Vector< Real > &g, const Vector< Real > &s)
Real norm(const std::vector< Real > &x) const
Teuchos::RCP< Vector< Real > > yG_
const Real linearizationError(const unsigned i) const
void applyFullMatrix(std::vector< Real > &Hx, const std::vector< Real > &x) const
void applyMatrix(std::vector< Real > &Hx, const std::vector< Real > &x) const
Contains definitions of custom data types in ROL.
unsigned solveEQPsubproblem(std::vector< Real > &s, Real &mu, const std::vector< Real > &g, const Real tol) const
Real computeCriticality(const std::vector< Real > &g)
virtual Teuchos::RCP< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
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.
unsigned solveDual(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)
const Vector< Real > & subgradient(const unsigned i) const
void applyPreconditioner(std::vector< Real > &Px, const std::vector< Real > &x) const
std::set< unsigned > nworkingSet_
const Real computeAlpha(const Real dm, const Real le) const
std::vector< Real > dualVariables_
void scale(std::vector< Real > &x, const Real a, const std::vector< Real > &y) const
void applyG_SymGS(std::vector< Real > &Gx, const std::vector< Real > &x) const
Teuchos::RCP< Vector< Real > > ge_
Real dot(const std::vector< Real > &x, const std::vector< Real > &y) const
void computeLagMult(std::vector< Real > &lam, const Real mu, const std::vector< Real > &g) const
const Real alpha(const unsigned i) const
std::vector< Teuchos::RCP< Vector< Real > > > subgradients_
unsigned projectedCG(std::vector< Real > &x, Real &mu, const std::vector< Real > &b, const Real tol) const
void applyG_Identity(std::vector< Real > &Gx, const std::vector< Real > &x) const
Real computeAlpha(unsigned &ind, const std::vector< Real > &x, const std::vector< Real > &p) const
void applyG_Jacobi(std::vector< Real > &Gx, const std::vector< Real > &x) const
std::vector< Real > distanceMeasures_
Real evaluateObjective(std::vector< Real > &g, const std::vector< Real > &x, const Real t) const
bool isNonnegative(unsigned &ind, const std::vector< Real > &x) const
void applyPreconditioner_SymGS(std::vector< Real > &Px, const std::vector< Real > &x) const
void aggregate(Vector< Real > &aggSubGrad, Real &aggLinErr, Real &aggDistMeas) const
unsigned solveDual_dim1(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)
void applyPreconditioner_Identity(std::vector< Real > &Px, const std::vector< Real > &x) const
Teuchos::RCP< Vector< Real > > eG_
unsigned size(void) const
void applyG(std::vector< Real > &Gx, const std::vector< Real > &x) const
const Real distanceMeasure(const unsigned i) const
Teuchos::RCP< Vector< Real > > tG_
virtual void set(const Vector &x)
Set where .
void project(std::vector< Real > &x, const std::vector< Real > &v) const
static const double ROL_OVERFLOW
Platform-dependent maximum double.
void axpy(const Real a, const std::vector< Real > &x, std::vector< Real > &y) const
std::vector< Real > linearizationErrors_
unsigned solveDual_dim2(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)
void initialize(const Vector< Real > &g)
void add(const Vector< Real > &g, const Real le, const Real dm)
Teuchos::RCP< Vector< Real > > gx_
Bundle(const unsigned maxSize=10, const Real coeff=0.0, const unsigned remSize=2)
void computeResidualUpdate(std::vector< Real > &r, std::vector< Real > &g) const
Provides the interface for and implments a bundle.
static const double ROL_EPSILON
Platform-dependent machine epsilon.
unsigned solveDual_arbitrary(const Real t, const unsigned maxit=1000, const Real tol=1.e-8)