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

This commit is contained in:
Davis King 2018-04-17 11:30:46 -04:00
parent 854801d4b4
commit d7dfd8ad26
2 changed files with 27 additions and 6 deletions

View File

@ -785,13 +785,16 @@ namespace dlib
// make sure one side of the bracket isn't super huge compared to the other
// side. If it is then contract it.
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()
// 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;
else if (p_min < p2)
}
else if (bracket_ratio <= 0.1)
{
if (p_min < p2)
p_min = (p2+p3)/2;
}

View File

@ -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
@ -1223,6 +1240,7 @@ namespace
test_poly_min_extract_2nd();
optimization_test();
test_solve_trust_region_subproblem_bounded();
test_find_min_single_variable();
}
} a;