diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules')
2 files changed, 67 insertions, 108 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 e03a8c35..238ade5b 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,98 +1,26 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules | 1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules |
2 | 2 | ||
3 | import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference | ||
5 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation | ||
6 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
7 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 3 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem |
8 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator | 4 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.MultiplicityGoalConstraintCalculator |
9 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns | 5 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns |
10 | import java.util.ArrayList | 6 | import java.util.ArrayList |
11 | import java.util.HashMap | ||
12 | import java.util.LinkedList | ||
13 | import java.util.List | ||
14 | import java.util.Map | ||
15 | import org.eclipse.viatra.query.runtime.api.IPatternMatch | ||
16 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification | ||
17 | import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher | ||
18 | |||
19 | import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* | ||
20 | 7 | ||
21 | class GoalConstraintProvider { | 8 | class GoalConstraintProvider { |
22 | 9 | ||
23 | def public getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns, boolean calculateObjectCost) { | 10 | def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns) { |
24 | val res = new ArrayList() | 11 | val res = new ArrayList() |
25 | 12 | for (entry : patterns.multiplicityConstraintQueries.entrySet) { | |
26 | res.addAll(patterns.unfinishedNonContainmentMulticiplicityQueries,false) | 13 | val constraint = entry.key |
27 | if(calculateObjectCost) { | 14 | if (constraint.constrainsUnfinished) { |
28 | val missingObjectCost = calculateMissingObjectCost(p) | 15 | val queries = entry.value |
29 | res.addAll(patterns.unfinishedContainmentMulticiplicityQueries,true,missingObjectCost) | 16 | val targetRelationName = constraint.relation.name |
30 | } else { | 17 | val query = queries.unfinishedMultiplicityQuery |
31 | res.addAll(patterns.unfinishedContainmentMulticiplicityQueries,true) | 18 | val minValue = constraint.lowerBound |
32 | } | 19 | val containment = constraint.containment |
33 | return res | 20 | res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, minValue, containment, 1) |
34 | } | ||
35 | |||
36 | def addAll(ArrayList<MultiplicityGoalConstraintCalculator> res, Map<Relation, Pair<IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>,Integer>> queries, boolean containment) { | ||
37 | for(multiplicityQuery : queries.entrySet) { | ||
38 | val targetRelationName = multiplicityQuery.key.name | ||
39 | val query = multiplicityQuery.value.key | ||
40 | val minValue = multiplicityQuery.value.value | ||
41 | res += new MultiplicityGoalConstraintCalculator(targetRelationName,query,minValue,containment,1); | ||
42 | } | ||
43 | } | ||
44 | def addAll( | ||
45 | ArrayList<MultiplicityGoalConstraintCalculator> res, | ||
46 | Map<Relation, Pair<IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>>,Integer>> 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.key | ||
53 | val minValue = multiplicityQuery.value.value | ||
54 | res += new MultiplicityGoalConstraintCalculator(targetRelationName,query,minValue,containment,multiplicityQuery.key.lookup(cost)) | ||
55 | } | ||
56 | } | ||
57 | |||
58 | def calculateMissingObjectCost(LogicProblem p) { | ||
59 | val containments = p.containmentHierarchies.head.containmentRelations | ||
60 | val containment2Lower = containments.toInvertedMap[containment | | ||
61 | val lower = p.annotations.filter(LowerMultiplicityAssertion).filter[it.relation === containment].head | ||
62 | if(lower !== null) { lower.lower } | ||
63 | else { 0 } | ||
64 | ] | ||
65 | val types = p.types | ||
66 | val Map<Type,List<? extends Pair<Type,Integer>>> type2NewCost = new HashMap | ||
67 | for(type:types) { | ||
68 | val allSupertypes = (#[type] + type.supertypes).toSet | ||
69 | val allOutgoingContainments = containments.filter[allSupertypes.contains((it.parameters.get(0) as ComplexTypeReference).referred)] | ||
70 | val list = new LinkedList | ||
71 | for(outgoingContainment : allOutgoingContainments) { | ||
72 | val value = containment2Lower.get(outgoingContainment) | ||
73 | if(value>0) { | ||
74 | list.add((outgoingContainment.parameters.get(1) as ComplexTypeReference).referred | ||
75 | -> value) | ||
76 | } | ||
77 | } | 21 | } |
78 | type2NewCost.put(type, list) | ||
79 | } | ||
80 | val res = new HashMap | ||
81 | for(containment : containments) { | ||
82 | val key = containment | ||
83 | val value = (containment.parameters.get(1) as ComplexTypeReference).referred.count(type2NewCost) | ||
84 | // println('''«key.name» --> «value» new''') | ||
85 | res.put(key,value) | ||
86 | } | 22 | } |
87 | return res | 23 | return res |
88 | } | 24 | } |
89 | 25 | ||
90 | private def int count(Type t, Map<Type,List<? extends Pair<Type,Integer>>> containments) { | ||
91 | val list = containments.get(t) | ||
92 | var r = 1 | ||
93 | for(element : list) { | ||
94 | r += element.value * element.key.count(containments) | ||
95 | } | ||
96 | return r | ||
97 | } | ||
98 | } \ No newline at end of file | 26 | } \ No newline at end of file |
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend index 23ea118b..0b8a9019 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend | |||
@@ -15,7 +15,7 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.StringTypeReference | |||
15 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | 15 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type |
16 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | 16 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem |
17 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStatistics | 17 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ModelGenerationStatistics |
18 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.ScopePropagator | 18 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.ScopePropagator |
19 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns | 19 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns |
20 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.ObjectCreationPrecondition | 20 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.ObjectCreationPrecondition |
21 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialBooleanInterpretation | 21 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialBooleanInterpretation |
@@ -84,13 +84,13 @@ class RefinementRuleProvider { | |||
84 | { | 84 | { |
85 | val name = '''addObject_«type.name.canonizeName»« | 85 | val name = '''addObject_«type.name.canonizeName»« |
86 | IF containmentRelation!==null»_by_«containmentRelation.name.canonizeName»«ENDIF»''' | 86 | IF containmentRelation!==null»_by_«containmentRelation.name.canonizeName»«ENDIF»''' |
87 | val ruleBuilder = factory.createRule | 87 | val ruleBuilder = factory.createRule(lhs) |
88 | .name(name) | 88 | .name(name) |
89 | .precondition(lhs) | ||
90 | if(containmentRelation !== null) { | 89 | if(containmentRelation !== null) { |
91 | if(inverseRelation!== null) { | 90 | if(inverseRelation!== null) { |
92 | ruleBuilder.action[match | | 91 | ruleBuilder.action[match | |
93 | //println(name) | 92 | statistics.incrementTransformationCount |
93 | // println(name) | ||
94 | val startTime = System.nanoTime | 94 | val startTime = System.nanoTime |
95 | //val problem = match.get(0) as LogicProblem | 95 | //val problem = match.get(0) as LogicProblem |
96 | val interpretation = match.get(1) as PartialInterpretation | 96 | val interpretation = match.get(1) as PartialInterpretation |
@@ -111,11 +111,17 @@ class RefinementRuleProvider { | |||
111 | scopePropagator | 111 | scopePropagator |
112 | ) | 112 | ) |
113 | 113 | ||
114 | statistics.addExecutionTime(System.nanoTime-startTime) | 114 | val propagatorStartTime = System.nanoTime |
115 | statistics.addExecutionTime(propagatorStartTime-startTime) | ||
116 | |||
117 | // Scope propagation | ||
118 | scopePropagator.propagateAllScopeConstraints() | ||
119 | statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) | ||
115 | ] | 120 | ] |
116 | } else { | 121 | } else { |
117 | ruleBuilder.action[match | | 122 | ruleBuilder.action[match | |
118 | //println(name) | 123 | statistics.incrementTransformationCount |
124 | // println(name) | ||
119 | val startTime = System.nanoTime | 125 | val startTime = System.nanoTime |
120 | //val problem = match.get(0) as LogicProblem | 126 | //val problem = match.get(0) as LogicProblem |
121 | val interpretation = match.get(1) as PartialInterpretation | 127 | val interpretation = match.get(1) as PartialInterpretation |
@@ -134,17 +140,23 @@ class RefinementRuleProvider { | |||
134 | scopePropagator | 140 | scopePropagator |
135 | ) | 141 | ) |
136 | 142 | ||
137 | statistics.addExecutionTime(System.nanoTime-startTime) | 143 | val propagatorStartTime = System.nanoTime |
144 | statistics.addExecutionTime(propagatorStartTime-startTime) | ||
145 | |||
146 | // Scope propagation | ||
147 | scopePropagator.propagateAllScopeConstraints() | ||
148 | statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) | ||
138 | ] | 149 | ] |
139 | } | 150 | } |
140 | } else { | 151 | } else { |
141 | ruleBuilder.action[match | | 152 | ruleBuilder.action[match | |
142 | //println(name) | 153 | statistics.incrementTransformationCount |
154 | // println(name) | ||
143 | val startTime = System.nanoTime | 155 | val startTime = System.nanoTime |
144 | //val problem = match.get(0) as LogicProblem | 156 | //val problem = match.get(0) as LogicProblem |
145 | val interpretation = match.get(1) as PartialInterpretation | 157 | val interpretation = match.get(1) as PartialInterpretation |
146 | val typeInterpretation = match.get(2) as PartialComplexTypeInterpretation | 158 | val typeInterpretation = match.get(2) as PartialComplexTypeInterpretation |
147 | 159 | ||
148 | createObjectAction( | 160 | createObjectAction( |
149 | nameNewElement, | 161 | nameNewElement, |
150 | interpretation, | 162 | interpretation, |
@@ -154,14 +166,18 @@ class RefinementRuleProvider { | |||
154 | scopePropagator | 166 | scopePropagator |
155 | ) | 167 | ) |
156 | 168 | ||
157 | statistics.addExecutionTime(System.nanoTime-startTime) | 169 | val propagatorStartTime = System.nanoTime |
170 | statistics.addExecutionTime(propagatorStartTime-startTime) | ||
171 | |||
172 | // Scope propagation | ||
173 | scopePropagator.propagateAllScopeConstraints() | ||
174 | statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) | ||
158 | ] | 175 | ] |
159 | } | 176 | } |
160 | return ruleBuilder.build | 177 | return ruleBuilder.build |
161 | } | 178 | } |
162 | 179 | ||
163 | def private recursiveObjectCreation(LogicProblem p, PartialInterpretation i) | 180 | def private recursiveObjectCreation(LogicProblem p, PartialInterpretation i) { |
164 | { | ||
165 | val Map<Type,List<ObjectCreationInterpretationData>> recursiveObjectCreation = new HashMap | 181 | val Map<Type,List<ObjectCreationInterpretationData>> recursiveObjectCreation = new HashMap |
166 | for(type : p.types) { | 182 | for(type : p.types) { |
167 | recursiveObjectCreation.put(type,new LinkedList) | 183 | recursiveObjectCreation.put(type,new LinkedList) |
@@ -305,49 +321,64 @@ class RefinementRuleProvider { | |||
305 | private dispatch def Function0<DefinedElement> getTypeConstructor(PartialStringInterpretation reference) { [createStringElement] } | 321 | private dispatch def Function0<DefinedElement> getTypeConstructor(PartialStringInterpretation reference) { [createStringElement] } |
306 | 322 | ||
307 | 323 | ||
308 | def createRelationRefinementRules(GeneratedPatterns patterns, ModelGenerationStatistics statistics) { | 324 | def createRelationRefinementRules(GeneratedPatterns patterns, ScopePropagator scopePropagator, ModelGenerationStatistics statistics) { |
309 | val res = new LinkedHashMap | 325 | val res = new LinkedHashMap |
310 | for(LHSEntry: patterns.refinerelationQueries.entrySet) { | 326 | for(LHSEntry: patterns.refinerelationQueries.entrySet) { |
311 | val declaration = LHSEntry.key.key | 327 | val declaration = LHSEntry.key.key |
312 | val inverseReference = LHSEntry.key.value | 328 | val inverseReference = LHSEntry.key.value |
313 | val lhs = LHSEntry.value as IQuerySpecification<ViatraQueryMatcher<GenericPatternMatch>> | 329 | val lhs = LHSEntry.value as IQuerySpecification<ViatraQueryMatcher<GenericPatternMatch>> |
314 | val rule = createRelationRefinementRule(declaration,inverseReference,lhs,statistics) | 330 | val rule = createRelationRefinementRule(declaration,inverseReference,lhs,scopePropagator,statistics) |
315 | res.put(LHSEntry.key,rule) | 331 | res.put(LHSEntry.key,rule) |
316 | } | 332 | } |
317 | return res | 333 | return res |
318 | } | 334 | } |
319 | 335 | ||
320 | def private BatchTransformationRule<GenericPatternMatch, ViatraQueryMatcher<GenericPatternMatch>> | 336 | def private BatchTransformationRule<GenericPatternMatch, ViatraQueryMatcher<GenericPatternMatch>> |
321 | createRelationRefinementRule(RelationDeclaration declaration, Relation inverseRelation, IQuerySpecification<ViatraQueryMatcher<GenericPatternMatch>> lhs, ModelGenerationStatistics statistics) | 337 | createRelationRefinementRule(RelationDeclaration declaration, Relation inverseRelation, IQuerySpecification<ViatraQueryMatcher<GenericPatternMatch>> lhs, ScopePropagator scopePropagator, ModelGenerationStatistics statistics) |
322 | { | 338 | { |
323 | val name = '''addRelation_«declaration.name.canonizeName»«IF inverseRelation !== null»_and_«inverseRelation.name.canonizeName»«ENDIF»''' | 339 | val name = '''addRelation_«declaration.name.canonizeName»«IF inverseRelation !== null»_and_«inverseRelation.name.canonizeName»«ENDIF»''' |
324 | val ruleBuilder = factory.createRule | 340 | val ruleBuilder = factory.createRule(lhs) |
325 | .name(name) | 341 | .name(name) |
326 | .precondition(lhs) | ||
327 | if (inverseRelation === null) { | 342 | if (inverseRelation === null) { |
328 | ruleBuilder.action [ match | | 343 | ruleBuilder.action [ match | |
344 | statistics.incrementTransformationCount | ||
329 | val startTime = System.nanoTime | 345 | val startTime = System.nanoTime |
330 | //println(name) | 346 | // println(name) |
331 | // val problem = match.get(0) as LogicProblem | 347 | // val problem = match.get(0) as LogicProblem |
332 | // val interpretation = match.get(1) as PartialInterpretation | 348 | // val interpretation = match.get(1) as PartialInterpretation |
333 | val relationInterpretation = match.get(2) as PartialRelationInterpretation | 349 | val relationInterpretation = match.get(2) as PartialRelationInterpretation |
334 | val src = match.get(3) as DefinedElement | 350 | val src = match.get(3) as DefinedElement |
335 | val trg = match.get(4) as DefinedElement | 351 | val trg = match.get(4) as DefinedElement |
352 | |||
336 | createRelationLinkAction(src, trg, relationInterpretation) | 353 | createRelationLinkAction(src, trg, relationInterpretation) |
337 | statistics.addExecutionTime(System.nanoTime-startTime) | 354 | |
355 | val propagatorStartTime = System.nanoTime | ||
356 | statistics.addExecutionTime(propagatorStartTime-startTime) | ||
357 | |||
358 | // Scope propagation | ||
359 | scopePropagator.propagateAdditionToRelation(declaration) | ||
360 | statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) | ||
338 | ] | 361 | ] |
339 | } else { | 362 | } else { |
340 | ruleBuilder.action [ match | | 363 | ruleBuilder.action [ match | |
364 | statistics.incrementTransformationCount | ||
341 | val startTime = System.nanoTime | 365 | val startTime = System.nanoTime |
342 | //println(name) | 366 | // println(name) |
343 | // val problem = match.get(0) as LogicProblem | 367 | // val problem = match.get(0) as LogicProblem |
344 | // val interpretation = match.get(1) as PartialInterpretation | 368 | // val interpretation = match.get(1) as PartialInterpretation |
345 | val relationInterpretation = match.get(2) as PartialRelationInterpretation | 369 | val relationInterpretation = match.get(2) as PartialRelationInterpretation |
346 | val inverseInterpretation = match.get(3) as PartialRelationInterpretation | 370 | val inverseInterpretation = match.get(3) as PartialRelationInterpretation |
347 | val src = match.get(4) as DefinedElement | 371 | val src = match.get(4) as DefinedElement |
348 | val trg = match.get(5) as DefinedElement | 372 | val trg = match.get(5) as DefinedElement |
373 | |||
349 | createRelationLinkWithInverse(src, trg, relationInterpretation, inverseInterpretation) | 374 | createRelationLinkWithInverse(src, trg, relationInterpretation, inverseInterpretation) |
350 | statistics.addExecutionTime(System.nanoTime-startTime) | 375 | |
376 | val propagatorStartTime = System.nanoTime | ||
377 | statistics.addExecutionTime(propagatorStartTime-startTime) | ||
378 | |||
379 | // Scope propagation | ||
380 | scopePropagator.propagateAdditionToRelation(declaration) | ||
381 | statistics.addScopePropagationTime(System.nanoTime-propagatorStartTime) | ||
351 | ] | 382 | ] |
352 | } | 383 | } |
353 | 384 | ||
@@ -426,7 +457,7 @@ class RefinementRuleProvider { | |||
426 | inverseRelationInterpretation.relationlinks+=newLink2 | 457 | inverseRelationInterpretation.relationlinks+=newLink2 |
427 | 458 | ||
428 | // Scope propagation | 459 | // Scope propagation |
429 | scopePropagator.propagateAdditionToType(typeInterpretation) | 460 | scopePropagator.decrementTypeScope(typeInterpretation) |
430 | 461 | ||
431 | // Existence | 462 | // Existence |
432 | interpretation.newElements+=newElement | 463 | interpretation.newElements+=newElement |
@@ -464,7 +495,7 @@ class RefinementRuleProvider { | |||
464 | relationInterpretation.relationlinks+=newLink | 495 | relationInterpretation.relationlinks+=newLink |
465 | 496 | ||
466 | // Scope propagation | 497 | // Scope propagation |
467 | scopePropagator.propagateAdditionToType(typeInterpretation) | 498 | scopePropagator.decrementTypeScope(typeInterpretation) |
468 | 499 | ||
469 | // Existence | 500 | // Existence |
470 | interpretation.newElements+=newElement | 501 | interpretation.newElements+=newElement |
@@ -497,7 +528,7 @@ class RefinementRuleProvider { | |||
497 | } | 528 | } |
498 | 529 | ||
499 | // Scope propagation | 530 | // Scope propagation |
500 | scopePropagator.propagateAdditionToType(typeInterpretation) | 531 | scopePropagator.decrementTypeScope(typeInterpretation) |
501 | 532 | ||
502 | // Existence | 533 | // Existence |
503 | interpretation.newElements+=newElement | 534 | interpretation.newElements+=newElement |