aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend112
1 files changed, 112 insertions, 0 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend
new file mode 100644
index 00000000..eeccbf76
--- /dev/null
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend
@@ -0,0 +1,112 @@
1package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage
2
3import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDeclaration
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory
7import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
8import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
9import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration
10import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition
11import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem
12import hu.bme.mit.inf.dslreasoner.logic.model.patterns.SupertypeStarMatcher
13import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialConstantInterpretation
14import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialFunctionInterpretation
15import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
16import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialRelationInterpretation
17import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation
18import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationFactory
19import java.util.HashMap
20import java.util.Map
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
22import org.eclipse.viatra.query.runtime.emf.EMFScope
23import org.eclipse.xtend.lib.annotations.Data
24
25import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.*
26
27@Data class Problem2PartialInterpretationTrace {
28 Map<TypeDeclaration, PartialTypeInterpratation> type2Interpretation = new HashMap
29 Map<RelationDeclaration, PartialRelationInterpretation> relation2Interpretation = new HashMap
30}
31
32class PartialInterpretationInitialiser {
33 val extension PartialinterpretationFactory factory = PartialinterpretationFactory.eINSTANCE
34 val extension LogiclanguageFactory factory2 = LogiclanguageFactory.eINSTANCE
35
36 /**
37 * Initialises an empty partial interpretation from a logic problem
38 */
39 def TracedOutput<PartialInterpretation,Problem2PartialInterpretationTrace> initialisePartialInterpretation(
40 LogicProblem problem,
41 int minNewElement, int maxNewElement)
42 {
43 val engine = ViatraQueryEngine.on(new EMFScope(problem))
44 val trace = new Problem2PartialInterpretationTrace
45
46 val res = createPartialInterpretation => [
47 it.problem = problem
48 it.openWorldElementPrototype = createDefinedElement => [it.name = "Symbolic New Element"]
49 it.minNewElements = minNewElement
50 it.maxNewElements = maxNewElement
51
52 for(typeDeclaration : problem.types.filter(TypeDeclaration)) {
53 it.partialtypeinterpratation += typeDeclaration.initialisePartialTypeInterpretation(engine,trace)
54 }
55 problem.connectSuperypes(trace)
56
57 it.partialrelationinterpretation += problem.relations.filter(RelationDeclaration)
58 .map[initialisePartialRelationInterpretation(trace)]
59 it.partialfunctioninterpretation += problem.functions.filter(FunctionDeclaration)
60 .map[initialisePartialFunctionInterpretation(trace)]
61 it.partialconstantinterpretation += problem.constants.filter(ConstantDeclaration)
62 .map[initialisePartialConstantDeclaration(trace)]
63 ]
64
65 return new TracedOutput(res,trace)
66 }
67
68 /**
69 * Initialize type with existing elements
70 */
71 def private initialisePartialTypeInterpretation(TypeDeclaration t, ViatraQueryEngine engine, Problem2PartialInterpretationTrace trace) {
72 val supertypeMatcher = SupertypeStarMatcher.on(engine)
73 val res = createPartialTypeInterpratation => [
74 it.interpretationOf = t
75 it.elements += supertypeMatcher.getAllValuesOfsubtype(t)
76 .filter(TypeDefinition)
77 .map[elements].flatten
78 ]
79 trace.type2Interpretation.put(t,res)
80 return res
81 }
82
83 def private connectSuperypes(LogicProblem problem, Problem2PartialInterpretationTrace trace) {
84 for(typeDeclaration : problem.types.filter(TypeDeclaration)) {
85 val supertypes = typeDeclaration.<Type>transitiveClosurePlus[it.supertypes]
86 for(supertype : supertypes.filter(TypeDeclaration)) {
87 typeDeclaration.lookup(trace.type2Interpretation).supertypeInterpretation += supertype.lookup(trace.type2Interpretation)
88 //println('''«typeDeclaration.name» --> «supertype.name»''')
89 }
90 }
91 }
92
93 def private initialisePartialRelationInterpretation(RelationDeclaration r, Problem2PartialInterpretationTrace trace) {
94 val res = createPartialRelationInterpretation => [
95 it.interpretationOf = r
96 if(r.parameters.size==2) {
97 it.param1 = r.parameters.get(0)
98 it.param2 = r.parameters.get(1)
99 } else throw new UnsupportedOperationException
100 ]
101 trace.relation2Interpretation.put(r,res)
102 return res
103 }
104
105 def private PartialConstantInterpretation initialisePartialConstantDeclaration(ConstantDeclaration c, Problem2PartialInterpretationTrace trace) {
106 throw new UnsupportedOperationException
107 }
108
109 def private PartialFunctionInterpretation initialisePartialFunctionInterpretation(FunctionDeclaration f, Problem2PartialInterpretationTrace trace) {
110 throw new UnsupportedOperationException
111 }
112} \ No newline at end of file