diff options
| author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2013-01-04 14:44:39 -0500 |
|---|---|---|
| committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2013-02-12 06:55:16 -0500 |
| commit | e317c5e5ff5bb7292fb9866913cae5688dc77094 (patch) | |
| tree | c373c94c9ee9cab89905e6c1551175d59f3341b1 /native | |
| parent | 308ff37a60a61e158bfe108bfcea0bf3b71e942d (diff) | |
Precision fix: user deliberate rounding in LP result conversion
Use proper rounding when converting blocking terms to avoid rounding
issues. This could cause some (very rare) off-by-one bugs when
incorrectly truncating an objective result very close to the next
largest integer.
Diffstat (limited to 'native')
| -rw-r--r-- | native/src/blocking/linprog/lp_dflp.cpp | 5 | ||||
| -rw-r--r-- | native/src/blocking/linprog/lp_dpcp.cpp | 9 | ||||
| -rw-r--r-- | native/src/blocking/linprog/lp_fmlp.cpp | 5 | ||||
| -rw-r--r-- | native/src/blocking/linprog/lp_mpcp.cpp | 7 |
4 files changed, 15 insertions, 11 deletions
diff --git a/native/src/blocking/linprog/lp_dflp.cpp b/native/src/blocking/linprog/lp_dflp.cpp index 0370358..a022d7b 100644 --- a/native/src/blocking/linprog/lp_dflp.cpp +++ b/native/src/blocking/linprog/lp_dflp.cpp | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | #include <iostream> | 1 | #include <iostream> |
| 2 | #include <cmath> | ||
| 2 | 3 | ||
| 3 | #include "lp_common.h" | 4 | #include "lp_common.h" |
| 4 | #include "stl-hashmap.h" | 5 | #include "stl-hashmap.h" |
| @@ -167,8 +168,8 @@ static BlockingBounds* _lp_dflp_bounds(const ResourceSharingInfo& info, | |||
| 167 | { | 168 | { |
| 168 | Interference total, remote, local; | 169 | Interference total, remote, local; |
| 169 | 170 | ||
| 170 | local.total_length = sol->evaluate(local_obj[i]); | 171 | local.total_length = lrint(sol->evaluate(local_obj[i])); |
| 171 | remote.total_length = sol->evaluate(remote_obj[i]); | 172 | remote.total_length = lrint(sol->evaluate(remote_obj[i])); |
| 172 | total.total_length = local.total_length + remote.total_length; | 173 | total.total_length = local.total_length + remote.total_length; |
| 173 | 174 | ||
| 174 | (*results)[i] = total; | 175 | (*results)[i] = total; |
diff --git a/native/src/blocking/linprog/lp_dpcp.cpp b/native/src/blocking/linprog/lp_dpcp.cpp index bec131b..50d38c5 100644 --- a/native/src/blocking/linprog/lp_dpcp.cpp +++ b/native/src/blocking/linprog/lp_dpcp.cpp | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #include <iostream> | 1 | #include <iostream> |
| 2 | #include <set> | 2 | #include <set> |
| 3 | #include <algorithm> | 3 | #include <algorithm> |
| 4 | #include <cmath> | ||
| 4 | 5 | ||
| 5 | #include "lp_common.h" | 6 | #include "lp_common.h" |
| 6 | #include "blocking.h" | 7 | #include "blocking.h" |
| @@ -385,8 +386,8 @@ static BlockingBounds* _lp_dpcp_bounds(const ResourceSharingInfo& info, | |||
| 385 | { | 386 | { |
| 386 | Interference total, remote, local; | 387 | Interference total, remote, local; |
| 387 | 388 | ||
| 388 | local.total_length = sol->evaluate(local_obj[i]); | 389 | local.total_length = lrint(sol->evaluate(local_obj[i])); |
| 389 | remote.total_length = sol->evaluate(remote_obj[i]); | 390 | remote.total_length = lrint(sol->evaluate(remote_obj[i])); |
| 390 | total.total_length = local.total_length + remote.total_length; | 391 | total.total_length = local.total_length + remote.total_length; |
| 391 | 392 | ||
| 392 | (*results)[i] = total; | 393 | (*results)[i] = total; |
| @@ -455,8 +456,8 @@ static void apply_dpcp_bounds_for_task( | |||
| 455 | 456 | ||
| 456 | Interference total, remote, local; | 457 | Interference total, remote, local; |
| 457 | 458 | ||
| 458 | total.total_length = sol->evaluate(*lp.get_objective()); | 459 | total.total_length = lrint(sol->evaluate(*lp.get_objective())); |
| 459 | local.total_length = sol->evaluate(*local_obj); | 460 | local.total_length = lrint(sol->evaluate(*local_obj)); |
| 460 | remote.total_length = total.total_length - local.total_length; | 461 | remote.total_length = total.total_length - local.total_length; |
| 461 | 462 | ||
| 462 | bounds[i] = total; | 463 | bounds[i] = total; |
diff --git a/native/src/blocking/linprog/lp_fmlp.cpp b/native/src/blocking/linprog/lp_fmlp.cpp index 75e2186..3f2ff94 100644 --- a/native/src/blocking/linprog/lp_fmlp.cpp +++ b/native/src/blocking/linprog/lp_fmlp.cpp | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #include <iostream> | 1 | #include <iostream> |
| 2 | #include <set> | 2 | #include <set> |
| 3 | #include <algorithm> | 3 | #include <algorithm> |
| 4 | #include <cmath> | ||
| 4 | 5 | ||
| 5 | #include "lp_common.h" | 6 | #include "lp_common.h" |
| 6 | #include "blocking.h" | 7 | #include "blocking.h" |
| @@ -244,8 +245,8 @@ static void apply_fmlp_bounds_for_task( | |||
| 244 | 245 | ||
| 245 | Interference total, remote, local; | 246 | Interference total, remote, local; |
| 246 | 247 | ||
| 247 | total.total_length = sol->evaluate(*lp.get_objective()); | 248 | total.total_length = lrint(sol->evaluate(*lp.get_objective())); |
| 248 | local.total_length = sol->evaluate(*local_obj); | 249 | local.total_length = lrint(sol->evaluate(*local_obj)); |
| 249 | remote.total_length = total.total_length - local.total_length; | 250 | remote.total_length = total.total_length - local.total_length; |
| 250 | 251 | ||
| 251 | bounds[i] = total; | 252 | bounds[i] = total; |
diff --git a/native/src/blocking/linprog/lp_mpcp.cpp b/native/src/blocking/linprog/lp_mpcp.cpp index bccea5d..6037c3d 100644 --- a/native/src/blocking/linprog/lp_mpcp.cpp +++ b/native/src/blocking/linprog/lp_mpcp.cpp | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #include <iostream> | 1 | #include <iostream> |
| 2 | #include <set> | 2 | #include <set> |
| 3 | #include <algorithm> | 3 | #include <algorithm> |
| 4 | #include <cmath> | ||
| 4 | 5 | ||
| 5 | #include "lp_common.h" | 6 | #include "lp_common.h" |
| 6 | #include "blocking.h" | 7 | #include "blocking.h" |
| @@ -527,8 +528,8 @@ static void apply_mpcp_bounds_for_task( | |||
| 527 | 528 | ||
| 528 | Interference total, remote, local; | 529 | Interference total, remote, local; |
| 529 | 530 | ||
| 530 | total.total_length = sol->evaluate(*lp.get_objective()); | 531 | total.total_length = lrint(sol->evaluate(*lp.get_objective())); |
| 531 | local.total_length = sol->evaluate(*local_obj); | 532 | local.total_length = lrint(sol->evaluate(*local_obj)); |
| 532 | 533 | ||
| 533 | bounds[i] = total; | 534 | bounds[i] = total; |
| 534 | bounds.set_local_blocking(i, local); | 535 | bounds.set_local_blocking(i, local); |
| @@ -546,7 +547,7 @@ static void apply_mpcp_bounds_for_task( | |||
| 546 | 547 | ||
| 547 | assert(sol != NULL); | 548 | assert(sol != NULL); |
| 548 | 549 | ||
| 549 | remote.total_length = sol->evaluate(*lp.get_objective()); | 550 | remote.total_length = lrint(sol->evaluate(*lp.get_objective())); |
| 550 | bounds.set_remote_blocking(i, remote); | 551 | bounds.set_remote_blocking(i, remote); |
| 551 | 552 | ||
| 552 | #if DEBUG_LP_OVERHEADS >= 2 | 553 | #if DEBUG_LP_OVERHEADS >= 2 |
