/******************************************************************************* * Copyright (c) 2010-2015, Andras Szabolcs Nagy and Daniel Varro * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * Contributors: * Andras Szabolcs Nagy - initial API and implementation *******************************************************************************/ package org.eclipse.viatra.dse.examples.cps.dse; import java.util.concurrent.TimeUnit; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.viatra.dse.api.DesignSpaceExplorer; import org.eclipse.viatra.dse.api.strategy.impl.FixedPriorityStrategy; import org.eclipse.viatra.dse.base.DesignSpaceManager; import org.eclipse.viatra.dse.examples.cps.CpsPackage; import org.eclipse.viatra.dse.examples.cps.HostType; import org.eclipse.viatra.dse.examples.cps.objectives.ResourceUsageObjective; import org.eclipse.viatra.dse.examples.cps.patterns.CreateHostInstanceMatch; import org.eclipse.viatra.dse.examples.cps.patterns.util.AllApplicationInstanceIsRunningQuerySpecification; import org.eclipse.viatra.dse.examples.cps.patterns.util.AllocatedAppQuerySpecification; import org.eclipse.viatra.dse.examples.cps.patterns.util.ApplicationsQuerySpecification; import org.eclipse.viatra.dse.examples.cps.patterns.util.MoreThanOneUnusedHostQuerySpecification; import org.eclipse.viatra.dse.examples.cps.patterns.util.NotExistUnsatisfiedRequirementQuerySpecification; import org.eclipse.viatra.dse.examples.cps.patterns.util.RunningAppQuerySpecification; import org.eclipse.viatra.dse.examples.cps.patterns.util.UnusedHostQuerySpecification; import org.eclipse.viatra.dse.examples.cps.problems.CpsProblemFactory; import org.eclipse.viatra.dse.examples.cps.problems.RoomServiceCpsDomain; import org.eclipse.viatra.dse.examples.cps.rules.CpsRuleProvider; import org.eclipse.viatra.dse.examples.cps.statecoder.CpsStateCoderFactory; import org.eclipse.viatra.dse.objectives.ActivationFitnessProcessor; import org.eclipse.viatra.dse.objectives.Comparators; import org.eclipse.viatra.dse.objectives.impl.ConstraintsObjective; import org.eclipse.viatra.dse.objectives.impl.ModelQueriesGlobalConstraint; import org.eclipse.viatra.dse.objectives.impl.ModelQueryType; import org.eclipse.viatra.dse.objectives.impl.TrajectoryCostSoftObjective; import org.eclipse.viatra.dse.solutionstore.SolutionStore; import org.eclipse.viatra.query.runtime.api.IPatternMatch; import org.eclipse.viatra.query.runtime.exception.ViatraQueryException; import org.junit.Test; import com.google.common.base.Stopwatch; public class CpsDseRunner { @Test public void run() throws ViatraQueryException { Logger.getRootLogger().setLevel(Level.WARN); Logger.getLogger(DesignSpaceManager.class).setLevel(Level.DEBUG); CpsProblemFactory cpsProblemFactory = new CpsProblemFactory(); final RoomServiceCpsDomain domain = cpsProblemFactory.getDomain(); DesignSpaceExplorer dse = new DesignSpaceExplorer(); dse.setInitialModel(cpsProblemFactory.all()); dse.addMetaModelPackage(CpsPackage.eINSTANCE); dse.setStateCoderFactory(new CpsStateCoderFactory()); CpsRuleProvider rules = new CpsRuleProvider(); dse.addTransformationRule(rules.startRule); dse.addTransformationRule(rules.allocateRule); dse.addTransformationRule(rules.createAppRule); dse.addTransformationRule(rules.createHostRule); dse.addGlobalConstraint(new ModelQueriesGlobalConstraint() .withConstraint(MoreThanOneUnusedHostQuerySpecification.instance()) .withType(ModelQueryType.NO_MATCH)); dse.addObjective(new ConstraintsObjective() .withSoftConstraint("RunningApps", RunningAppQuerySpecification.instance(), -4d) .withSoftConstraint("AllocatedApps", AllocatedAppQuerySpecification.instance(), -3d) .withSoftConstraint("ApplicationInstances", ApplicationsQuerySpecification.instance(), -2d) .withSoftConstraint("UnusedHosts", UnusedHostQuerySpecification.instance(), 1d) .withHardConstraint(NotExistUnsatisfiedRequirementQuerySpecification.instance()) .withHardConstraint(AllApplicationInstanceIsRunningQuerySpecification.instance()) .withComparator(Comparators.LOWER_IS_BETTER) .withLevel(1)); dse.addObjective(new ResourceUsageObjective().withLevel(2)); dse.addObjective(new TrajectoryCostSoftObjective("RuleCost") .withRuleCost(rules.allocateRule, 3) .withRuleCost(rules.deleteAllocRule, 3) .withRuleCost(rules.moveRule, 4) .withRuleCost(rules.startRule, 1) .withRuleCost(rules.stopRule, 1) .withRuleCost(rules.createAppRule, 2) .withActivationCost(rules.createHostRule, new ActivationFitnessProcessor() { @Override public double process(IPatternMatch match) { CreateHostInstanceMatch m = (CreateHostInstanceMatch) match; HostType hostType = m.getHostType(); if (hostType.getId().equals(domain.smokeSensor.getId())) { return 2d; } else if (hostType.getId().equals(domain.temperatureSensor.getId())) { return 3d; } else if (hostType.getId().equals(domain.infraCam.getId())) { return 30d; } else if (hostType.getId().equals(domain.computeServer.getId())) { return 9d; } else if (hostType.getId().equals(domain.videoCam.getId())) { return 18d; } else { return 0d; } } }). withLevel(2)); FixedPriorityStrategy fixedPriorityStrategy = new FixedPriorityStrategy() .withRulePriority(rules.startRule, 9) .withRulePriority(rules.allocateRule, 8) .withRulePriority(rules.createAppRule, 7) .withRulePriority(rules.createHostRule, 6); dse.setMaxNumberOfThreads(1); dse.setSolutionStore(new SolutionStore(1)); dse.startExploration(fixedPriorityStrategy); Stopwatch stopwatch = Stopwatch.createStarted(); stopwatch.stop(); String solutions = dse.toStringSolutions(); System.out.println(solutions); System.out.println("States:" + dse.getNumberOfStates()); System.out.println("Milisecs: " +stopwatch.elapsed(TimeUnit.MILLISECONDS)); } }