45 #include "GlobiPack_TestLagrPolyMeritFunc1D.hpp" 46 #include "GlobiPack_ArmijoPolyInterpLineSearch.hpp" 47 #include "Teuchos_Tuple.hpp" 51 #include "Teuchos_UnitTestHarness.hpp" 65 using GlobiPack::armijoQuadraticLineSearch;
66 using GlobiPack::computeValue;
68 using Teuchos::inOutArg;
69 using Teuchos::outArg;
72 using Teuchos::rcpFromRef;
75 using Teuchos::ParameterList;
76 using Teuchos::parameterList;
79 double g_tol = Teuchos::ScalarTraits<double>::eps()*100.0;
82 TEUCHOS_STATIC_SETUP()
84 Teuchos::UnitTestRepository::getCLP().setOption(
85 "tol", &g_tol,
"Floating point tolerance" );
98 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( ArmijoPolyInterpLineSearch, defaultParams, Scalar )
100 typedef Teuchos::ScalarTraits<Scalar> ST;
101 typedef typename ST::magnitudeType ScalarMag;
103 RCP<ArmijoPolyInterpLineSearch<Scalar> > linesearch =
104 armijoQuadraticLineSearch<Scalar>();
112 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( ArmijoPolyInterpLineSearch, defaultParams )
119 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( ArmijoPolyInterpLineSearch, parseParams, Scalar )
121 typedef Teuchos::ScalarTraits<Scalar> ST;
123 ECHO(RCP<ArmijoPolyInterpLineSearch<Scalar> > linesearch =
124 armijoQuadraticLineSearch<Scalar>());
125 const double eta = 0.99999;
126 const double minFrac = 4.0;
127 const double maxFrac = 5.0;
128 const int minIters = 5;
129 const int maxIters = 100;
130 const bool doMaxIters =
true;
131 ECHO(
const RCP<ParameterList> pl = parameterList());
132 ECHO(pl->set(
"Armijo Slope Fraction", eta));
133 ECHO(pl->set(
"Min Backtrack Fraction", minFrac));
134 ECHO(pl->set(
"Max Backtrack Fraction", maxFrac));
135 ECHO(pl->set(
"Min Num Iterations", minIters));
136 ECHO(pl->set(
"Max Num Iterations", maxIters));
137 ECHO(pl->set(
"Do Max Iterations", doMaxIters));
138 ECHO(linesearch->setParameterList(pl));
139 const Scalar tol = ST::eps();
140 TEST_FLOATING_EQUALITY(linesearch->eta(), as<Scalar>(eta), tol);
141 TEST_FLOATING_EQUALITY(linesearch->minFrac(), as<Scalar>(minFrac), tol);
142 TEST_FLOATING_EQUALITY(linesearch->maxFrac(), as<Scalar>(maxFrac), tol);
143 TEST_EQUALITY(linesearch->minIters(), minIters);
144 TEST_EQUALITY(linesearch->maxIters(), maxIters);
145 TEST_EQUALITY(linesearch->doMaxIters(), doMaxIters);
148 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( ArmijoPolyInterpLineSearch, parseParams )
173 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( ArmijoPolyInterpLineSearch, quadExact, Scalar )
176 typedef Teuchos::ScalarTraits<Scalar> ST;
177 typedef typename ST::magnitudeType ScalarMag;
179 const RCP<TestLagrPolyMeritFunc1D<Scalar> > phi = quadPhi<Scalar>();
181 RCP<ArmijoPolyInterpLineSearch<Scalar> > linesearch =
182 armijoQuadraticLineSearch<Scalar>();
184 linesearch->setOStream(rcpFromRef(out));
186 const PointEval1D<Scalar> point_k =
computePoint(*phi, ST::zero(),
true,
true);
187 PointEval1D<Scalar> point_kp1 =
computePoint(*phi, as<Scalar>(5.0));
190 const bool linesearchResult = linesearch->doLineSearch(
191 *phi, point_k, inOutArg(point_kp1), outArg(numIters) );
193 TEST_ASSERT(linesearchResult);
194 TEST_EQUALITY(numIters, 1);
195 TEST_FLOATING_EQUALITY(point_kp1.alpha, as<Scalar>(2.0), g_tol);
196 TEST_FLOATING_EQUALITY(point_kp1.phi, as<ScalarMag>(3.0), g_tol);
200 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( ArmijoPolyInterpLineSearch, quadExact )
208 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( ArmijoPolyInterpLineSearch, noEval, Scalar )
211 typedef Teuchos::ScalarTraits<Scalar> ST;
212 typedef typename ST::magnitudeType ScalarMag;
214 const RCP<TestLagrPolyMeritFunc1D<Scalar> > phi = quadPhi<Scalar>();
216 RCP<ArmijoPolyInterpLineSearch<Scalar> > linesearch =
217 armijoQuadraticLineSearch<Scalar>();
219 linesearch->setOStream(rcpFromRef(out));
221 const Scalar alpha_k_init = as<Scalar>(2.1);
222 const PointEval1D<Scalar> point_k =
computePoint(*phi, ST::zero(),
true,
true);
223 PointEval1D<Scalar> point_kp1 =
computePoint(*phi, alpha_k_init);
226 const bool linesearchResult = linesearch->doLineSearch(
227 *phi, point_k, inOutArg(point_kp1), outArg(numIters) );
229 TEST_ASSERT(linesearchResult);
230 TEST_EQUALITY(numIters, 0);
231 TEST_FLOATING_EQUALITY(point_kp1.alpha, alpha_k_init, g_tol);
232 TEST_FLOATING_EQUALITY(point_kp1.phi,
computeValue(*phi, alpha_k_init), g_tol);
236 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( ArmijoPolyInterpLineSearch, noEval )
243 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( ArmijoPolyInterpLineSearch, minIters, Scalar )
246 typedef Teuchos::ScalarTraits<Scalar> ST;
247 typedef typename ST::magnitudeType ScalarMag;
249 const RCP<TestLagrPolyMeritFunc1D<Scalar> > phi = quadPhi<Scalar>();
251 RCP<ArmijoPolyInterpLineSearch<Scalar> > linesearch =
252 armijoQuadraticLineSearch<Scalar>();
254 const RCP<ParameterList> pl = parameterList();
255 pl->set(
"Max Backtrack Fraction", 1.0);
256 pl->set(
"Min Num Iterations", 1);
257 linesearch->setParameterList(pl);
259 linesearch->setOStream(rcpFromRef(out));
261 const Scalar alpha_k_init = as<Scalar>(2.1);
262 const PointEval1D<Scalar> point_k =
computePoint(*phi, ST::zero(),
true,
true);
263 PointEval1D<Scalar> point_kp1 =
computePoint(*phi, alpha_k_init);
266 const bool linesearchResult = linesearch->doLineSearch(
267 *phi, point_k, inOutArg(point_kp1), outArg(numIters) );
269 TEST_ASSERT(linesearchResult);
270 TEST_EQUALITY(numIters, 1);
271 TEST_FLOATING_EQUALITY(point_kp1.alpha, as<Scalar>(2.0), g_tol);
272 TEST_FLOATING_EQUALITY(point_kp1.phi, as<ScalarMag>(3.0), g_tol);
276 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( ArmijoPolyInterpLineSearch, minIters )
const RCP< TestLagrPolyMeritFunc1D< Scalar > > testLagrPolyMeritFunc1D(const ArrayView< const Scalar > &alpha, const ArrayView< const Scalar > &phi)
const double maxFrac_default
Linesearch subclass implementing a backtracking-only line search using an Armijo cord test condition ...
const int maxIters_default
PointEval1D< Scalar > computePoint(const MeritFunc1DBase< Scalar > &phi, const Scalar &alpha, const bool compute_phi=true, const bool compute_Dphi=false)
Compute a point as an object.
const bool doMaxIters_default
const double minFrac_default
Lagrange Polynomial Merit Function used in testing.
ScalarTraits< Scalar >::magnitudeType computeValue(const MeritFunc1DBase< Scalar > &phi, const Scalar &alpha)
Compute the value of the merit function phi(alpha).