aboutsummaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2013-01-04 14:44:39 -0500
committerBjoern Brandenburg <bbb@mpi-sws.org>2013-02-12 06:55:16 -0500
commite317c5e5ff5bb7292fb9866913cae5688dc77094 (patch)
treec373c94c9ee9cab89905e6c1551175d59f3341b1 /native
parent308ff37a60a61e158bfe108bfcea0bf3b71e942d (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.cpp5
-rw-r--r--native/src/blocking/linprog/lp_dpcp.cpp9
-rw-r--r--native/src/blocking/linprog/lp_fmlp.cpp5
-rw-r--r--native/src/blocking/linprog/lp_mpcp.cpp7
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