diff --git a/jastadd-mquat-benchmark/build.gradle b/jastadd-mquat-benchmark/build.gradle index 945310193b6bb88de3fef9a266ed74a72d9d5436..8af65710869459ddde81c454925f1e17388b603d 100644 --- a/jastadd-mquat-benchmark/build.gradle +++ b/jastadd-mquat-benchmark/build.gradle @@ -30,7 +30,7 @@ task benchmarkCustom(type: JavaExec, dependsOn: assemble) { classpath = sourceSets.test.runtimeClasspath main = 'de.tudresden.inf.st.mquat.benchmark.CustomBenchmarkMain' systemProperty "java.library.path", project.glpkPath - jvmArgs("-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder", "-XX:StartFlightRecording=settings=profile", "-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=results/fr", "-Xverify:none") +// jvmArgs("-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder", "-XX:StartFlightRecording=settings=profile", "-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=results/fr", "-Xverify:none") } task benchmarkFull(type: JavaExec, dependsOn: assemble) { diff --git a/jastadd-mquat-solver-ilp/build.gradle b/jastadd-mquat-solver-ilp/build.gradle index fcdb26bacaed33bbb4b969877546967edd1b4dc4..8c4fec8f2d50a8f5c986b0eb6fce44e64ca78ea7 100644 --- a/jastadd-mquat-solver-ilp/build.gradle +++ b/jastadd-mquat-solver-ilp/build.gradle @@ -13,6 +13,7 @@ dependencies { compile group: 'org.gnu.glpk', name: 'glpk-java', version: '1.11.0' compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0' compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0' + compile 'nz.ac.waikato.cms.weka:weka-stable:3.8.3' compile project(':jastadd-mquat-base') compile project(':jastadd-mquat-solver') testCompile project(path: ':jastadd-mquat-solver', configuration: 'testArtifacts') diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/HardwareComponent.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/HardwareComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..5f334aafebf7769a311fffff28899a9e13ab04a9 --- /dev/null +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/HardwareComponent.java @@ -0,0 +1,35 @@ +package de.tudresden.inf.st.mquat.solving.clustering; + +import de.tudresden.inf.st.mquat.jastadd.model.Resource; +import weka.core.DenseInstance; +import weka.core.Instance; + +/*** + * An entity unifying WEKA instances and Jastadd resources + */ +public class HardwareComponent { + + private Resource resource; + private Instance instance; + + public HardwareComponent(Resource resource, int attributes_number) { + this.resource = resource; + this.instance = new DenseInstance(attributes_number); + } + + public Resource getResource() { + return resource; + } + + public void setResource(Resource resource) { + this.resource = resource; + } + + public Instance getInstance() { + return instance; + } + + public void setInstance(Instance instance) { + this.instance = instance; + } +} diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/KMeans.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/KMeans.java new file mode 100644 index 0000000000000000000000000000000000000000..04ea64d311d9ef28b6a7bb9e4017636ecf6c6a59 --- /dev/null +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/clustering/KMeans.java @@ -0,0 +1,106 @@ +package de.tudresden.inf.st.mquat.solving.clustering; + +import de.tudresden.inf.st.mquat.jastadd.model.Resource; +import de.tudresden.inf.st.mquat.jastadd.model.Root; +import weka.clusterers.*; +import weka.core.Attribute; +import weka.core.Instances; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/*** + * Wrapper for WEKA SimpleKMeans. Clustering based on: + * CPU frequency + * RAM total + * Disk total + * Network throughput + * + * @author Dmytro Pukhkaiev + * @version 0.1 + */ +public class KMeans{ + // dataset + private Instances resources; + // number of clusters + private int k; + // list of resources + private ArrayList<HardwareComponent> hardwareComponentList = new ArrayList<>(); + + public KMeans(Root model) { + // create attributes for instances + Attribute cpu = new Attribute("cpu"); + Attribute ram = new Attribute("ram"); + Attribute disk = new Attribute("disk"); + Attribute network = new Attribute("network"); + ArrayList<Attribute> attributeList = new ArrayList<Attribute>(); + attributeList.add(cpu); + attributeList.add(ram); + attributeList.add(disk); + attributeList.add(network); + + // create a dataset + resources = new Instances("resources", attributeList, 0); + + //instantiate items in the dataset + for (Resource resource : model.getHardwareModel().getResourceList()) { + if (resource.getType().getName().getName().equals("ComputeNode")) { + HardwareComponent hardwareComponent = new HardwareComponent(resource, resource.getNumSubResource()); + hardwareComponent.getInstance().setDataset(resources); + + for (Resource sub : resource.getSubResourceList()) { + String typeName = sub.getType().getName().getName(); + switch (typeName) { + case "CPU": + hardwareComponent.getInstance().setValue(cpu, sub.getCurrentValueByPropertyName("frequency")); + break; + case "RAM": + hardwareComponent.getInstance().setValue(ram, sub.getCurrentValueByPropertyName("total")); + break; + case "DISK": + hardwareComponent.getInstance().setValue(disk, sub.getCurrentValueByPropertyName("total")); + break; + case "NETWORK": + hardwareComponent.getInstance().setValue(network, sub.getCurrentValueByPropertyName("throughput")); + break; + default: + throw new RuntimeException("Unable to transform unknown resource of type" + typeName); + } + } + + hardwareComponentList.add(hardwareComponent); + } + } + + for (HardwareComponent hwc : hardwareComponentList) + resources.add(hwc.getInstance()); + + k = (int) (0.2 * model.getHardwareModel().getResourceList().asJavaCollection().size()); + + } + + public Map<Integer, ArrayList<Resource>> buildClusters(){ + + SimpleKMeans algorithm = new SimpleKMeans(); + Map<Integer, ArrayList<Resource>> Clusters = new HashMap<>(); + + for (int i = 0; i < k; i ++) + Clusters.put(i, new ArrayList<>()); + try { + algorithm.setNumClusters(k); + algorithm.setPreserveInstancesOrder(true); + algorithm.buildClusterer(resources); + + int[] assignments = algorithm.getAssignments(); + + for (int i = 0; i < assignments.length; i++){ + Clusters.get(assignments[i]).add(hardwareComponentList.get(i).getResource()); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return Clusters; + } +} diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java index 3538ce52d36b140ab926dd76e7258b5e32872da5..cb99848e7a313b5abc14df936495e46eb3fbac74 100644 --- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPMain.java @@ -2,12 +2,10 @@ package de.tudresden.inf.st.mquat.solving.ilp; import de.tudresden.inf.st.mquat.generator.ScenarioDescription; import de.tudresden.inf.st.mquat.generator.ScenarioGenerator; -import de.tudresden.inf.st.mquat.jastadd.model.ILP; -import de.tudresden.inf.st.mquat.jastadd.model.MquatWriteSettings; -import de.tudresden.inf.st.mquat.jastadd.model.Root; -import de.tudresden.inf.st.mquat.jastadd.model.Solution; +import de.tudresden.inf.st.mquat.jastadd.model.*; import de.tudresden.inf.st.mquat.solving.Solver; import de.tudresden.inf.st.mquat.solving.SolvingException; +import de.tudresden.inf.st.mquat.solving.clustering.KMeans; import de.tudresden.inf.st.mquat.utils.StopWatch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -16,6 +14,8 @@ import org.gnu.glpk.GLPK; import java.io.File; import java.io.IOException; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Map; import java.util.Scanner; import java.util.concurrent.TimeUnit; @@ -90,6 +90,8 @@ public class ILPMain { System.out.println(version); ScenarioGenerator gen = new ScenarioGenerator(new ScenarioDescription(1, 2, 0, 0, 0, 2, 2, 2.5, 3, 1, 0)); Root model = gen.generate(); + KMeans kMeans = new KMeans(model); + Map<Integer, ArrayList<Resource>> clusters = kMeans.buildClusters(); Solver external = new GLPKSolver().setDeleteFilesOnExit(false); Solution solution = external.solve(model); logger.info(model.print(new MquatWriteSettings(" ")));