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, 84 insertions, 5 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..87f7e339 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,97 @@
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.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
7import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
3import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator 8import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator
4import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns 9import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns
5import java.util.ArrayList 10import java.util.ArrayList
11import java.util.HashMap
12import java.util.LinkedList
13import java.util.List
14import java.util.Map
15import org.eclipse.viatra.query.runtime.api.IPatternMatch
16import org.eclipse.viatra.query.runtime.api.IQuerySpecification
17import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher
18
19import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
6 20
7class GoalConstraintProvider { 21class GoalConstraintProvider {
8 def public getUnfinishedMultiplicityQueries(GeneratedPatterns patterns) { 22 val calculateObjectCost = true
9 val multiplicityQueries = patterns.unfinishedMulticiplicityQueries 23
10 val res = new ArrayList(multiplicityQueries.size) 24 def public getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns) {
11 for(multiplicityQuery : multiplicityQueries.entrySet) { 25 val res = new ArrayList()
26
27 res.addAll(patterns.unfinishedContainmentMulticiplicityQueries,true)
28 if(calculateObjectCost) {
29 val middingObjectCost = calculateMissingObjectCost(p)
30 res.addAll(patterns.unfinishedNonContainmentMulticiplicityQueries,false)
31 } else {
32 res.addAll(patterns.unfinishedNonContainmentMulticiplicityQueries,false)
33 }
34 return res
35 }
36
37 def addAll(ArrayList<MultiplicityGoalConstraintCalculator> res, Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> queries, boolean containment) {
38 for(multiplicityQuery : queries.entrySet) {
12 val targetRelationName = multiplicityQuery.key.name 39 val targetRelationName = multiplicityQuery.key.name
13 val query = multiplicityQuery.value 40 val query = multiplicityQuery.value
14 res += new MultiplicityGoalConstraintCalculator(targetRelationName,query); 41 res += new MultiplicityGoalConstraintCalculator(targetRelationName,query,containment,1);
42 }
43 }
44 def addAll(
45 ArrayList<MultiplicityGoalConstraintCalculator> res,
46 Map<Relation, IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>> queries,
47 boolean containment,
48 Map<Relation, Integer> cost
49 ) {
50 for(multiplicityQuery : queries.entrySet) {
51 val targetRelationName = multiplicityQuery.key.name
52 val query = multiplicityQuery.value
53 res += new MultiplicityGoalConstraintCalculator(targetRelationName,query,containment,multiplicityQuery.key.lookup(cost))
54 }
55 }
56
57 def calculateMissingObjectCost(LogicProblem p) {
58 val containments = p.containmentHierarchies.head.containmentRelations
59 val containment2Lower = containments.toInvertedMap[containment |
60 val lower = p.annotations.filter(LowerMultiplicityAssertion).filter[it.relation === containment].head
61 if(lower !== null) { lower.lower }
62 else { 0 }
63 ]
64 val types = p.types
65 val Map<Type,List<? extends Pair<Type,Integer>>> type2NewCost = new HashMap
66 for(type:types) {
67 val allSupertypes = (#[type] + type.supertypes).toSet
68 val allOutgoingContainments = containments.filter[allSupertypes.contains((it.parameters.get(0) as ComplexTypeReference).referred)]
69 val list = new LinkedList
70 for(outgoingContainment : allOutgoingContainments) {
71 val value = containment2Lower.get(outgoingContainment)
72 if(value>0) {
73 list.add((outgoingContainment.parameters.get(1) as ComplexTypeReference).referred
74 -> value)
75 }
76 }
77 type2NewCost.put(type, list)
78 }
79 val res = new HashMap
80 for(containment : containments) {
81 val key = containment
82 val value = (containment.parameters.get(1) as ComplexTypeReference).referred.count(type2NewCost)
83 //println('''«key.name» --> «value» new''')
84 res.put(key,value)
15 } 85 }
16 return res 86 return res
17 } 87 }
88
89 private def int count(Type t, Map<Type,List<? extends Pair<Type,Integer>>> containments) {
90 val list = containments.get(t)
91 var r = 1
92 for(element : list) {
93 r += element.value * element.key.count(containments)
94 }
95 return r
96 }
18} \ No newline at end of file 97} \ No newline at end of file