Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Plug memory leaks.
[simgrid.git] / teshsuite / surf / lmm_usage / lmm_solve.cpp
1 /* Copyright (c) 2019. The SimGrid Team. All rights reserved.               */
2
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. */
5
6 #include "src/include/catch.hpp"
7 #include "src/kernel/lmm/maxmin.hpp"
8 #include "src/surf/surf_interface.hpp"
9 #include "xbt/log.h"
10
11 namespace lmm = simgrid::kernel::lmm;
12
13 TEST_CASE("kernel::lmm Single constraint shared systems", "[kernel-lmm-shared-single-sys]")
14 {
15   lmm::System* Sys = lmm::make_new_maxmin_system(false);
16
17   SECTION("Variable weight")
18   {
19     /*
20      * System under consideration:
21      * 1\times\rho_1^{1} + 1\times\rho_2^{2} + 1\times\rho_3^{3} \le 10
22      */
23
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);
28
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);
32     Sys->solve();
33
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));
37   }
38
39   SECTION("Consumption weight")
40   {
41     /*
42      * System under consideration:
43      * 1\times\rho_1^{1} + 2\times\rho_2^{1} + 3\times\rho_3^{1} \le 10
44      */
45
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);
50
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);
54     Sys->solve();
55
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));
59   }
60
61   SECTION("Consumption weight + variable weight")
62   {
63     /*
64      * Strange system under consideration:
65      * 56\times\rho_1^{74} + 21\times\rho_2^{6} + 2\times\rho_3^{2} \le 123
66      */
67
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);
72
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);
76     Sys->solve();
77
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));
81   }
82
83   Sys->variable_free_all();
84   delete Sys;
85 }
86
87 TEST_CASE("kernel::lmm Multiple constraint shared systems", "[kernel-lmm-shared-multiple-sys]")
88 {
89   lmm::System* Sys = lmm::make_new_maxmin_system(false);
90
91   SECTION("3 Constraints system")
92   {
93
94     /*
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
99      */
100
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);
104
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);
110
111     // Constraint 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);
115     // Constraint 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);
119     // Constraint 3
120     Sys->expand(sys_cnst_3, sys_var_5, 6);
121     Sys->solve();
122
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));
128   }
129
130   Sys->variable_free_all();
131   delete Sys;
132 }
133
134 TEST_CASE("kernel::lmm Single constraint unshared systems", "[kernel-lmm-unshared-single-sys]")
135 {
136   lmm::System* Sys = lmm::make_new_maxmin_system(false);
137
138   SECTION("Variable weight")
139   {
140     /*
141      * System under consideration:
142      * 1\times\rho_1^{1} + 1\times\rho_2^{2} + 1\times\rho_3^{3} \le 10
143      */
144
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);
150
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);
154     Sys->solve();
155
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));
159   }
160
161   SECTION("Consumption weight")
162   {
163     /*
164      * System under consideration:
165      * 1\times\rho_1^{1} + 2\times\rho_2^{1} + 3\times\rho_3^{1} \le 10
166      */
167
168     lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 10);
169     sys_cnst->unshare();
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);
173
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);
177     Sys->solve();
178
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));
182   }
183
184   SECTION("Consumption weight + variable weight")
185   {
186     /*
187      * Strange system under consideration:
188      * 56\times\rho_1^{74} + 21\times\rho_2^{6} + 2\times\rho_3^{2} \le 123
189      */
190
191     lmm::Constraint* sys_cnst = Sys->constraint_new(nullptr, 123);
192     sys_cnst->unshare();
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);
196
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);
200     Sys->solve();
201
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));
205   }
206
207   Sys->variable_free_all();
208   delete Sys;
209 }
210
211 TEST_CASE("kernel::lmm Multiple constraint unshared systems", "[kernel-lmm-unshared-multiple-sys]")
212 {
213   lmm::System* Sys = lmm::make_new_maxmin_system(false);
214
215   SECTION("3 Constraints system")
216   {
217
218     /*
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
223      */
224
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();
231
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);
237
238     // Constraint 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);
242     // Constraint 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);
246     // Constraint 3
247     Sys->expand(sys_cnst_3, sys_var_5, 6);
248     Sys->solve();
249
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));
255   }
256
257   Sys->variable_free_all();
258   delete Sys;
259 }