mirror of
https://github.com/boostorg/math.git
synced 2026-02-24 04:02:18 +00:00
added more lbfgs tests
This commit is contained in:
@@ -344,6 +344,39 @@ make_lbfgs(Objective&& obj,
|
||||
lbfgs_update_policy<RealType>{},
|
||||
std::forward<LineSearchPolicy>(lsp));
|
||||
}
|
||||
|
||||
template<class Objective,
|
||||
typename ArgumentContainer,
|
||||
class InitializationPolicy,
|
||||
class FunctionEvalPolicy,
|
||||
class GradientEvalPolicy,
|
||||
class LineSearchPolicy>
|
||||
auto
|
||||
make_lbfgs(Objective&& obj,
|
||||
ArgumentContainer& x,
|
||||
std::size_t m,
|
||||
InitializationPolicy&& ip,
|
||||
FunctionEvalPolicy&& fep,
|
||||
GradientEvalPolicy&& gep,
|
||||
LineSearchPolicy&& lsp)
|
||||
{
|
||||
using RealType = typename argument_container_t<ArgumentContainer>::type;
|
||||
return lbfgs<ArgumentContainer,
|
||||
RealType,
|
||||
std::decay_t<Objective>,
|
||||
InitializationPolicy,
|
||||
FunctionEvalPolicy,
|
||||
GradientEvalPolicy,
|
||||
LineSearchPolicy>(std::forward<Objective>(obj),
|
||||
x,
|
||||
m,
|
||||
std::forward<InitializationPolicy>(ip),
|
||||
std::forward<FunctionEvalPolicy>(fep),
|
||||
std::forward<GradientEvalPolicy>(gep),
|
||||
lbfgs_update_policy<RealType>{},
|
||||
std::forward<LineSearchPolicy>(lsp));
|
||||
}
|
||||
|
||||
} // namespace optimization
|
||||
} // namespace math
|
||||
} // namespace boost
|
||||
|
||||
@@ -93,4 +93,28 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(custom_init_lbfgs_test, T, all_float_types)
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE_TEMPLATE(analytic_lbfgs_test, T, all_float_types)
|
||||
{
|
||||
constexpr size_t M = 10;
|
||||
const T eps = T{ 1e-3 };
|
||||
|
||||
RandomSample<T> rng{ T(-5), T(5) };
|
||||
std::vector<T> x(3);
|
||||
for (auto& xi : x)
|
||||
xi = rng.next();
|
||||
|
||||
auto opt = bopt::make_lbfgs(&quadratic<T>, // Objective
|
||||
x, // Arguments
|
||||
M, // History size
|
||||
zero_init_policy<T>{}, // Initialization
|
||||
analytic_objective_eval_pol<T>{}, // Function eval
|
||||
analytic_gradient_eval_pol<T>{}, // Gradient eval
|
||||
bopt::armijo_line_search_policy<T>{});
|
||||
|
||||
auto result = minimize(opt);
|
||||
|
||||
for (auto& xi : x) {
|
||||
BOOST_REQUIRE_SMALL(xi, eps);
|
||||
}
|
||||
}
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
Reference in New Issue
Block a user