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
24 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
25 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
26 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 2, 0.0, 1);
27 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
29 Sys->expand(sys_cnst, sys_var_1, 1);
30 Sys->expand(sys_cnst, sys_var_2, 1);
31 Sys->expand(sys_cnst, sys_var_3, 1);
34 REQUIRE(double_equals(sys_var_1->get_value(), 5.45455, sg_maxmin_precision));
35 REQUIRE(double_equals(sys_var_2->get_value(), 2.72727, sg_maxmin_precision));
36 REQUIRE(double_equals(sys_var_3->get_value(), 1.81818, sg_maxmin_precision));
39 SECTION("Consumption weight")
42 * System under consideration:
43 * 1\times\rho_1^{1} + 2\times\rho_2^{1} + 3\times\rho_3^{1} \le 10
46 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
47 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
48 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 1, 0.0, 1);
49 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 1, 0.0, 1);
51 Sys->expand(sys_cnst, sys_var_1, 1);
52 Sys->expand(sys_cnst, sys_var_2, 2);
53 Sys->expand(sys_cnst, sys_var_3, 3);
56 REQUIRE(double_equals(sys_var_1->get_value(), 1.666667, sg_maxmin_precision));
57 REQUIRE(double_equals(sys_var_2->get_value(), 1.666667, sg_maxmin_precision));
58 REQUIRE(double_equals(sys_var_3->get_value(), 1.666667, sg_maxmin_precision));
61 SECTION("Consumption weight + variable weight")
64 * Strange system under consideration:
65 * 56\times\rho_1^{74} + 21\times\rho_2^{6} + 2\times\rho_3^{2} \le 123
68 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 123);
69 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 56, 0.0, 1);
70 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 21, 0.0, 1);
71 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
73 Sys->expand(sys_cnst, sys_var_1, 74);
74 Sys->expand(sys_cnst, sys_var_2, 6);
75 Sys->expand(sys_cnst, sys_var_3, 2);
78 REQUIRE(double_equals(sys_var_1->get_value(), 0.9659686, sg_maxmin_precision));
79 REQUIRE(double_equals(sys_var_2->get_value(), 2.575916, sg_maxmin_precision));
80 REQUIRE(double_equals(sys_var_3->get_value(), 18.03141, sg_maxmin_precision));
83 Sys->variable_free_all();
87 TEST_CASE("kernel::lmm Multiple constraint shared systems", "[kernel-lmm-shared-multiple-sys]")
89 lmm::System* Sys = lmm::make_new_maxmin_system(false);
91 SECTION("3 Constraints system")
95 * System under consideration:
96 * 4\times\rho_1^{5.1} + 2.6\times\rho_2^{7} + 1.2\times\rho_3^{8.5} \le 14.6 \\
97 * 5\times\rho_4^{6.2} + 2\times\rho_2^{7} + 4.1\times\rho_3^{8.5} \le 40.7 \\
98 * 6\times\rho_5^1 \le 7
101 lmm::Constraint* sys_cnst_1 = Sys->constraint_new(nullptr, 14.6);
102 lmm::Constraint* sys_cnst_2 = Sys->constraint_new(nullptr, 10.7);
103 lmm::Constraint* sys_cnst_3 = Sys->constraint_new(nullptr, 7);
105 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 5.1, 0.0, 1);
106 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 7, 0.0, 2);
107 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 8.5, 0.0, 2);
108 lmm::Variable* sys_var_4 = Sys->variable_new(nullptr, 6.2, 0.0, 1);
109 lmm::Variable* sys_var_5 = Sys->variable_new(nullptr, 1, 0.0, 1);
112 Sys->expand(sys_cnst_1, sys_var_1, 4);
113 Sys->expand(sys_cnst_1, sys_var_2, 2.6);
114 Sys->expand(sys_cnst_1, sys_var_3, 1.2);
116 Sys->expand(sys_cnst_2, sys_var_4, 5);
117 Sys->expand(sys_cnst_2, sys_var_2, 2);
118 Sys->expand(sys_cnst_2, sys_var_3, 4.1);
120 Sys->expand(sys_cnst_3, sys_var_5, 6);
123 REQUIRE(double_equals(sys_var_1->get_value(), 2.779119, sg_maxmin_precision));
124 REQUIRE(double_equals(sys_var_2->get_value(), 0.9708181, sg_maxmin_precision));
125 REQUIRE(double_equals(sys_var_3->get_value(), 0.7994973, sg_maxmin_precision));
126 REQUIRE(double_equals(sys_var_4->get_value(), 1.096085, sg_maxmin_precision));
127 REQUIRE(double_equals(sys_var_5->get_value(), 1.166667, sg_maxmin_precision));
130 Sys->variable_free_all();
134 TEST_CASE("kernel::lmm Single constraint unshared systems", "[kernel-lmm-unshared-single-sys]")
136 lmm::System* Sys = lmm::make_new_maxmin_system(false);
138 SECTION("Variable weight")
141 * System under consideration:
142 * 1\times\rho_1^{1} + 1\times\rho_2^{2} + 1\times\rho_3^{3} \le 10
145 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
146 sys_cnst->unshare(); // FATPIPE
147 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
148 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 2, 0.0, 1);
149 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
151 Sys->expand(sys_cnst, sys_var_1, 1);
152 Sys->expand(sys_cnst, sys_var_2, 1);
153 Sys->expand(sys_cnst, sys_var_3, 1);
156 REQUIRE(double_equals(sys_var_1->get_value(), 10, sg_maxmin_precision));
157 REQUIRE(double_equals(sys_var_2->get_value(), 5, sg_maxmin_precision));
158 REQUIRE(double_equals(sys_var_3->get_value(), 3.333333, sg_maxmin_precision));
161 SECTION("Consumption weight")
164 * System under consideration:
165 * 1\times\rho_1^{1} + 2\times\rho_2^{1} + 3\times\rho_3^{1} \le 10
168 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
170 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 1, 0.0, 1);
171 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 1, 0.0, 1);
172 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 1, 0.0, 1);
174 Sys->expand(sys_cnst, sys_var_1, 1);
175 Sys->expand(sys_cnst, sys_var_2, 2);
176 Sys->expand(sys_cnst, sys_var_3, 3);
179 REQUIRE(double_equals(sys_var_1->get_value(), 3.333333, sg_maxmin_precision));
180 REQUIRE(double_equals(sys_var_2->get_value(), 3.333333, sg_maxmin_precision));
181 REQUIRE(double_equals(sys_var_3->get_value(), 3.333333, sg_maxmin_precision));
184 SECTION("Consumption weight + variable weight")
187 * Strange system under consideration:
188 * 56\times\rho_1^{74} + 21\times\rho_2^{6} + 2\times\rho_3^{2} \le 123
191 lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 123);
193 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 56, 0.0, 1);
194 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 21, 0.0, 1);
195 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 3, 0.0, 1);
197 Sys->expand(sys_cnst, sys_var_1, 74);
198 Sys->expand(sys_cnst, sys_var_2, 6);
199 Sys->expand(sys_cnst, sys_var_3, 2);
202 REQUIRE(double_equals(sys_var_1->get_value(), 1.662162, sg_maxmin_precision));
203 REQUIRE(double_equals(sys_var_2->get_value(), 4.432432, sg_maxmin_precision));
204 REQUIRE(double_equals(sys_var_3->get_value(), 31.02703, sg_maxmin_precision));
207 Sys->variable_free_all();
211 TEST_CASE("kernel::lmm Multiple constraint unshared systems", "[kernel-lmm-unshared-multiple-sys]")
213 lmm::System* Sys = lmm::make_new_maxmin_system(false);
215 SECTION("3 Constraints system")
219 * System under consideration:
220 * 4\times\rho_1^{5.1} + 2.6\times\rho_2^{7} + 1.2\times\rho_3^{8.5} \le 14.6 \\
221 * 5\times\rho_4^{6.2} + 2\times\rho_2^{7} + 4.1\times\rho_3^{8.5} \le 40.7 \\
222 * 6\times\rho_5^1 \le 7
225 lmm::Constraint* sys_cnst_1 = Sys->constraint_new(nullptr, 14.6);
226 sys_cnst_1->unshare();
227 lmm::Constraint* sys_cnst_2 = Sys->constraint_new(nullptr, 10.7);
228 sys_cnst_2->unshare();
229 lmm::Constraint* sys_cnst_3 = Sys->constraint_new(nullptr, 7);
230 sys_cnst_3->unshare();
232 lmm::Variable* sys_var_1 = Sys->variable_new(nullptr, 5.1, 0.0, 1);
233 lmm::Variable* sys_var_2 = Sys->variable_new(nullptr, 7, 0.0, 2);
234 lmm::Variable* sys_var_3 = Sys->variable_new(nullptr, 8.5, 0.0, 2);
235 lmm::Variable* sys_var_4 = Sys->variable_new(nullptr, 6.2, 0.0, 1);
236 lmm::Variable* sys_var_5 = Sys->variable_new(nullptr, 1, 0.0, 1);
239 Sys->expand(sys_cnst_1, sys_var_1, 4);
240 Sys->expand(sys_cnst_1, sys_var_2, 2.6);
241 Sys->expand(sys_cnst_1, sys_var_3, 1.2);
243 Sys->expand(sys_cnst_2, sys_var_4, 5);
244 Sys->expand(sys_cnst_2, sys_var_2, 2);
245 Sys->expand(sys_cnst_2, sys_var_3, 4.1);
247 Sys->expand(sys_cnst_3, sys_var_5, 6);
250 REQUIRE(double_equals(sys_var_1->get_value(), 3.65, sg_maxmin_precision));
251 REQUIRE(double_equals(sys_var_2->get_value(), 1.895429, sg_maxmin_precision));
252 REQUIRE(double_equals(sys_var_3->get_value(), 1.560941, sg_maxmin_precision));
253 REQUIRE(double_equals(sys_var_4->get_value(), 2.14, sg_maxmin_precision));
254 REQUIRE(double_equals(sys_var_5->get_value(), 1.166667, sg_maxmin_precision));
257 Sys->variable_free_all();