From 60f01f46ba232ed6416054f0a6115cb2a9b70b4e Mon Sep 17 00:00:00 2001 From: OszkarSemerath Date: Sat, 10 Jun 2017 19:05:05 +0200 Subject: Migrating Additional projects --- .../PartialInterpretationInitialiser.xtend | 112 +++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/PartialInterpretationInitialiser.xtend') 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 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage + +import hu.bme.mit.inf.dslreasoner.logic.model.builder.TracedOutput +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ConstantDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.FunctionDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.LogiclanguageFactory +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDeclaration +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem +import hu.bme.mit.inf.dslreasoner.logic.model.patterns.SupertypeStarMatcher +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialConstantInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialFunctionInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialRelationInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialTypeInterpratation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialinterpretationFactory +import java.util.HashMap +import java.util.Map +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine +import org.eclipse.viatra.query.runtime.emf.EMFScope +import org.eclipse.xtend.lib.annotations.Data + +import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* + +@Data class Problem2PartialInterpretationTrace { + Map type2Interpretation = new HashMap + Map relation2Interpretation = new HashMap +} + +class PartialInterpretationInitialiser { + val extension PartialinterpretationFactory factory = PartialinterpretationFactory.eINSTANCE + val extension LogiclanguageFactory factory2 = LogiclanguageFactory.eINSTANCE + + /** + * Initialises an empty partial interpretation from a logic problem + */ + def TracedOutput initialisePartialInterpretation( + LogicProblem problem, + int minNewElement, int maxNewElement) + { + val engine = ViatraQueryEngine.on(new EMFScope(problem)) + val trace = new Problem2PartialInterpretationTrace + + val res = createPartialInterpretation => [ + it.problem = problem + it.openWorldElementPrototype = createDefinedElement => [it.name = "Symbolic New Element"] + it.minNewElements = minNewElement + it.maxNewElements = maxNewElement + + for(typeDeclaration : problem.types.filter(TypeDeclaration)) { + it.partialtypeinterpratation += typeDeclaration.initialisePartialTypeInterpretation(engine,trace) + } + problem.connectSuperypes(trace) + + it.partialrelationinterpretation += problem.relations.filter(RelationDeclaration) + .map[initialisePartialRelationInterpretation(trace)] + it.partialfunctioninterpretation += problem.functions.filter(FunctionDeclaration) + .map[initialisePartialFunctionInterpretation(trace)] + it.partialconstantinterpretation += problem.constants.filter(ConstantDeclaration) + .map[initialisePartialConstantDeclaration(trace)] + ] + + return new TracedOutput(res,trace) + } + + /** + * Initialize type with existing elements + */ + def private initialisePartialTypeInterpretation(TypeDeclaration t, ViatraQueryEngine engine, Problem2PartialInterpretationTrace trace) { + val supertypeMatcher = SupertypeStarMatcher.on(engine) + val res = createPartialTypeInterpratation => [ + it.interpretationOf = t + it.elements += supertypeMatcher.getAllValuesOfsubtype(t) + .filter(TypeDefinition) + .map[elements].flatten + ] + trace.type2Interpretation.put(t,res) + return res + } + + def private connectSuperypes(LogicProblem problem, Problem2PartialInterpretationTrace trace) { + for(typeDeclaration : problem.types.filter(TypeDeclaration)) { + val supertypes = typeDeclaration.transitiveClosurePlus[it.supertypes] + for(supertype : supertypes.filter(TypeDeclaration)) { + typeDeclaration.lookup(trace.type2Interpretation).supertypeInterpretation += supertype.lookup(trace.type2Interpretation) + //println('''«typeDeclaration.name» --> «supertype.name»''') + } + } + } + + def private initialisePartialRelationInterpretation(RelationDeclaration r, Problem2PartialInterpretationTrace trace) { + val res = createPartialRelationInterpretation => [ + it.interpretationOf = r + if(r.parameters.size==2) { + it.param1 = r.parameters.get(0) + it.param2 = r.parameters.get(1) + } else throw new UnsupportedOperationException + ] + trace.relation2Interpretation.put(r,res) + return res + } + + def private PartialConstantInterpretation initialisePartialConstantDeclaration(ConstantDeclaration c, Problem2PartialInterpretationTrace trace) { + throw new UnsupportedOperationException + } + + def private PartialFunctionInterpretation initialisePartialFunctionInterpretation(FunctionDeclaration f, Problem2PartialInterpretationTrace trace) { + throw new UnsupportedOperationException + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf