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 6b28d9a689d3e3ce734e209cadb3ea3f4bc00979..285d151bc1b967de2f0be29465badb134baf195b 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 @@ -83,31 +83,20 @@ public class ILPDirectSolver extends AbstractILPSolver { prob = GLPK.glp_create_prob(); GLPK.glp_set_prob_name(prob, model.description()); // only add variables not being ignored (which are remaining in the info object) - GLPK.glp_add_cols(prob, ilp.getInfo().vars.size()); + GLPK.glp_add_cols(prob, ilp.variableMap().size()); // helper structure, map IlpVariable to its index Map<IlpVariable, Integer> varToIndex = new HashMap<>(ilp.getNumIlpVariable()); - // create bounds - int colCount = ilp.getNumIlpBound(); - final Set<IlpVariable> toIgnore = new HashSet<>(); - for (int index = 1; index <= ilp.getNumIlpBound(); index++) { - IlpBound bound = ilp.getIlpBound(index - 1); - varToIndex.put(bound.getRef(), index); - switch (bound.getType()) { - case BINARY: - GLPK.glp_set_col_kind(prob, index, GLPKConstants.GLP_BV); - break; - case ZERO: - toIgnore.add(bound.getRef()); - --colCount; - continue; - default: // >= 0 - GLPK.glp_set_col_kind(prob, index, GLPKConstants.GLP_IV); - GLPK.glp_set_col_bnds(prob, index, GLPKConstants.GLP_LO, 0, 0); - break; + // define variables and count the number of columns + int colCount = 0; + for (IlpVariable variable : ilp.getIlpVariableList()) { + if (!variable.getIllegal()) { + colCount++; + varToIndex.put(variable, colCount); + GLPK.glp_set_col_kind(prob, colCount, GLPKConstants.GLP_BV); + GLPK.glp_set_col_name(prob, colCount, variable.getName()); } - GLPK.glp_set_col_name(prob, index, bound.getRef().getName()); } // create objective @@ -116,7 +105,7 @@ public class ILPDirectSolver extends AbstractILPSolver { GLPKConstants.GLP_MIN : GLPKConstants.GLP_MAX); // TODO only variables mentioned in objective are set to a value. Do the others need to be set to zero? for (IlpTerm term : ilp.getIlpObjective().getIlpLeftHandSide().getIlpTermList()) { - if (!toIgnore.contains(term.getRef())) { + if (!term.getRef().getIllegal()) { GLPK.glp_set_obj_coef(prob, varToIndex.get(term.getRef()), term.getValue()); } } @@ -161,7 +150,7 @@ public class ILPDirectSolver extends AbstractILPSolver { int colIndex = 1; for (int termIndex = 0; termIndex < lhs.getNumIlpTerm(); termIndex++) { IlpTerm term = lhs.getIlpTerm(termIndex); - if (toIgnore.contains(term.getRef())) { + if (term.getRef().getIllegal()) { continue; } GLPK.intArray_setitem(ind, colIndex, varToIndex.get(term.getRef())); @@ -283,7 +272,7 @@ public class ILPDirectSolver extends AbstractILPSolver { double val = GLPK.glp_mip_col_val(prob, i); logger.trace("{} (at index {}) = {}", name, i, val); if (val == 1) { - variablesSetToOne.add(ilp.getInfo().vars.get(name)); + variablesSetToOne.add(ilp.variableMap().get(name)); } } 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 b169b4831b11101b690f715b2a87228361a8abb8..ca67709531e8667f06a23ba26f474bfde8359a0b 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 @@ -144,11 +144,11 @@ public class ILPExternalSolver extends AbstractILPSolver { ILPSolution result = new ILPSolution(model); // readFromPrintableSolution(ilp, solution, result, variablesSetToOne); - readFromPlainTextSolution(model.getILP().getInfo(), solutionReadable, result, variablesSetToOne); + readFromPlainTextSolution(model.getILP(), solutionReadable, result, variablesSetToOne); return result.getObjective(); } - private static void readFromPlainTextSolution(IlpVarInfo info, Path solution, ILPSolution result, + private static void readFromPlainTextSolution(ILP ilp, Path solution, ILPSolution result, List<IlpVariable> variablesSetToOne) throws SolvingException { List<String> varNamesSetToOne = new ArrayList<>(); String name = null; @@ -202,7 +202,7 @@ public class ILPExternalSolver extends AbstractILPSolver { throw new SolvingException("Could not parse solution file", e); } for (String varName : varNamesSetToOne) { - IlpVariable variable = info.vars.get(varName); + IlpVariable variable = ilp.resolve(varName); if (variable == null) { throw new SolvingException("Could not find variable with name " + varName); }