void run( Vector<Real> &s, Real &snorm, Real &del, int &iflag, int &iter, const Vector<Real> &x, const Vector<Real> &grad, const Real &gnorm, ProjectedObjective<Real> &pObj ) { Real tol = std::sqrt(ROL_EPSILON); const Real gtol = std::min(tol1_,tol2_*gnorm); // Old and New Step Vectors s.zero(); snorm = 0.0; Real snorm2 = 0.0; s_->zero(); Real s1norm2 = 0.0; // Gradient Vector g_->set(grad); Real normg = gnorm; if ( pObj.isConActivated() ) { pObj.pruneActive(*g_,grad,x); normg = g_->norm(); } // Preconditioned Gradient Vector //pObj.precond(*v,*g,x,tol); pObj.reducedPrecond(*v_,*g_,x,grad,x,tol); // Basis Vector p_->set(*v_); p_->scale(-1.0); Real pnorm2 = v_->dot(g_->dual()); iter = 0; iflag = 0; Real kappa = 0.0; Real beta = 0.0; Real sigma = 0.0; Real alpha = 0.0; Real tmp = 0.0; Real gv = v_->dot(g_->dual()); Real sMp = 0.0; pRed_ = 0.0; for (iter = 0; iter < maxit_; iter++) { //pObj.hessVec(*Hp,*p,x,tol); pObj.reducedHessVec(*Hp_,*p_,x,grad,x,tol); kappa = p_->dot(Hp_->dual()); if (kappa <= 0.0) { sigma = (-sMp+sqrt(sMp*sMp+pnorm2*(del*del-snorm2)))/pnorm2; s.axpy(sigma,*p_); iflag = 2; break; } alpha = gv/kappa; s_->set(s); s_->axpy(alpha,*p_); s1norm2 = snorm2 + 2.0*alpha*sMp + alpha*alpha*pnorm2; if (s1norm2 >= del*del) { sigma = (-sMp+sqrt(sMp*sMp+pnorm2*(del*del-snorm2)))/pnorm2; s.axpy(sigma,*p_); iflag = 3; break; } pRed_ += 0.5*alpha*gv; s.set(*s_); snorm2 = s1norm2; g_->axpy(alpha,*Hp_); normg = g_->norm(); if (normg < gtol) { break; } //pObj.precond(*v,*g,x,tol); pObj.reducedPrecond(*v_,*g_,x,grad,x,tol); tmp = gv; gv = v_->dot(g_->dual()); beta = gv/tmp; p_->scale(beta); p_->axpy(-1.0,*v_); sMp = beta*(sMp+alpha*pnorm2); pnorm2 = gv + beta*beta*pnorm2; } if (iflag > 0) { pRed_ += sigma*(gv-0.5*sigma*kappa); } if (iter == maxit_) { iflag = 1; } if (iflag != 1) { iter++; } snorm = s.norm(); TrustRegion<Real>::setPredictedReduction(pRed_); }