diff --git a/dlib/optimization/optimization_line_search.h b/dlib/optimization/optimization_line_search.h index d78683d0c..aa778ed7c 100644 --- a/dlib/optimization/optimization_line_search.h +++ b/dlib/optimization/optimization_line_search.h @@ -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) + // 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 >= 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; } diff --git a/dlib/test/optimization.cpp b/dlib/test/optimization.cpp index b47449abe..675601574 100644 --- a/dlib/test/optimization.cpp +++ b/dlib/test/optimization.cpp @@ -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;