1 /* Copyright (c) 2019. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "src/include/catch.hpp"
7 #include "src/kernel/lmm/maxmin.hpp"
8 #include "src/surf/surf_interface.hpp"
11 namespace lmm = simgrid::kernel::lmm;
13 TEST_CASE("kernel::lmm Single constraint shared systems", "[kernel-lmm-shared-single-sys]")
15 lmm::System* Sys = lmm::make_new_maxmin_system(false);
17 SECTION("Variable weight")
20 * System under consideration:
21 * 1\times\rho_1^{1} + 1\times\rho_2^{2} + 1\times\rho_3^{3} \le 10
23 * - \rho_1 should have twice the resources of \rho_2
24 * - \rho_1 should have thrice the resources of \rho_3
27 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
28 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
29 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 2, 0.0, 1);
30 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
32 Sys->expand(sys_cnst, sys_var_1, 1);
33 Sys->expand(sys_cnst, sys_var_2, 1);
34 Sys->expand(sys_cnst, sys_var_3, 1);
37 REQUIRE(double_equals(sys_var_1->get_value(), 5.45455, sg_maxmin_precision));
38 REQUIRE(double_equals(sys_var_2->get_value(), 2.72727, sg_maxmin_precision));
39 REQUIRE(double_equals(sys_var_3->get_value(), 1.81818, sg_maxmin_precision));
42 SECTION("Consumption weight")
45 * System under consideration:
46 * 1\times\rho_1^{1} + 2\times\rho_2^{1} + 3\times\rho_3^{1} \le 10
48 * - All variable should have the same amount of resources
49 * - This amount should be equal to \frac{10}{\sum{\text{consumption weight}}}
52 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
53 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
54 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 1, 0.0, 1);
55 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 1, 0.0, 1);
57 Sys->expand(sys_cnst, sys_var_1, 1);
58 Sys->expand(sys_cnst, sys_var_2, 2);
59 Sys->expand(sys_cnst, sys_var_3, 3);
62 REQUIRE(double_equals(sys_var_1->get_value(), 1.666667, sg_maxmin_precision));
63 REQUIRE(double_equals(sys_var_2->get_value(), 1.666667, sg_maxmin_precision));
64 REQUIRE(double_equals(sys_var_3->get_value(), 1.666667, sg_maxmin_precision));
67 SECTION("Consumption weight + variable weight")
70 * Strange system under consideration:
71 * 56\times\rho_1^{74} + 21\times\rho_2^{6} + 2\times\rho_3^{2} \le 123
73 * - This test combine variable weight and consumption weight
74 * - Thus, we expect that \rho_j=\frac{\frac{10}{\sum{\frac{a_i}{w_i}}}}{w_j}
77 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 123);
78 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 56, 0.0, 1);
79 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 21, 0.0, 1);
80 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
82 Sys->expand(sys_cnst, sys_var_1, 74);
83 Sys->expand(sys_cnst, sys_var_2, 6);
84 Sys->expand(sys_cnst, sys_var_3, 2);
87 REQUIRE(double_equals(sys_var_1->get_value(), 0.9659686, sg_maxmin_precision));
88 REQUIRE(double_equals(sys_var_2->get_value(), 2.575916, sg_maxmin_precision));
89 REQUIRE(double_equals(sys_var_3->get_value(), 18.03141, sg_maxmin_precision));
92 Sys->variable_free_all();
96 TEST_CASE("kernel::lmm Multiple constraint shared systems", "[kernel-lmm-shared-multiple-sys]")
98 lmm::System* Sys = lmm::make_new_maxmin_system(false);
100 SECTION("3 Constraints system")
104 * System under consideration:
105 * 4\times\rho_1^{5.1} + 2.6\times\rho_2^{7} + 1.2\times\rho_3^{8.5} \le 14.6 \\
106 * 5\times\rho_4^{6.2} + 2\times\rho_2^{7} + 4.1\times\rho_3^{8.5} \le 40.7 \\
107 * 6\times\rho_5^1 \le 7
109 * - Order of inequation solving: 3, 1 and 2
110 * - Variable values are fixed using: \rho_j=\frac{\frac{C_r}{\sum{\frac{a_{r,i}}{w_i}}}}{w_j}
113 lmm::Constraint* sys_cnst_1 = Sys->constraint_new(nullptr, 14.6);
114 lmm::Constraint* sys_cnst_2 = Sys->constraint_new(nullptr, 10.7);
115 lmm::Constraint* sys_cnst_3 = Sys->constraint_new(nullptr, 7);
117 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 5.1, 0.0, 1);
118 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 7, 0.0, 2);
119 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 8.5, 0.0, 2);
120 lmm::Variable* sys_var_4 = Sys->variable_new(nullptr, 6.2, 0.0, 1);
121 lmm::Variable* sys_var_5 = Sys->variable_new(nullptr, 1, 0.0, 1);
124 Sys->expand(sys_cnst_1, sys_var_1, 4);
125 Sys->expand(sys_cnst_1, sys_var_2, 2.6);
126 Sys->expand(sys_cnst_1, sys_var_3, 1.2);
128 Sys->expand(sys_cnst_2, sys_var_4, 5);
129 Sys->expand(sys_cnst_2, sys_var_2, 2);
130 Sys->expand(sys_cnst_2, sys_var_3, 4.1);
132 Sys->expand(sys_cnst_3, sys_var_5, 6);
135 REQUIRE(double_equals(sys_var_1->get_value(), 2.779119, sg_maxmin_precision));
136 REQUIRE(double_equals(sys_var_2->get_value(), 0.9708181, sg_maxmin_precision));
137 REQUIRE(double_equals(sys_var_3->get_value(), 0.7994973, sg_maxmin_precision));
138 REQUIRE(double_equals(sys_var_4->get_value(), 1.096085, sg_maxmin_precision));
139 REQUIRE(double_equals(sys_var_5->get_value(), 1.166667, sg_maxmin_precision));
142 Sys->variable_free_all();
146 TEST_CASE("kernel::lmm Single constraint unshared systems", "[kernel-lmm-unshared-single-sys]")
148 lmm::System* Sys = lmm::make_new_maxmin_system(false);
150 SECTION("Variable weight")
153 * System under consideration:
154 * 1\times\rho_1^{1} + 1\times\rho_2^{2} + 1\times\rho_3^{3} \le 10
156 * - Variables are fixed using: \rho_j=\frac{\frac{10}{\frac{1}{1}}}{w_j}
159 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
160 sys_cnst->unshare(); // FATPIPE
161 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
162 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 2, 0.0, 1);
163 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
165 Sys->expand(sys_cnst, sys_var_1, 1);
166 Sys->expand(sys_cnst, sys_var_2, 1);
167 Sys->expand(sys_cnst, sys_var_3, 1);
170 REQUIRE(double_equals(sys_var_1->get_value(), 10, sg_maxmin_precision));
171 REQUIRE(double_equals(sys_var_2->get_value(), 5, sg_maxmin_precision));
172 REQUIRE(double_equals(sys_var_3->get_value(), 3.333333, sg_maxmin_precision));
175 SECTION("Consumption weight")
178 * System under consideration:
179 * 1\times\rho_1^{1} + 2\times\rho_2^{1} + 3\times\rho_3^{1} \le 10
181 * - Variables are fixed using: \rho_j=\frac{\frac{10}{\frac{3}{1}}}{w_j}
184 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
186 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
187 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 1, 0.0, 1);
188 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 1, 0.0, 1);
190 Sys->expand(sys_cnst, sys_var_1, 1);
191 Sys->expand(sys_cnst, sys_var_2, 2);
192 Sys->expand(sys_cnst, sys_var_3, 3);
195 REQUIRE(double_equals(sys_var_1->get_value(), 3.333333, sg_maxmin_precision));
196 REQUIRE(double_equals(sys_var_2->get_value(), 3.333333, sg_maxmin_precision));
197 REQUIRE(double_equals(sys_var_3->get_value(), 3.333333, sg_maxmin_precision));
200 SECTION("Consumption weight + variable weight")
203 * Strange system under consideration:
204 * 56\times\rho_1^{74} + 21\times\rho_2^{6} + 2\times\rho_3^{2} \le 123
206 * - Variables are fixed using: \rho_j=\frac{\frac{123}{\frac{74}{56}}}{w_j}
209 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 123);
211 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 56, 0.0, 1);
212 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 21, 0.0, 1);
213 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
215 Sys->expand(sys_cnst, sys_var_1, 74);
216 Sys->expand(sys_cnst, sys_var_2, 6);
217 Sys->expand(sys_cnst, sys_var_3, 2);
220 REQUIRE(double_equals(sys_var_1->get_value(), 1.662162, sg_maxmin_precision));
221 REQUIRE(double_equals(sys_var_2->get_value(), 4.432432, sg_maxmin_precision));
222 REQUIRE(double_equals(sys_var_3->get_value(), 31.02703, sg_maxmin_precision));
225 Sys->variable_free_all();
229 TEST_CASE("kernel::lmm Multiple constraint unshared systems", "[kernel-lmm-unshared-multiple-sys]")
231 lmm::System* Sys = lmm::make_new_maxmin_system(false);
233 SECTION("3 Constraints system")
237 * System under consideration:
238 * 4\times\rho_1^{5.1} + 2.6\times\rho_2^{7} + 1.2\times\rho_3^{8.5} \le 14.6 \\
239 * 5\times\rho_4^{6.2} + 2\times\rho_2^{7} + 4.1\times\rho_3^{8.5} \le 40.7 \\
240 * 6\times\rho_5^1 \le 7
242 * - Variable are fixed using: \rho_j=\frac{\frac{C_r}{max\left(\frac{a_{r},i}{w_i}\right)}}{w_j}
243 * - The order of inequation solving is expected to be: 3, 2 and 1
246 lmm::Constraint* sys_cnst_1 = Sys->constraint_new(nullptr, 14.6);
247 sys_cnst_1->unshare();
248 lmm::Constraint* sys_cnst_2 = Sys->constraint_new(nullptr, 10.7);
249 sys_cnst_2->unshare();
250 lmm::Constraint* sys_cnst_3 = Sys->constraint_new(nullptr, 7);
251 sys_cnst_3->unshare();
253 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 5.1, 0.0, 1);
254 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 7, 0.0, 2);
255 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 8.5, 0.0, 2);
256 lmm::Variable* sys_var_4 = Sys->variable_new(nullptr, 6.2, 0.0, 1);
257 lmm::Variable* sys_var_5 = Sys->variable_new(nullptr, 1, 0.0, 1);
260 Sys->expand(sys_cnst_1, sys_var_1, 4);
261 Sys->expand(sys_cnst_1, sys_var_2, 2.6);
262 Sys->expand(sys_cnst_1, sys_var_3, 1.2);
264 Sys->expand(sys_cnst_2, sys_var_4, 5);
265 Sys->expand(sys_cnst_2, sys_var_2, 2);
266 Sys->expand(sys_cnst_2, sys_var_3, 4.1);
268 Sys->expand(sys_cnst_3, sys_var_5, 6);
271 REQUIRE(double_equals(sys_var_1->get_value(), 3.65, sg_maxmin_precision));
272 REQUIRE(double_equals(sys_var_2->get_value(), 1.895429, sg_maxmin_precision));
273 REQUIRE(double_equals(sys_var_3->get_value(), 1.560941, sg_maxmin_precision));
274 REQUIRE(double_equals(sys_var_4->get_value(), 2.14, sg_maxmin_precision));
275 REQUIRE(double_equals(sys_var_5->get_value(), 1.166667, sg_maxmin_precision));
278 Sys->variable_free_all();