aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.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/rules/GoalConstraintProvider.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend89
1 files changed, 80 insertions, 9 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend
index e1be2742..732c135d 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend
@@ -1,18 +1,89 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules 1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules
2 2
3import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator 3import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
6import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
7import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator
4import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns 8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns
5import java.util.ArrayList 9import java.util.ArrayList
10import java.util.HashMap
11import java.util.LinkedList
12import java.util.List
13import java.util.Map
6 14
7class GoalConstraintProvider { 15class GoalConstraintProvider {
8 def public getUnfinishedMultiplicityQueries(GeneratedPatterns patterns) { 16
9 val multiplicityQueries = patterns.unfinishedMulticiplicityQueries 17 def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns, boolean calculateObjectCost) {
10 val res = new ArrayList(multiplicityQueries.size) 18 val objectCosts = if (calculateObjectCost) {
11 for(multiplicityQuery : multiplicityQueries.entrySet) { 19 calculateMissingObjectCost(p)
12 val targetRelationName = multiplicityQuery.key.name 20 } else {
13 val query = multiplicityQuery.value 21 emptyMap
14 res += new MultiplicityGoalConstraintCalculator(targetRelationName,query); 22 }
23 val res = new ArrayList()
24 for (entry : patterns.multiplicityConstraintQueries.entrySet) {
25 val constraint = entry.key
26 if (constraint.constrainsUnfinished) {
27 val queries = entry.value
28 val targetRelationName = constraint.relation.name
29 val query = queries.existingMultiplicityQuery
30 val containment = constraint.containment
31 val lowerBound = constraint.lowerBound
32 val cost = objectCosts.getOrDefault(constraint.relation, 1)
33 res += new MultiplicityGoalConstraintCalculator(
34 targetRelationName,
35 query,
36 containment,
37 lowerBound,
38 cost
39 )
40 }
15 } 41 }
16 return res 42 return res
17 } 43 }
18} \ No newline at end of file 44
45 private def calculateMissingObjectCost(LogicProblem p) {
46 val containments = p.containmentHierarchies.head.containmentRelations
47 val containment2Lower = containments.toInvertedMap [ containment |
48 val lower = p.annotations.filter(LowerMultiplicityAssertion).filter[it.relation === containment].head
49 if (lower !== null) {
50 lower.lower
51 } else {
52 0
53 }
54 ]
55 val types = p.types
56 val Map<Type, List<? extends Pair<Type, Integer>>> type2NewCost = new HashMap
57 for (type : types) {
58 val allSupertypes = (#[type] + type.supertypes).toSet
59 val allOutgoingContainments = containments.filter [
60 allSupertypes.contains((it.parameters.get(0) as ComplexTypeReference).referred)
61 ]
62 val list = new LinkedList
63 for (outgoingContainment : allOutgoingContainments) {
64 val value = containment2Lower.get(outgoingContainment)
65 if (value > 0) {
66 list.add((outgoingContainment.parameters.get(1) as ComplexTypeReference).referred -> value)
67 }
68 }
69 type2NewCost.put(type, list)
70 }
71 val res = new HashMap
72 for (containment : containments) {
73 val key = containment
74 val value = (containment.parameters.get(1) as ComplexTypeReference).referred.count(type2NewCost)
75// println('''«key.name» --> «value» new''')
76 res.put(key, value)
77 }
78 return res
79 }
80
81 private def int count(Type t, Map<Type, List<? extends Pair<Type, Integer>>> containments) {
82 val list = containments.get(t)
83 var r = 1
84 for (element : list) {
85 r += element.value * element.key.count(containments)
86 }
87 return r
88 }
89}