From 329ac27dfa84e9a07760bea75b36476dddcf29a7 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Tue, 14 Jul 2020 10:45:03 +0200 Subject: Optimizations --- .../.ApplicationConfigurationIdeModule.xtendbin | Bin 1701 -> 1701 bytes .../ide/.ApplicationConfigurationIdeSetup.xtendbin | Bin 2526 -> 2526 bytes .../.SolverSemanticHighlightCalculator.xtendbin | Bin 5334 -> 5334 bytes .../.SolverSemanticTextAttributeProvider.xtendbin | Bin 4902 -> 4902 bytes .../validation/.SolverLanguageValidator.xtendbin | Bin 1717 -> 1717 bytes ....SolverLanguageTokenDefInjectingParser.xtendbin | Bin 2742 -> 2742 bytes ...nguageSyntheticTokenSyntacticSequencer.xtendbin | Bin 2758 -> 2758 bytes .../ModelGenerationMethodProvider.xtend | 22 +++-- .../cardinality/PolyhedronScopePropagator.xtend | 4 + .../logic2viatra/cardinality/ScopePropagator.xtend | 4 + .../logic2viatra/patterns/PatternProvider.xtend | 12 +++ .../rules/RefinementRuleProvider.xtend | 12 +-- .../META-INF/MANIFEST.MF | 3 +- .../neighbourhood/Descriptor.xtend | 106 ++++++--------------- .../neighbourhood/PartialInterpretation2Hash.xtend | 14 ++- ...nterpretation2NeighbourhoodRepresentation.xtend | 63 ++++++------ .../NeighbourhoodBasedStateCoderFactory.xtend | 21 +++- .../viatrasolver/reasoner/ViatraReasoner.xtend | 2 +- .../config/genericSatellite.vsconfig | 6 +- .../config/genericTaxation.vsconfig | 6 +- .../case.study.pledge.run/inputs/Resource50hh.xmi | 59 ++++++++++++ 21 files changed, 196 insertions(+), 138 deletions(-) create mode 100644 Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin index bd1eabaf..35e3fe34 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeModule.xtendbin differ diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin index f4956ec0..b597e715 100644 Binary files a/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin and b/Application/hu.bme.mit.inf.dslreasoner.application.ide/xtend-gen/hu/bme/mit/inf/dslreasoner/application/ide/.ApplicationConfigurationIdeSetup.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin index 0ee6ab93..5d90d470 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticHighlightCalculator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin index 1fbc1b5a..f054d52c 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/ui/syntaxcoloring/.SolverSemanticTextAttributeProvider.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin index 6dfd9bdd..faaea19c 100644 Binary files a/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin and b/Application/org.eclipse.viatra.solver.language.ui/xtend-gen/org/eclipse/viatra/solver/language/validation/.SolverLanguageValidator.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin index 9e4a0e33..704006b4 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/parser/antlr/.SolverLanguageTokenDefInjectingParser.xtendbin differ diff --git a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin index 2a1c8746..76be2b25 100644 Binary files a/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin and b/Application/org.eclipse.viatra.solver.language/xtend-gen/org/eclipse/viatra/solver/language/serializer/.SolverLanguageSyntheticTokenSyntacticSequencer.xtendbin differ 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) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF index 83c90829..639a8a9c 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/META-INF/MANIFEST.MF @@ -28,7 +28,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.xtend.lib.macro, org.eclipse.viatra.query.runtime;bundle-version="1.5.0", org.eclipse.viatra.dse;bundle-version="0.15.0", - hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0" + hu.bme.mit.inf.dslreasoner.ecore2logic;bundle-version="1.0.0", + org.eclipse.collections;bundle-version="10.1.0" Bundle-ActivationPolicy: lazy Automatic-Module-Name: hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend index e4bdb086..685a1f5a 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/Descriptor.xtend @@ -7,7 +7,7 @@ import org.eclipse.xtend.lib.annotations.Data import org.eclipse.xtend2.lib.StringConcatenationClient @Data abstract class AbstractNodeDescriptor { - long dataHash + int dataHash protected def StringConcatenationClient prettyPrint() { '''(«dataHash»)[«class.simpleName»]''' @@ -57,7 +57,7 @@ import org.eclipse.xtend2.lib.StringConcatenationClient } override hashCode() { - return this.dataHash.hashCode + return this.dataHash } override equals(Object other) { @@ -119,7 +119,6 @@ import org.eclipse.xtend2.lib.StringConcatenationClient } @Data class FurtherNodeDescriptor extends AbstractNodeDescriptor { - NodeRep previousRepresentation Map, Integer> incomingEdges Map, Integer> outgoingEdges @@ -128,8 +127,8 @@ import org.eclipse.xtend2.lib.StringConcatenationClient Map, Integer> outgoingEdges) { super(calculateDataHash(previousRepresentation, incomingEdges, outgoingEdges)) this.previousRepresentation = previousRepresentation - this.incomingEdges = new HashMap(incomingEdges) - this.outgoingEdges = new HashMap(outgoingEdges) + this.incomingEdges = incomingEdges + this.outgoingEdges = outgoingEdges } static def private int calculateDataHash(NodeRep previousRepresentation, @@ -137,14 +136,14 @@ import org.eclipse.xtend2.lib.StringConcatenationClient val int prime = 31; var int result = previousRepresentation.hashCode; if (incomingEdges !== null) - result = prime * result + incomingEdges.hashCode(); + result = prime * result + hashIncomingNeighborhood(incomingEdges) if (outgoingEdges !== null) - result = prime * result + outgoingEdges.hashCode(); + result = prime * result + hashOutgoingNeighborhood(outgoingEdges) return result; } override hashCode() { - return this.dataHash.hashCode + return this.dataHash } override equals(Object other) { @@ -179,80 +178,31 @@ import org.eclipse.xtend2.lib.StringConcatenationClient '''«rep»''' } } + + private static def hashIncomingNeighborhood(Map, Integer> neighborhood) { + val int prime = 31 + var int hash = 0 + for (entry : neighborhood.entrySet) { + val relation = entry.key + hash += (prime * relation.from.hashCode + relation.type.hashCode).bitwiseXor(entry.value.hashCode) + } + hash + } + + private static def hashOutgoingNeighborhood(Map, Integer> neighborhood) { + val int prime = 31 + var int hash = 0 + for (entry : neighborhood.entrySet) { + val relation = entry.key + hash += (prime * relation.to.hashCode + relation.type.hashCode).bitwiseXor(entry.value.hashCode) + } + hash + } override toString() { ''' «prettyPrint» ''' } - -// @Pure -// @Override -// override public boolean equals(Object obj) { -// if (this === obj) -// return true; -// if (obj === null) -// return false; -// if (getClass() != obj.getClass()) -// return false; -// val AbstractNodeDescriptor other = obj as AbstractNodeDescriptor; -// if (other.dataHash != this.dataHash) -// return false; -// return true; -// } -// @Pure -// override public boolean equals(Object obj) { -// if (this === obj) -// return true; -// if (obj === null) -// return false; -// if (getClass() != obj.getClass()) -// return false; -// if (!super.equals(obj)) -// return false; -// val FurtherNodeDescriptor other = obj as FurtherNodeDescriptor; -// if (this.previousRepresentation === null) { -// if (other.previousRepresentation != null) -// return false; -// -// } -//// } else if (!this.previousRepresentation.equals(other.previousRepresentation)) -//// return false; -// if (this.incomingEdges === null) { -// if (other.incomingEdges != null) -// return false; -// } else if (!this.incomingEdges.equals(other.incomingEdges)) -// return false; -// if (this.outgoingEdges === null) { -// if (other.outgoingEdges != null) -// return false; -// } else if (!this.outgoingEdges.equals(other.outgoingEdges)) -// return false; -// if (this.attributeValues === null) { -// if (other.attributeValues != null) -// return false; -// } else if (!this.attributeValues.equals(other.attributeValues)) -// return false; -// return true; -// } } -/* - * @Data - * class ModelDescriptor { - * int dataHash - * int unknownElements - * Map knownElements - * - * public new(Map knownElements, int unknownElements) { - * this.dataHash = calculateDataHash(knownElements,unknownElements) - * this.unknownElements = unknownElements - * this.knownElements = knownElements - * } - * - * def private static calculateDataHash(Map knownElements, int unknownElements) - * { - * val int prime = 31; - * return knownElements.hashCode * prime + unknownElements.hashCode - * } - * } - */ + diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend index ddf7d712..5da202eb 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2Hash.xtend @@ -1,7 +1,8 @@ package hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.neighbourhood -import java.util.Map import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.DefinedElement +import java.util.Map +import org.eclipse.collections.api.factory.Maps class PartialInterpretation2Hash extends PartialInterpretation2NeighbourhoodRepresentation{ @@ -11,15 +12,22 @@ class PartialInterpretation2Hash extends PartialInterpretation2NeighbourhoodRepr override protected createLocalRepresentation(Map node2Representation, Map representation2Amount) { return new NeighbourhoodWithTraces( - representation2Amount.hashCode,node2Representation.mapValues[it.hashCode], + representation2Amount.hashCode,node2Representation.hashValues, null) } override protected createFurtherRepresentation(Map, Integer> nodeDescriptors, Map> node2Representation, NeighbourhoodWithTraces previous, boolean deepRepresentation) { return new NeighbourhoodWithTraces( nodeDescriptors.hashCode, - node2Representation.mapValues[it.hashCode], + node2Representation.hashValues, if(deepRepresentation) {previous} else {null}) } + private def hashValues(Map map) { + val hashedMap = Maps.mutable.ofInitialCapacity(map.size) + for (entry : map.entrySet) { + hashedMap.put(entry.key, entry.value.hashCode) + } + hashedMap + } } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend index 3048167e..93eab816 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/neighbourhood/PartialInterpretation2NeighbourhoodRepresentation.xtend @@ -8,11 +8,11 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialPrimitiveInterpretation import java.util.ArrayList -import java.util.HashMap -import java.util.HashSet import java.util.List import java.util.Map import java.util.Set +import org.eclipse.collections.api.factory.Maps +import org.eclipse.collections.impl.factory.Sets import static extension hu.bme.mit.inf.dslreasoner.util.CollectionsUtil.* @@ -68,10 +68,11 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation relevantTypes, Set relevantRelations, DefinedElement focusedElement) { - val Map> types = new HashMap + val initialSize = model.elements.size + val Map> types = Maps.mutable.ofInitialCapacity(initialSize) fillTypes(model, types, relevantTypes) - val Map>> IncomingRelations = new HashMap; - val Map>> OutgoingRelations = new HashMap; + val Map>> IncomingRelations = Maps.mutable.ofInitialCapacity(initialSize); + val Map>> OutgoingRelations = Maps.mutable.ofInitialCapacity(initialSize); fillReferences(model, IncomingRelations, OutgoingRelations, relevantRelations) val res = doRecursiveNeighbourCalculation(model, types, IncomingRelations, OutgoingRelations, range, parallels, @@ -103,12 +104,12 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> IncomingRelations, Map>> OutgoingRelations) { val elements = types.keySet - var Map> reachable = new HashMap - var Map> newReachable = new HashMap + var Map> reachable = Maps.mutable.ofInitialCapacity(elements.size) + var Map> newReachable = Maps.mutable.ofInitialCapacity(elements.size) for (element : elements) { - val set = new HashSet + val set = Sets.mutable.of set.add(element) - reachable.put(element, new HashSet) + reachable.put(element, Sets.mutable.of) newReachable.put(element, set) } @@ -201,8 +202,8 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation previousNumberOfTypes lastRange = nextRange @@ -224,7 +225,7 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation> node2Type, Set relevantTypes) { for (element : model.elements) { - node2Type.put(element, new HashSet) + node2Type.put(element, Sets.mutable.of) } // for(typeDefinition : model.problem.types.filter(TypeDefinition)) { @@ -286,7 +287,11 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation max) return Integer.MAX_VALUE else return original + 1 } @@ -294,15 +299,11 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> IncomingRelations, DefinedElement object, Map previousNodeRepresentations, int parallel) { - val Map, Integer> res = new HashMap + val Map, Integer> res = Maps.mutable.of for (incomingConcreteEdge : IncomingRelations.get(object)) { val IncomingRelation e = new IncomingRelation( previousNodeRepresentations.get(incomingConcreteEdge.from), incomingConcreteEdge.type) - if (res.containsKey(e)) { - res.put(e, addOne(res.get(e), parallel)) - } else { - res.put(e, 1) - } + res.compute(e, [key, value | addOne(value, parallel)]) } return res } @@ -310,17 +311,13 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> OutgoingRelations, DefinedElement object, Map previousNodeRepresentations, int parallel) { - val Map, Integer> res = new HashMap + val Map, Integer> res = Maps.mutable.of for (outgoingConcreteEdge : OutgoingRelations.get(object)) { val OutgoingRelation e = new OutgoingRelation( previousNodeRepresentations.get(outgoingConcreteEdge.to), outgoingConcreteEdge.type) - if (res.containsKey(e)) { - res.put(e, addOne(res.get(e), parallel)) - } else { - res.put(e, 1) - } + res.compute(e, [key, value | addOne(value, parallel)]) } - return res; + return res } /*def private void addOrCreate_Set(Map> map, KEY key, VALUE value) { @@ -338,16 +335,17 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation>> IncomingRelations, Map>> OutgoingRelations, int parallels, int maxNumber) { val previousNodeRepresentations = previous.nodeRepresentations - val node2Representation = new HashMap> + val size = previousNodeRepresentations.size + val node2Representation = Maps.mutable.>ofInitialCapacity(size) val Map, Integer> descriptor2Number = if (this. mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } val Map, FurtherNodeDescriptor> uniqueDescription = if (this. mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } @@ -392,14 +390,15 @@ abstract class PartialInterpretation2NeighbourhoodRepresentation> types, int maxNumber, DefinedElement focusedElement) { - val Map node2Representation = new HashMap + val size = types.size + val Map node2Representation = Maps.mutable.ofInitialCapacity(size) val Map representation2Amount = if (mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } val Map uniqueRepresentation = if (this.mergeSimilarNeighbourhood) { - new HashMap + Maps.mutable.ofInitialCapacity(size) } else { null } diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend index f19ac30f..04c49506 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage/src/hu/bme/mit/inf/dslreasoner/viatrasolver/partialinterpretationlanguage/statecoder/NeighbourhoodBasedStateCoderFactory.xtend @@ -9,6 +9,7 @@ import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.par import java.util.ArrayList import java.util.Map import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.IQuerySpecification class NeighbourhoodBasedStateCoderFactory extends AbstractNeighbourhoodBasedStateCoderFactory { new() { @@ -38,6 +39,7 @@ class NeighbourhoodBasedHashStateCoderFactory extends AbstractNeighbourhoodBased class NeighbourhoodBasedPartialInterpretationStateCoder extends AbstractNeighbourhoodBasedPartialInterpretationStateCoder { val PartialInterpretation2NeighbourhoodRepresentation calculator + val Map, String> fullyQualifiedNames = newHashMap var Map nodeRepresentations = null var ModelRep modelRepresentation = null @@ -55,27 +57,36 @@ class NeighbourhoodBasedPartialInterpretationStateCoder exten modelRepresentation = code.modelRepresentation nodeRepresentations = code.nodeRepresentations } + + private def getFullyQualifiedNameCached(IQuerySpecification specification) { + fullyQualifiedNames.computeIfAbsent(specification, [fullyQualifiedName]) + } override doCreateActivationCode(IPatternMatch match) { val size = match.specification.parameters.size - val res = new ArrayList(size) - var int equivalenceHash = 0 + var int hash = 0 val prime = 31 for (var int index = 0; index < size; index++) { val matchArgument = match.get(index) - res.add(getCode(matchArgument)) + val code = getCode(matchArgument) + val codeNumber = if (code === null) { + 0 + } else { + code.hashCode + } + hash = prime * hash + codeNumber for (var i = 0; i < index; i++) { val number = if (matchArgument === match.get(i)) { 1 } else { 0 } - equivalenceHash = prime * equivalenceHash + number + hash = prime * hash + number } } - match.specification.fullyQualifiedName -> (res -> equivalenceHash).hashCode + match.specification.fullyQualifiedNameCached -> hash } def private getCode(Object o) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend index fd871615..c333feca 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasoner.xtend @@ -206,7 +206,7 @@ class ViatraReasoner extends LogicReasoner { it.transformationTime = (transformationTime / 1000000) as int for (pair : solutionCopier.getAllCopierRuntimes(true).indexed) { it.entries += createIntStatisticEntry => [ - it.name = '''_Solution«pair.key»FoundAt''' + it.name = '''Solution«pair.key»FoundAt''' it.value = (pair.value / 1000000) as int ] } diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig index 57eaf326..192dac7b 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericSatellite.vsconfig @@ -33,10 +33,8 @@ generate { runtime = 10000, log-level = normal, "fitness-scope" = "3", - "fitness-punishSize" = "inverse", - "fitness-objectCreationCosts" = "true", - "scopePropagator" = "typeHierarchy", - "fitness-missing-containment" = "2" + "fitness-punishSize" = "true", + "scopePropagator" = "polyhedral" } runs = 1 diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig index 7d742202..ee3c3631 100644 --- a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/config/genericTaxation.vsconfig @@ -35,7 +35,11 @@ generate { config = { runtime = 10000, log-level = normal, - "fitness-objectCreationCosts" = "true" + "fitness-scope" = "1", + "fitness-punishSize" = "inverse", + "fitness-objectCreationCosts" = "true", + "scopePropagator" = "typeHierarchy", + "fitness-missing-containment" = "2" } runs = 1 diff --git a/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi new file mode 100644 index 00000000..5b110b76 --- /dev/null +++ b/Tests/MODELS2020-CaseStudies/case.study.pledge.run/inputs/Resource50hh.xmi @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3-54-g00ecf