package Starter; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.LinkedList; import explosion.ExplosionSPLat; import inc.IncSPLat; import nesting.NestSPLat; import nointeraction.NoSPLat; import prefix.PrefixSPLat; import reference.RefSPLat; /** * * Original implementation by * Kim et al. SPLat: Lightweight dynamic analysis for reducing combinatorics in testing configurable systems * * @author Jens Meinicke * */ public class SPLat { private static long maxUsedMemory = 0; private final static int rounds = 3; public static void main(String[] args) { ISPLatEvaluation[] testClasses = new ISPLatEvaluation[]{ new NoSPLat(), // new PrefixSPLat(), new RefSPLat(), new IncSPLat(), new NestSPLat(), // new ExplosionSPLat() }; for (ISPLatEvaluation testClass : testClasses) { System.out.println("Start " + testClass.getClass().getName()); boolean timedOut = false; int maxComplexity = 100; if (testClass.getClass() == PrefixSPLat.class) { maxComplexity = 10; } for (int max = 0; max <= maxComplexity; max++) { if (timedOut) { break; } for (int i = 0; i < rounds ; i++) { long start = System.currentTimeMillis(); int runs = runSPLat(testClass, max); long end = System.currentTimeMillis(); long time = (end - start); System.out.println(" finished after " + runs + " configurations after " + time + "ms " + (maxUsedMemory >> 10) + "MB"); createOutput(time); missingConfigurations.clear(); Runtime.getRuntime().gc(); if (time > 120_000) { timedOut = true; break; } } } File resultsFile = new File("SPLat.csv"); resultsFile.renameTo(new File("SPLat-" + testClass.getClass().getSimpleName() + ".csv")); } } // static int maxConfs = 0; private static int runSPLat(ISPLatEvaluation testClass, int max) { // maxConfs = 0; System.out.print("#feature " + max); nrFeatures = max; if (testClass.getClass() == PrefixSPLat.class) { nrFeatures = 10; } int runs = 0; maxUsedMemory = 0; missingConfigurations.add(new Configuration()); while (!missingConfigurations.isEmpty()) { // include for memory usage // if (maxConfs < missingConfigurations.size()) { // maxConfs = missingConfigurations.size(); // System.out.println(maxConfs); // Runtime rt = Runtime.getRuntime(); // Runtime.getRuntime().gc(); // final long m = rt.totalMemory() - rt.freeMemory(); // if (m > maxUsedMemory) { // maxUsedMemory = m; // } // } // currentConfiguration = missingConfigurations.remove(0); currentConfiguration = missingConfigurations.removeLast(); testClass.run(max);runs++; } return runs; } private static void createOutput(long time) { File results = new File("SPLat.csv"); System.out.println("write results to " + results + " " + time); try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(results, true)))) { out.print(time); out.print(';'); out.print(maxUsedMemory >> 20);// MB out.println(); } catch (IOException e) { e.printStackTrace(); } } static int nrFeatures = 0; static LinkedList<Configuration> missingConfigurations = new LinkedList<>(); static Configuration currentConfiguration = new Configuration(); public static boolean get(int i) { byte selection = currentConfiguration.get(i); if (selection == 0) { currentConfiguration.set(i, (byte) 1); Configuration newConfig = currentConfiguration.copy(); newConfig.set(i, (byte)-1); missingConfigurations.add(newConfig); } return currentConfiguration.get(i) == 1; } } class Configuration { byte[] selection = new byte[SPLat.nrFeatures]; byte get(int i) { return selection[i]; } void set(int i, byte j) { selection[i] = j; } Configuration copy() { Configuration c = new Configuration(); for (int k = 0; k < selection.length; k++) { if (selection[k] != 0) { c.selection[k] = selection[k]; } } return c; } @Override public int hashCode() { int hash = 0; for (int j = 0; j < selection.length; j++) { if (selection[j] != 0 && selection[j] == 1) { hash += Math.pow(2, j); } } return hash; } @Override public boolean equals(Object obj) { Configuration other = (Configuration) obj; return Arrays.equals(selection, other.selection); } @Override public String toString() { return Arrays.toString(selection); } }