44 std::ostream &outStream) {
46 if (proj_ == nullPtr) {
47 proj_ = makePtr<PolyhedralProjection<Real>>(makePtrFromRef(bnd));
52 Real ftol = std::sqrt(ROL_EPSILON<Real>());
53 proj_->project(x,outStream);
55 state_->value = obj.
value(x,ftol);
57 obj.
gradient(*state_->gradientVec,x,ftol);
59 state_->stepVec->set(x);
60 state_->stepVec->axpy(-one,state_->gradientVec->dual());
61 proj_->project(*state_->stepVec,outStream);
62 Real fnew = state_->value;
66 fnew = obj.
value(*state_->stepVec,ftol);
70 state_->stepVec->axpy(-one,x);
71 state_->gnorm = state_->stepVec->norm();
72 state_->snorm = ROL_INF<Real>();
77 Real gs = state_->stepVec->apply(*state_->gradientVec);
78 Real denom = (fnew - state_->value - gs);
79 bool flag = maxAlpha_ == alpha0_;
80 alpha0_ = ((denom > ROL_EPSILON<Real>()) ? -half*gs/denom : alpha0bnd_);
81 alpha0_ = ((alpha0_ > alpha0bnd_) ? alpha0_ : one);
82 if (flag) maxAlpha_ = alpha0_;
86 alpha0_ /= state_->gradientVec->norm();
88 state_->searchSize = alpha0_;
96 std::ostream &outStream ) {
99 initialize(x,g,obj,bnd,outStream);
100 Ptr<Vector<Real>> s = x.
clone();
101 Real ftrial(0), gs(0), ftrialP(0), alphaP(0), tol(std::sqrt(ROL_EPSILON<Real>()));
103 bool incAlpha =
false, accept =
true;
106 if (verbosity_ > 0) writeOutput(outStream,
true);
109 state_->stepVec->set(state_->gradientVec->dual());
110 while (status_->check(*state_)) {
113 if (!usePrevAlpha_ && !useAdapt_) state_->searchSize = alpha0_;
114 state_->iterateVec->set(x);
115 state_->iterateVec->axpy(-state_->searchSize,*state_->stepVec);
116 proj_->project(*state_->iterateVec,outStream);
118 ftrial = obj.
value(*state_->iterateVec,tol);
120 s->set(*state_->iterateVec);
122 gs = s->dot(*state_->stepVec);
123 incAlpha = (state_->value - ftrial >= -c1_*gs);
124 if (verbosity_ > 1) {
125 outStream <<
" In TypeB::GradientAlgorithm: Line Search" << std::endl;
126 outStream <<
" Step size: " << state_->searchSize << std::endl;
127 outStream <<
" Trial objective value: " << ftrial << std::endl;
128 outStream <<
" Computed reduction: " << state_->value-ftrial << std::endl;
129 outStream <<
" Dot product of gradient and step: " << gs << std::endl;
130 outStream <<
" Sufficient decrease bound: " << -gs*c1_ << std::endl;
131 outStream <<
" Number of function evaluations: " << ls_nfval << std::endl;
132 outStream <<
" Increase alpha?: " << incAlpha << std::endl;
134 if (incAlpha && useAdapt_) {
135 ftrialP = ROL_INF<Real>();
136 while ( state_->value - ftrial >= -c1_*gs
138 && state_->searchSize < maxAlpha_
139 && ls_nfval < maxit_ ) {
142 alphaP = state_->searchSize;
144 state_->searchSize *= rhoinc_;
145 state_->searchSize = std::min(state_->searchSize,maxAlpha_);
146 state_->iterateVec->set(x);
147 state_->iterateVec->axpy(-state_->searchSize,*state_->stepVec);
148 proj_->project(*state_->iterateVec,outStream);
150 ftrial = obj.
value(*state_->iterateVec,tol);
152 s->set(*state_->iterateVec);
154 gs = s->dot(*state_->stepVec);
155 if (verbosity_ > 1) {
156 outStream << std::endl;
157 outStream <<
" Step size: " << state_->searchSize << std::endl;
158 outStream <<
" Trial objective value: " << ftrial << std::endl;
159 outStream <<
" Computed reduction: " << state_->value-ftrial << std::endl;
160 outStream <<
" Dot product of gradient and step: " << gs << std::endl;
161 outStream <<
" Sufficient decrease bound: " << -gs*c1_ << std::endl;
162 outStream <<
" Number of function evaluations: " << ls_nfval << std::endl;
165 if (state_->value - ftrial < -c1_*gs || ftrial > ftrialP) {
167 state_->searchSize = alphaP;
168 state_->iterateVec->set(x);
169 state_->iterateVec->axpy(-state_->searchSize,*state_->stepVec);
170 proj_->project(*state_->iterateVec,outStream);
171 s->set(*state_->iterateVec);
177 while ( state_->value - ftrial < -c1_*gs && ls_nfval < maxit_ ) {
178 state_->searchSize *= rhodec_;
179 state_->iterateVec->set(x);
180 state_->iterateVec->axpy(-state_->searchSize,*state_->stepVec);
181 proj_->project(*state_->iterateVec,outStream);
183 ftrial = obj.
value(*state_->iterateVec,tol);
185 s->set(*state_->iterateVec);
187 gs = s->dot(*state_->stepVec);
188 if (verbosity_ > 1) {
189 outStream << std::endl;
190 outStream <<
" Step size: " << state_->searchSize << std::endl;
191 outStream <<
" Trial objective value: " << ftrial << std::endl;
192 outStream <<
" Computed reduction: " << state_->value-ftrial << std::endl;
193 outStream <<
" Dot product of gradient and step: " << gs << std::endl;
194 outStream <<
" Sufficient decrease bound: " << -gs*c1_ << std::endl;
195 outStream <<
" Number of function evaluations: " << ls_nfval << std::endl;
199 state_->nfval += ls_nfval;
202 state_->stepVec->set(*s);
203 state_->snorm = state_->stepVec->norm();
206 x.
set(*state_->iterateVec);
210 state_->value = ftrial;
213 obj.
gradient(*state_->gradientVec,x,tol);
217 state_->stepVec->set(state_->gradientVec->dual());
220 s->set(x); s->axpy(-one,*state_->stepVec);
221 proj_->project(*s,outStream);
223 state_->gnorm = s->norm();
226 if (verbosity_ > 0) writeOutput(outStream,writeHeader_);
269 std::ios_base::fmtflags osFlags(os.flags());
270 os << std::scientific << std::setprecision(6);
271 if ( state_->iter == 0 ) writeName(os);
272 if ( write_header ) writeHeader(os);
273 if ( state_->iter == 0 ) {
275 os << std::setw(6) << std::left << state_->iter;
276 os << std::setw(15) << std::left << state_->value;
277 os << std::setw(15) << std::left << state_->gnorm;
278 os << std::setw(15) << std::left <<
"---";
279 os << std::setw(15) << std::left <<
"---";
280 os << std::setw(10) << std::left << state_->nfval;
281 os << std::setw(10) << std::left << state_->ngrad;
286 os << std::setw(6) << std::left << state_->iter;
287 os << std::setw(15) << std::left << state_->value;
288 os << std::setw(15) << std::left << state_->gnorm;
289 os << std::setw(15) << std::left << state_->snorm;
290 os << std::setw(15) << std::left << state_->searchSize;
291 os << std::setw(10) << std::left << state_->nfval;
292 os << std::setw(10) << std::left << state_->ngrad;