From a7b9a3eef14fc165909d00c65bb6fc1744a8ebd8 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 7 Jul 2020 15:00:13 +0200 Subject: Trying to fix performance regressions --- .../ModelGenerationMethodProvider.xtend | 3 +- .../MultiplicityGoalConstraintCalculator.xtend | 3 + .../logic2viatra/cardinality/ScopePropagator.xtend | 14 ++++- .../logic2viatra/patterns/PatternGenerator.xtend | 2 +- .../patterns/RelationDeclarationIndexer.xtend | 4 +- .../patterns/RelationRefinementGenerator.xtend | 3 +- .../rules/GoalConstraintProvider.xtend | 71 ++++++++++++++++++++-- 7 files changed, 87 insertions(+), 13 deletions(-) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend index 78eda150..b79039cb 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/ModelGenerationMethodProvider.xtend @@ -112,6 +112,7 @@ class ModelGenerationMethodProvider { ReasonerWorkspace workspace, boolean nameNewElements, TypeInferenceMethod typeInferenceMethod, + boolean calculateObjectCreationCosts, ScopePropagatorStrategy scopePropagatorStrategy, Collection hints, DocumentationLevel debugLevel @@ -135,7 +136,7 @@ class ModelGenerationMethodProvider { val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, statistics) - val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries) + val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries,calculateObjectCreationCosts) val unfinishedWF = queries.getUnfinishedWFQueries.values diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend index 392ab3ee..273e0ac3 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/MultiplicityGoalConstraintCalculator.xtend @@ -14,6 +14,9 @@ class MultiplicityGoalConstraintCalculator { val int cost new(String targetRelationName, IQuerySpecification querySpecification, boolean containment, int lowerBound, int cost) { + if (lowerBound <= 0) { + throw new IllegalArgumentException("Invalid lower bound: " + lowerBound) + } this.targetRelationName = targetRelationName this.querySpecification = querySpecification this.calculator = null diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend index 132ca8e8..3e95b2cc 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/ScopePropagator.xtend @@ -60,15 +60,23 @@ class ScopePropagator { } } } while (changed) - + copyScopeBoundsToHeuristic() } def propagateAllScopeConstraints() { + if (!valid) { + return + } statistics.incrementScopePropagationCount() doPropagateAllScopeConstraints() } - + + def isValid() { + partialInterpretation.maxNewElements == -1 || + partialInterpretation.minNewElements <= partialInterpretation.maxNewElements + } + protected def copyScopeBoundsToHeuristic() { partialInterpretation.minNewElementsHeuristic = partialInterpretation.minNewElements for (scope : partialInterpretation.scopes) { @@ -109,7 +117,7 @@ class ScopePropagator { // this.partialInterpretation.scopes.forEach[println(''' «(it.targetTypeInterpretation as PartialComplexTypeInterpretation).interpretationOf.name»: «it.minNewElements»-«it.maxNewElements»''')] // println('''All constraints are propagated upon increasing «(t as PartialComplexTypeInterpretation).interpretationOf.name»''') } - + protected def setScopesInvalid() { partialInterpretation.minNewElements = Integer.MAX_VALUE partialInterpretation.maxNewElements = 0 diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend index f3125b80..80bc3844 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternGenerator.xtend @@ -51,7 +51,7 @@ class PatternGenerator { @Accessors(PUBLIC_GETTER) val RelationRefinementGenerator relationRefinementGenerator = new RelationRefinementGenerator(this) @Accessors(PUBLIC_GETTER) val UnitPropagationPreconditionGenerator unitPropagationPreconditionGenerator = new UnitPropagationPreconditionGenerator(this) - public new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { + new(TypeInferenceMethod typeInferenceMethod, ScopePropagatorStrategy scopePropagatorStrategy) { if(typeInferenceMethod == TypeInferenceMethod.Generic) { this.typeIndexer = new GenericTypeIndexer(this) this.typeRefinementGenerator = new GenericTypeRefinementGenerator(this) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend index cef707c5..b4403979 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationDeclarationIndexer.xtend @@ -19,7 +19,7 @@ class RelationDeclarationIndexer { this.base = base } - public def generateRelationIndexers(LogicProblem problem, Iterable relations, Map fqn2PQuery) { + def generateRelationIndexers(LogicProblem problem, Iterable relations, Map fqn2PQuery) { val upperMultiplicities = new HashMap problem.annotations.filter(UpperMultiplicityAssertion).forEach[ upperMultiplicities.put(it.relation,it.upper) @@ -42,7 +42,7 @@ class RelationDeclarationIndexer { '''«modality.name.toLowerCase»InRelation«base.canonizeName(r.name)»''' } - public def referRelation( + def referRelation( RelationDeclaration referred, String sourceVariable, String targetVariable, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend index d915d47e..783cd36b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/RelationRefinementGenerator.xtend @@ -5,12 +5,11 @@ import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.Modality import java.util.LinkedList -import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.ComplexTypeReference class RelationRefinementGenerator { PatternGenerator base; - public new(PatternGenerator base) { + new(PatternGenerator base) { this.base = base } 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 7dc21410..732c135d 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,13 +1,25 @@ 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.Type import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.cardinality.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 class GoalConstraintProvider { - - def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns) { + + def getUnfinishedMultiplicityQueries(LogicProblem p, GeneratedPatterns patterns, boolean calculateObjectCost) { + val objectCosts = if (calculateObjectCost) { + calculateMissingObjectCost(p) + } else { + emptyMap + } val res = new ArrayList() for (entry : patterns.multiplicityConstraintQueries.entrySet) { val constraint = entry.key @@ -17,10 +29,61 @@ class GoalConstraintProvider { val query = queries.existingMultiplicityQuery val containment = constraint.containment val lowerBound = constraint.lowerBound - res += new MultiplicityGoalConstraintCalculator(targetRelationName, query, containment, 1, lowerBound) + val cost = objectCosts.getOrDefault(constraint.relation, 1) + res += new MultiplicityGoalConstraintCalculator( + targetRelationName, + query, + containment, + lowerBound, + cost + ) } } return res } -} \ No newline at end of file + private 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 + } +} -- cgit v1.2.3-54-g00ecf