aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.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/patterns/TypeRefinementGenerator.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend95
1 files changed, 95 insertions, 0 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend
new file mode 100644
index 00000000..a9ce9d73
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/TypeRefinementGenerator.xtend
@@ -0,0 +1,95 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns
2
3import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
5import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
6import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.TypeAnalysisResult
7import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
8import java.util.Map
9import org.eclipse.xtend.lib.annotations.Data
10import java.util.HashMap
11import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.InverseRelationAssertion
12import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration
13import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference
14import java.util.LinkedHashMap
15import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
16import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.ContainmentHierarchy
17
18@Data
19class ObjectCreationPrecondition {
20 Relation containmentRelation
21 Relation inverseContainment
22 Type newType
23}
24
25abstract class TypeRefinementGenerator {
26 val protected PatternGenerator base;
27 public new(PatternGenerator base) {
28 this.base = base
29 }
30
31 public def boolean requiresTypeAnalysis()
32 public def CharSequence generateRefineObjectQueries(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult)
33 public def CharSequence generateRefineTypeQueries(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult)
34 public def Map<? extends Type, String> getRefineTypeQueryNames(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult)
35
36 public def getRefineObjectQueryNames(LogicProblem p, PartialInterpretation emptySolution, TypeAnalysisResult typeAnalysisResult) {
37 val Map<ObjectCreationPrecondition,String> objectCreationQueries = new LinkedHashMap
38 val containment = p.containmentHierarchies.head
39 val inverseRelations = new HashMap
40 p.annotations.filter(InverseRelationAssertion).forEach[
41 inverseRelations.put(it.inverseA,it.inverseB)
42 inverseRelations.put(it.inverseB,it.inverseA)
43 ]
44 for(type: p.types.filter(TypeDeclaration).filter[!it.isAbstract]) {
45 if(containment.typeInContainment(type)) {
46 for(containmentRelation : containment.containmentRelations.filter[canBeContainedByRelation(it,type)]) {
47 if(inverseRelations.containsKey(containmentRelation)) {
48 objectCreationQueries.put(
49 new ObjectCreationPrecondition(containmentRelation,inverseRelations.get(containmentRelation),type),
50 this.patternName(containmentRelation,inverseRelations.get(containmentRelation),type))
51 } else {
52 objectCreationQueries.put(
53 new ObjectCreationPrecondition(containmentRelation,null,type),
54 patternName(containmentRelation,null,type))
55 }
56 }
57 } else {
58 objectCreationQueries.put(
59 new ObjectCreationPrecondition(null,null,type),
60 this.patternName(null,null,type))
61 }
62 }
63 return objectCreationQueries
64 }
65
66 protected def canBeContainedByRelation(Relation r, Type t) {
67 if(r.parameters.size==2) {
68 val param = r.parameters.get(1)
69 if(param instanceof ComplexTypeReference) {
70 val allSuperTypes = t.transitiveClosureStar[it.supertypes]
71 for(superType : allSuperTypes) {
72 if(param.referred == superType) return true
73 }
74 }
75 }
76 return false
77 }
78
79 private def typeInContainment(ContainmentHierarchy hierarchy, Type type) {
80 val allSuperTypes = type.transitiveClosureStar[it.supertypes]
81 return allSuperTypes.exists[hierarchy.typesOrderedInHierarchy.contains(it)]
82 }
83
84 protected def String patternName(Relation containmentRelation, Relation inverseContainment, Type newType) {
85 if(containmentRelation != null) {
86 if(inverseContainment != null) {
87 '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»_with_«base.canonizeName(inverseContainment.name)»'''
88 } else {
89 '''createObject_«base.canonizeName(newType.name)»_by_«base.canonizeName(containmentRelation.name)»'''
90 }
91 } else {
92 '''createObject_«base.canonizeName(newType.name)»'''
93 }
94 }
95} \ No newline at end of file