105 const Real
zero(0), half(0.5), one(1), two(2), eps(std::sqrt(ROL_EPSILON<Real>()));
106 Real tol(eps), alpha(1), sHs(0), alphaTmp(1), mmax(0), qmin(0), q(0);
107 Real
gnorm(0), ss(0), gs(0);
108 std::deque<Real> mqueue; mqueue.push_back(0);
112 pwa1_->set(gmod_->dual());
113 s.set(*pwa1_); s.scale(-one);
115 gs = gmod_->apply(s);
116 sHs = dwa_->apply(s);
117 snorm = std::sqrt(std::abs(gs));
120 q = alpha*(gs+half*alpha*sHs);
121 gmod_->axpy(alpha,*dwa_);
124 if (useNMSP_ && useMin_) { qmin = q; smin_->set(s);}
127 pwa1_->set(gmod_->dual());
128 pwa_->set(s); pwa_->axpy(-one,*pwa1_);
129 snorm = pwa_->norm();
132 gnorm = pwa_->norm();
138 const Real gtol = std::min(tol1_,tol2_*
gnorm);
141 Real lambda = std::max(lambdaMin_,std::min(one/gmod_->norm(),lambdaMax_));
142 pwa_->set(s); pwa_->axpy(-lambda,*pwa1_);
143 snorm = pwa_->norm();
146 gs = gmod_->apply(*pwa_);
147 ss = pwa_->dot(*pwa_);
151 model.
hessVec(*dwa_,*pwa_,s,tol);
152 sHs = dwa_->apply(*pwa_);
155 mmax = *std::max_element(mqueue.begin(),mqueue.end());
156 alphaTmp = (-(one-gamma_)*gs + std::sqrt(std::pow((one-gamma_)*gs,two)-two*sHs*(q-mmax)))/sHs;
161 alpha = (sHs >
zero ? std::min(one,std::max(
zero,alphaTmp)) : one);
163 q += alpha*(gs+half*alpha*sHs);
164 gmod_->axpy(alpha,*dwa_);
168 if (
static_cast<int>(mqueue.size())==maxSize_) mqueue.pop_front();
170 if (useMin_ && q <= qmin) { qmin = q; smin_->set(s); }
173 pwa1_->set(gmod_->dual());
174 pwa_->set(s); pwa_->axpy(-one,*pwa1_);
175 snorm = pwa_->norm();
178 gnorm = pwa_->norm();
179 if (
gnorm < gtol)
break;
181 lambda = (sHs <= eps ? lambdaMax_ : std::max(lambdaMin_,std::min(ss/sHs,lambdaMax_)));
182 pwa_->set(s); pwa_->axpy(-lambda,*pwa1_);
183 snorm = pwa_->norm();
186 gs = gmod_->apply(*pwa_);
187 ss = pwa_->dot(*pwa_);
189 if (useNMSP_ && useMin_) { q = qmin; s.set(*smin_); }
190 iflag = (
iter==maxit_ ? 1 : 0);
void solve(Vector< Real > &s, Real &snorm, Real &pRed, int &iflag, int &iter, const Real del, TrustRegionModel_U< Real > &model)