ROL
ROL_TrustRegionStep.hpp
Go to the documentation of this file.
1 // @HEADER
2 // ************************************************************************
3 //
4 // Rapid Optimization Library (ROL) Package
5 // Copyright (2014) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact lead developers:
38 // Drew Kouri (dpkouri@sandia.gov) and
39 // Denis Ridzal (dridzal@sandia.gov)
40 //
41 // ************************************************************************
42 // @HEADER
43 
44 #ifndef ROL_TRUSTREGIONSTEP_H
45 #define ROL_TRUSTREGIONSTEP_H
46 
47 #include "ROL_Step.hpp"
48 #include "ROL_Types.hpp"
49 #include "ROL_Secant.hpp"
50 #include "ROL_TrustRegion.hpp"
51 #include <sstream>
52 #include <iomanip>
53 
126 namespace ROL {
127 
128 template <class Real>
129 class TrustRegionStep : public Step<Real> {
130 private:
131 
132  // ADDITIONAL VECTOR STORAGE
133  Teuchos::RCP<Vector<Real> > xnew_;
134  Teuchos::RCP<Vector<Real> > xold_;
135  Teuchos::RCP<Vector<Real> > gp_;
136 
137  // TRUST REGION INFORMATION
138  Teuchos::RCP<TrustRegion<Real> > trustRegion_;
139  Teuchos::RCP<TrustRegionModel<Real> > model_;
142  Real delMax_;
144  int SPflag_;
145  int SPiter_;
146  bool bndActive_;
147 
148  // SECANT INFORMATION
149  Teuchos::RCP<Secant<Real> > secant_;
153 
154  // BOUND CONSTRAINED PARAMETERS
155  Real scaleEps_;
157 
158  // POST SMOOTHING PARAMETERS
159  Real alpha_init_;
160  int max_fval_;
161  Real mu_;
162  Real beta_;
163 
164  // COLEMAN-LI PARAMETERS
168 
169  // INEXACT COMPUTATION PARAMETERS
170  std::vector<bool> useInexact_;
171  Real scale0_;
172  Real scale1_;
173 
174  // VERBOSITY SETTING
176 
183  void parseParameterList(Teuchos::ParameterList &parlist) {
184  Teuchos::RCP<StepState<Real> > step_state = Step<Real>::getState();
185  // Trust-Region Parameters
186  Teuchos::ParameterList &slist = parlist.sublist("Step");
187  Teuchos::ParameterList &list = slist.sublist("Trust Region");
188  step_state->searchSize = list.get("Initial Radius", static_cast<Real>(-1));
189  delMax_ = list.get("Maximum Radius", static_cast<Real>(1.e8));
190  // Inexactness Information
191  Teuchos::ParameterList &glist = parlist.sublist("General");
192  useInexact_.clear();
193  useInexact_.push_back(glist.get("Inexact Objective Function", false));
194  useInexact_.push_back(glist.get("Inexact Gradient", false));
195  useInexact_.push_back(glist.get("Inexact Hessian-Times-A-Vector", false));
196  // Trust-Region Inexactness Parameters
197  Teuchos::ParameterList &ilist = list.sublist("Inexact").sublist("Gradient");
198  scale0_ = ilist.get("Tolerance Scaling", static_cast<Real>(0.1));
199  scale1_ = ilist.get("Relative Tolerance", static_cast<Real>(2));
200  // Initialize Trust Region Subproblem Solver Object
201  etr_ = StringToETrustRegion(list.get("Subproblem Solver", "Dogleg"));
202  TRmodel_ = StringToETrustRegionModel(list.get("Subproblem Model", "Kelley-Sachs"));
203  useProjectedGrad_ = glist.get("Projected Gradient Criticality Measure", false);
204  trustRegion_ = TrustRegionFactory<Real>(parlist);
205  // Scale for epsilon active sets
206  scaleEps_ = glist.get("Scale for Epsilon Active Sets", static_cast<Real>(1));
207  verbosity_ = glist.get("Print Verbosity", 0);
208  // Post-smoothing parameters
209  max_fval_ = list.sublist("Post-Smoothing").get("Function Evaluation Limit", 20);
210  alpha_init_ = list.sublist("Post-Smoothing").get("Initial Step Size", static_cast<Real>(1));
211  mu_ = list.sublist("Post-Smoothing").get("Tolerance", static_cast<Real>(0.9999));
212  beta_ = list.sublist("Post-Smoothing").get("Rate", static_cast<Real>(0.01));
213  // Coleman-Li parameters
214  stepBackMax_ = list.sublist("Coleman-Li").get("Maximum Step Back", static_cast<Real>(0.9999));
215  stepBackScale_ = list.sublist("Coleman-Li").get("Maximum Step Scale", static_cast<Real>(1));
216  singleReflect_ = list.sublist("Coleman-Li").get("Single Reflection", true);
217  }
218 
234  AlgorithmState<Real> &algo_state ) {
235  Teuchos::RCP<StepState<Real> > state = Step<Real>::getState();
236  if ( useInexact_[1] ) {
237  const Real one(1);
238  //const Real oem2(1.e-2), oe4(1.e4);
239  //Real c = scale0_*std::max(oem2,std::min(one,oe4*algo_state.gnorm));
240  //Real gtol1 = c*std::min(algo_state.gnorm,state->searchSize);
241  //Real gtol0 = scale1_*gtol1 + one;
242  //while ( gtol0 > gtol1*scale1_ ) {
243  // obj.gradient(*(state->gradientVec),x,gtol1);
244  // algo_state.gnorm = computeCriticalityMeasure(*(state->gradientVec),x,bnd);
245  // gtol0 = gtol1;
246  // c = scale0_*std::max(oem2,std::min(one,oe4*algo_state.gnorm));
247  // gtol1 = c*std::min(algo_state.gnorm,state->searchSize);
248  //}
249  //algo_state.ngrad++;
250  Real gtol1 = scale0_*std::min(algo_state.gnorm,state->searchSize);
251  Real gtol0 = gtol1 + one;
252  while ( gtol0 > gtol1 ) {
253  obj.gradient(*(state->gradientVec),x,gtol1);
254  algo_state.gnorm = computeCriticalityMeasure(*(state->gradientVec),x,bnd);
255  gtol0 = gtol1;
256  gtol1 = scale0_*std::min(algo_state.gnorm,state->searchSize);
257  }
258  algo_state.ngrad++;
259  }
260  else {
261  Real gtol = std::sqrt(ROL_EPSILON<Real>());
262  obj.gradient(*(state->gradientVec),x,gtol);
263  algo_state.ngrad++;
264  algo_state.gnorm = computeCriticalityMeasure(*(state->gradientVec),x,bnd);
265  }
266  }
267 
277  if ( bnd.isActivated() ) {
278  if ( useProjectedGrad_ ) {
279  gp_->set(g);
280  bnd.computeProjectedGradient( *gp_, x );
281  return gp_->norm();
282  }
283  else {
284  Real one(1);
285  xnew_->set(x);
286  xnew_->axpy(-one,g.dual());
287  bnd.project(*xnew_);
288  xnew_->axpy(-one,x);
289  return xnew_->norm();
290  }
291  }
292  else {
293  return g.norm();
294  }
295  }
296 
297 public:
298 
300  using Step<Real>::compute;
301  using Step<Real>::update;
302 
303  virtual ~TrustRegionStep() {}
304 
312  TrustRegionStep( Teuchos::ParameterList & parlist )
313  : Step<Real>(),
314  xnew_(Teuchos::null), xold_(Teuchos::null), gp_(Teuchos::null),
315  trustRegion_(Teuchos::null), model_(Teuchos::null),
317  delMax_(1e8), TRflag_(TRUSTREGION_FLAG_SUCCESS),
318  SPflag_(0), SPiter_(0), bndActive_(false),
319  secant_(Teuchos::null), esec_(SECANT_LBFGS),
320  useSecantHessVec_(false), useSecantPrecond_(false),
321  scaleEps_(1), useProjectedGrad_(false),
322  alpha_init_(1), max_fval_(20), mu_(0.9999), beta_(0.01),
323  stepBackMax_(0.9999), stepBackScale_(1), singleReflect_(true),
324  scale0_(1), scale1_(1),
325  verbosity_(0) {
326  // Parse input parameterlist
327  parseParameterList(parlist);
328  // Create secant object
329  Teuchos::ParameterList &glist = parlist.sublist("General");
330  esec_ = StringToESecant(glist.sublist("Secant").get("Type","Limited-Memory BFGS"));
331  useSecantPrecond_ = glist.sublist("Secant").get("Use as Preconditioner", false);
332  useSecantHessVec_ = glist.sublist("Secant").get("Use as Hessian", false);
333  secant_ = SecantFactory<Real>(parlist);
334  }
335 
345  TrustRegionStep( Teuchos::RCP<Secant<Real> > &secant, Teuchos::ParameterList &parlist )
346  : Step<Real>(),
347  xnew_(Teuchos::null), xold_(Teuchos::null), gp_(Teuchos::null),
348  trustRegion_(Teuchos::null), model_(Teuchos::null),
350  delMax_(1e8), TRflag_(TRUSTREGION_FLAG_SUCCESS),
351  SPflag_(0), SPiter_(0), bndActive_(false),
352  secant_(Teuchos::null), esec_(SECANT_LBFGS),
353  useSecantHessVec_(false), useSecantPrecond_(false),
354  scaleEps_(1), useProjectedGrad_(false),
355  alpha_init_(1), max_fval_(20), mu_(0.9999), beta_(0.01),
356  stepBackMax_(0.9999), stepBackScale_(1), singleReflect_(true),
357  scale0_(1), scale1_(1),
358  verbosity_(0) {
359  // Parse input parameterlist
360  parseParameterList(parlist);
361  // Create secant object
362  Teuchos::ParameterList &glist = parlist.sublist("General");
363  useSecantPrecond_ = glist.sublist("Secant").get("Use as Preconditioner", false);
364  useSecantHessVec_ = glist.sublist("Secant").get("Use as Hessian", false);
365  if ( secant_ == Teuchos::null ) {
366  Teuchos::ParameterList Slist;
367  Slist.sublist("General").sublist("Secant").set("Type","Limited-Memory BFGS");
368  Slist.sublist("General").sublist("Secant").set("Maximum Storage",10);
369  secant_ = SecantFactory<Real>(Slist);
370  }
371  }
372 
381  void initialize( Vector<Real> &x, const Vector<Real> &s, const Vector<Real> &g,
383  AlgorithmState<Real> &algo_state ) {
384  Real p1(0.1), oe10(1.e10), zero(0), one(1), half(0.5), three(3), two(2), six(6);
385  Teuchos::RCP<StepState<Real> > step_state = Step<Real>::getState();
386  bndActive_ = bnd.isActivated();
387 
388  trustRegion_->initialize(x,s,g);
389 
390  Real htol = std::sqrt(ROL_EPSILON<Real>());
391  Real ftol = p1*ROL_OVERFLOW<Real>();
392 
393  step_state->descentVec = s.clone();
394  step_state->gradientVec = g.clone();
395 
396  if ( bnd.isActivated() ) {
397  // Make initial guess feasible
398  bnd.project(x);
399  xnew_ = x.clone();
400  xold_ = x.clone();
401 
402  // Make initial guess strictly feasible
403  if ( TRmodel_ == TRUSTREGION_MODEL_COLEMANLI ) {
404  xold_->set(*bnd.getUpperVectorRCP()); // u
405  xold_->axpy(-one,*bnd.getLowerVectorRCP()); // u - l
406  Real minDiff = static_cast<Real>(1e-1)
407  * std::min(one, half * xold_->reduce(Elementwise::ReductionMin<Real>()));
408 
409  class LowerFeasible : public Elementwise::BinaryFunction<Real> {
410  private:
411  const Real eps_;
412  public:
413  LowerFeasible(const Real eps) : eps_(eps) {}
414  Real apply( const Real &x, const Real &y ) const {
415  const Real tol = static_cast<Real>(100)*ROL_EPSILON<Real>();
416  return (x < y+tol) ? y+eps_ : x;
417  }
418  };
419  x.applyBinary(LowerFeasible(minDiff), *bnd.getLowerVectorRCP());
420 
421  class UpperFeasible : public Elementwise::BinaryFunction<Real> {
422  private:
423  const Real eps_;
424  public:
425  UpperFeasible(const Real eps) : eps_(eps) {}
426  Real apply( const Real &x, const Real &y ) const {
427  const Real tol = static_cast<Real>(100)*ROL_EPSILON<Real>();
428  return (x > y-tol) ? y-eps_ : x;
429  }
430  };
431  x.applyBinary(UpperFeasible(minDiff), *bnd.getUpperVectorRCP());
432  }
433  }
434  gp_ = g.clone();
435 
436  // Update approximate gradient and approximate objective function.
437  obj.update(x,true,algo_state.iter);
438  updateGradient(x,obj,bnd,algo_state);
439  algo_state.snorm = oe10;
440  algo_state.value = obj.value(x,ftol);
441  algo_state.nfval++;
442 
443  // Try to apply inverse Hessian
444  if ( !useSecantHessVec_ &&
445  (etr_ == TRUSTREGION_DOGLEG || etr_ == TRUSTREGION_DOUBLEDOGLEG) ) {
446  try {
447  Teuchos::RCP<Vector<Real> > v = g.clone();
448  Teuchos::RCP<Vector<Real> > hv = x.clone();
449  obj.invHessVec(*hv,*v,x,htol);
450  }
451  catch (std::exception &e) {
452  useSecantHessVec_ = true;
453  }
454  }
455 
456  // Evaluate Objective Function at Cauchy Point
457  if ( step_state->searchSize <= zero ) {
458  Teuchos::RCP<Vector<Real> > Bg = g.clone();
459  if ( useSecantHessVec_ ) {
460  secant_->applyB(*Bg,(step_state->gradientVec)->dual());
461  }
462  else {
463  obj.hessVec(*Bg,(step_state->gradientVec)->dual(),x,htol);
464  }
465  Real gBg = Bg->dot(*(step_state->gradientVec));
466  Real alpha = one;
467  if ( gBg > ROL_EPSILON<Real>() ) {
468  alpha = algo_state.gnorm*algo_state.gnorm/gBg;
469  }
470  // Evaluate the objective function at the Cauchy point
471  Teuchos::RCP<Vector<Real> > cp = s.clone();
472  cp->set((step_state->gradientVec)->dual());
473  cp->scale(-alpha);
474  Teuchos::RCP<Vector<Real> > xcp = x.clone();
475  xcp->set(x);
476  xcp->plus(*cp);
477  if ( bnd.isActivated() ) {
478  bnd.project(*xcp);
479  }
480  obj.update(*xcp);
481  Real fnew = obj.value(*xcp,ftol); // MUST DO SOMETHING HERE WITH FTOL
482  algo_state.nfval++;
483  // Perform cubic interpolation to determine initial trust region radius
484  Real gs = cp->dot((step_state->gradientVec)->dual());
485  Real a = fnew - algo_state.value - gs - half*alpha*alpha*gBg;
486  if ( std::abs(a) < ROL_EPSILON<Real>() ) {
487  // a = 0 implies the objective is quadratic in the negative gradient direction
488  step_state->searchSize = std::min(alpha*algo_state.gnorm,delMax_);
489  }
490  else {
491  Real b = half*alpha*alpha*gBg;
492  Real c = gs;
493  if ( b*b-three*a*c > ROL_EPSILON<Real>() ) {
494  // There is at least one critical point
495  Real t1 = (-b-std::sqrt(b*b-three*a*c))/(three*a);
496  Real t2 = (-b+std::sqrt(b*b-three*a*c))/(three*a);
497  if ( six*a*t1 + two*b > zero ) {
498  // t1 is the minimizer
499  step_state->searchSize = std::min(t1*alpha*algo_state.gnorm,delMax_);
500  }
501  else {
502  // t2 is the minimizer
503  step_state->searchSize = std::min(t2*alpha*algo_state.gnorm,delMax_);
504  }
505  }
506  else {
507  step_state->searchSize = std::min(alpha*algo_state.gnorm,delMax_);
508  }
509  }
510  }
511  }
512 
524  AlgorithmState<Real> &algo_state ) {
525  // Get step state
526  Teuchos::RCP<StepState<Real> > step_state = Step<Real>::getState();
527  // Build trust-region model
528  if (bnd.isActivated()) {
529  if ( TRmodel_ == TRUSTREGION_MODEL_KELLEYSACHS ) {
530 // Real eps = scaleEps_*algo_state.gnorm;
531  Real eps = scaleEps_ * std::min(std::pow(algo_state.gnorm,static_cast<Real>(0.75)),
532  static_cast<Real>(0.01));
533  model_ = Teuchos::rcp(new ROL::KelleySachsModel<Real>(obj,
534  bnd,
535  x,
536  *(step_state->gradientVec),
537  eps,
538  secant_,
539  useSecantPrecond_,
540  useSecantHessVec_));
541  }
542  else if ( TRmodel_ == TRUSTREGION_MODEL_COLEMANLI ) {
543  model_ = Teuchos::rcp(new ROL::ColemanLiModel<Real>(obj,
544  bnd,
545  x,
546  *(step_state->gradientVec),
547  secant_,
548  useSecantPrecond_,
549  useSecantHessVec_,
550  step_state->searchSize,
551  stepBackMax_,
552  stepBackScale_,
553  singleReflect_));
554  }
555  else {
556  TEUCHOS_TEST_FOR_EXCEPTION( true, std::invalid_argument,
557  ">>> ERROR (ROL::TrustRegionStep): Invalid trust-region model!");
558  }
559  }
560  else {
561  model_ = Teuchos::rcp(new ROL::TrustRegionModel<Real>(obj,
562  x,
563  *(step_state->gradientVec),
564  secant_,
565  useSecantPrecond_,
566  useSecantHessVec_));
567  }
568  // Minimize trust-region model over trust-region constraint
569  SPflag_ = 0; SPiter_ = 0;
570  trustRegion_->run(s,algo_state.snorm,SPflag_,SPiter_,step_state->searchSize,*model_);
571  }
572 
585  const Vector<Real> &s,
586  Objective<Real> &obj,
587  BoundConstraint<Real> &bnd,
588  AlgorithmState<Real> &algo_state ) {
589  // Get step state
590  Teuchos::RCP<StepState<Real> > state = Step<Real>::getState();
591  // Store previous step for constraint computations
592  if ( bnd.isActivated() ) {
593  xold_->set(x);
594  }
595  // Update trust-region information;
596  // Performs a hard update on the objective function
597  TRflag_ = TRUSTREGION_FLAG_SUCCESS;
598  state->nfval = 0;
599  state->ngrad = 0;
600  Real fold = algo_state.value;
601  Real fnew(0);
602  algo_state.iter++;
603  trustRegion_->update(x,fnew,state->searchSize,state->nfval,state->ngrad,TRflag_,
604  s,algo_state.snorm,fold,*(state->gradientVec),algo_state.iter,
605  obj,bnd,*model_);
606  algo_state.nfval += state->nfval;
607  algo_state.ngrad += state->ngrad;
608  // If step is accepted ...
609  // Compute new gradient and update secant storage
610  if ( TRflag_ == TRUSTREGION_FLAG_SUCCESS ||
611  TRflag_ == TRUSTREGION_FLAG_POSPREDNEG ) {
612  // Perform line search (smoothing) to ensure decrease
613  if ( bnd.isActivated() && TRmodel_ == TRUSTREGION_MODEL_KELLEYSACHS ) {
614  Real tol = std::sqrt(ROL_EPSILON<Real>());
615  // Compute new gradient
616  obj.gradient(*gp_,x,tol); // MUST DO SOMETHING HERE WITH TOL
617  algo_state.ngrad++;
618  // Compute smoothed step
619  Real alpha(1);
620  xnew_->set(x);
621  xnew_->axpy(-alpha*alpha_init_,gp_->dual());
622  bnd.project(*xnew_);
623  // Compute new objective value
624  obj.update(*xnew_,true,algo_state.iter);
625  Real ftmp = obj.value(*xnew_,tol); // MUST DO SOMETHING HERE WITH TOL
626  algo_state.nfval++;
627  // Perform smoothing
628  int cnt = 0;
629  alpha = static_cast<Real>(1)/alpha_init_;
630  while ( (fnew-ftmp) <= mu_*(fnew-fold) ) {
631  xnew_->set(x);
632  xnew_->axpy(-alpha*alpha_init_,gp_->dual());
633  bnd.project(*xnew_);
634  obj.update(*xnew_,true,algo_state.iter);
635  ftmp = obj.value(*xnew_,tol); // MUST DO SOMETHING HERE WITH TOL
636  algo_state.nfval++;
637  if ( cnt >= max_fval_ ) {
638  break;
639  }
640  alpha *= beta_;
641  cnt++;
642  }
643  // Store objective function and iteration information
644  fnew = ftmp;
645  x.set(*xnew_);
646  }
647  // Store previous gradient for secant update
648  if ( useSecantHessVec_ || useSecantPrecond_ ) {
649  gp_->set(*(state->gradientVec));
650  }
651  // Update objective function and approximate model
652  updateGradient(x,obj,bnd,algo_state);
653  // Update secant information
654  if ( useSecantHessVec_ || useSecantPrecond_ ) {
655  if ( bnd.isActivated() ) { // Compute new constrained step
656  xnew_->set(x);
657  xnew_->axpy(-static_cast<Real>(1),*xold_);
658  secant_->updateStorage(x,*(state->gradientVec),*gp_,*xnew_,algo_state.snorm,algo_state.iter+1);
659  }
660  else {
661  secant_->updateStorage(x,*(state->gradientVec),*gp_,s,algo_state.snorm,algo_state.iter+1);
662  }
663  }
664  // Update algorithm state
665  (algo_state.iterateVec)->set(x);
666  }
667  else {
668  if ( useInexact_[1] ) {
669  // Update objective function and approximate model
670  updateGradient(x,obj,bnd,algo_state);
671  }
672  }
673  // Update algorithm state
674  algo_state.value = fnew;
675  }
676 
681  std::string printHeader( void ) const {
682  std::stringstream hist;
683 
684  if(verbosity_>0) {
685  hist << std::string(114,'-') << "\n";
686 
687  hist << "Trust-Region status output definitions\n\n";
688 
689  hist << " iter - Number of iterates (steps taken) \n";
690  hist << " value - Objective function value \n";
691  hist << " gnorm - Norm of the gradient\n";
692  hist << " snorm - Norm of the step (update to optimization vector)\n";
693  hist << " delta - Trust-Region radius\n";
694  hist << " #fval - Number of times the objective function was evaluated\n";
695  hist << " #grad - Number of times the gradient was computed\n";
696 
697 
698 
699  hist << "\n";
700  hist << " tr_flag - Trust-Region flag" << "\n";
701  for( int flag = TRUSTREGION_FLAG_SUCCESS; flag != TRUSTREGION_FLAG_UNDEFINED; ++flag ) {
702  hist << " " << NumberToString(flag) << " - "
703  << ETrustRegionFlagToString(static_cast<ETrustRegionFlag>(flag)) << "\n";
704 
705  }
706 
707  if( etr_ == TRUSTREGION_TRUNCATEDCG ) {
708  hist << "\n";
709  hist << " iterCG - Number of Truncated CG iterations\n\n";
710  hist << " flagGC - Trust-Region Truncated CG flag" << "\n";
711  for( int flag = CG_FLAG_SUCCESS; flag != CG_FLAG_UNDEFINED; ++flag ) {
712  hist << " " << NumberToString(flag) << " - "
713  << ECGFlagToString(static_cast<ECGFlag>(flag)) << "\n";
714  }
715  }
716 
717  hist << std::string(114,'-') << "\n";
718  }
719 
720  hist << " ";
721  hist << std::setw(6) << std::left << "iter";
722  hist << std::setw(15) << std::left << "value";
723  hist << std::setw(15) << std::left << "gnorm";
724  hist << std::setw(15) << std::left << "snorm";
725  hist << std::setw(15) << std::left << "delta";
726  hist << std::setw(10) << std::left << "#fval";
727  hist << std::setw(10) << std::left << "#grad";
728  hist << std::setw(10) << std::left << "tr_flag";
729  if ( etr_ == TRUSTREGION_TRUNCATEDCG ) {
730  hist << std::setw(10) << std::left << "iterCG";
731  hist << std::setw(10) << std::left << "flagCG";
732  }
733  hist << "\n";
734  return hist.str();
735  }
736 
741  std::string printName( void ) const {
742  std::stringstream hist;
743  hist << "\n" << ETrustRegionToString(etr_) << " Trust-Region Solver";
744  if ( useSecantPrecond_ || useSecantHessVec_ ) {
745  if ( useSecantPrecond_ && !useSecantHessVec_ ) {
746  hist << " with " << ESecantToString(esec_) << " Preconditioning\n";
747  }
748  else if ( !useSecantPrecond_ && useSecantHessVec_ ) {
749  hist << " with " << ESecantToString(esec_) << " Hessian Approximation\n";
750  }
751  else {
752  hist << " with " << ESecantToString(esec_) << " Preconditioning and Hessian Approximation\n";
753  }
754  }
755  else {
756  hist << "\n";
757  }
758  if ( bndActive_ ) {
759  hist << "Trust-Region Model: " << ETrustRegionModelToString(TRmodel_) << "\n";
760  }
761  return hist.str();
762  }
763 
771  std::string print( AlgorithmState<Real> & algo_state, bool print_header = false ) const {
772  const Teuchos::RCP<const StepState<Real> >& step_state = Step<Real>::getStepState();
773 
774  std::stringstream hist;
775  hist << std::scientific << std::setprecision(6);
776  if ( algo_state.iter == 0 ) {
777  hist << printName();
778  }
779  if ( print_header ) {
780  hist << printHeader();
781  }
782  if ( algo_state.iter == 0 ) {
783  hist << " ";
784  hist << std::setw(6) << std::left << algo_state.iter;
785  hist << std::setw(15) << std::left << algo_state.value;
786  hist << std::setw(15) << std::left << algo_state.gnorm;
787  hist << std::setw(15) << std::left << " ";
788  hist << std::setw(15) << std::left << step_state->searchSize;
789  hist << "\n";
790  }
791  else {
792  hist << " ";
793  hist << std::setw(6) << std::left << algo_state.iter;
794  hist << std::setw(15) << std::left << algo_state.value;
795  hist << std::setw(15) << std::left << algo_state.gnorm;
796  hist << std::setw(15) << std::left << algo_state.snorm;
797  hist << std::setw(15) << std::left << step_state->searchSize;
798  hist << std::setw(10) << std::left << algo_state.nfval;
799  hist << std::setw(10) << std::left << algo_state.ngrad;
800  hist << std::setw(10) << std::left << TRflag_;
801  if ( etr_ == TRUSTREGION_TRUNCATEDCG ) {
802  hist << std::setw(10) << std::left << SPiter_;
803  hist << std::setw(10) << std::left << SPflag_;
804  }
805  hist << "\n";
806  }
807  return hist.str();
808  }
809 
810 }; // class Step
811 
812 } // namespace ROL
813 
814 #endif
std::string ECGFlagToString(ECGFlag cgf)
Definition: ROL_Types.hpp:884
Provides the interface to evaluate objective functions.
void parseParameterList(Teuchos::ParameterList &parlist)
Parse input ParameterList.
ESecant esec_
Secant type.
bool bndActive_
Flag whether bound is activated.
std::string ETrustRegionModelToString(ETrustRegionModel tr)
std::string printHeader(void) const
Print iterate header.
Real mu_
Post-Smoothing tolerance for projected methods.
std::string print(AlgorithmState< Real > &algo_state, bool print_header=false) const
Print iterate status.
bool useSecantPrecond_
Flag whether to use a secant preconditioner.
virtual Real value(const Vector< Real > &x, Real &tol)=0
Compute value.
Provides the interface to compute optimization steps.
Definition: ROL_Step.hpp:69
virtual void applyBinary(const Elementwise::BinaryFunction< Real > &f, const Vector &x)
Definition: ROL_Vector.hpp:224
void initialize(Vector< Real > &x, const Vector< Real > &s, const Vector< Real > &g, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Initialize step.
virtual void hessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply Hessian approximation to vector.
Teuchos::RCP< StepState< Real > > getState(void)
Definition: ROL_Step.hpp:74
Contains definitions of custom data types in ROL.
Real alpha_init_
Initial line-search parameter for projected methods.
virtual Teuchos::RCP< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
Provides the interface to evaluate trust-region model functions.
TrustRegionStep(Teuchos::RCP< Secant< Real > > &secant, Teuchos::ParameterList &parlist)
Constructor.
ESecant StringToESecant(std::string s)
Definition: ROL_Types.hpp:527
Defines the linear algebra or vector space interface.
Definition: ROL_Vector.hpp:76
Teuchos::RCP< Vector< Real > > gp_
Container for previous gradient vector.
Teuchos::RCP< Vector< Real > > xold_
Container for previous iteration vector.
Teuchos::RCP< Secant< Real > > secant_
Container for secant approximation.
Real computeCriticalityMeasure(const Vector< Real > &g, const Vector< Real > &x, BoundConstraint< Real > &bnd)
Compute the criticality measure.
ETrustRegionModel TRmodel_
Trust-region subproblem model type.
State for algorithm class. Will be used for restarts.
Definition: ROL_Types.hpp:91
Real scaleEps_
Scaling for epsilon-active sets.
virtual void gradient(Vector< Real > &g, const Vector< Real > &x, Real &tol)
Compute gradient.
bool isActivated(void)
Check if bounds are on.
virtual const Vector & dual() const
Return dual representation of , for example, the result of applying a Riesz map, or change of basis...
Definition: ROL_Vector.hpp:215
std::string NumberToString(T Number)
Definition: ROL_Types.hpp:80
ETrustRegion etr_
Trust-region subproblem solver type.
Teuchos::RCP< Vector< Real > > xnew_
Container for updated iteration vector.
void compute(Vector< Real > &s, const Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Compute step.
ESecant
Enumeration of secant update algorithms.
Definition: ROL_Types.hpp:470
ETrustRegionModel StringToETrustRegionModel(std::string s)
int SPflag_
Subproblem solver termination flag.
const Teuchos::RCP< const StepState< Real > > getStepState(void) const
Get state for step object.
Definition: ROL_Step.hpp:293
ETrustRegionFlag TRflag_
Trust-region exit flag.
bool useSecantHessVec_
Flag whether to use a secant Hessian.
int SPiter_
Subproblem solver iteration count.
std::vector< bool > useInexact_
Flags for inexact (0) objective function, (1) gradient, (2) Hessian.
Provides interface for and implements limited-memory secant operators.
Definition: ROL_Secant.hpp:70
Real scale0_
Scale for inexact gradient computation.
virtual const Teuchos::RCP< const Vector< Real > > getUpperVectorRCP(void) const
Return the ref count pointer to the upper bound vector.
Real delMax_
Maximum trust-region radius.
virtual void invHessVec(Vector< Real > &hv, const Vector< Real > &v, const Vector< Real > &x, Real &tol)
Apply inverse Hessian approximation to vector.
TrustRegionStep(Teuchos::ParameterList &parlist)
Constructor.
Provides the interface to evaluate interior trust-region model functions from the Coleman-Li bound co...
ETrustRegionModel
Enumeration of trust-region model types.
Provides the interface to apply upper and lower bound constraints.
void computeProjectedGradient(Vector< Real > &g, const Vector< Real > &x)
Compute projected gradient.
int verbosity_
Print additional information to screen if > 0.
std::string printName(void) const
Print step name.
ETrustRegion StringToETrustRegion(std::string s)
Provides the interface to evaluate projected trust-region model functions from the Kelley-Sachs bound...
ROL::DiagonalOperator apply
void update(Vector< Real > &x, const Vector< Real > &s, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Update step, if successful.
virtual const Teuchos::RCP< const Vector< Real > > getLowerVectorRCP(void) const
Return the ref count pointer to the lower bound vector.
Teuchos::RCP< TrustRegionModel< Real > > model_
Container for trust-region model.
Teuchos::RCP< Vector< Real > > iterateVec
Definition: ROL_Types.hpp:105
virtual void set(const Vector &x)
Set where .
Definition: ROL_Vector.hpp:198
virtual Real norm() const =0
Returns where .
int max_fval_
Maximum function evaluations in line-search for projected methods.
virtual void update(const Vector< Real > &x, bool flag=true, int iter=-1)
Update objective function.
ETrustRegion
Enumeration of trust-region solver types.
std::string ETrustRegionFlagToString(ETrustRegionFlag trf)
ETrustRegionFlag
Enumation of flags used by trust-region solvers.
std::string ETrustRegionToString(ETrustRegion tr)
std::string ESecantToString(ESecant tr)
Definition: ROL_Types.hpp:479
bool useProjectedGrad_
Flag whether to use the projected gradient criticality measure.
Teuchos::RCP< TrustRegion< Real > > trustRegion_
Container for trust-region solver object.
Real beta_
Post-Smoothing rate for projected methods.
Real scale1_
Scale for inexact gradient computation.
void updateGradient(Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &bnd, AlgorithmState< Real > &algo_state)
Update gradient to iteratively satisfy inexactness condition.
virtual void project(Vector< Real > &x)
Project optimization variables onto the bounds.
Provides the interface to compute optimization steps with trust regions.