mirror of
https://github.com/davisking/dlib.git
synced 2024-11-01 10:14:53 +08:00
Made find_min_single_variable() more stable. Fixes https://github.com/davisking/dlib/issues/1224.
This commit is contained in:
parent
854801d4b4
commit
d7dfd8ad26
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user