diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java index 4c50b7a290bcf1458aa23bfa59d7820e8d95dd9d..91cb89dcfa4efc60f54f39b44ad5af1bf2ae7eb9 100644 --- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/AbstractILPSolver.java @@ -85,7 +85,7 @@ public abstract class AbstractILPSolver implements BenchmarkableSolver { // call to abstract method try { - solve0(model, watch, variablesSetToOne); + solve0(model, ilp, watch, variablesSetToOne); this.lastSolving = watch.time(TimeUnit.MILLISECONDS) - this.lastGeneration; // translate ilp-encoded solution to MQuAT solution return populateSolution(variablesSetToOne, new ILPSolution(model)); @@ -103,12 +103,11 @@ public abstract class AbstractILPSolver implements BenchmarkableSolver { * @return the objective value * @throws SolvingException if anything went wrong */ - protected abstract double solve0(Root model, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException; + protected abstract double solve0(Root model, ILP ilp, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException; protected ILPSolution populateSolution(List<IlpVariable> variablesSetToOne, ILPSolution result) throws SolvingException { List<Assignment> listOfAssignments = new ArrayList<>(); for (IlpVariable var : variablesSetToOne) { - logger.debug("Found, that {} = 1", var.getName()); if (var.isMappingVariable()) { IlpMappingVariable mappingVar = var.asMappingVariable(); Assignment assignment = new Assignment(); diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java index 50dfad47ae459b0255eab4cd82536b7cade22c5d..53238dadb87c2775c6428efdbbb7e6d168977351 100644 --- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/GurobiSolver.java @@ -4,6 +4,9 @@ import de.tudresden.inf.st.mquat.jastadd.model.ILP; import de.tudresden.inf.st.mquat.jastadd.model.IlpVariable; import de.tudresden.inf.st.mquat.solving.SolvingException; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -23,20 +26,24 @@ public class GurobiSolver extends ILPExternalSolver { * @see GurobiSolver#setDeleteFilesOnExit(boolean) */ public GurobiSolver() { + } @Override protected String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis) { - String[] command = {"gurobi_cl", " ResultFile=" + solution.toAbsolutePath(), "TimeLimit=" + remainingTimeForSolvingInMillis/1000, String.valueOf(lp.toAbsolutePath())}; + String[] command = {"gurobi_cl", "ResultFile=" + solution.toAbsolutePath(), "TimeLimit=" + remainingTimeForSolvingInMillis/1000, String.valueOf(lp.toAbsolutePath())}; return command; } @Override protected void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result, List<IlpVariable> variablesSetToOne) throws SolvingException { - try (Stream<String> lines = Files.lines(solution)) { - for (String line : lines.collect(Collectors.toList())) { + + logger.debug("reading solution from {}.", solution); + + try(BufferedReader br = new BufferedReader(new FileReader(solution.toFile()))) { + for(String line; (line = br.readLine()) != null; ) { if (line.startsWith("#")) { // comment line @@ -45,24 +52,20 @@ public class GurobiSolver extends ILPExternalSolver { logger.debug("read objective {}", Double.valueOf(line.substring(20).trim())); } } else { - String[] tokens = line.split("\\s+"); - if (tokens.length == 2) { - // tokens: name, value - if (Math.round(Double.parseDouble(tokens[1])*1000000000)==1000000000) { - logger.debug("found new variable {} with value {}", tokens[0], tokens[1]); - IlpVariable variable = ilp.resolve(tokens[0]); - if (variable == null) { - throw new SolvingException("Could not find variable with name " + tokens[0]); - } - variablesSetToOne.add(variable); + if (line.endsWith(" 1")) { + String varString = line.substring(0,line.length()-2); + IlpVariable variable = ilp.resolve(varString); + if (variable == null) { + throw new SolvingException("Could not find variable with name " + varString); } + variablesSetToOne.add(variable); } } } + } catch (FileNotFoundException e) { + e.printStackTrace(); } catch (IOException e) { - throw new SolvingException("Could not open solution file", e); - } catch (NumberFormatException e) { - throw new SolvingException("Could not parse solution file", e); + e.printStackTrace(); } } diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java index 12f6d952ed95324a366dc10eb307af41b336ca34..ef9ad6b002261fcf9a8f4b0fdaf64fc3f9a69736 100644 --- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPDirectSolver.java @@ -57,8 +57,7 @@ public class ILPDirectSolver extends AbstractILPSolver { this.prob = null; } - protected double solve0(Root model, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException { - ILP ilp = model.getILP(); + protected double solve0(Root model, ILP ilp, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException { if (logger.isTraceEnabled()) { logger.trace(ilp.printIlp().toString()); diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java index f1625f4425a9f0158e64559f6e85d62f33c655ad..ef53166b8740f48b403d1b9a81b16f7e71f50002 100644 --- a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/ILPExternalSolver.java @@ -70,7 +70,7 @@ public abstract class ILPExternalSolver extends AbstractILPSolver { } } - protected double solve0(Root model, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException { + protected double solve0(Root model, ILP ilp, StopWatch watch, List<IlpVariable> variablesSetToOne) throws SolvingException { long startOfWriteOutInMillis = watch.time(TimeUnit.MILLISECONDS); @@ -85,7 +85,9 @@ public abstract class ILPExternalSolver extends AbstractILPSolver { } // write out lp file - IlpString output = model.getILP().printIlp(); + logger.debug("Starting ILP string construction."); + IlpString output = ilp.printIlp(); + logger.debug("ILP string construction completed."); try (BufferedWriter writer = Files.newBufferedWriter( lp, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { writer.write(output.toString()); @@ -140,8 +142,10 @@ public abstract class ILPExternalSolver extends AbstractILPSolver { // read the solution file ILPSolution result = new ILPSolution(model); + logger.debug("created empty solution"); + // readFromPrintableSolution(ilp, solution, result, variablesSetToOne); - readFromPlainTextSolution(model.getILP(), solutionReadable, result, variablesSetToOne); + readFromPlainTextSolution(ilp, solutionReadable, result, variablesSetToOne); return result.getObjective(); }