From 89fe6051866933495237f0c733147700275b9549 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 25 May 2019 15:00:10 -0400 Subject: MDEOptimiser tuning for CPS --- .../dslreasoner/domains/cps/cplex/CbcCpsMain.xtend | 21 +++++++++++++--- .../domains/cps/dse/RuleBasedCpsMain.xtend | 2 +- .../domains/cps/generator/CpsGenerator.xtend | 14 +++++++++++ .../domains/cps/mdeo/CpsMdeOptimiserMain.xtend | 29 +++++++++++++++++++++- .../mit/inf/dslreasoner/domains/cps/mdeo/cps.mopt | 12 +++++---- 5 files changed, 67 insertions(+), 11 deletions(-) (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme') 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 0203a6b6..1a07e26e 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 @@ -6,14 +6,16 @@ import java.io.BufferedReader import java.io.BufferedWriter import java.io.FileReader import java.io.FileWriter +import java.util.concurrent.TimeUnit +import java.util.regex.Pattern import org.eclipse.emf.ecore.EPackage import org.eclipse.emf.ecore.resource.Resource import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl -import java.util.concurrent.TimeUnit class CbcCpsMain { static val PROBLEM_FILE = "problem.lp" static val SOLUTION_FILE = "solution.txt" + static val VALUE_REGEX = Pattern.compile("Optimal - objective value\\s*([0-9]+(\\.[0-9]+)?)") private new() { new IllegalStateException("This is a static utility class and should not be instantiated directly.") @@ -23,7 +25,7 @@ class CbcCpsMain { 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 generator = new CpsGenerator(1, 4, 1) val problem = generator.generateCpsProblem val toLp = new CpsToLpTranslator(problem, 10, true) val lp = toLp.lpProblem @@ -44,11 +46,22 @@ class CbcCpsMain { System.exit(-1) } val reader = new BufferedReader(new FileReader(SOLUTION_FILE)) + var double value = Double.NaN try { - reader.lines.forEach[println(it)] + var String line + while ((line = reader.readLine) !== null) { + println(line) + val matcher = VALUE_REGEX.matcher(line) + if (matcher.matches) { + value = Double.parseDouble(matcher.group(1)) + } + } } finally { reader.close } - println("Additional cost: " + problem.requests.flatMap[requirements.map[count]].reduce[p1, p2|p1 + p2] * 5) + val applicationCost = problem.requests.flatMap[requirements.map[count]].reduce[p1, p2|p1 + p2] * 5 + val cost = applicationCost + value + println + println("Cost: " + cost) } } diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsMain.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsMain.xtend index b2cc0063..35b3b1df 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsMain.xtend +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsMain.xtend @@ -20,7 +20,7 @@ class RuleBasedCpsMain { 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) { DesignSpaceExplorer.turnOnLogging(DseLoggingLevel.VERBOSE_FULL) Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl) diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend index 390d13d3..e8d29949 100644 --- a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/generator/CpsGenerator.xtend @@ -22,11 +22,17 @@ class CpsGenerator { val Random random val int applicationTypeCount val int demandFactor + val boolean populateAppInstances new(long randomSeed, int applicationTypeCount, int demandFactor) { + this(randomSeed, applicationTypeCount, demandFactor, false) + } + + new(long randomSeed, int applicationTypeCount, int demandFactor, boolean populateAppInstances) { this.random = new Random(randomSeed) this.applicationTypeCount = applicationTypeCount this.demandFactor = demandFactor + this.populateAppInstances = populateAppInstances } def generateCpsProblem() { @@ -50,6 +56,14 @@ class CpsGenerator { requirements += createRequirement => [ count = nextInt(CpsGenerator.MIN_REPLICAS, CpsGenerator.MAX_REPLICAS) type = appType + if (populateAppInstances) { + for (j : 0 ..< count) { + val app = createApplicationInstance + app.type = appType + appType.instances += app + instances += app + } + } ] } ] 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 index 628d5963..459c6ab7 100644 --- 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 @@ -2,6 +2,11 @@ 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 java.io.BufferedReader +import java.io.BufferedWriter +import java.io.FileReader +import java.io.FileWriter +import java.util.Map import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.EPackage import org.eclipse.emf.ecore.resource.Resource @@ -21,11 +26,33 @@ class CpsMdeOptimiserMain { 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 generator = new CpsGenerator(1, 4, 1) val problem = generator.generateCpsProblem problem.eResource.URI = URI.createFileURI(PROBLEM_PATH) problem.eResource.save(emptyMap) + fixupHenshinModel("model/cps.henshin", "model/cps_fixup.henshin", #{"cps.ecore" -> CpsPackage.eNS_URI}) val injector = new MoptStandaloneSetup().createInjectorAndDoEMFRegistration(); injector.getInstance(ExcludedRun).run(PROJECT_PATH, MOPT_PATH) } + + private def static void fixupHenshinModel(String originalPath, String outputPath, Map remapMap) { + val reader = new BufferedReader(new FileReader(originalPath)) + try { + val writer = new BufferedWriter(new FileWriter(outputPath)) + try { + var String line + while ((line = reader.readLine) !== null) { + for (entry : remapMap.entrySet) { + line = line.replace(entry.key, entry.value) + } + writer.write(line) + writer.write("\n") + } + } finally { + writer.close + } + } finally { + reader.close + } + } } 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 index 4c05939d..67fe7508 100644 --- 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 @@ -16,11 +16,13 @@ goal { } search { -// mutate using unit "createAppInstance" -// mutate using unit "createHostInstance" -// mutate using unit "allocate" -// mutate using unit "deleteAppInstance" -// mutate using unit "unallocate" +// mutate using unit "createAppInstance" +// mutate using unit "deleteAppInstance" +// mutate using unit "createHostInstance" +// mutate using unit "deleteHostInstance" +// mutate using unit "allocate" +// mutate using unit "unallocate" +// mutate using unit "reallocate" mutate { "ApplicationInstance" } mutate { "HostInstance" } } -- cgit v1.2.3-54-g00ecf