diff options
author | Kristóf Marussy <kris7topher@gmail.com> | 2019-07-29 14:21:36 +0200 |
---|---|---|
committer | Kristóf Marussy <kris7topher@gmail.com> | 2019-07-29 14:21:36 +0200 |
commit | b4bf8d387e430600790f6b30d9e88ec785148cd7 (patch) | |
tree | fdf6df1437823c9880b031405be498782109fdd8 /Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests | |
parent | Parse rational numbers in Z3PolyhedronSolver (diff) | |
download | VIATRA-Generator-b4bf8d387e430600790f6b30d9e88ec785148cd7.tar.gz VIATRA-Generator-b4bf8d387e430600790f6b30d9e88ec785148cd7.tar.zst VIATRA-Generator-b4bf8d387e430600790f6b30d9e88ec785148cd7.zip |
Make CbcPolyhedronSolver more robust
Diffstat (limited to 'Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests')
2 files changed, 106 insertions, 15 deletions
diff --git a/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/CbcPolyhedronSolverTest.xtend b/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/CbcPolyhedronSolverTest.xtend index a51aa082..b22e2a20 100644 --- a/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/CbcPolyhedronSolverTest.xtend +++ b/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/CbcPolyhedronSolverTest.xtend | |||
@@ -7,11 +7,19 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Polyhedr | |||
7 | import org.junit.Test | 7 | import org.junit.Test |
8 | 8 | ||
9 | import static org.junit.Assert.* | 9 | import static org.junit.Assert.* |
10 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearConstraint | ||
10 | 11 | ||
11 | class CbcPolyhedronSolverTest extends IntegerPolyhedronSolverTest { | 12 | class CbcPolyhedronSolverTest extends IntegerPolyhedronSolverTest { |
12 | 13 | ||
13 | override protected createSolver() { | 14 | override protected createSolver() { |
14 | new CbcPolyhedronSolver(10, true) | 15 | new CbcPolyhedronSolver(false, 10, true) |
16 | } | ||
17 | } | ||
18 | |||
19 | class RelaxedCbcPolyhedronSolverTest extends RelaxedPolyhedronSolverTest { | ||
20 | |||
21 | override protected createSolver() { | ||
22 | new CbcPolyhedronSolver(true, 10, true) | ||
15 | } | 23 | } |
16 | } | 24 | } |
17 | 25 | ||
@@ -19,9 +27,9 @@ class CbcPolyhedronSolverTimeoutTest { | |||
19 | 27 | ||
20 | @Test | 28 | @Test |
21 | def void timeoutTest() { | 29 | def void timeoutTest() { |
22 | val solver = new CbcPolyhedronSolver(0, true) | 30 | val solver = new CbcPolyhedronSolver(false, 0, true) |
23 | val x = new Dimension("x", 0, 1) | 31 | val x = new Dimension("x", 0, 1) |
24 | val polyhedron = new Polyhedron(#[x], #[], #[x]) | 32 | val polyhedron = new Polyhedron(#[x], #[new LinearConstraint(#{x -> 1}, null, 0)], #[x]) |
25 | val operator = solver.createSaturationOperator(polyhedron) | 33 | val operator = solver.createSaturationOperator(polyhedron) |
26 | try { | 34 | try { |
27 | val result = operator.saturate | 35 | val result = operator.saturate |
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 index 1b2dcb00..47534618 100644 --- 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 | |||
@@ -80,26 +80,52 @@ abstract class PolyhedronSolverTest { | |||
80 | 80 | ||
81 | @Test | 81 | @Test |
82 | def void singleDimensionUnboundedFromAboveTest() { | 82 | def void singleDimensionUnboundedFromAboveTest() { |
83 | val x = new Dimension("x", 0, null) | 83 | val x = new Dimension("x", -2, null) |
84 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | 84 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) |
85 | 85 | ||
86 | val result = saturate() | 86 | val result = saturate() |
87 | 87 | ||
88 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | 88 | assertEquals(PolyhedronSaturationResult.SATURATED, result) |
89 | assertEquals(0, x.lowerBound) | 89 | assertEquals(-2, x.lowerBound) |
90 | assertEquals(null, x.upperBound) | 90 | assertEquals(null, x.upperBound) |
91 | } | 91 | } |
92 | 92 | ||
93 | @Test | 93 | @Test |
94 | def void singleDimensionUnboundedFromBelowTest() { | 94 | def void singleDimensionUnboundedFromBelowTest() { |
95 | val x = new Dimension("x", null, 0) | 95 | val x = new Dimension("x", null, 2) |
96 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) | 96 | createSaturationOperator(new Polyhedron(#[x], #[], #[x])) |
97 | 97 | ||
98 | val result = saturate() | 98 | val result = saturate() |
99 | 99 | ||
100 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | 100 | assertEquals(PolyhedronSaturationResult.SATURATED, result) |
101 | assertEquals(null, x.lowerBound) | 101 | assertEquals(null, x.lowerBound) |
102 | assertEquals(0, x.upperBound) | 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) | ||
103 | } | 129 | } |
104 | 130 | ||
105 | @Test | 131 | @Test |
@@ -174,6 +200,25 @@ abstract class PolyhedronSolverTest { | |||
174 | 200 | ||
175 | assertEquals(PolyhedronSaturationResult.EMPTY, result) | 201 | assertEquals(PolyhedronSaturationResult.EMPTY, result) |
176 | } | 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 | } | ||
177 | 222 | ||
178 | protected def createSaturationOperator(Polyhedron polyhedron) { | 223 | protected def createSaturationOperator(Polyhedron polyhedron) { |
179 | destroyOperatorIfExists() | 224 | destroyOperatorIfExists() |
@@ -228,7 +273,7 @@ abstract class IntegerPolyhedronSolverTest extends PolyhedronSolverTest { | |||
228 | @Test | 273 | @Test |
229 | def void unboundedRelaxationWithNoIntegerSolutionTest() { | 274 | def void unboundedRelaxationWithNoIntegerSolutionTest() { |
230 | val x = new Dimension("x", 0, 1) | 275 | val x = new Dimension("x", 0, 1) |
231 | val y = new Dimension("y", 0, null) | 276 | val y = new Dimension("y", null, null) |
232 | createSaturationOperator(new Polyhedron( | 277 | createSaturationOperator(new Polyhedron( |
233 | #[x, y], | 278 | #[x, y], |
234 | #[new LinearConstraint(#{x -> 2}, 1, 1)], | 279 | #[new LinearConstraint(#{x -> 2}, 1, 1)], |
@@ -282,21 +327,59 @@ abstract class RelaxedPolyhedronSolverTest extends PolyhedronSolverTest { | |||
282 | } | 327 | } |
283 | 328 | ||
284 | @Test | 329 | @Test |
285 | def void unboundedRelaxationWithNoIntegerSolutionTest() { | 330 | def void unboundedRelaxationWithNoIntegerSolutionUnconstrainedVariableTest() { |
286 | val x = new Dimension("x", 0, 1) | 331 | val x = new Dimension("x", 1, 2) |
287 | val y = new Dimension("y", 0, null) | 332 | val y = new Dimension("y", null, null) |
288 | createSaturationOperator(new Polyhedron( | 333 | createSaturationOperator(new Polyhedron( |
289 | #[x, y], | 334 | #[x, y], |
290 | #[new LinearConstraint(#{x -> 2}, 1, 1)], | 335 | #[new LinearConstraint(#{x -> 2}, 3, 3)], |
291 | #[x, y] | 336 | #[x, y] |
292 | )) | 337 | )) |
293 | 338 | ||
294 | val result = saturate() | 339 | val result = saturate() |
295 | 340 | ||
296 | assertEquals(PolyhedronSaturationResult.SATURATED, result) | 341 | assertEquals(PolyhedronSaturationResult.SATURATED, result) |
297 | assertEquals(0, x.lowerBound) | 342 | assertEquals(1, x.lowerBound) |
298 | assertEquals(1, x.upperBound) | 343 | assertEquals(2, x.upperBound) |
299 | assertEquals(0, y.lowerBound) | 344 | assertEquals(null, y.lowerBound) |
300 | assertEquals(null, y.upperBound) | 345 | assertEquals(null, y.upperBound) |
301 | } | 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 | } | ||
302 | } | 385 | } |