diff --git a/pom.xml b/pom.xml index 4999606c072d29270f6feac20ba13e7f23b18596..1654522062d1ec6c0e33c7281558fa0993b05145 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <groupId>edu.illinois.cs.cogcomp</groupId> <artifactId>illinois-inference</artifactId> <packaging>jar</packaging> - <version>0.6.0</version> + <version>0.7.0</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> @@ -25,7 +25,7 @@ <dependency> <groupId>edu.illinois.cs.cogcomp</groupId> <artifactId>illinois-core-utilities</artifactId> - <version>3.0.51</version> + <version>3.0.80</version> </dependency> <dependency> <groupId>edu.illinois.cs.cogcomp</groupId> diff --git a/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java index 406907433b96ca8ba3a0bde2a340df13fb2a3ee3..46ac20e9fea7c756a83808f34797ae6dbe1d10d4 100644 --- a/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java +++ b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiHookTest.java @@ -1,50 +1,289 @@ package edu.illinois.cs.cogcomp.infer.ilp; -import gurobi.*; import org.junit.Test; -import static org.junit.Assert.assertEquals; - +import static org.junit.Assert.assertTrue; public class GurobiHookTest { + @Test + public void testProgram1() throws Exception { + GurobiHook ojaHook = new GurobiHook(); + int[] varInds = new int[2]; + + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(-1.0); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, -3); + ojaHook.addLessThanConstraint(varInds, coefs, 4); + + ojaHook.setMaximize(false); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + assertTrue(ojaHook.objectiveValue() == -2.0); + assertTrue(ojaHook.getBooleanValue(0)); + assertTrue(ojaHook.getBooleanValue(1)); + } + + @Test + public void testProgram2() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[2]; + + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(-1.0); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, -3); + ojaHook.addLessThanConstraint(varInds, coefs, 4); + + ojaHook.setMaximize(true); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == 0); + assertTrue(!ojaHook.getBooleanValue(0)); + assertTrue(!ojaHook.getBooleanValue(1)); + } + @Test - public void testGurobi() throws GRBException { + public void testProgram3() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[2]; + + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(1.5); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, -3); + ojaHook.addLessThanConstraint(varInds, coefs, 4); + + ojaHook.setMaximize(true); + try { - GRBEnv env = new GRBEnv(); - GRBModel model = new GRBModel(env); + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } - // Create variables - GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "x"); - GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "y"); - GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB.BINARY, "z"); + ojaHook.printModelInfo(); - // Integrate new variables - model.update(); + assertTrue(ojaHook.objectiveValue() == 3); + assertTrue(ojaHook.getBooleanValue(0)); + assertTrue(ojaHook.getBooleanValue(1)); + } + + @Test + public void testProgram4() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[2]; - // Add constraint: x + 2 y + 3 z <= 4 - GRBLinExpr expr = new GRBLinExpr(); - expr.addTerm(1.0, x); - expr.addTerm(2.0, y); - expr.addTerm(3, z); - model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0"); + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(1.5); + varInds[i] = x; + i++; + } - // Add constraint: x + y >= 1 - expr = new GRBLinExpr(); - expr.addTerm(1.0, x); - expr.addTerm(1.0, y); - model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1"); + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, -3); + ojaHook.addLessThanConstraint(varInds, coefs, 4); - // Optimize model - model.optimize(); + ojaHook.setMaximize(false); - assertEquals("x", x.get(GRB.StringAttr.VarName)); - assertEquals(1.0, x.get(GRB.DoubleAttr.X), 0.0); - assertEquals(0.0, y.get(GRB.DoubleAttr.X), 0.0); - assertEquals(1.0, z.get(GRB.DoubleAttr.X), 0.0); - assertEquals(-3.0, model.get(GRB.DoubleAttr.ObjVal), 0.0); - } catch (UnsatisfiedLinkError e) { - System.out.println("\n\n**** GUROBI LICENSE NOT FOUND! SKIPPING THE TEST ****\n\n"); + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == 0); + assertTrue(!ojaHook.getBooleanValue(0)); + assertTrue(!ojaHook.getBooleanValue(1)); } -} + + @Test + public void testProgram5() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[2]; + + double[] objCoefs = {1.5, 2.5}; + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(objCoefs[i]); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, 1); + ojaHook.addLessThanConstraint(varInds, coefs, 4); + + ojaHook.setMaximize(true); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == 4); + assertTrue(ojaHook.getBooleanValue(0)); + assertTrue(ojaHook.getBooleanValue(1)); + } + + @Test + public void testProgram6() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[2]; + + double[] objCoefs = {1.5, 2.5}; + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(objCoefs[i]); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, 1); + ojaHook.addLessThanConstraint(varInds, coefs, 2); + + ojaHook.setMaximize(false); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == 1.5); + assertTrue(ojaHook.getBooleanValue(0)); + assertTrue(!ojaHook.getBooleanValue(1)); + } + + @Test + public void testProgram7() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[2]; + + double[] objCoefs = {1.5, 2.5}; + int i = 0; + while (i< 2) { + int x = ojaHook.addBooleanVariable(objCoefs[i]); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 2 }; + ojaHook.addGreaterThanConstraint(varInds, coefs, 1); + ojaHook.addLessThanConstraint(varInds, coefs, 2); + + ojaHook.setMaximize(true); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == 2.5); + assertTrue(!ojaHook.getBooleanValue(0)); + assertTrue(ojaHook.getBooleanValue(1)); + } + + @Test + public void testProgram8() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + int[] varInds = new int[3]; + + double[] objCoefs = {-1, -1, -1}; + int i = 0; + while (i< 3) { + int x = ojaHook.addBooleanVariable(objCoefs[i]); + varInds[i] = x; + i++; + } + + double[] coefs = { 1, 1, 1}; + ojaHook.addEqualityConstraint(varInds, coefs, 3); + ojaHook.setMaximize(true); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == -3); + assertTrue(ojaHook.getBooleanValue(0)); + assertTrue(ojaHook.getBooleanValue(1)); + assertTrue(ojaHook.getBooleanValue(2)); + } + + @Test + public void testProgram9() throws Exception { + OJalgoHook ojaHook = new OJalgoHook(); + + double[] objCoefs = {0, -1}; + ojaHook.addDiscreteVariable(objCoefs); + ojaHook.addDiscreteVariable(objCoefs); + ojaHook.addDiscreteVariable(objCoefs); + + double[] coefs = { 1, 1, 1}; + int[] varInds = {1, 3, 5}; + ojaHook.addEqualityConstraint(varInds, coefs, 3); + ojaHook.setMaximize(true); + + try { + ojaHook.solve(); + } catch (Exception e) { + e.printStackTrace(); + } + + ojaHook.printModelInfo(); + + assertTrue(ojaHook.objectiveValue() == -3); + assertTrue(!ojaHook.getBooleanValue(0)); + assertTrue(ojaHook.getBooleanValue(1)); + assertTrue(!ojaHook.getBooleanValue(2)); + assertTrue(ojaHook.getBooleanValue(3)); + assertTrue(!ojaHook.getBooleanValue(4)); + assertTrue(ojaHook.getBooleanValue(5)); + } + +} \ No newline at end of file diff --git a/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiTest.java b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4dc74e1990f4c481e51088d24dad9fbe0568ece8 --- /dev/null +++ b/src/test/java/edu/illinois/cs/cogcomp/infer/ilp/GurobiTest.java @@ -0,0 +1,50 @@ +package edu.illinois.cs.cogcomp.infer.ilp; + +import gurobi.*; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + + +public class GurobiTest { + + @Test + public void testGurobi() throws GRBException { + try { + GRBEnv env = new GRBEnv(); + GRBModel model = new GRBModel(env); + + // Create variables + GRBVar x = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "x"); + GRBVar y = model.addVar(0.0, 1.0, -1.0, GRB.BINARY, "y"); + GRBVar z = model.addVar(0.0, 1.0, -2.0, GRB.BINARY, "z"); + + // Integrate new variables + model.update(); + + // Add constraint: x + 2 y + 3 z <= 4 + GRBLinExpr expr = new GRBLinExpr(); + expr.addTerm(1.0, x); + expr.addTerm(2.0, y); + expr.addTerm(3, z); + model.addConstr(expr, GRB.LESS_EQUAL, 4.0, "c0"); + + // Add constraint: x + y >= 1 + expr = new GRBLinExpr(); + expr.addTerm(1.0, x); + expr.addTerm(1.0, y); + model.addConstr(expr, GRB.GREATER_EQUAL, 1.0, "c1"); + + // Optimize model + model.optimize(); + + assertEquals("x", x.get(GRB.StringAttr.VarName)); + assertEquals(1.0, x.get(GRB.DoubleAttr.X), 0.0); + assertEquals(0.0, y.get(GRB.DoubleAttr.X), 0.0); + assertEquals(1.0, z.get(GRB.DoubleAttr.X), 0.0); + assertEquals(-3.0, model.get(GRB.DoubleAttr.ObjVal), 0.0); + } catch (UnsatisfiedLinkError e) { + System.out.println("\n\n**** GUROBI LICENSE NOT FOUND! SKIPPING THE TEST ****\n\n"); + } + } +}