39 ROL::ParameterList &list
40 = parlist.sublist(
"Step").sublist(
"Line Search").sublist(
"Line-Search Method").sublist(
"Brent's");
41 tol_ = list.get(
"Tolerance",oem10);
42 niter_ = list.get(
"Iteration Limit",1000);
43 test_ = list.get(
"Run Test Upon Initialization",
true);
56 std::cout <<
"Brent's Test Passed!\n";
59 std::cout <<
"Brent's Test Failed!\n";
65 void run( Real &alpha, Real &fval,
int &ls_neval,
int &ls_ngrad,
68 ls_neval = 0; ls_ngrad = 0;
76 ROL::Ptr<typename LineSearch<Real>::ScalarFunction> phi
77 = ROL::makePtr<typename LineSearch<Real>::Phi>(*
xnew_,x,s,obj,con);
87 const Real A,
const Real B)
const {
90 const Real
zero(0), half(0.5), one(1), two(2), three(3), five(5);
91 const Real c = half*(three - std::sqrt(five));
92 const Real eps = std::sqrt(ROL_EPSILON<Real>());
97 Real fx = phi.value(alpha);
100 Real v = alpha, w = v, u(0), fu(0);
101 Real p(0), q(0), r(0), d(0), e(0);
102 Real fv = fx, fw = fx, tol(0), t2(0), m(0);
103 for (
int i = 0; i <
niter_; i++) {
105 tol = eps*std::abs(alpha) +
tol_; t2 = two*tol;
107 if (std::abs(alpha-m) <= t2 - half*(b-a)) {
111 if ( std::abs(e) > tol ) {
113 r = (alpha-w)*(fx-fv); q = (alpha-v)*(fx-fw);
114 p = (alpha-v)*q - (alpha-w)*r; q = two*(q-r);
121 if ( std::abs(p) < std::abs(half*q*r) && p > q*(a-alpha) && p < q*(b-alpha) ) {
123 d = p/q; u = alpha + d;
125 if ( (u - a) < t2 || (b - u) < t2 ) {
126 d = (alpha < m) ? tol : -tol;
131 e = ((alpha < m) ? b : a) - alpha; d = c*e;
134 u = alpha + ((std::abs(d) >= tol) ? d : ((d >
zero) ? tol : -tol));
145 v = w; fv = fw; w = alpha; fw = fx; alpha = u; fx = fu;
154 if ( fu <= fw || w == alpha ) {
155 v = w; fv = fw; w = u; fw = fu;
157 else if ( fu <= fv || v == alpha || v == w ) {
168 Real val(0), I(0), two(2), five(5);
169 for (
int i = 0; i < 20; i++) {
171 val += std::pow((two*I - five)/(x-(I*I)),two);
178 ROL::Ptr<typename LineSearch<Real>::ScalarFunction> phi
179 = ROL::makePtr<testFunction>();
180 Real A(0), B(0), alpha(0), fval(0);
181 Real error(0), error_i(0);
182 Real
zero(0), two(2), three(3);
184 std::vector<Real> fvector(19,
zero), avector(19,
zero);
185 fvector[0] = 3.6766990169; avector[0] = 3.0229153;
186 fvector[1] = 1.1118500100; avector[1] = 6.6837536;
187 fvector[2] = 1.2182217637; avector[2] = 11.2387017;
188 fvector[3] = 2.1621103109; avector[3] = 19.6760001;
189 fvector[4] = 3.0322905193; avector[4] = 29.8282273;
190 fvector[5] = 3.7583856477; avector[5] = 41.9061162;
191 fvector[6] = 4.3554103836; avector[6] = 55.9535958;
192 fvector[7] = 4.8482959563; avector[7] = 71.9856656;
193 fvector[8] = 5.2587585400; avector[8] = 90.0088685;
194 fvector[9] = 5.6036524295; avector[9] = 110.0265327;
195 fvector[10] = 5.8956037976; avector[10] = 132.0405517;
196 fvector[11] = 6.1438861542; avector[11] = 156.0521144;
197 fvector[12] = 6.3550764593; avector[12] = 182.0620604;
198 fvector[13] = 6.5333662003; avector[13] = 210.0711010;
199 fvector[14] = 6.6803639849; avector[14] = 240.0800483;
200 fvector[15] = 6.7938538365; avector[15] = 272.0902669;
201 fvector[16] = 6.8634981053; avector[16] = 306.1051233;
202 fvector[17] = 6.8539024631; avector[17] = 342.1369454;
203 fvector[18] = 6.6008470481; avector[18] = 380.2687097;
204 for (
int i = 0; i < 19; i++ ) {
205 A = std::pow((Real)(i+1),two);
206 B = std::pow((Real)(i+2),two);
208 error_i = std::max(std::abs(fvector[i]-fval)/fvector[i],
209 std::abs(avector[i]-alpha)/avector[i]);
210 error = std::max(error,error_i);
212 return (error < three*(std::sqrt(ROL_EPSILON<Real>())*avector[18]+
tol_)) ?
true :
false;
Provides the interface to evaluate objective functions.
virtual Real getInitialAlpha(int &ls_neval, int &ls_ngrad, const Real fval, const Real gs, const Vector< Real > &x, const Vector< Real > &s, Objective< Real > &obj, BoundConstraint< Real > &con)
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
Brents(ROL::ParameterList &parlist)
Defines the linear algebra or vector space interface.
void initialize(const Vector< Real > &x, const Vector< Real > &s, const Vector< Real > &g, Objective< Real > &obj, BoundConstraint< Real > &con)
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0_ zero()
ROL::Ptr< Vector< Real > > xnew_
Provides interface for and implements line searches.
Implements a Brent's method line search.
void run_brents(int &neval, Real &fval, Real &alpha, typename LineSearch< Real >::ScalarFunction &phi, const Real A, const Real B) const
bool test_brents(void) const
void run(Real &alpha, Real &fval, int &ls_neval, int &ls_ngrad, const Real &gs, const Vector< Real > &s, const Vector< Real > &x, Objective< Real > &obj, BoundConstraint< Real > &con)
Provides the interface to apply upper and lower bound constraints.
virtual void initialize(const Vector< Real > &x, const Vector< Real > &s, const Vector< Real > &g, Objective< Real > &obj, BoundConstraint< Real > &con)