aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend33
1 files changed, 25 insertions, 8 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend
index 3e4fea8a..7fec452f 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/RelationConstraintCalculator.xtend
@@ -46,11 +46,11 @@ class RelationMultiplicityConstraint {
46 def constrainsUnrepairable() { 46 def constrainsUnrepairable() {
47 // TODO Optimize the unrepairable matches computation, 47 // TODO Optimize the unrepairable matches computation,
48 // or come up with a heuristic when does computing unrepairables worth the overhead. 48 // or come up with a heuristic when does computing unrepairables worth the overhead.
49 constrainsUnfinished && canHaveMultipleSourcesPerTarget && false 49 constrainsUnfinished && canHaveMultipleSourcesPerTarget && reference
50 } 50 }
51 51
52 def constrainsRemainingInverse() { 52 def constrainsRemainingInverse() {
53 lowerBound >= 1 && !containment && inverseUpperBoundFinite 53 lowerBound >= 1 && !containment && !container && inverseUpperBoundFinite && reference
54 } 54 }
55 55
56 def constrainsRemainingContents() { 56 def constrainsRemainingContents() {
@@ -61,6 +61,18 @@ class RelationMultiplicityConstraint {
61 constrainsUnfinished || constrainsUnrepairable || constrainsRemainingInverse || constrainsRemainingContents 61 constrainsUnfinished || constrainsUnrepairable || constrainsRemainingInverse || constrainsRemainingContents
62 } 62 }
63 63
64 def isSourceTypeComplex() {
65 getParamTypeReference(0) instanceof ComplexTypeReference
66 }
67
68 def isTargetTypeComplex() {
69 getParamTypeReference(1) instanceof ComplexTypeReference
70 }
71
72 def isReference() {
73 sourceTypeComplex && targetTypeComplex
74 }
75
64 def getSourceType() { 76 def getSourceType() {
65 getParamType(0) 77 getParamType(0)
66 } 78 }
@@ -69,15 +81,20 @@ class RelationMultiplicityConstraint {
69 getParamType(1) 81 getParamType(1)
70 } 82 }
71 83
72 private def getParamType(int i) { 84 private def getParamTypeReference(int i) {
73 val parameters = relation.parameters 85 val parameters = relation.parameters
74 if (i < parameters.size) { 86 if (i < parameters.size) {
75 val firstParam = parameters.get(i) 87 return parameters.get(i)
76 if (firstParam instanceof ComplexTypeReference) { 88 }
77 return firstParam.referred 89 throw new IllegalArgumentException("Argument index out of range")
78 } 90 }
91
92 private def getParamType(int i) {
93 val reference = getParamTypeReference(i)
94 if (reference instanceof ComplexTypeReference) {
95 return reference.referred
79 } 96 }
80 throw new IllegalArgumentException("Constraint with unknown source type") 97 throw new IllegalArgumentException("Constraint with primitive type")
81 } 98 }
82} 99}
83 100