-/* Copyright (c) 2019-2022. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2019-2023. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-#include "src/include/catch.hpp"
+#include "src/3rd-party/catch.hpp"
#include "src/kernel/lmm/bmf.hpp"
-#include "src/surf/surf_interface.hpp"
+#include "src/simgrid/math_utils.h"
#include "xbt/log.h"
namespace lmm = simgrid::kernel::lmm;
Sys.expand(sys_cnst, rho_1, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 3, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 3, sg_precision_workamount));
}
SECTION("Two flows")
Sys.expand(sys_cnst, rho_2, 10);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 3.0 / 2.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), (3.0 / 2.0) / 10.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 3.0 / 2.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), (3.0 / 2.0) / 10.0, sg_precision_workamount));
}
SECTION("Variable penalty/priority")
Sys.expand(sys_cnst, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 2.0 / 3.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 1.0 / 3.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 2.0 / 3.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 1.0 / 3.0, sg_precision_workamount));
}
SECTION("Disable variable doesn't count")
Sys.expand(sys_cnst, rho_2, 10);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 0.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 0.0, sg_precision_workamount));
}
SECTION("No consumption variable")
Sys.expand(sys_cnst, rho_2, 10);
Sys.solve();
- REQUIRE(double_positive(rho_1->get_value(), sg_maxmin_precision));
+ REQUIRE(double_positive(rho_1->get_value(), sg_precision_workamount));
}
SECTION("Bounded variable")
Sys.expand(sys_cnst, rho_1, 2);
Sys.expand(sys_cnst, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), .1, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), .8, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), .1, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), .8, sg_precision_workamount));
}
SECTION("Fatpipe")
Sys.expand(sys_cnst, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 3.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 3.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 3.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 3.0, sg_precision_workamount));
}
SECTION("(un)Bounded variable")
Sys.expand(sys_cnst, rho_1, 1);
Sys.expand(sys_cnst, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), .5, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), .5, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), .5, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), .5, sg_precision_workamount));
}
SECTION("Dynamic bounds")
lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1);
Sys.expand(sys_cnst, rho_1, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1, sg_precision_workamount));
// add another variable, half initial capacity
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1);
Sys.expand(sys_cnst, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), .25, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), .25, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), .25, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), .25, sg_precision_workamount));
}
Sys.variable_free_all();
Sys.expand(sys_cnst2, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1.0 / 11.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 1.0 / 11.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1.0 / 11.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 1.0 / 11.0, sg_precision_workamount));
}
SECTION("BMF paper example")
Sys.expand(sys_cnst3, rho_3, 3.0 / 4.0);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1.0 / 3.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 4.0 / 9.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_3->get_value(), 4.0 / 9.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1.0 / 3.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 4.0 / 9.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_3->get_value(), 4.0 / 9.0, sg_precision_workamount));
}
SECTION("IO - example")
Sys.expand(sys_cnst3, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1e6 / 2.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 1e6 / 2.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1e6 / 2.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 1e6 / 2.0, sg_precision_workamount));
}
SECTION("Proportional fairness")
Sys.expand(sys_cnst, rho_3, epsilon);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1.0 / (2.0 + 2 * epsilon), sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 1.0 / (2.0 + 2 * epsilon), sg_maxmin_precision));
- REQUIRE(double_equals(rho_3->get_value(), 1.0 / (1.0 + epsilon), sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1.0 / (2.0 + 2 * epsilon), sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 1.0 / (2.0 + 2 * epsilon), sg_precision_workamount));
+ REQUIRE(double_equals(rho_3->get_value(), 1.0 / (1.0 + epsilon), sg_precision_workamount));
}
Sys.variable_free_all();
lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1);
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1);
- Sys.expand_add(sys_cnst, rho_1, 5);
- Sys.expand_add(sys_cnst, rho_1, 7);
- Sys.expand_add(sys_cnst, rho_2, 7);
- Sys.expand_add(sys_cnst, rho_2, 5);
+ Sys.expand(sys_cnst, rho_1, 5);
+ Sys.expand(sys_cnst, rho_1, 7);
+ Sys.expand(sys_cnst, rho_2, 7);
+ Sys.expand(sys_cnst, rho_2, 5);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 5.0 / 24.0, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 5.0 / 24.0, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 5.0 / 24.0, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 5.0 / 24.0, sg_precision_workamount));
}
SECTION("1 subflows, 1 flow and 1 resource")
lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1);
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1);
- Sys.expand_add(sys_cnst, rho_1, 10);
- Sys.expand_add(sys_cnst, rho_1, 5);
+ Sys.expand(sys_cnst, rho_1, 10);
+ Sys.expand(sys_cnst, rho_1, 5);
Sys.expand(sys_cnst, rho_2, 10);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), (5.0 / 25.0), sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), (5.0 / 25.0), sg_maxmin_precision));
- REQUIRE(double_equals(15 * rho_1->get_value(), 10 * rho_2->get_value() * 3 / 2, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), (5.0 / 25.0), sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), (5.0 / 25.0), sg_precision_workamount));
+ REQUIRE(double_equals(15 * rho_1->get_value(), 10 * rho_2->get_value() * 3 / 2, sg_precision_workamount));
}
SECTION("1 subflows using 2 resources: different max for each resource")
lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1, -1, 2);
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1, -1, 2);
- Sys.expand_add(sys_cnst, rho_1, 1.0);
- Sys.expand_add(sys_cnst, rho_1, 1.0);
+ Sys.expand(sys_cnst, rho_1, 1.0);
+ Sys.expand(sys_cnst, rho_1, 1.0);
Sys.expand(sys_cnst, rho_2, 1);
- Sys.expand_add(sys_cnst2, rho_1, 1.0 / 2.0);
- Sys.expand_add(sys_cnst2, rho_1, 1.0 / 2.0);
+ Sys.expand(sys_cnst2, rho_1, 1.0 / 2.0);
+ Sys.expand(sys_cnst2, rho_1, 1.0 / 2.0);
Sys.expand(sys_cnst2, rho_2, 3.0 / 2.0);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), (1.0 / 3.0), sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), (1.0 / 3.0), sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), (1.0 / 3.0), sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), (1.0 / 3.0), sg_precision_workamount));
}
Sys.variable_free_all();
[&vars, &Sys, &A](const auto&) { vars.push_back(Sys.variable_new(nullptr, 1, -1, A.size())); });
for (size_t j = 0; j < A.size(); j++) {
for (size_t i = 0; i < A[j].size(); i++) {
- Sys.expand_add(sys_cnst[j], vars[i], A[j][i]);
+ Sys.expand(sys_cnst[j], vars[i], A[j][i]);
}
}
Sys.solve();
for (const auto* rho : vars) {
- REQUIRE(double_positive(rho->get_value(), sg_maxmin_precision));
+ REQUIRE(double_positive(rho->get_value(), sg_precision_workamount));
}
}
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1, 2.27328e-10, 2);
lmm::Variable* rho_3 = Sys.variable_new(nullptr, 1);
- Sys.expand_add(sys_cnst, rho_1, 1.84467e+19);
- Sys.expand_add(sys_cnst2, rho_1, 1.84467e+19);
- Sys.expand_add(sys_cnst, rho_2, 1.84467e+19);
- Sys.expand_add(sys_cnst, rho_3, 1.91268e+11);
+ Sys.expand(sys_cnst, rho_1, 1.84467e+19);
+ Sys.expand(sys_cnst2, rho_1, 1.84467e+19);
+ Sys.expand(sys_cnst, rho_2, 1.84467e+19);
+ Sys.expand(sys_cnst, rho_3, 1.91268e+11);
Sys.solve();
}
+
SECTION("DadOu's bug: complete matrix")
{
constexpr int cnsts = 71;
lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1, 1.5, 2);
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1, 3, 2);
- Sys.expand_add(sys_cnst, rho_1, 5.0);
- Sys.expand_add(sys_cnst2, rho_1, 1.0);
- Sys.expand_add(sys_cnst, rho_2, 1.0);
- Sys.expand_add(sys_cnst2, rho_2, 1.0);
+ Sys.expand(sys_cnst, rho_1, 5.0);
+ Sys.expand(sys_cnst2, rho_1, 1.0);
+ Sys.expand(sys_cnst, rho_2, 1.0);
+ Sys.expand(sys_cnst2, rho_2, 1.0);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 1.4, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 3, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 1.4, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 3, sg_precision_workamount));
}
SECTION("s4u-cloud-capping bug: all limited by bound extra case")
lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1, 7.6296e+06, 1);
lmm::Variable* rho_2 = Sys.variable_new(nullptr, 1, 3.8148e+07, 1);
- Sys.expand_add(sys_cnst, rho_1, 1);
- Sys.expand_add(sys_cnst, rho_2, 1);
+ Sys.expand(sys_cnst, rho_1, 1);
+ Sys.expand(sys_cnst, rho_2, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 7.6296e+06, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 3.8148e+07, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 7.6296e+06, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 3.8148e+07, sg_precision_workamount));
}
SECTION("Variable penalty with bounds: thread bug")
Sys.expand(sys_cnst, rho_1, 1);
Sys.solve();
- REQUIRE(double_equals(rho_1->get_value(), 8e7, sg_maxmin_precision));
- REQUIRE(double_equals(rho_2->get_value(), 3.2e8, sg_maxmin_precision));
+ REQUIRE(double_equals(rho_1->get_value(), 8e7, sg_precision_workamount));
+ REQUIRE(double_equals(rho_2->get_value(), 3.2e8, sg_precision_workamount));
+ }
+
+ SECTION("Variable penalty with bounds greater than C")
+ {
+ /*
+ * Detected by exec-thread. 6 thread running in a 4 core CPU.
+ */
+
+ lmm::Constraint* sys_cnst = Sys.constraint_new(nullptr, 4e8);
+ lmm::Variable* rho_1 = Sys.variable_new(nullptr, 1.0 / 6.0, 6e8, 1);
+ Sys.expand(sys_cnst, rho_1, 1);
+ Sys.solve();
+
+ REQUIRE(double_equals(rho_1->get_value(), 4e8, sg_precision_workamount));
}
Sys.variable_free_all();
for (int j = 0; j < N; j++) {
lmm::Variable* rho = Sys.variable_new(nullptr, 1, -1, C);
for (int i = 0; i < C; i++) {
- Sys.expand_add(sys_cnst[i], rho, data[i * j + j]);
+ Sys.expand(sys_cnst[i], rho, data[i * j + j]);
}
}
Sys.solve();
for (int j = 0; j < N; j++) {
for (int i = 0; i < C; i++) {
lmm::Variable* rho = Sys.variable_new(nullptr, 1);
- Sys.expand_add(sys_cnst[i], rho, data[i * j + j]);
+ Sys.expand(sys_cnst[i], rho, data[i * j + j]);
}
}
Sys.solve();