From 329ac27dfa84e9a07760bea75b36476dddcf29a7 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 14 Jul 2020 10:45:03 +0200 Subject: Optimizations --- .../ModelGenerationMethodProvider.xtend | 22 +++++++++++++++------- .../cardinality/PolyhedronScopePropagator.xtend | 4 ++++ .../logic2viatra/cardinality/ScopePropagator.xtend | 4 ++++ .../logic2viatra/patterns/PatternProvider.xtend | 12 ++++++++++++ .../rules/RefinementRuleProvider.xtend | 12 ++++++------ 5 files changed, 41 insertions(+), 13 deletions(-) (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu') 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 b79039cb..56beacfa 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 @@ -1,6 +1,7 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra import com.google.common.collect.ImmutableMap +import com.google.common.collect.ImmutableSet import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem import hu.bme.mit.inf.dslreasoner.viatra2logic.viatra2logicannotations.TransfomedViatraQuery @@ -57,7 +58,7 @@ class ModelGenerationStatistics { } public var int transformationInvocations - + synchronized def incrementTransformationCount() { transformationInvocations++ } @@ -67,7 +68,7 @@ class ModelGenerationStatistics { synchronized def incrementScopePropagationCount() { scopePropagatorInvocations++ } - + public var int scopePropagatorSolverInvocations synchronized def incrementScopePropagationSolverCount() { @@ -126,9 +127,7 @@ class ModelGenerationMethodProvider { val relationConstraints = relationConstraintCalculator.calculateRelationConstraints(logicProblem) val queries = patternProvider.generateQueries(logicProblem, emptySolution, statistics, existingQueries, workspace, typeInferenceMethod, scopePropagatorStrategy, relationConstraints, hints, writeFiles) - val queryEngine = ViatraQueryEngine.on(new EMFScope(emptySolution)) - GenericQueryGroup.of(queries.allQueries).prepare(queryEngine) - + val scopePropagator = createScopePropagator(scopePropagatorStrategy, emptySolution, hints, queries, statistics) scopePropagator.propagateAllScopeConstraints val objectRefinementRules = refinementRuleProvider.createObjectRefinementRules(logicProblem, emptySolution, @@ -136,7 +135,8 @@ class ModelGenerationMethodProvider { val relationRefinementRules = refinementRuleProvider.createRelationRefinementRules(queries, scopePropagator, statistics) - val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem,queries,calculateObjectCreationCosts) + val unfinishedMultiplicities = goalConstraintProvider.getUnfinishedMultiplicityQueries(logicProblem, queries, + calculateObjectCreationCosts) val unfinishedWF = queries.getUnfinishedWFQueries.values @@ -150,10 +150,18 @@ class ModelGenerationMethodProvider { val modalRelationQueries = modalRelationQueriesBuilder.build val invalidWF = queries.getInvalidWFQueries.values - + val mustUnitPropagationPreconditions = queries.getMustUnitPropagationPreconditionPatterns val currentUnitPropagationPreconditions = queries.getCurrentUnitPropagationPreconditionPatterns + val queriesToPrepare = ImmutableSet.builder.addAll(queries.refineObjectQueries.values).addAll( + queries.refineTypeQueries.values).addAll(queries.refinerelationQueries.values).addAll(queries. + multiplicityConstraintQueries.values.flatMap[allQueries]).addAll(queries.unfinishedWFQueries.values).addAll( + queries.invalidWFQueries.values).addAll(queries.mustUnitPropagationPreconditionPatterns.values).addAll( + queries.currentUnitPropagationPreconditionPatterns.values).add(queries.hasElementInContainmentQuery).build + val queryEngine = ViatraQueryEngine.on(new EMFScope(emptySolution)) + GenericQueryGroup.of(queriesToPrepare).prepare(queryEngine) + return new ModelGenerationMethod( statistics, objectRefinementRules.values, diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend index db22b95c..c28d4caa 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/cardinality/PolyhedronScopePropagator.xtend @@ -114,6 +114,10 @@ class PolyhedronScopePropagator extends TypeHierarchyScopePropagator { override isPropagationNeededAfterAdditionToRelation(Relation r) { relevantRelations.contains(r) || super.isPropagationNeededAfterAdditionToRelation(r) } + + override isQueryEngineFlushRequiredBeforePropagation() { + true + } def resetBounds() { for (dimension : polyhedron.dimensions) { 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 3e95b2cc..93b83577 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 @@ -130,6 +130,10 @@ class ScopePropagator { def isPropagationNeededAfterAdditionToRelation(Relation r) { false } + + def isQueryEngineFlushRequiredBeforePropagation() { + false + } private def removeOne(Scope scope) { if (scope.minNewElements > 0) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend index 2f7c9e2d..d57705ce 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/patterns/PatternProvider.xtend @@ -1,5 +1,6 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra.patterns +import com.google.common.collect.ImmutableSet import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Relation import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDefinition @@ -55,6 +56,17 @@ class ModalPatternQueries { class UnifinishedMultiplicityQueries { val IQuerySpecification> existingMultiplicityQuery val IQuerySpecification> existingInverseMultiplicityQuery + + def Set>> getAllQueries() { + val builder = ImmutableSet.builder + if (existingMultiplicityQuery !== null) { + builder.add(existingMultiplicityQuery) + } + if (existingInverseMultiplicityQuery !== null) { + builder.add(existingInverseMultiplicityQuery) + } + builder.build + } } class PatternProvider { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend index 1d976e14..f7fe97a3 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.logic2viatra/src/hu/bme/mit/inf/dslreasoner/viatrasolver/logic2viatra/rules/RefinementRuleProvider.xtend @@ -114,7 +114,7 @@ class RefinementRuleProvider { ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine + flushQueryEngine(scopePropagator) // Scope propagation val propagatorStartTime = System.nanoTime @@ -144,7 +144,7 @@ class RefinementRuleProvider { ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine + flushQueryEngine(scopePropagator) // Scope propagation val propagatorStartTime = System.nanoTime @@ -171,7 +171,7 @@ class RefinementRuleProvider { ) statistics.addExecutionTime(System.nanoTime - startTime) - flushQueryEngine + flushQueryEngine(scopePropagator) // Scope propagation val propagatorStartTime = System.nanoTime @@ -404,7 +404,7 @@ class RefinementRuleProvider { // Scope propagation if (scopePropagator.isPropagationNeededAfterAdditionToRelation(declaration)) { - flushQueryEngine + flushQueryEngine(scopePropagator) val propagatorStartTime = System.nanoTime scopePropagator.propagateAllScopeConstraints() @@ -581,8 +581,8 @@ class RefinementRuleProvider { inverseInterpretation.relationlinks += inverseLink } - protected def flushQueryEngine() { - if (queryEngine.updatePropagationDelayed) { + protected def flushQueryEngine(ScopePropagator scopePropagator) { + if (scopePropagator.queryEngineFlushRequiredBeforePropagation && queryEngine.updatePropagationDelayed) { delayMessageDelivery.setBoolean(queryEngine, false) queryEngine.getQueryBackend(ReteBackendFactory.INSTANCE).flushUpdates delayMessageDelivery.setBoolean(queryEngine, true) -- cgit v1.2.3-70-g09d2