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:
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.xtend385
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 @@
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 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
239abstract 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
289abstract 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}