From b7ed3353ba34dd837bfc15f7e48c30a2cdc7ce75 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 22 May 2019 20:38:53 -0400 Subject: MDEOptimiser implementation of CPS benchmark --- .../dslreasoner/domains/cps/cplex/CbcCpsMain.xtend | 5 +- .../domains/cps/mdeo/CpsMdeOptimiserMain.xtend | 31 ++++++++ .../cps/mdeo/ExcludedOptimisationInterpreter.xtend | 85 ++++++++++++++++++++++ .../mdeo/NonRedundantAllocationsConstraint.xtend | 29 ++++++++ .../mdeo/NotAllocatedAppInstancesConstraint.xtend | 24 ++++++ .../mdeo/NotSatisfiedRequirementsConstraint.xtend | 27 +++++++ .../domains/cps/mdeo/ResourceUtilizationUtil.xtend | 31 ++++++++ .../cps/mdeo/TooLowAverageHddConstraint.xtend | 33 +++++++++ .../cps/mdeo/TooLowAverageMemoryConstraint.xtend | 33 +++++++++ .../cps/mdeo/TotalCostFitnessFunction.xtend | 23 ++++++ .../cps/mdeo/UnavailableHddConstraint.xtend | 27 +++++++ .../cps/mdeo/UnavailableMemoryConstraint.xtend | 27 +++++++ .../mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt | 41 +++++++++++ 13 files changed, 414 insertions(+), 2 deletions(-) create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/CpsMdeOptimiserMain.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ExcludedOptimisationInterpreter.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NonRedundantAllocationsConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotAllocatedAppInstancesConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotSatisfiedRequirementsConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ResourceUtilizationUtil.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageHddConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageMemoryConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TotalCostFitnessFunction.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableHddConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableMemoryConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner') diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/cplex/CbcCpsMain.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/cplex/CbcCpsMain.xtend index 7ec0f84d..0203a6b6 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/cplex/CbcCpsMain.xtend +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/cplex/CbcCpsMain.xtend @@ -19,11 +19,11 @@ class CbcCpsMain { new IllegalStateException("This is a static utility class and should not be instantiated directly.") } - static def void main(String[] args) { + public static def void main(String[] args) { Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl) EPackage.Registry.INSTANCE.put(CpsPackage.eNS_URI, CpsPackage.eINSTANCE) - val generator = new CpsGenerator(1, 4, 1) + val generator = new CpsGenerator(1, 4, 2) val problem = generator.generateCpsProblem val toLp = new CpsToLpTranslator(problem, 10, true) val lp = toLp.lpProblem @@ -49,5 +49,6 @@ class CbcCpsMain { } finally { reader.close } + println("Additional cost: " + problem.requests.flatMap[requirements.map[count]].reduce[p1, p2|p1 + p2] * 5) } } diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/CpsMdeOptimiserMain.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/CpsMdeOptimiserMain.xtend new file mode 100644 index 00000000..628d5963 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/CpsMdeOptimiserMain.xtend @@ -0,0 +1,31 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CpsPackage +import hu.bme.mit.inf.dslreasoner.domains.cps.generator.CpsGenerator +import org.eclipse.emf.common.util.URI +import org.eclipse.emf.ecore.EPackage +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl +import uk.ac.kcl.inf.mdeoptimiser.languages.MoptStandaloneSetup + +class CpsMdeOptimiserMain { + static val PROJECT_PATH = "." + static val PROBLEM_PATH = "model/problem.xmi" + static val MOPT_PATH = "src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt" + + private new() { + new IllegalStateException("This is a static utility class and should not be instantiated directly.") + } + + public static def void main(String[] args) { + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION, + new XMIResourceFactoryImpl) + EPackage.Registry.INSTANCE.put(CpsPackage.eNS_URI, CpsPackage.eINSTANCE) + val generator = new CpsGenerator(1, 4, 2) + val problem = generator.generateCpsProblem + problem.eResource.URI = URI.createFileURI(PROBLEM_PATH) + problem.eResource.save(emptyMap) + val injector = new MoptStandaloneSetup().createInjectorAndDoEMFRegistration(); + injector.getInstance(ExcludedRun).run(PROJECT_PATH, MOPT_PATH) + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ExcludedOptimisationInterpreter.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ExcludedOptimisationInterpreter.xtend new file mode 100644 index 00000000..1e9c5adf --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ExcludedOptimisationInterpreter.xtend @@ -0,0 +1,85 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import java.util.Properties +import org.moeaframework.Executor +import org.moeaframework.Instrumenter +import org.moeaframework.algorithm.PeriodicAction +import org.moeaframework.core.TerminationCondition +import org.moeaframework.core.spi.AlgorithmFactory +import uk.ac.kcl.inf.mdeoptimiser.interfaces.cli.Run +import uk.ac.kcl.inf.mdeoptimiser.languages.mopt.Optimisation +import uk.ac.kcl.inf.mdeoptimiser.languages.mopt.SolverSpec +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.OptimisationInterpreter +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.executor.SolutionGenerator +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.MoeaOptimisation +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.algorithms.MoeaOptimisationAlgorithmProvider +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.instrumentation.PopulationCollector +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.problem.MoeaOptimisationProblem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.operators.adaptation.MutationStepSizeStrategyFactory +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.output.MDEOBatch + +class ExcludedMoeaOptimisation extends MoeaOptimisation { + SolutionGenerator solutionGenerator + Instrumenter algorithmStepSizeInstrumenter + + override execute(SolverSpec solverSpec, SolutionGenerator solutionGenerator) { + this.solutionGenerator = solutionGenerator + super.execute(solverSpec, solutionGenerator) + } + + override Instrumenter runOptimisation(SolverSpec solverSpec, Properties optimisationProperties) { + val algorithmFactory = new AlgorithmFactory + algorithmFactory.addProvider(new MoeaOptimisationAlgorithmProvider) + + algorithmStepSizeInstrumenter = new Instrumenter().addExcludedPackage("org.eclipse").withProblemClass( + MoeaOptimisationProblem, solutionGenerator).attachApproximationSetCollector().attachElapsedTimeCollector(). + attachPopulationSizeCollector.attach(new PopulationCollector()).withFrequency(1).withFrequencyType( + PeriodicAction.FrequencyType.STEPS) + + var stepSizeStrategy = new MutationStepSizeStrategyFactory(solverSpec.algorithm, algorithmStepSizeInstrumenter). + strategy + + solutionGenerator.setMutationStepSizeStrategy(stepSizeStrategy) + + // TODO: Place this in a better location. + // Exclude JDK packages from Instrumenter + this.algorithmStepSizeInstrumenter.addExcludedPackage("jdk") + + new Executor().usingAlgorithmFactory(algorithmFactory).withAlgorithm(solverSpec.algorithm.name) // Initialize problem with our solution generator + .withProblemClass(MoeaOptimisationProblem, solutionGenerator).withProperties(optimisationProperties). + withInstrumenter(algorithmStepSizeInstrumenter).withTerminationCondition( + optimisationProperties.get("terminationCondition") as TerminationCondition).run() + + return algorithmStepSizeInstrumenter + } +} + +class ExcludedOptimisationInterpreter extends OptimisationInterpreter { + val Optimisation model + + new(String projectPath, Optimisation model) { + super(projectPath, model) + this.model = model + } + + override start() { + // This model provider loads the model given by the user in the DSL + var solutionGenerator = new SolutionGenerator(model, getBreedingOperators, getMutationOperators, + getModelProvider, getMetamodel); + + return new ExcludedMoeaOptimisation().execute(model.solver, solutionGenerator) + } + +} + +class ExcludedRun extends Run { + override runBatch(String moptProjectPath, Optimisation optimisationModel, Integer batch, boolean singleBatch) { + val optimisationInterpreter = new ExcludedOptimisationInterpreter(moptProjectPath, optimisationModel); + val startTime = System.nanoTime(); + val optimisationOutcome = optimisationInterpreter.start(); + val endTime = System.nanoTime(); + val experimentDuration = ((endTime - startTime) / 1000000); + val generatedRules = optimisationInterpreter.getRulegenOperators(); + return new MDEOBatch(batch, experimentDuration, optimisationOutcome, generatedRules, singleBatch); + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NonRedundantAllocationsConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NonRedundantAllocationsConstraint.xtend new file mode 100644 index 00000000..1a9286b3 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NonRedundantAllocationsConstraint.xtend @@ -0,0 +1,29 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution +import com.google.common.collect.HashMultiset + +class NonRedundantAllocationsConstraint implements IGuidanceFunction { + override getName() { + "NonRedundantAllocations" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var int cost = 0 + for (hostType : cps.hostTypes) { + for (host : hostType.instances) { + val bins = HashMultiset.create + for (app : host.applications) { + bins.add(app.requirement) + } + for (entry : bins.entrySet) { + cost += entry.count - 1 + } + } + } + cost + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotAllocatedAppInstancesConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotAllocatedAppInstancesConstraint.xtend new file mode 100644 index 00000000..663aa26c --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotAllocatedAppInstancesConstraint.xtend @@ -0,0 +1,24 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class NotAllocatedAppInstancesConstraint implements IGuidanceFunction { + override getName() { + "NotAllocatedAppInstances" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var int cost = 0 + for (appType : cps.applicationTypes) { + for (app : appType.instances) { + if (app.allocatedTo === null || !appType.requirements.exists[hostType == app.allocatedTo.type]) { + cost++ + } + } + } + cost + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotSatisfiedRequirementsConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotSatisfiedRequirementsConstraint.xtend new file mode 100644 index 00000000..e44381ec --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/NotSatisfiedRequirementsConstraint.xtend @@ -0,0 +1,27 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class NotSatisfiedRequirementsConstraint implements IGuidanceFunction { + override getName() { + "NotSatisfiedRequirements" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var int cost = 0 + for (request : cps.requests) { + for (requirement : request.requirements) { + cost += Math.abs(requirement.count - requirement.instances.size) + for (app : requirement.instances) { + if (app.type != requirement.type) { + cost++ + } + } + } + } + cost + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ResourceUtilizationUtil.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ResourceUtilizationUtil.xtend new file mode 100644 index 00000000..fc1d666f --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/ResourceUtilizationUtil.xtend @@ -0,0 +1,31 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.HostInstance + +class ResourceUtilizationUtil { + private new() { + new IllegalStateException("This is a static utility class and should not be instantiated directly.") + } + + static def getMemoryUtilization(HostInstance host) { + var int utilization = 0 + for (app : host.applications) { + val req = app.type.requirements.findFirst[hostType == host.type] + if (req !== null) { + utilization += req.requiredMemory + } + } + utilization + } + + static def getHddUtilization(HostInstance host) { + var int utilization = 0 + for (app : host.applications) { + val req = app.type.requirements.findFirst[hostType == host.type] + if (req !== null) { + utilization += req.requiredHdd + } + } + utilization + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageHddConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageHddConstraint.xtend new file mode 100644 index 00000000..85cc8115 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageHddConstraint.xtend @@ -0,0 +1,33 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class TooLowAverageHddConstraint implements IGuidanceFunction { + static val THRESHOLD = 0.25 + + override getName() { + "TooLowAverageHdd" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var double sumUtilization + var int numHosts + for (hostType : cps.hostTypes) { + numHosts += hostType.instances.size + for (host : hostType.instances) { + val utilization = ResourceUtilizationUtil.getHddUtilization(host) + sumUtilization += (utilization as double) / hostType.defaultHdd + } + } + val averageUtilization = sumUtilization / numHosts + val difference = THRESHOLD - averageUtilization + if (difference > 0) { + difference + } else { + 0 + } + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageMemoryConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageMemoryConstraint.xtend new file mode 100644 index 00000000..e9b47d4c --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TooLowAverageMemoryConstraint.xtend @@ -0,0 +1,33 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class TooLowAverageMemoryConstraint implements IGuidanceFunction { + static val THRESHOLD = 0.25 + + override getName() { + "TooLowAverageMemory" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var double sumUtilization + var int numHosts + for (hostType : cps.hostTypes) { + numHosts += hostType.instances.size + for (host : hostType.instances) { + val utilization = ResourceUtilizationUtil.getMemoryUtilization(host) + sumUtilization += (utilization as double) / hostType.defaultMemory + } + } + val averageUtilization = sumUtilization / numHosts + val difference = THRESHOLD - averageUtilization + if (difference > 0) { + difference + } else { + 0 + } + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TotalCostFitnessFunction.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TotalCostFitnessFunction.xtend new file mode 100644 index 00000000..af65e442 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/TotalCostFitnessFunction.xtend @@ -0,0 +1,23 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class TotalCostFitnessFunction implements IGuidanceFunction { + override getName() { + "TotalCost" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var int cost = 0 + for (appType : cps.applicationTypes) { + cost += 5 * appType.instances.size + } + for (hostType : cps.hostTypes) { + cost += hostType.cost * hostType.instances.size + } + cost + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableHddConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableHddConstraint.xtend new file mode 100644 index 00000000..08450f45 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableHddConstraint.xtend @@ -0,0 +1,27 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class UnavailableHddConstraint implements IGuidanceFunction { + override getName() { + "UnavailableHdd" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var int cost = 0 + for (hostType : cps.hostTypes) { + for (host : hostType.instances) { + val utilization = ResourceUtilizationUtil.getHddUtilization(host) + val difference = utilization - hostType.defaultHdd + if (difference > 0) { + cost += difference + } + } + } + cost + } + +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableMemoryConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableMemoryConstraint.xtend new file mode 100644 index 00000000..e46d59a6 --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/UnavailableMemoryConstraint.xtend @@ -0,0 +1,27 @@ +package hu.bme.mit.inf.dslreasoner.domains.cps.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class UnavailableMemoryConstraint implements IGuidanceFunction { + override getName() { + "UnavailableMemory" + } + + override computeFitness(Solution solution) { + val cps = solution.model as CyberPhysicalSystem + var int cost = 0 + for (hostType : cps.hostTypes) { + for (host : hostType.instances) { + val utilization = ResourceUtilizationUtil.getMemoryUtilization(host) + val difference = utilization - hostType.defaultMemory + if (difference > 0) { + cost += difference + } + } + } + cost + } + +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt new file mode 100644 index 00000000..4c05939d --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt @@ -0,0 +1,41 @@ +problem { + basepath + metamodel + model +} + +goal { + objective TotalCost minimise java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.TotalCostFitnessFunction" } + constraint NotSatisfiedRequriements java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.NotSatisfiedRequirementsConstraint" } + constraint NotAllocatedAppInstances java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.NotAllocatedAppInstancesConstraint" } + constraint NonRedundantAllocations java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.NonRedundantAllocationsConstraint" } + constraint UnavailableMemory java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.UnavailableMemoryConstraint" } + constraint UnavailableHdd java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.UnavailableHddConstraint" } + constraint TooLowAverageMemory java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.TooLowAverageMemoryConstraint" } + constraint TooLowAverageHdd java { "hu.bme.mit.inf.dslreasoner.domains.cps.mdeo.TooLowAverageHddConstraint" } +} + +search { +// mutate using unit "createAppInstance" +// mutate using unit "createHostInstance" +// mutate using unit "allocate" +// mutate using unit "deleteAppInstance" +// mutate using unit "unallocate" + mutate { "ApplicationInstance" } + mutate { "HostInstance" } +} + +solver { + optimisation provider moea algorithm NSGAII { + variation: mutation + population: 25 + mutation.step: 3 + mutation.strategy: random + } + + termination { + time: 120 + } + + batches 1 +} -- cgit v1.2.3-54-g00ecf