| 1010 | |
| 1011 | template <typename search_strategy_type> |
| 1012 | double test_bound_solver_rosen (dlib::rand& rnd, search_strategy_type search_strategy) |
| 1013 | { |
| 1014 | using namespace dlib::test_functions; |
| 1015 | print_spinner(); |
| 1016 | matrix<double,2,1> starting_point, lower, upper, x; |
| 1017 | |
| 1018 | |
| 1019 | // pick random bounds and sometimes put the upper bound at zero so we can have |
| 1020 | // a test where the optimal value has a bound active at 0 so make sure this case |
| 1021 | // works properly. |
| 1022 | if (rnd.get_random_double() > 0.2) |
| 1023 | { |
| 1024 | lower = rnd.get_random_gaussian()+1, rnd.get_random_gaussian()+1; |
| 1025 | upper = rnd.get_random_gaussian()+1, rnd.get_random_gaussian()+1; |
| 1026 | while (upper(0) < lower(0)) upper(0) = rnd.get_random_gaussian()+1; |
| 1027 | while (upper(1) < lower(1)) upper(1) = rnd.get_random_gaussian()+1; |
| 1028 | } |
| 1029 | else |
| 1030 | { |
| 1031 | upper = 0,0; |
| 1032 | if (rnd.get_random_double() > 0.5) |
| 1033 | upper(0) = -rnd.get_random_double(); |
| 1034 | if (rnd.get_random_double() > 0.5) |
| 1035 | upper(1) = -rnd.get_random_double(); |
| 1036 | |
| 1037 | lower = rnd.get_random_double()+1, rnd.get_random_double()+1; |
| 1038 | lower = upper - lower; |
| 1039 | } |
| 1040 | const bool pick_uniform_bounds = rnd.get_random_double() > 0.9; |
| 1041 | if (pick_uniform_bounds) |
| 1042 | { |
| 1043 | double x = rnd.get_random_gaussian()*2; |
| 1044 | double y = rnd.get_random_gaussian()*2; |
| 1045 | lower = min(x,y); |
| 1046 | upper = max(x,y); |
| 1047 | } |
| 1048 | |
| 1049 | starting_point = rnd.get_random_double()*(upper(0)-lower(0))+lower(0), |
| 1050 | rnd.get_random_double()*(upper(1)-lower(1))+lower(1); |
| 1051 | |
| 1052 | dlog << LINFO << "lower: "<< trans(lower); |
| 1053 | dlog << LINFO << "upper: "<< trans(upper); |
| 1054 | dlog << LINFO << "starting: "<< trans(starting_point); |
| 1055 | |
| 1056 | x = starting_point; |
| 1057 | double val; |
| 1058 | if (!pick_uniform_bounds) |
| 1059 | { |
| 1060 | val = find_min_box_constrained( |
| 1061 | search_strategy, |
| 1062 | objective_delta_stop_strategy(1e-16, 500), |
| 1063 | rosen, der_rosen, x, |
| 1064 | lower, |
| 1065 | upper |
| 1066 | ); |
| 1067 | } |
| 1068 | else |
| 1069 | { |
no test coverage detected