aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <oszka@152.66.252.189>2017-06-10 19:05:05 +0200
committerLibravatar OszkarSemerath <oszka@152.66.252.189>2017-06-10 19:05:05 +0200
commit60f01f46ba232ed6416054f0a6115cb2a9b70b4e (patch)
tree5edf8aeb07abc51f3fec63bbd15c926e1de09552 /Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/TypeAnalysis.xtend
parentInitial commit, migrating from SVN (diff)
downloadVIATRA-Generator-60f01f46ba232ed6416054f0a6115cb2a9b70b4e.tar.gz
VIATRA-Generator-60f01f46ba232ed6416054f0a6115cb2a9b70b4e.tar.zst
VIATRA-Generator-60f01f46ba232ed6416054f0a6115cb2a9b70b4e.zip
Migrating Additional projects
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.xtend92
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 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra
2
3import org.eclipse.xtend.lib.annotations.Data
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
5import java.util.List
6import java.util.Map
7import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
8import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
9import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
10import org.eclipse.viatra.query.runtime.emf.EMFScope
11import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementTypeConstructorMatcher
12import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementTypeRefinementTargetMatcher
13import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.NewElementTypeRefinementNegativeConstraintMatcher
14import java.util.ArrayList
15import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.queries.DontHaveDefinedSupertypeMatcher
16import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration
17import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement
18import 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
59class 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