diff --git a/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/CPLEXSolver.java b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/CPLEXSolver.java new file mode 100644 index 0000000000000000000000000000000000000000..8294e6c3cdaa6817da7c2fb5f9fb755f64a90387 --- /dev/null +++ b/jastadd-mquat-solver-ilp/src/main/java/de/tudresden/inf/st/mquat/solving/ilp/CPLEXSolver.java @@ -0,0 +1,84 @@ +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 org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.*; +import java.nio.file.Path; +import java.util.List; + +public class CPLEXSolver extends ILPExternalSolver { + + private static final Logger logger = LogManager.getLogger(CPLEXSolver.class); + + + public CPLEXSolver(ILPTransformer transformer) { + super(transformer); + } + + @Override + protected String[] getCommand(Path lp, Path solution, long remainingTimeForSolvingInMillis) { + String[] command = { + "cplex", + "-c", + "read " + lp.toAbsolutePath() +"", + "set clocktype 2", + " set timelimit " + remainingTimeForSolvingInMillis/1000, + "optimize", + "write " + solution.toAbsolutePath()}; + + return command; + } + + @Override + protected void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result, + List<IlpVariable> variablesSetToOne) throws SolvingException { + + logger.debug("reading solution from {}.", solution); + + try { + File file = solution.toFile(); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory + .newInstance(); + + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document document = documentBuilder.parse(file); + + // iterate over all variables + NodeList variables = document.getDocumentElement().getElementsByTagName("variable"); + logger.debug(variables.getLength()); + + for (int nodeIndex = 0; nodeIndex < variables.getLength(); nodeIndex++) { + Element variable = (Element)variables.item(nodeIndex); + String name = variable.getAttribute("name"); + int value = Integer.valueOf(variable.getAttribute("value")); + logger.info("found variable {} with value {}", name, value); + if (value == 1) { + IlpVariable ilpVariable = ilp.resolve(name); + variablesSetToOne.add(ilpVariable); + } + + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public String getName() { + return "ilp-cplex"; + } + +} 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 0f6686f140da3572f7002ceb5e53b3966f76cfc6..0eaed227347a73b656f15b88c2e541c81a9ae715 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 @@ -79,6 +79,7 @@ public abstract class ILPExternalSolver extends AbstractILPSolver { lp = Files.createTempFile("ilp", ".lp"); // solution = Files.createTempFile("solution", null); solutionReadable = Files.createTempFile("sol-read", ".sol"); + Files.delete(solutionReadable); } 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()); diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractCPLEXHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractCPLEXHandwrittenTest.java new file mode 100644 index 0000000000000000000000000000000000000000..76a9fa9a0dd47cb57934120f2c7dfafb1a99f2ee --- /dev/null +++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractCPLEXHandwrittenTest.java @@ -0,0 +1,13 @@ +package de.tudresden.inf.st.mquat.solving; + +import de.tudresden.inf.st.mquat.solving.ilp.AbstractILPTransformer; +import de.tudresden.inf.st.mquat.solving.ilp.CPLEXSolver; +import de.tudresden.inf.st.mquat.solving.ilp.GurobiSolver; + +public class AbstractCPLEXHandwrittenTest extends AbstractHandwrittenTestSuite { + @Override + protected Solver getSolver() { + // set to false for debugging + return new CPLEXSolver(new AbstractILPTransformer()).setDeleteFilesOnExit(false); + } +} diff --git a/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/CPLEXHandwrittenTest.java b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/CPLEXHandwrittenTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3d5a9dc17e994b686c8ba3a48a41a4e5de090356 --- /dev/null +++ b/jastadd-mquat-solver-ilp/src/test/java/de/tudresden/inf/st/mquat/solving/CPLEXHandwrittenTest.java @@ -0,0 +1,12 @@ +package de.tudresden.inf.st.mquat.solving; + +import de.tudresden.inf.st.mquat.solving.ilp.CPLEXSolver; +import de.tudresden.inf.st.mquat.solving.ilp.ConcreteILPTransformer; + +public class CPLEXHandwrittenTest extends OptimalHandwrittenTestSuite { + @Override + protected Solver getSolver() { + // set to false for debugging + return new CPLEXSolver(new ConcreteILPTransformer()).setDeleteFilesOnExit(false); + } +}