aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-07-14 00:56:19 +0200
committerLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-07-14 00:56:19 +0200
commitfc505b6b171a2d54c3bad6078031b028b55131d3 (patch)
tree8eaa033e053e21ca60bd7f958055cc46e93b7cba /Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend
parentTry fix statecode bug (diff)
downloadVIATRA-Generator-fc505b6b171a2d54c3bad6078031b028b55131d3.tar.gz
VIATRA-Generator-fc505b6b171a2d54c3bad6078031b028b55131d3.tar.zst
VIATRA-Generator-fc505b6b171a2d54c3bad6078031b028b55131d3.zip
Polyhedron abstraction with Z3 for cardinality propagation
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend115
1 files changed, 115 insertions, 0 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend
new file mode 100644
index 00000000..08bf25b9
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronSolver.xtend
@@ -0,0 +1,115 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality
2
3import java.util.List
4import java.util.Map
5import org.eclipse.xtend.lib.annotations.Accessors
6import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor
7
8interface PolyhedronSolver {
9 def PolyhedronSaturationOperator createSaturationOperator(Polyhedron polyhedron)
10}
11
12enum PolyhedronSaturationResult {
13 SATURATED,
14 EMPTY,
15 UNKNOWN
16}
17
18interface PolyhedronSaturationOperator extends AutoCloseable {
19 def Polyhedron getPolyhedron()
20
21 def PolyhedronSaturationResult saturate()
22}
23
24@FinalFieldsConstructor
25@Accessors
26class Polyhedron {
27 /**
28 * The list of dimensions (variables) for this polyhedron.
29 *
30 * This list must not be modified after the polyhedron was created.
31 * However, lower and upper bounds of the dimensions may be changed.
32 *
33 * Names of dimensions in this list are assumed to be unique.
34 */
35 val List<Dimension> dimensions
36
37 /**
38 * The list of constraints defining this polyhedron.
39 *
40 * The list and its elements may be freely modified.
41 */
42 val List<LinearConstraint> constraints
43
44 /**
45 * The list of constraints that should be saturated (tightened)
46 * when a {@link PolyhedronSaturationOperator} is invoked.
47 *
48 * This list may be freely modified.
49 *
50 * Place all dimensions and constraints here to saturate all the bounds.
51 */
52 val List<LinearBoundedExpression> expressionsToSaturate
53
54 override toString() '''
55 Dimensions:
56 «FOR dimension : dimensions»
57 «dimension»
58 «ENDFOR»
59 Constraints:
60 «FOR constraint : constraints»
61 «constraint»
62 «ENDFOR»
63««« Saturate:
64««« «FOR expression : expressionsToSaturate»
65««« «IF expression instanceof Dimension»dimension«ELSEIF expression instanceof LinearConstraint»constraint«ELSE»unknown«ENDIF» «expression»
66««« «ENDFOR»
67 '''
68
69}
70
71@Accessors
72abstract class LinearBoundedExpression {
73 var Integer lowerBound
74 var Integer upperBound
75}
76
77@Accessors
78class Dimension extends LinearBoundedExpression {
79 val String name
80
81 @FinalFieldsConstructor
82 new() {
83 }
84
85 new(String name, Integer lowerBound, Integer upperBound) {
86 this(name)
87 this.lowerBound = lowerBound
88 this.upperBound = upperBound
89 }
90
91 override toString() {
92 '''«IF lowerBound !== null»«lowerBound» <= «ENDIF»«name»«IF upperBound !== null» <= «upperBound»«ENDIF»'''
93 }
94
95}
96
97@Accessors
98class LinearConstraint extends LinearBoundedExpression {
99 val Map<Dimension, Integer> coefficients
100
101 @FinalFieldsConstructor
102 new() {
103 }
104
105 new(Map<Dimension, Integer> coefficients, Integer lowerBound, Integer upperBound) {
106 this(coefficients)
107 this.lowerBound = lowerBound
108 this.upperBound = upperBound
109 }
110
111 override toString() {
112 '''«IF lowerBound !== null»«lowerBound» <= «ENDIF»«FOR pair : coefficients.entrySet SEPARATOR " + "»«IF pair.value != 1»«pair.value» * «ENDIF»«pair.key.name»«ENDFOR»«IF upperBound !== null» <= «upperBound»«ENDIF»'''
113 }
114
115}