Skip to content
Snippets Groups Projects
Commit df10f8bc authored by Johannes Mey's avatar Johannes Mey
Browse files

add gurobi solver (untested so far)

parent bffe7371
Branches
No related tags found
No related merge requests found
......@@ -2,6 +2,7 @@ package de.tudresden.inf.st.mquat.benchmark;
import de.tudresden.inf.st.mquat.solving.BenchmarkableSolver;
import de.tudresden.inf.st.mquat.solving.ilp.GLPKSolver;
import de.tudresden.inf.st.mquat.solving.ilp.GurobiSolver;
import de.tudresden.inf.st.mquat.solving.ilp.ILPDirectSolver;
import de.tudresden.inf.st.mquat.solving.genetic.GeneticSolver;
import de.tudresden.inf.st.mquat.solving.ilp.SCIPSolver;
......@@ -31,6 +32,7 @@ public class SolverFactory {
new EMFeRSolver(),
new GLPKSolver(),
new SCIPSolver(),
new GurobiSolver(),
new ILPDirectSolver(),
new SimpleSolver(),
new RandomSolver(0, 0),
......
package de.tudresden.inf.st.mquat.solving.ilp;
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.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class GurobiSolver extends ILPExternalSolver {
/**
* Create a new GLPK solver with default settings.
* Default is:
* <ul>
* <li>1 minute timeout</li>
* <li>delete temporary files on exit.</li>
* </ul>
* @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())};
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())) {
if (line.startsWith("#")) {
// comment line
if (line.startsWith("# Objective Value =")) {
result.setObjective(Double.valueOf(line.substring(20).trim()));
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);
}
}
}
}
} catch (IOException e) {
throw new SolvingException("Could not open solution file", e);
} catch (NumberFormatException e) {
throw new SolvingException("Could not parse solution file", e);
}
}
@Override
public String getName() {
return "ilp-gurobi";
}
}
......@@ -75,7 +75,7 @@ public abstract class ILPExternalSolver extends AbstractILPSolver {
try {
lp = Files.createTempFile("ilp", ".lp");
// solution = Files.createTempFile("solution", null);
solutionReadable = Files.createTempFile("sol-read", null);
solutionReadable = Files.createTempFile("sol-read", ".sol");
} catch (IOException e) { throw new SolvingException("Can not create lp or solution file", e); }
if (!deleteFilesOnExit) {
logger.info("Writing ILP to {}, solving now", lp.toAbsolutePath());
......
package de.tudresden.inf.st.mquat.solving;
import de.tudresden.inf.st.mquat.solving.ilp.GurobiSolver;
public class GurobiHandwrittenTest extends HandwrittenTestSuite {
@Override
protected Solver getSolver() {
// set to false for debugging
return new GurobiSolver().setDeleteFilesOnExit(false);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment