Commit d7dfd8ad authored by Davis King's avatar Davis King

Made find_min_single_variable() more stable. Fixes https://github.com/davisking/dlib/issues/1224.

parent 854801d4
...@@ -785,13 +785,16 @@ namespace dlib ...@@ -785,13 +785,16 @@ namespace dlib
// make sure one side of the bracket isn't super huge compared to the other // make sure one side of the bracket isn't super huge compared to the other
// side. If it is then contract it. // side. If it is then contract it.
const double bracket_ratio = abs(p1-p2)/abs(p2-p3); const double bracket_ratio = abs(p1-p2)/abs(p2-p3);
if ( !( bracket_ratio < 10 && bracket_ratio > 0.1) )
{
// Force p_min to be on a reasonable side. But only if lagrange_poly_min_extrap() // Force p_min to be on a reasonable side. But only if lagrange_poly_min_extrap()
// didn't put it on a good side already. // didn't put it on a good side already.
if (bracket_ratio > 1 && p_min > p2) if (bracket_ratio >= 10)
{
if (p_min > p2)
p_min = (p1+p2)/2; p_min = (p1+p2)/2;
else if (p_min < p2) }
else if (bracket_ratio <= 0.1)
{
if (p_min < p2)
p_min = (p2+p3)/2; p_min = (p2+p3)/2;
} }
......
...@@ -1202,6 +1202,23 @@ namespace ...@@ -1202,6 +1202,23 @@ namespace
} }
// ----------------------------------------------------------------------------------------
void test_find_min_single_variable()
{
auto f = [](double x) { return (x-0.2)*(x-0.2); };
double x = 0.8;
try
{
find_min_single_variable(f, x, 0, 1, 1e-9);
DLIB_TEST(std::abs(x-0.2) < 1e-7);
}
catch(optimize_single_variable_failure&)
{
DLIB_TEST(false);
}
}
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
class optimization_tester : public tester class optimization_tester : public tester
...@@ -1223,6 +1240,7 @@ namespace ...@@ -1223,6 +1240,7 @@ namespace
test_poly_min_extract_2nd(); test_poly_min_extract_2nd();
optimization_test(); optimization_test();
test_solve_trust_region_subproblem_bounded(); test_solve_trust_region_subproblem_bounded();
test_find_min_single_variable();
} }
} a; } a;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment