From c1f185fd8fc2c3dfc123d9271726c588963c7c01 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 8 Apr 2019 00:58:00 +0200 Subject: Objective POC implementation --- .../optimization/ThreeValuedCostObjective.xtend | 86 ++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend') diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend new file mode 100644 index 00000000..362ef4a3 --- /dev/null +++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/optimization/ThreeValuedCostObjective.xtend @@ -0,0 +1,86 @@ +package hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization + +import com.google.common.collect.ImmutableList +import java.util.Collection +import org.eclipse.viatra.dse.base.ThreadContext +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 org.eclipse.xtend.lib.annotations.Data + +@Data +class ThreeValuedCostElement { + val IQuerySpecification> currentMatchQuery + val IQuerySpecification> mayMatchQuery + val IQuerySpecification> mustMatchQuery + val int weight +} + +class ThreeValuedCostObjective extends AbstractThreeValuedObjective { + val Collection costElements + Collection matchers + + new(String name, Collection costElements, ObjectiveKind kind, ObjectiveThreshold threshold, + int level) { + super(name, kind, threshold, level) + this.costElements = costElements + } + + override createNew() { + new ThreeValuedCostObjective(name, costElements, kind, threshold, level) + } + + override init(ThreadContext context) { + val queryEngine = context.queryEngine + matchers = ImmutableList.copyOf(costElements.map [ element | + new CostElementMatchers( + queryEngine.getMatcher(element.currentMatchQuery), + queryEngine.getMatcher(element.mayMatchQuery), + queryEngine.getMatcher(element.mustMatchQuery), + element.weight + ) + ]) + } + + override getFitness(ThreadContext context) { + var int cost = 0 + for (matcher : matchers) { + cost += matcher.weight * matcher.currentMatcher.countMatches + } + cost as double + } + + override getLowestPossibleFitness(ThreadContext threadContext) { + var int cost = 0 + for (matcher : matchers) { + if (matcher.weight >= 0) { + cost += matcher.weight * matcher.mustMatcher.countMatches + } else if (matcher.mayMatcher.countMatches > 0) { + // TODO Count may matches. + return Double.NEGATIVE_INFINITY + } + } + cost as double + } + + override getHighestPossibleFitness(ThreadContext threadContext) { + var int cost = 0 + for (matcher : matchers) { + if (matcher.weight <= 0) { + cost += matcher.weight * matcher.mustMatcher.countMatches + } else if (matcher.mayMatcher.countMatches > 0) { + // TODO Count may matches. + return Double.POSITIVE_INFINITY + } + } + cost as double + } + + @Data + private static class CostElementMatchers { + val ViatraQueryMatcher currentMatcher + val ViatraQueryMatcher mayMatcher + val ViatraQueryMatcher mustMatcher + val int weight + } +} -- cgit v1.2.3-54-g00ecf