aboutsummaryrefslogtreecommitdiffstats
path: root/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <oszka@152.66.252.189>2017-06-21 21:19:27 +0200
committerLibravatar OszkarSemerath <oszka@152.66.252.189>2017-06-21 21:19:27 +0200
commitbd9d6001d6d288b98f20ba2b4886a147088a6f99 (patch)
treeb0b93dd8de27642afe86cdc9e849c49e7ec7202b /Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme
parentModel translator and sanitiser from original yakindu files to simplified (diff)
downloadVIATRA-Generator-bd9d6001d6d288b98f20ba2b4886a147088a6f99.tar.gz
VIATRA-Generator-bd9d6001d6d288b98f20ba2b4886a147088a6f99.tar.zst
VIATRA-Generator-bd9d6001d6d288b98f20ba2b4886a147088a6f99.zip
Logic interpretation -> standard EMF instance model
Diffstat (limited to 'Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme')
-rw-r--r--Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend91
1 files changed, 91 insertions, 0 deletions
diff --git a/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend
new file mode 100644
index 00000000..2ab7091e
--- /dev/null
+++ b/Framework/hu.bme.mit.inf.dslreasoner.logic2ecore/src/hu/bme/mit/inf/dslreasoner/logic2ecore/Logic2Ecore.xtend
@@ -0,0 +1,91 @@
1package hu.bme.mit.inf.dslreasoner.logic2ecore
2
3import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic_Trace
4import hu.bme.mit.inf.dslreasoner.logic.model.logicresult.ModelResult
5import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicStructureBuilder
6import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder
7import hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic
8import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicModelInterpretation
9import java.util.HashSet
10import java.util.HashMap
11import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
12import org.eclipse.emf.ecore.EClass
13import java.util.Set
14import org.eclipse.emf.ecore.EObject
15import java.util.List
16import java.util.Collection
17
18class Logic2Ecore {
19 private val extension LogicProblemBuilder problemBuilder = new LogicProblemBuilder
20 private val extension LogicStructureBuilder structureBuilder = new LogicStructureBuilder
21 val Ecore2Logic ecore2Logic;
22
23 new (Ecore2Logic ecore2Logic) {
24 this.ecore2Logic = ecore2Logic
25 }
26
27 def transformInterpretation(LogicModelInterpretation interpretation, Ecore2Logic_Trace forwardTrace) {
28 val allClasses = ecore2Logic.allClassesInScope(forwardTrace)
29 val elements = new HashSet
30 val element2Classes = new HashMap
31
32
33 for(clazz: allClasses) {
34 val type = ecore2Logic.TypeofEClass(forwardTrace,clazz);
35 val elementsOfClass = getElements(interpretation,type)
36 for(element : elementsOfClass) {
37 elements += element
38 element2Classes.putOrAddToSet(element,clazz)
39 }
40 }
41
42 val element2Object = new HashMap
43 for(element: elements) {
44 val clazz = element.lookup(element2Classes).mostConcreteType
45 val eobject = clazz.EPackage.EFactoryInstance.create(clazz)
46 element2Object.put(element,eobject)
47 }
48
49 val allReferences = ecore2Logic.allReferencesInScope(forwardTrace)
50 for(referenceType : allReferences) {
51 for(sourceElement : elements) {
52 val sourceObject = sourceElement.lookup(element2Object)
53 if(sourceObject.eClass.isSuperTypeOf(referenceType.EContainingClass)) {
54 for(targetElement: elements) {
55 val targetObject = targetElement.lookup(element2Object)
56 if(targetObject.eClass.isSuperTypeOf(referenceType.EReferenceType)) {
57 val expression = ecore2Logic.IsInReference(forwardTrace,sourceElement,targetElement,referenceType)
58 val linkExist = interpretation.evalAsBool(expression)
59 if(linkExist) {
60 if(referenceType.isMany) {
61 val list = sourceObject.eGet(referenceType) as List<? super EObject>
62 list+= targetObject
63 } else {
64 sourceObject.eSet(referenceType,targetObject)
65 }
66 }
67 }
68 }
69 }
70 }
71 }
72
73 /// Attributes
74
75 return element2Object.values.root
76 }
77
78 def mostConcreteType(Set<EClass> classes) {
79 for(candidate : classes) {
80 val subtypeOfAll = classes.forall[it.isSuperTypeOf(candidate)]
81 if(subtypeOfAll) {
82 return candidate
83 }
84 }
85 throw new AssertionError("Object has no unique concrete type!")
86 }
87
88 def getRoot(Collection<EObject> objects) {
89 objects.filter[eContainer === null].head
90 }
91} \ No newline at end of file