diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend')
-rw-r--r-- | Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend new file mode 100644 index 00000000..395aba85 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend | |||
@@ -0,0 +1,92 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra | ||
2 | |||
3 | import org.eclipse.xtend.lib.annotations.Data | ||
4 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type | ||
5 | import java.util.List | ||
6 | import java.util.Map | ||
7 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | ||
8 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem | ||
9 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine | ||
10 | import org.eclipse.viatra.query.runtime.emf.EMFScope | ||
11 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementTypeConstructorMatcher | ||
12 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementTypeRefinementTargetMatcher | ||
13 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementTypeRefinementNegativeConstraintMatcher | ||
14 | import java.util.ArrayList | ||
15 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.DontHaveDefinedSupertypeMatcher | ||
16 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration | ||
17 | import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement | ||
18 | import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementMayTypeNegativeConstraintMatcher | ||
19 | |||
20 | @Data class TypeRefinementPrecondition { | ||
21 | Type targetType | ||
22 | List<? extends Type> inhibitorTypes | ||
23 | } | ||
24 | |||
25 | /** | ||
26 | * Collection of all possible element creation and type refinement rules for defined and undefined elements. | ||
27 | */ | ||
28 | @Data class TypeAnalysisResult { | ||
29 | ///////////////// | ||
30 | // New elements | ||
31 | ///////////////// | ||
32 | /** | ||
33 | * New elements can be created using with the following types. | ||
34 | */ | ||
35 | List<? extends Type> possibleNewDynamicTypes | ||
36 | /** | ||
37 | * <b>(A,B)</b> in <b>possibleNewTypeRefinements</b>: a new element <b>x</b> can be refined to A <=> <b>x</b> has all types listed in B. | ||
38 | */ | ||
39 | List<TypeRefinementPrecondition> possibleNewTypeRefinements | ||
40 | /** | ||
41 | * A new element may have type A if it already has types | ||
42 | */ | ||
43 | Map<? extends Type,TypeRefinementPrecondition> mayNewTypePreconditions | ||
44 | |||
45 | ///////////////// | ||
46 | // Old elements | ||
47 | ///////////////// | ||
48 | |||
49 | /** | ||
50 | * <b>(A,B)</b> in <b>possibleNewTypeRefinements</b>: a new element <b>x</b> can be refined to A <=> <b>x</b> has all types listed in B. | ||
51 | */ | ||
52 | Map<DefinedElement,TypeRefinementPrecondition> possibleOldTypeRefinements | ||
53 | /** | ||
54 | * A new element may have type A if it already has types | ||
55 | */ | ||
56 | Map<? extends Type,Map<DefinedElement,TypeRefinementPrecondition>> mayOldTypePreconditions | ||
57 | } | ||
58 | |||
59 | class TypeAnalysis { | ||
60 | |||
61 | def TypeAnalysisResult performTypeAnalysis(LogicProblem problem, PartialInterpretation interpretation) { | ||
62 | val viatraEngine = ViatraQueryEngine.on(new EMFScope(problem)) | ||
63 | val negativeMatcher = NewElementTypeRefinementNegativeConstraintMatcher.on(viatraEngine) | ||
64 | |||
65 | val possibleNewDynamicTypes = NewElementTypeConstructorMatcher.on(viatraEngine).allValuesOftype | ||
66 | |||
67 | val possibleNewTypeRefinementTargets = NewElementTypeRefinementTargetMatcher.on(viatraEngine).allValuesOfrefined | ||
68 | val possibleNewTypeRefinements = new ArrayList | ||
69 | for(possibleNewTypeRefinementTarget : possibleNewTypeRefinementTargets) { | ||
70 | val inhibitorTypes = negativeMatcher.getAllValuesOfinhibitor(possibleNewTypeRefinementTarget) | ||
71 | possibleNewTypeRefinements += new TypeRefinementPrecondition( | ||
72 | possibleNewTypeRefinementTarget, | ||
73 | inhibitorTypes.toList) | ||
74 | } | ||
75 | |||
76 | val possibleTypes = DontHaveDefinedSupertypeMatcher.on(viatraEngine).allValuesOftype | ||
77 | val newElementMayTypeMatcher = NewElementMayTypeNegativeConstraintMatcher.on(viatraEngine) | ||
78 | |||
79 | val mayNewTypePreconditions = possibleTypes.toInvertedMap[type | | ||
80 | val inhibitorTypes = newElementMayTypeMatcher.getAllValuesOfinhibitor(type as TypeDeclaration) | ||
81 | return new TypeRefinementPrecondition(type,inhibitorTypes.toList) | ||
82 | ] | ||
83 | |||
84 | return new TypeAnalysisResult( | ||
85 | possibleNewDynamicTypes.toList, | ||
86 | possibleNewTypeRefinements, | ||
87 | mayNewTypePreconditions, | ||
88 | emptyMap, | ||
89 | emptyMap | ||
90 | ) | ||
91 | } | ||
92 | } \ No newline at end of file | ||