From 53ce0bea21c18061eabfd890f6ea6776fe4e1d08 Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Tue, 12 May 2020 02:38:04 +0200 Subject: advanced goal heuristics for missing containment and non-cont. edges --- .../rules/GoalConstraintProvider.xtend | 89 ++++++++++++++++++++-- 1 file changed, 84 insertions(+), 5 deletions(-) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend index e1be2742..87f7e339 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/GoalConstraintProvider.xtend @@ -1,18 +1,97 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.rules +import hu.bme.mit.inf.dslreasoner.ecore2logic.ecore2logicannotations.LowerMultiplicityAssertion +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation +import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type +import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.MultiplicityGoalConstraintCalculator import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns.GeneratedPatterns import java.util.ArrayList +import java.util.HashMap +import java.util.LinkedList +import java.util.List +import java.util.Map +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.IQuerySpecification +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher + +import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* class GoalConstraintProvider { - def public getUnfinishedMultiplicityQueries(GeneratedPatterns patterns) { - val multiplicityQueries = patterns.unfinishedMulticiplicityQueries - val res = new ArrayList(multiplicityQueries.size) - for(multiplicityQuery : multiplicityQueries.entrySet) { + val calculateObjectCost = true + + def public getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns) { + val res = new ArrayList() + + res.addAll(patterns.unfinishedContainmentMulticiplicityQueries,true) + if(calculateObjectCost) { + val middingObjectCost = calculateMissingObjectCost(p) + res.addAll(patterns.unfinishedNonContainmentMulticiplicityQueries,false) + } else { + res.addAll(patterns.unfinishedNonContainmentMulticiplicityQueries,false) + } + return res + } + + def addAll(ArrayList res, Map>> queries, boolean containment) { + for(multiplicityQuery : queries.entrySet) { val targetRelationName = multiplicityQuery.key.name val query = multiplicityQuery.value - res += new MultiplicityGoalConstraintCalculator(targetRelationName,query); + res += new MultiplicityGoalConstraintCalculator(targetRelationName,query,containment,1); + } + } + def addAll( + ArrayList res, + Map>> queries, + boolean containment, + Map cost + ) { + for(multiplicityQuery : queries.entrySet) { + val targetRelationName = multiplicityQuery.key.name + val query = multiplicityQuery.value + res += new MultiplicityGoalConstraintCalculator(targetRelationName,query,containment,multiplicityQuery.key.lookup(cost)) + } + } + + def calculateMissingObjectCost(LogicProblem p) { + val containments = p.containmentHierarchies.head.containmentRelations + val containment2Lower = containments.toInvertedMap[containment | + val lower = p.annotations.filter(LowerMultiplicityAssertion).filter[it.relation === containment].head + if(lower !== null) { lower.lower } + else { 0 } + ] + val types = p.types + val Map>> type2NewCost = new HashMap + for(type:types) { + val allSupertypes = (#[type] + type.supertypes).toSet + val allOutgoingContainments = containments.filter[allSupertypes.contains((it.parameters.get(0) as ComplexTypeReference).referred)] + val list = new LinkedList + for(outgoingContainment : allOutgoingContainments) { + val value = containment2Lower.get(outgoingContainment) + if(value>0) { + list.add((outgoingContainment.parameters.get(1) as ComplexTypeReference).referred + -> value) + } + } + type2NewCost.put(type, list) + } + val res = new HashMap + for(containment : containments) { + val key = containment + val value = (containment.parameters.get(1) as ComplexTypeReference).referred.count(type2NewCost) + //println('''«key.name» --> «value» new''') + res.put(key,value) } return res } + + private def int count(Type t, Map>> containments) { + val list = containments.get(t) + var r = 1 + for(element : list) { + r += element.value * element.key.count(containments) + } + return r + } } \ No newline at end of file -- cgit v1.2.3-70-g09d2