| 40 | } |
| 41 | |
| 42 | void run_test( |
| 43 | const int num |
| 44 | ) |
| 45 | { |
| 46 | static dlib::rand rnd; |
| 47 | |
| 48 | matrix<int> mat, mask; |
| 49 | |
| 50 | mat.set_size(rnd.get_random_32bit_number()%1000 + 1, |
| 51 | rnd.get_random_32bit_number()%1000 + 1); |
| 52 | mask.set_size(mat.nr(), mat.nc()); |
| 53 | mask = 0; |
| 54 | |
| 55 | mat = -10000; |
| 56 | |
| 57 | std::vector<rectangle> true_rects; |
| 58 | |
| 59 | for (int i = 0; i < num; ++i) |
| 60 | { |
| 61 | const int width = rnd.get_random_32bit_number()%100 + 1; |
| 62 | const int height = rnd.get_random_32bit_number()%100 + 1; |
| 63 | |
| 64 | rectangle rect = centered_rect(rnd.get_random_16bit_number()%mat.nc(), |
| 65 | rnd.get_random_16bit_number()%mat.nr(), |
| 66 | width,height); |
| 67 | rect = get_rect(mat).intersect(rect); |
| 68 | |
| 69 | // make sure this new rectangle doesn't overlap or abut any others |
| 70 | if (sum(subm(mask,grow_rect(rect,1).intersect(get_rect(mask)))) == 0) |
| 71 | { |
| 72 | set_subm(mat, rect) = rnd.get_random_8bit_number()%100 + 1; |
| 73 | set_subm(mask, rect) = 1; |
| 74 | true_rects.push_back(rect); |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | |
| 79 | std::vector<rectangle> res; |
| 80 | res = max_sum_submatrix(mat, true_rects.size()+10, 0); |
| 81 | |
| 82 | DLIB_TEST(res.size() == true_rects.size()); |
| 83 | |
| 84 | // make sure big rectangles come first |
| 85 | for (unsigned long i = 0; i+1 < res.size(); ++i) |
| 86 | { |
| 87 | DLIB_TEST(sum(subm(mat,res[i])) >= sum(subm(mat,res[i+1]))); |
| 88 | } |
| 89 | |
| 90 | // make sure rectangles match |
| 91 | sort(true_rects.begin(), true_rects.end(), order_rects); |
| 92 | sort(res.begin(), res.end(), order_rects); |
| 93 | for (unsigned long i = 0; i < res.size(); ++i) |
| 94 | { |
| 95 | DLIB_TEST_MSG(res[i] == true_rects[i], |
| 96 | "i: " << i << " res[i]: " << res[i] << " true_rects[i]: " << true_rects[i]); |
| 97 | } |
| 98 | |
| 99 | } |
no test coverage detected