aboutsummaryrefslogtreecommitdiffstats
path: root/Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-07-18 15:21:56 +0200
committerLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-07-19 11:43:02 +0200
commitb217dfc7e7bd7beb73c8cc23ad82383309ceb697 (patch)
tree965485702e311137a9ea865285ce1f409b99caed /Tests/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/tests/cardinality/PolyhedronSolverTest.xtend
parentTransitive closure of type hierarchy in ScopePropagator (diff)
downloadVIATRA-Generator-b217dfc7e7bd7beb73c8cc23ad82383309ceb697.tar.gz
VIATRA-Generator-b217dfc7e7bd7beb73c8cc23ad82383309ceb697.tar.zst
VIATRA-Generator-b217dfc7e7bd7beb73c8cc23ad82383309ceb697.zip
Implement Coin-OR CBC polyhedron saturation operator
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.xtend216
1 files changed, 216 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..789018cb
--- /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,216 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.tests.cardinality
2
3import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Dimension
4import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.LinearConstraint
5import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.Polyhedron
6import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronSaturationOperator
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronSaturationResult
8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.PolyhedronSolver
9import org.junit.After
10import org.junit.Before
11import org.junit.Test
12
13import static org.junit.Assert.*
14
15abstract 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 singleDimensionConstraintIntegerTest() {
83 val x = new Dimension("x", null, null)
84 val constraint = new LinearConstraint(#{x -> 2}, 0, 3)
85 createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x]))
86
87 val result = saturate()
88
89 assertEquals(PolyhedronSaturationResult.SATURATED, result)
90 assertEquals(0, x.lowerBound)
91 assertEquals(1, x.upperBound)
92 }
93
94 @Test
95 def void singleDimensionUnboundedFromAboveTest() {
96 val x = new Dimension("x", 0, null)
97 createSaturationOperator(new Polyhedron(#[x], #[], #[x]))
98
99 val result = saturate()
100
101 assertEquals(PolyhedronSaturationResult.SATURATED, result)
102 assertEquals(0, x.lowerBound)
103 assertEquals(null, x.upperBound)
104 }
105
106 @Test
107 def void singleDimensionUnboundedFromBelowTest() {
108 val x = new Dimension("x", null, 0)
109 createSaturationOperator(new Polyhedron(#[x], #[], #[x]))
110
111 val result = saturate()
112
113 assertEquals(PolyhedronSaturationResult.SATURATED, result)
114 assertEquals(null, x.lowerBound)
115 assertEquals(0, x.upperBound)
116 }
117
118 @Test
119 def void singleDimensionUnsatisfiableTest() {
120 val x = new Dimension("x", 0, 1)
121 val constraint = new LinearConstraint(#{x -> 2}, -2, -1)
122 createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x]))
123
124 val result = saturate()
125
126 assertEquals(PolyhedronSaturationResult.EMPTY, result)
127 }
128
129 @Test
130 def void equalityConstraintTest() {
131 val x = new Dimension("x", null, null)
132 val y = new Dimension("y", 1, 2)
133 val constraint = new LinearConstraint(#{x -> 2, y -> 2}, 6, 6)
134 createSaturationOperator(new Polyhedron(#[x, y], #[constraint], #[x]))
135
136 val result = saturate()
137
138 assertEquals(PolyhedronSaturationResult.SATURATED, result)
139 assertEquals(1, x.lowerBound)
140 assertEquals(2, x.upperBound)
141 }
142
143 @Test
144 def void saturateConstraintTest() {
145 val x = new Dimension("x", 0, 2)
146 val y = new Dimension("y", 1, 2)
147 val constraint = new LinearConstraint(#{x -> 2, y -> 1}, 0, 8)
148 createSaturationOperator(new Polyhedron(#[x, y], #[constraint], #[constraint]))
149
150 val result = saturate()
151
152 assertEquals(PolyhedronSaturationResult.SATURATED, result)
153 assertEquals(1, constraint.lowerBound)
154 assertEquals(6, constraint.upperBound)
155 }
156
157 @Test(expected=IllegalArgumentException)
158 def void unknownVariableTest() {
159 val x = new Dimension("x", 0, 1)
160 val y = new Dimension("y", 0, 1)
161 val constraint = new LinearConstraint(#{y -> 2}, 0, 2)
162 createSaturationOperator(new Polyhedron(#[x], #[constraint], #[x]))
163
164 saturate()
165 }
166
167 @Test
168 def void unsatisfiableMultipleInheritanceTest() {
169 val x = new Dimension("x", 0, 1)
170 val y = new Dimension("y", 0, 1)
171 val z = new Dimension("z", 0, 1)
172 createSaturationOperator(new Polyhedron(
173 #[x, y, z],
174 #[
175 new LinearConstraint(#{x -> 1, y -> 1}, 1, 1),
176 new LinearConstraint(#{x -> 1, z -> 1}, 1, 1),
177 new LinearConstraint(#{y -> 1, z -> 1}, 1, 1)
178 ],
179 #[x, y, z]
180 ))
181
182 val result = saturate()
183
184 assertEquals(PolyhedronSaturationResult.EMPTY, result)
185 }
186
187 @Test
188 def void unboundedRelaxationWithNoIntegerSolutionTest() {
189 val x = new Dimension("x", 0, 1)
190 val y = new Dimension("y", 0, null)
191 createSaturationOperator(new Polyhedron(
192 #[x, y],
193 #[new LinearConstraint(#{x -> 2}, 1, 1)],
194 #[x, y]
195 ))
196
197 val result = saturate()
198
199 assertEquals(PolyhedronSaturationResult.EMPTY, result)
200 }
201
202 private def createSaturationOperator(Polyhedron polyhedron) {
203 destroyOperatorIfExists()
204 operator = solver.createSaturationOperator(polyhedron)
205 }
206
207 private def destroyOperatorIfExists() {
208 if (operator !== null) {
209 operator.close
210 }
211 }
212
213 private def saturate() {
214 operator.saturate
215 }
216}