35 const Real
zero(0), two(2), oem3(1.e-3), oem6(1.e-6), oem8(1.e-8);
36 const Real p1(0.1), p2(0.2), p9(0.9), oe3(1.e3), oe8(1.e8);
37 ParameterList &blist = parlist.sublist(
"Step").sublist(
"Bundle");
38 state_->searchSize = blist.get(
"Initial Trust-Region Parameter", oe3);
39 T_ = blist.get(
"Maximum Trust-Region Parameter", oe8);
40 tol_ = blist.get(
"Epsilon Solution Tolerance", oem6);
41 m1_ = blist.get(
"Upper Threshold for Serious Step", p1);
42 m2_ = blist.get(
"Lower Threshold for Serious Step", p2);
43 m3_ = blist.get(
"Upper Threshold for Null Step", p9);
44 nu_ = blist.get(
"Tolerance for Trust-Region Parameter", oem3);
47 Real coeff = blist.get(
"Distance Measure Coefficient",
zero);
48 Real omega = blist.get(
"Locality Measure Coefficient", two);
49 unsigned maxSize = blist.get(
"Maximum Bundle Size", 200);
50 unsigned remSize = blist.get(
"Removal Size for Bundle Update", 2);
51 int cps = blist.get(
"Cutting Plane Solver",0);
53 bundle_ = makePtr<Bundle_U_TT<Real>>(maxSize,coeff,omega,remSize);
56 bundle_ = makePtr<Bundle_U_AS<Real>>(maxSize,coeff,omega,remSize);
61 QPtol_ = blist.get(
"Cutting Plane Tolerance", oem8);
62 QPmaxit_ = blist.get(
"Cutting Plane Iteration Limit", 1000);
65 ParameterList &lslist = parlist.sublist(
"Step").sublist(
"Line Search");
66 ls_maxit_ = lslist.get(
"Maximum Number of Function Evaluations",20);
72 verbosity_ = parlist.sublist(
"General").get(
"Output Level", 0);
101 std::ostream &outStream ) {
102 const Real
zero(0), two(2), half(0.5);
106 Ptr<Vector<Real>> y = x.
clone();
107 Ptr<Vector<Real>> aggSubGradNew = g.
clone();
108 Real aggSubGradOldNorm =
state_->gnorm;
109 Real linErrNew(0), valueNew(0);
110 Real aggLinErrNew(0), aggLinErrOld(0), aggDistMeasNew(0);
111 Real v(0), l(0), u(
T_), gd(0);
127 bundle_->aggregate(*aggSubGradNew,aggLinErrNew,aggDistMeasNew);
128 state_->aggregateGradientNorm = aggSubGradNew->norm();
130 outStream << std::endl;
131 outStream <<
" Computation of aggregrate quantities" << std::endl;
132 outStream <<
" Aggregate subgradient norm: " <<
state_->aggregateGradientNorm << std::endl;
133 outStream <<
" Aggregate linearization error: " << aggLinErrNew << std::endl;
134 outStream <<
" Aggregate distance measure: " << aggDistMeasNew << std::endl;
139 v = -
state_->searchSize*std::pow(
state_->aggregateGradientNorm,two)-aggLinErrNew;
140 state_->stepVec->set(aggSubGradNew->dual());
144 outStream << std::endl;
145 outStream <<
" Solve cutting plan subproblem" << std::endl;
146 outStream <<
" Cutting plan objective value: " << v << std::endl;
147 outStream <<
" Norm of computed step: " <<
state_->snorm << std::endl;
148 outStream <<
" 'Trust-region' radius: " <<
state_->searchSize << std::endl;
153 if (std::max(
state_->aggregateGradientNorm,aggLinErrNew) <=
tol_) {
161 else if (std::isnan(
state_->aggregateGradientNorm)
162 || std::isnan(aggLinErrNew)
163 || (std::isnan(aggDistMeasNew) && !
isConvex_)) {
171 y->set(x); y->plus(*
state_->stepVec);
173 valueNew = obj.
value(*y,tol);
180 linErrNew =
state_->value - (valueNew - gd);
183 Real del = eps*std::max(
static_cast<Real
>(1),std::abs(
state_->value));
184 Real Df = (valueNew -
state_->value) - del;
187 if (std::abs(Df) < eps && std::abs(Dm) < eps) {
195 bool NS2a = (
bundle_->computeAlpha(
state_->snorm,linErrNew) <=
m3_*aggLinErrOld);
196 bool NS2b = (std::abs(
state_->value-valueNew) <= aggSubGradOldNorm + aggLinErrOld);
198 outStream << std::endl;
199 outStream <<
" Check for serious/null step" << std::endl;
200 outStream <<
" Serious step test SS(i): " << SS1 << std::endl;
201 outStream <<
" -> Left hand side: " << valueNew-
state_->value << std::endl;
202 outStream <<
" -> Right hand side: " <<
m1_*v << std::endl;
203 outStream <<
" Null step test NS(iia): " << NS2a << std::endl;
204 outStream <<
" -> Left hand side: " <<
bundle_->computeAlpha(
state_->snorm,linErrNew) << std::endl;
205 outStream <<
" -> Right hand side: " <<
m3_*aggLinErrOld << std::endl;
206 outStream <<
" Null step test NS(iib): " << NS2b << std::endl;
207 outStream <<
" -> Left hand side: " << std::abs(
state_->value-valueNew) << std::endl;
208 outStream <<
" -> Right hand side: " << aggSubGradOldNorm + aggLinErrOld << std::endl;
215 outStream <<
" Serious step test SS(iia): " << (gd >=
m2_*v) << std::endl;
216 outStream <<
" -> Left hand side: " << gd << std::endl;
217 outStream <<
" -> Right hand side: " <<
m2_*v << std::endl;
218 outStream <<
" Serious step test SS(iia): " << (
state_->searchSize >=
T_-
nu_) << std::endl;
219 outStream <<
" -> Left hand side: " <<
state_->searchSize << std::endl;
220 outStream <<
" -> Right hand side: " <<
T_-
nu_ << std::endl;
226 outStream <<
" Serious step taken" << std::endl;
232 state_->searchSize = half*(u+l);
234 outStream <<
" Increase 'trust-region' radius: " <<
state_->searchSize << std::endl;
239 if ( NS2a || NS2b ) {
244 outStream <<
" Null step taken" << std::endl;
250 state_->searchSize = half*(u+l);
252 outStream <<
" Decrease 'trust-region' radius: " <<
state_->searchSize << std::endl;
261 outStream <<
" Null step test NS(iii): " << NS3 << std::endl;
262 outStream <<
" -> Left hand side: " << gd -
bundle_->computeAlpha(
state_->snorm,linErrNew) << std::endl;
263 outStream <<
" -> Right hand side: " <<
m2_*v << std::endl;
271 if ( NS2a || NS2b ) {
281 int ls_nfval = 0, ls_ngrad = 0;
290 state_->stepVec->scale(alpha);
298 state_->searchSize = half*(u+l);
304 state_->searchSize = half*(u+l);
313 state_->aggregateModelError = aggLinErrNew;
314 aggSubGradOldNorm =
state_->aggregateGradientNorm;
315 aggLinErrOld = aggLinErrNew;
328 Real valueOld =
state_->value;
340 state_->iterateVec->set(x);
354 std::ios_base::fmtflags osFlags(os.flags());
356 os << std::setw(6) << std::left <<
"iter";
357 os << std::setw(15) << std::left <<
"value";
358 os << std::setw(15) << std::left <<
"gnorm";
359 os << std::setw(15) << std::left <<
"snorm";
360 os << std::setw(10) << std::left <<
"#fval";
361 os << std::setw(10) << std::left <<
"#grad";
362 os << std::setw(15) << std::left <<
"znorm";
363 os << std::setw(15) << std::left <<
"alpha";
364 os << std::setw(15) << std::left <<
"TRparam";
365 os << std::setw(10) << std::left <<
"QPiter";
379 std::ios_base::fmtflags osFlags(os.flags());
380 os << std::scientific << std::setprecision(6);
383 if ( print_header ) {
387 os << std::setw(6) << std::left <<
state_->iter;
388 os << std::setw(15) << std::left <<
state_->value;
389 os << std::setw(15) << std::left <<
state_->gnorm;
390 os << std::setw(15) << std::left <<
"---";
391 os << std::setw(10) << std::left <<
state_->nfval;
392 os << std::setw(10) << std::left <<
state_->ngrad;
393 os << std::setw(15) << std::left <<
"---";
394 os << std::setw(15) << std::left <<
"---";
395 os << std::setw(15) << std::left <<
state_->searchSize;
396 os << std::setw(10) << std::left <<
"---";
400 if ( print_header ) {
405 os << std::setw(6) << std::left <<
state_->iter;
406 os << std::setw(15) << std::left <<
state_->value;
407 os << std::setw(15) << std::left <<
state_->gnorm;
408 os << std::setw(15) << std::left <<
state_->snorm;
409 os << std::setw(10) << std::left <<
state_->nfval;
410 os << std::setw(10) << std::left <<
state_->ngrad;
411 os << std::setw(15) << std::left <<
state_->aggregateGradientNorm;
412 os << std::setw(15) << std::left <<
state_->aggregateModelError;
413 os << std::setw(15) << std::left <<
state_->searchSize;
414 os << std::setw(10) << std::left <<
QPiter_;