+ // precalculate all distances
+ for (unsigned i = 0; i < points.size(); ++i) {
+ for (unsigned j = 0; j < points.size(); ++j) {
+ cache(points[i].first, points[i].second, 0, points[j].first, points[j].second, 0) =
+ distance(points[i].first, points[i].second, 0, points[j].first, points[j].second, 0);
+
+ cache(points[i].first, points[i].second, 0, points[j].first, points[j].second, 1) =
+ distance(points[i].first, points[i].second, 0, points[j].first, points[j].second, 1);
+
+ cache(points[i].first, points[i].second, 1, points[j].first, points[j].second, 0) =
+ distance(points[i].first, points[i].second, 1, points[j].first, points[j].second, 0);
+
+ cache(points[i].first, points[i].second, 1, points[j].first, points[j].second, 1) =
+ distance(points[i].first, points[i].second, 1, points[j].first, points[j].second, 1);
+
+ opt_cache(points[i].first, points[i].second, points[j].first, points[j].second) =
+ optimistic_distance(points[i].first, points[i].second, points[j].first, points[j].second);
+ }
+ }
+