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 ++++++++++++++++++++-- .../viatrasolver/reasoner/ViatraReasoner.xtend | 12 +++- .../reasoner/ViatraReasonerConfiguration.xtend | 7 ++- .../dse/BestFirstStrategyForModelGeneration.java | 8 +-- .../dse/ModelGenerationCompositeObjective.xtend | 27 ++++---- .../reasoner/dse/PunishSizeObjective.xtend | 70 +++++++++++++++++++++ .../viatrasolver/reasoner/dse/ScopeObjective.xtend | 2 +- 13 files changed, 189 insertions(+), 37 deletions(-) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend (limited to 'Solvers') 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 + } +} 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 b9056685..b58033d7 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 @@ -43,6 +43,7 @@ import org.eclipse.viatra.dse.api.DesignSpaceExplorer import org.eclipse.viatra.dse.api.DesignSpaceExplorer.DseLoggingLevel import org.eclipse.viatra.dse.solutionstore.SolutionStore import org.eclipse.viatra.dse.statecode.IStateCoderFactory +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse.PunishSizeObjective class ViatraReasoner extends LogicReasoner { val PartialInterpretationInitialiser initialiser = new PartialInterpretationInitialiser() @@ -86,17 +87,24 @@ class ViatraReasoner extends LogicReasoner { workspace, viatraConfig.nameNewElements, viatraConfig.typeInferenceMethod, + viatraConfig.calculateObjectCreationCosts, viatraConfig.scopePropagatorStrategy, viatraConfig.hints, viatraConfig.documentationLevel ) - dse.addObjective(new ModelGenerationCompositeObjective( + val compositeObjective = new ModelGenerationCompositeObjective( basicScopeGlobalConstraint ?: new ScopeObjective, method.unfinishedMultiplicities.map[new UnfinishedMultiplicityObjective(it)], wf2ObjectiveConverter.createCompletenessObjective(method.unfinishedWF), viatraConfig - )) + ) + dse.addObjective(compositeObjective) + if (viatraConfig.punishSize) { + val punishObjective = new PunishSizeObjective + punishObjective.level = compositeObjective.level + 1 + dse.addObjective(punishObjective) + } val extremalObjectives = Lists.newArrayListWithExpectedSize(viatraConfig.costObjectives.size) for (entry : viatraConfig.costObjectives.indexed) { diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend index e33a2590..a2f6de22 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/ViatraReasonerConfiguration.xtend @@ -57,11 +57,12 @@ class ViatraReasonerConfiguration extends LogicSolverConfiguration { public var runIntermediateNumericalConsistencyChecks = true - public var punishSize = true - public var scopeWeight = 2 - public var conaintmentWeight = 1 + public var punishSize = false + public var scopeWeight = 1 + public var conaintmentWeight = 2 public var nonContainmentWeight = 1 public var unfinishedWFWeight = 1 + public var calculateObjectCreationCosts = false public var ScopePropagatorStrategy scopePropagatorStrategy = new ScopePropagatorStrategy.Polyhedral( PolyhedralScopePropagatorConstraints.Relational, PolyhedralScopePropagatorSolver.Clp) diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java index 09575384..a2de1abc 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/BestFirstStrategyForModelGeneration.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.PriorityQueue; import java.util.Random; -import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -29,6 +28,8 @@ import org.eclipse.viatra.dse.objectives.Fitness; import org.eclipse.viatra.dse.objectives.ObjectiveComparatorHelper; import org.eclipse.viatra.dse.solutionstore.ISolutionFoundHandler; import org.eclipse.viatra.dse.solutionstore.SolutionStore; +import org.eclipse.viatra.query.runtime.api.IPatternMatch; +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher; import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner; @@ -137,10 +138,9 @@ public class BestFirstStrategyForModelGeneration implements IStrategy { // ViatraQueryEngine engine = context.getQueryEngine(); // matchers = new LinkedList>(); // for(IQuerySpecification> p : this.method.getAllPatterns()) { -// ViatraQueryMatcher matcher = p.getMatcher(engine); -// matchers.add(matcher); +// ViatraQueryMatcher matcher = p.getMatcher(engine); // } - +// final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper(); this.comparator = new Comparator() { @Override diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend index 481f4ce1..27208cf4 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ModelGenerationCompositeObjective.xtend @@ -9,13 +9,13 @@ import java.util.List import org.eclipse.viatra.dse.base.ThreadContext import org.eclipse.viatra.dse.objectives.Comparators import org.eclipse.viatra.dse.objectives.IObjective +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PrimitiveElement class ModelGenerationCompositeObjective implements IThreeValuedObjective { val IObjective scopeObjective val List unfinishedMultiplicityObjectives val UnfinishedWFObjective unfinishedWFObjective var PartialInterpretation model = null - val boolean punishSize val int scopeWeight val int conaintmentWeight val int nonContainmentWeight @@ -28,7 +28,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { ViatraReasonerConfiguration configuration) { this( - scopeObjective, unfinishedMultiplicityObjectives, unfinishedWFObjective, configuration.punishSize, + scopeObjective, unfinishedMultiplicityObjectives, unfinishedWFObjective, configuration.scopeWeight, configuration.conaintmentWeight, configuration.nonContainmentWeight, configuration.unfinishedWFWeight ) @@ -38,13 +38,12 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { IObjective scopeObjective, List unfinishedMultiplicityObjectives, UnfinishedWFObjective unfinishedWFObjective, - boolean punishSize, int scopeWeight, int conaintmentWeight, int nonContainmentWeight, int unfinishedWFWeight) + int scopeWeight, int conaintmentWeight, int nonContainmentWeight, int unfinishedWFWeight) { this.scopeObjective = scopeObjective this.unfinishedMultiplicityObjectives = unfinishedMultiplicityObjectives this.unfinishedWFObjective = unfinishedWFObjective - this.punishSize = punishSize this.scopeWeight = scopeWeight this.conaintmentWeight = conaintmentWeight this.nonContainmentWeight = nonContainmentWeight @@ -63,7 +62,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { scopeObjective.createNew, ImmutableList.copyOf(unfinishedMultiplicityObjectives.map[createNew as UnfinishedMultiplicityObjective]), unfinishedWFObjective.createNew as UnfinishedWFObjective, - punishSize, scopeWeight, conaintmentWeight, nonContainmentWeight, unfinishedWFWeight + scopeWeight, conaintmentWeight, nonContainmentWeight, unfinishedWFWeight ) } @@ -77,16 +76,14 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { var containmentMultiplicity = 0.0 var nonContainmentMultiplicity = 0.0 for(multiplicityObjective : unfinishedMultiplicityObjectives) { + val multiplicity = multiplicityObjective.getFitness(context) +// println(multiplicityObjective.name + "=" + multiplicity) if(multiplicityObjective.containment) { - containmentMultiplicity+=multiplicityObjective.getFitness(context) + containmentMultiplicity+=multiplicity } else { - nonContainmentMultiplicity+=multiplicityObjective.getFitness(context) + nonContainmentMultiplicity+=multiplicity } - } - val size = if(punishSize) { - 0.9/model.newElements.size - } else { - 0 + } var sum = 0.0 @@ -94,7 +91,9 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { sum += containmentMultiplicity*conaintmentWeight sum += nonContainmentMultiplicity*nonContainmentWeight sum += unfinishedWFsFitness*unfinishedWFWeight - sum+=size + +// println('''scope=«scopeFitnes», containment=«containmentMultiplicity», nonContainment=«nonContainmentMultiplicity», wf=«unfinishedWFsFitness», sum=«sum»''') + return sum } @@ -112,7 +111,7 @@ class ModelGenerationCompositeObjective implements IThreeValuedObjective { override isHardObjective() { true } - override satisifiesHardObjective(Double fitness) { fitness <= 0.9 } + override satisifiesHardObjective(Double fitness) { fitness < 0.01 } override setComparator(Comparator comparator) { throw new UnsupportedOperationException("Model generation objective comparator cannot be set.") diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend new file mode 100644 index 00000000..8505661c --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/PunishSizeObjective.xtend @@ -0,0 +1,70 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.dse + +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PrimitiveElement +import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.IThreeValuedObjective +import java.util.Comparator +import org.eclipse.viatra.dse.base.ThreadContext +import org.eclipse.viatra.dse.objectives.Comparators +import org.eclipse.xtend.lib.annotations.Accessors + +class PunishSizeObjective implements IThreeValuedObjective { + @Accessors int level = 3 + + override createNew() { + this + } + + override init(ThreadContext context) { + // Nothing to initialize. + } + + override getComparator() { + Comparators.LOWER_IS_BETTER + } + + override getFitness(ThreadContext threadContext) { + val model = threadContext.model + if (model instanceof PartialInterpretation) { + val size = model.newObjectCount +// println('''size=«size»''') + size as double + } else { + throw new IllegalArgumentException("notifier must be a PartialInterpretation") + } + } + + override getBestPossibleFitness(ThreadContext threadContext) { + getFitness(threadContext) + } + + override getWorstPossibleFitness(ThreadContext threadContext) { + val model = threadContext.model + if (model instanceof PartialInterpretation) { + (model.newObjectCount + model.maxNewElements) as double + } else { + throw new IllegalArgumentException("notifier must be a PartialInterpretation") + } + } + + private def getNewObjectCount(PartialInterpretation interpretation) { + interpretation.newElements.reject[it instanceof PrimitiveElement].size + } + + override getName() { + typeof(PunishSizeObjective).name + } + + override isHardObjective() { + false + } + + override satisifiesHardObjective(Double fitness) { + true + } + + override setComparator(Comparator comparator) { + throw new UnsupportedOperationException("Model generation objective comparator cannot be set.") + } + +} \ No newline at end of file diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend index 7abc5cb8..b61bd20b 100644 --- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/ScopeObjective.xtend @@ -25,7 +25,7 @@ class ScopeObjective implements IObjective{ val interpretation = context.model as PartialInterpretation var res = interpretation.minNewElementsHeuristic.doubleValue for(scope : interpretation.scopes) { - res += scope.minNewElementsHeuristic + res += scope.minNewElementsHeuristic * 2 } return res } -- cgit v1.2.3-54-g00ecf