| 1089 | |
| 1090 | template <typename search_strategy_type> |
| 1091 | double test_bound_solver_brown (dlib::rand& rnd, search_strategy_type search_strategy) |
| 1092 | { |
| 1093 | using namespace dlib::test_functions; |
| 1094 | print_spinner(); |
| 1095 | matrix<double,4,1> starting_point(4), lower(4), upper(4), x; |
| 1096 | |
| 1097 | const matrix<double,0,1> solution = brown_solution(); |
| 1098 | |
| 1099 | // pick random bounds |
| 1100 | lower = rnd.get_random_gaussian(), rnd.get_random_gaussian(), rnd.get_random_gaussian(), rnd.get_random_gaussian(); |
| 1101 | lower = lower*10 + solution; |
| 1102 | upper = rnd.get_random_gaussian(), rnd.get_random_gaussian(), rnd.get_random_gaussian(), rnd.get_random_gaussian(); |
| 1103 | upper = upper*10 + solution; |
| 1104 | for (int i = 0; i < lower.size(); ++i) |
| 1105 | { |
| 1106 | if (upper(i) < lower(i)) |
| 1107 | swap(upper(i),lower(i)); |
| 1108 | } |
| 1109 | |
| 1110 | starting_point = rnd.get_random_double()*(upper(0)-lower(0))+lower(0), |
| 1111 | rnd.get_random_double()*(upper(1)-lower(1))+lower(1), |
| 1112 | rnd.get_random_double()*(upper(2)-lower(2))+lower(2), |
| 1113 | rnd.get_random_double()*(upper(3)-lower(3))+lower(3); |
| 1114 | |
| 1115 | dlog << LINFO << "lower: "<< trans(lower); |
| 1116 | dlog << LINFO << "upper: "<< trans(upper); |
| 1117 | dlog << LINFO << "starting: "<< trans(starting_point); |
| 1118 | |
| 1119 | // The contract for find_min_box_constrained() says we always call obj() before der(). So |
| 1120 | // these lambdas verify that this is so. |
| 1121 | dlib::matrix<double,0,1> last_x; |
| 1122 | auto obj = [&](const dlib::matrix<double,0,1> &x) { last_x = x; return brown(x); }; |
| 1123 | auto der = [&](const dlib::matrix<double,0,1> &x) { |
| 1124 | // check that obj(x) was called before der(x). |
| 1125 | DLIB_TEST_MSG(max(abs(x - last_x)) == 0, max(abs(x - last_x))); |
| 1126 | return brown_derivative(x); |
| 1127 | }; |
| 1128 | |
| 1129 | x = starting_point; |
| 1130 | double val = find_min_box_constrained( |
| 1131 | search_strategy, |
| 1132 | objective_delta_stop_strategy(1e-16, 500), |
| 1133 | obj, der, x, |
| 1134 | lower, |
| 1135 | upper |
| 1136 | ); |
| 1137 | |
| 1138 | DLIB_TEST(std::abs(val - brown(x)) < 1e-14); |
| 1139 | dlog << LINFO << "brown solution:\n" << x; |
| 1140 | return unconstrained_gradient_magnitude(brown_derivative, x, lower, upper); |
| 1141 | } |
| 1142 | |
| 1143 | template <typename search_strategy_type> |
| 1144 | void test_box_constrained_optimizers(search_strategy_type search_strategy) |
no test coverage detected