45 #include "GlobiPack_TestLagrPolyMeritFunc1D.hpp" 46 #include "GlobiPack_BrentsLineSearch.hpp" 47 #include "Teuchos_Tuple.hpp" 51 #include "Teuchos_UnitTestHarness.hpp" 63 using GlobiPack::brentsLineSearch;
64 using GlobiPack::computeValue;
66 using Teuchos::inOutArg;
67 using Teuchos::outArg;
70 using Teuchos::rcpFromRef;
73 using Teuchos::ParameterList;
74 using Teuchos::parameterList;
77 double g_tol_scale = 100.0;
80 TEUCHOS_STATIC_SETUP()
82 Teuchos::UnitTestRepository::getCLP().setOption(
83 "tol", &g_tol_scale,
"Floating point tolerance scaling of eps." );
97 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( BrentsLineSearch, quadExact, Scalar )
100 typedef Teuchos::ScalarTraits<Scalar> ST;
101 typedef typename ST::magnitudeType ScalarMag;
103 const RCP<TestLagrPolyMeritFunc1D<Scalar> > phi = quadPhi<Scalar>();
105 RCP<BrentsLineSearch<Scalar> > linesearch = brentsLineSearch<Scalar>();
107 linesearch->setOStream(rcpFromRef(out));
109 const PointEval1D<Scalar> point_k =
computePoint(*phi, ST::zero());
110 PointEval1D<Scalar> point_kp1 =
computePoint(*phi, as<Scalar>(8.0));
113 const bool linesearchResult = linesearch->doLineSearch(
114 *phi, point_k, inOutArg(point_kp1), outArg(numIters) );
116 TEST_ASSERT(linesearchResult);
117 TEST_FLOATING_EQUALITY(point_kp1.alpha, as<Scalar>(2.0),
118 as<Scalar>(g_tol_scale*ST::squareroot(ST::eps())));
119 TEST_FLOATING_EQUALITY(point_kp1.phi, as<ScalarMag>(3.0),
120 as<Scalar>(g_tol_scale)*ST::eps());
124 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( BrentsLineSearch, quadExact )
131 TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL( BrentsLineSearch, cubicApprox, Scalar )
134 typedef Teuchos::ScalarTraits<Scalar> ST;
135 typedef typename ST::magnitudeType ScalarMag;
137 const RCP<TestLagrPolyMeritFunc1D<Scalar> > phi = quadPhi<Scalar>();
139 RCP<BrentsLineSearch<Scalar> > linesearch = brentsLineSearch<Scalar>();
141 const RCP<ParameterList> pl = parameterList();
142 pl->sublist(
"Minimize").set(
"Relative Tol", as<double>(g_tol_scale*ST::eps()));
143 pl->sublist(
"Minimize").set(
"Bracket Tol", as<double>(ST::eps()));
144 linesearch->setParameterList(pl);
146 linesearch->setOStream(rcpFromRef(out));
148 const PointEval1D<Scalar> point_k =
computePoint(*phi, ST::zero());
149 PointEval1D<Scalar> point_kp1 =
computePoint(*phi, as<Scalar>(8.0));
152 const bool linesearchResult = linesearch->doLineSearch(
153 *phi, point_k, inOutArg(point_kp1), outArg(numIters) );
155 TEST_ASSERT(linesearchResult);
156 TEST_FLOATING_EQUALITY(point_kp1.alpha, as<Scalar>(2.0),
157 as<Scalar>(g_tol_scale*ST::squareroot(ST::eps())));
158 TEST_FLOATING_EQUALITY(point_kp1.phi, as<ScalarMag>(3.0),
159 as<Scalar>(g_tol_scale)*ST::eps());
163 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT_REAL_SCALAR_TYPES( BrentsLineSearch, cubicApprox )
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.
Linesearch subclass implementing a function-value-only approximate minimization algorithm using brack...