diff options
Diffstat (limited to 'Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend')
-rw-r--r-- | Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend b/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend new file mode 100644 index 00000000..47534618 --- /dev/null +++ b/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend | |||
@@ -0,0 +1,385 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests.cardinality | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Dimension | ||
4 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearConstraint | ||
5 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Polyhedron | ||
6 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronSaturationOperator | ||
7 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronSaturationResult | ||
8 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronSolver | ||
9 | import org.junit.After | ||
10 | import org.junit.Before | ||
11 | import org.junit.Test | ||
12 | |||
13 | import static org.junit.Assert.* | ||
14 | |||
15 | abstract class PolyhedronSolverTest { | ||
16 | var PolyhedronSolver solver | ||
17 | var PolyhedronSaturationOperator operator | ||
18 | |||
19 | protected def PolyhedronSolver createSolver() | ||
20 | |||
21 | @Before | ||
22 | def void setUp() { | ||
23 | solver = createSolver() | ||
24 | } | ||
25 | |||
26 | @After | ||
27 | def void tearDown() { | ||
28 | destroyOperatorIfExists() | ||
29 | } | ||
30 | |||
31 | @Test | ||
32 | def void singleDimensionTest() { | ||
33 | val x = new Dimension("x", 0, 1) | ||
34 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | ||
35 | |||
36 | val result = saturate() | ||
37 | |||
38 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
39 | assertEquals(0, x.lowerBound) | ||
40 | assertEquals(1, x.upperBound) | ||
41 | } | ||
42 | |||
43 | @Test | ||
44 | def void singleDimensionNegativeValueTest() { | ||
45 | val x = new Dimension("x", -2, -1) | ||
46 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | ||
47 | |||
48 | val result = saturate() | ||
49 | |||
50 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
51 | assertEquals(-2, x.lowerBound) | ||
52 | assertEquals(-1, x.upperBound) | ||
53 | } | ||
54 | |||
55 | @Test | ||
56 | def void singleDimensionConstraintTest() { | ||
57 | val x = new Dimension("x", null, null) | ||
58 | val constraint = new LinearConstraint(#{x -> 2}, 0, 2) | ||
59 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x])) | ||
60 | |||
61 | val result = saturate() | ||
62 | |||
63 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
64 | assertEquals(0, x.lowerBound) | ||
65 | assertEquals(1, x.upperBound) | ||
66 | } | ||
67 | |||
68 | @Test | ||
69 | def void singleDimensionConstraintUnitCoefficientTest() { | ||
70 | val x = new Dimension("x", null, null) | ||
71 | val constraint = new LinearConstraint(#{x -> 1}, 1, 3) | ||
72 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x])) | ||
73 | |||
74 | val result = saturate() | ||
75 | |||
76 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
77 | assertEquals(1, x.lowerBound) | ||
78 | assertEquals(3, x.upperBound) | ||
79 | } | ||
80 | |||
81 | @Test | ||
82 | def void singleDimensionUnboundedFromAboveTest() { | ||
83 | val x = new Dimension("x", -2, null) | ||
84 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | ||
85 | |||
86 | val result = saturate() | ||
87 | |||
88 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
89 | assertEquals(-2, x.lowerBound) | ||
90 | assertEquals(null, x.upperBound) | ||
91 | } | ||
92 | |||
93 | @Test | ||
94 | def void singleDimensionUnboundedFromBelowTest() { | ||
95 | val x = new Dimension("x", null, 2) | ||
96 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | ||
97 | |||
98 | val result = saturate() | ||
99 | |||
100 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
101 | assertEquals(null, x.lowerBound) | ||
102 | assertEquals(2, x.upperBound) | ||
103 | } | ||
104 | |||
105 | @Test | ||
106 | def void singleDimensionUnboundedTest() { | ||
107 | val x = new Dimension("x", null, null) | ||
108 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | ||
109 | |||
110 | val result = saturate() | ||
111 | |||
112 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
113 | assertEquals(null, x.lowerBound) | ||
114 | assertEquals(null, x.upperBound) | ||
115 | } | ||
116 | |||
117 | @Test | ||
118 | def void singleDimensionUnboundedObjectiveTest() { | ||
119 | val x = new Dimension("x", null, null) | ||
120 | val y = new Dimension("y", 0, 1) | ||
121 | val objective = new LinearConstraint(#{x -> 1, y -> 1}, null, null) | ||
122 | createSaturationOperator(new Polyhedron(#[x, y], #[], #[objective])) | ||
123 | |||
124 | val result = saturate() | ||
125 | |||
126 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
127 | assertEquals(null, objective.lowerBound) | ||
128 | assertEquals(null, objective.upperBound) | ||
129 | } | ||
130 | |||
131 | @Test | ||
132 | def void singleDimensionUnsatisfiableTest() { | ||
133 | val x = new Dimension("x", 0, 1) | ||
134 | val constraint = new LinearConstraint(#{x -> 2}, -2, -1) | ||
135 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x])) | ||
136 | |||
137 | val result = saturate() | ||
138 | |||
139 | assertEquals(PolyhedronSaturationResult.EMPTY, result) | ||
140 | } | ||
141 | |||
142 | @Test | ||
143 | def void equalityConstraintTest() { | ||
144 | val x = new Dimension("x", null, null) | ||
145 | val y = new Dimension("y", 1, 2) | ||
146 | val constraint = new LinearConstraint(#{x -> 2, y -> 2}, 6, 6) | ||
147 | createSaturationOperator(new Polyhedron(#[x, y], #[constraint], #[x])) | ||
148 | |||
149 | val result = saturate() | ||
150 | |||
151 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
152 | assertEquals(1, x.lowerBound) | ||
153 | assertEquals(2, x.upperBound) | ||
154 | } | ||
155 | |||
156 | @Test | ||
157 | def void saturateConstraintTest() { | ||
158 | val x = new Dimension("x", 0, 2) | ||
159 | val y = new Dimension("y", 1, 2) | ||
160 | val constraint = new LinearConstraint(#{x -> 2, y -> 1}, 0, 8) | ||
161 | createSaturationOperator(new Polyhedron(#[x, y], #[constraint], #[constraint])) | ||
162 | |||
163 | val result = saturate() | ||
164 | |||
165 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
166 | assertEquals(1, constraint.lowerBound) | ||
167 | assertEquals(6, constraint.upperBound) | ||
168 | } | ||
169 | |||
170 | @Test(expected=IllegalArgumentException) | ||
171 | def void unknownVariableTest() { | ||
172 | val x = new Dimension("x", 0, 1) | ||
173 | val y = new Dimension("y", 0, 1) | ||
174 | val constraint = new LinearConstraint(#{y -> 2}, 0, 2) | ||
175 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x])) | ||
176 | |||
177 | saturate() | ||
178 | } | ||
179 | |||
180 | @Test | ||
181 | def void emptyConstraintTest() { | ||
182 | val x = new Dimension("x", 0, 1) | ||
183 | val constraint = new LinearConstraint(emptyMap, 0, 1) | ||
184 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[constraint])) | ||
185 | |||
186 | val result = saturate() | ||
187 | |||
188 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
189 | assertEquals(0, constraint.lowerBound) | ||
190 | assertEquals(0, constraint.upperBound) | ||
191 | } | ||
192 | |||
193 | @Test | ||
194 | def void emptyConstraintUnsatisfiableTest() { | ||
195 | val x = new Dimension("x", 0, 1) | ||
196 | val constraint = new LinearConstraint(emptyMap, 1, 0) | ||
197 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[constraint])) | ||
198 | |||
199 | val result = saturate() | ||
200 | |||
201 | assertEquals(PolyhedronSaturationResult.EMPTY, result) | ||
202 | } | ||
203 | |||
204 | @Test | ||
205 | def void unboundedRelaxationWithIntegerSolutionTest() { | ||
206 | val x = new Dimension("x", 1, 3) | ||
207 | val y = new Dimension("y", null, null) | ||
208 | createSaturationOperator(new Polyhedron( | ||
209 | #[x, y], | ||
210 | #[new LinearConstraint(#{x -> 2}, 2, 6)], | ||
211 | #[x, y] | ||
212 | )) | ||
213 | |||
214 | val result = saturate() | ||
215 | |||
216 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
217 | assertEquals(1, x.lowerBound) | ||
218 | assertEquals(3, x.upperBound) | ||
219 | assertEquals(null, y.lowerBound) | ||
220 | assertEquals(null, y.upperBound) | ||
221 | } | ||
222 | |||
223 | protected def createSaturationOperator(Polyhedron polyhedron) { | ||
224 | destroyOperatorIfExists() | ||
225 | operator = solver.createSaturationOperator(polyhedron) | ||
226 | } | ||
227 | |||
228 | protected def destroyOperatorIfExists() { | ||
229 | if (operator !== null) { | ||
230 | operator.close | ||
231 | } | ||
232 | } | ||
233 | |||
234 | protected def saturate() { | ||
235 | operator.saturate | ||
236 | } | ||
237 | } | ||
238 | |||
239 | abstract class IntegerPolyhedronSolverTest extends PolyhedronSolverTest { | ||
240 | @Test | ||
241 | def void singleDimensionConstraintNonIntegerTest() { | ||
242 | val x = new Dimension("x", null, null) | ||
243 | val constraint = new LinearConstraint(#{x -> 2}, 0, 3) | ||
244 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x])) | ||
245 | |||
246 | val result = saturate() | ||
247 | |||
248 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
249 | assertEquals(0, x.lowerBound) | ||
250 | assertEquals(1, x.upperBound) | ||
251 | } | ||
252 | |||
253 | @Test | ||
254 | def void unsatisfiableMultipleInheritanceTest() { | ||
255 | val x = new Dimension("x", 0, 1) | ||
256 | val y = new Dimension("y", 0, 1) | ||
257 | val z = new Dimension("z", 0, 1) | ||
258 | createSaturationOperator(new Polyhedron( | ||
259 | #[x, y, z], | ||
260 | #[ | ||
261 | new LinearConstraint(#{x -> 1, y -> 1}, 1, 1), | ||
262 | new LinearConstraint(#{x -> 1, z -> 1}, 1, 1), | ||
263 | new LinearConstraint(#{y -> 1, z -> 1}, 1, 1) | ||
264 | ], | ||
265 | #[x, y, z] | ||
266 | )) | ||
267 | |||
268 | val result = saturate() | ||
269 | |||
270 | assertEquals(PolyhedronSaturationResult.EMPTY, result) | ||
271 | } | ||
272 | |||
273 | @Test | ||
274 | def void unboundedRelaxationWithNoIntegerSolutionTest() { | ||
275 | val x = new Dimension("x", 0, 1) | ||
276 | val y = new Dimension("y", null, null) | ||
277 | createSaturationOperator(new Polyhedron( | ||
278 | #[x, y], | ||
279 | #[new LinearConstraint(#{x -> 2}, 1, 1)], | ||
280 | #[x, y] | ||
281 | )) | ||
282 | |||
283 | val result = saturate() | ||
284 | |||
285 | assertEquals(PolyhedronSaturationResult.EMPTY, result) | ||
286 | } | ||
287 | } | ||
288 | |||
289 | abstract class RelaxedPolyhedronSolverTest extends PolyhedronSolverTest { | ||
290 | @Test | ||
291 | def void singleDimensionConstraintNonIntegerTest() { | ||
292 | val x = new Dimension("x", null, null) | ||
293 | val constraint = new LinearConstraint(#{x -> 2}, 0, 3) | ||
294 | createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x])) | ||
295 | |||
296 | val result = saturate() | ||
297 | |||
298 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
299 | assertEquals(0, x.lowerBound) | ||
300 | assertEquals(2, x.upperBound) | ||
301 | } | ||
302 | |||
303 | @Test | ||
304 | def void unsatisfiableMultipleInheritanceTest() { | ||
305 | val x = new Dimension("x", 0, 1) | ||
306 | val y = new Dimension("y", 0, 1) | ||
307 | val z = new Dimension("z", 0, 1) | ||
308 | createSaturationOperator(new Polyhedron( | ||
309 | #[x, y, z], | ||
310 | #[ | ||
311 | new LinearConstraint(#{x -> 1, y -> 1}, 1, 1), | ||
312 | new LinearConstraint(#{x -> 1, z -> 1}, 1, 1), | ||
313 | new LinearConstraint(#{y -> 1, z -> 1}, 1, 1) | ||
314 | ], | ||
315 | #[x, y, z] | ||
316 | )) | ||
317 | |||
318 | val result = saturate() | ||
319 | |||
320 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
321 | assertEquals(0, x.lowerBound) | ||
322 | assertEquals(1, x.upperBound) | ||
323 | assertEquals(0, y.lowerBound) | ||
324 | assertEquals(1, y.upperBound) | ||
325 | assertEquals(0, z.lowerBound) | ||
326 | assertEquals(1, z.upperBound) | ||
327 | } | ||
328 | |||
329 | @Test | ||
330 | def void unboundedRelaxationWithNoIntegerSolutionUnconstrainedVariableTest() { | ||
331 | val x = new Dimension("x", 1, 2) | ||
332 | val y = new Dimension("y", null, null) | ||
333 | createSaturationOperator(new Polyhedron( | ||
334 | #[x, y], | ||
335 | #[new LinearConstraint(#{x -> 2}, 3, 3)], | ||
336 | #[x, y] | ||
337 | )) | ||
338 | |||
339 | val result = saturate() | ||
340 | |||
341 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
342 | assertEquals(1, x.lowerBound) | ||
343 | assertEquals(2, x.upperBound) | ||
344 | assertEquals(null, y.lowerBound) | ||
345 | assertEquals(null, y.upperBound) | ||
346 | } | ||
347 | |||
348 | @Test | ||
349 | def void unboundedRelaxationWithNoIntegerSolutionConstrainedVariableTest() { | ||
350 | val x = new Dimension("x", 1, 2) | ||
351 | val y = new Dimension("y", null, null) | ||
352 | createSaturationOperator(new Polyhedron( | ||
353 | #[x, y], | ||
354 | #[new LinearConstraint(#{x -> 2}, 3, 3), new LinearConstraint(#{y -> 1}, null, 1)], | ||
355 | #[x, y] | ||
356 | )) | ||
357 | |||
358 | val result = saturate() | ||
359 | |||
360 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
361 | assertEquals(1, x.lowerBound) | ||
362 | assertEquals(2, x.upperBound) | ||
363 | assertEquals(null, y.lowerBound) | ||
364 | assertEquals(1, y.upperBound) | ||
365 | } | ||
366 | |||
367 | @Test | ||
368 | def void unboundedRelaxationWithNoIntegerSolutionBoundedVariableTest() { | ||
369 | val x = new Dimension("x", 1, 2) | ||
370 | val y = new Dimension("y", null, 1) | ||
371 | createSaturationOperator(new Polyhedron( | ||
372 | #[x, y], | ||
373 | #[new LinearConstraint(#{x -> 2}, 3, 3)], | ||
374 | #[x, y] | ||
375 | )) | ||
376 | |||
377 | val result = saturate() | ||
378 | |||
379 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | ||
380 | assertEquals(1, x.lowerBound) | ||
381 | assertEquals(2, x.upperBound) | ||
382 | assertEquals(null, y.lowerBound) | ||
383 | assertEquals(1, y.upperBound) | ||
384 | } | ||
385 | } | ||