2015-01-31 12:12:57 +00:00
|
|
|
package no.birkett.kiwi;
|
|
|
|
|
|
|
|
import org.junit.Test;
|
|
|
|
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
|
|
|
|
|
|
|
|
public class Tests {
|
|
|
|
|
|
|
|
private static double EPSILON = 1.0e-8;
|
|
|
|
|
|
|
|
@Test
|
2015-02-01 19:45:20 +00:00
|
|
|
public void simpleNew() throws UnsatisfiableConstraintException, DuplicateConstraintException {
|
2015-01-31 12:12:57 +00:00
|
|
|
Solver solver = new Solver();
|
|
|
|
Variable x = new Variable("x");
|
|
|
|
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.equals(Symbolics.add(x, 2), 20));
|
2015-02-01 19:45:20 +00:00
|
|
|
|
|
|
|
solver.updateVariables();
|
|
|
|
|
|
|
|
assertEquals(x.getValue(), 18, EPSILON);
|
|
|
|
}
|
2016-01-30 11:48:21 +00:00
|
|
|
|
2015-02-01 19:45:20 +00:00
|
|
|
@Test
|
|
|
|
public void simple0() throws UnsatisfiableConstraintException, DuplicateConstraintException {
|
|
|
|
Solver solver = new Solver();
|
|
|
|
Variable x = new Variable("x");
|
|
|
|
Variable y = new Variable("y");
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2015-02-01 19:45:20 +00:00
|
|
|
solver.addConstraint(Symbolics.equals(x, 20));
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.equals(Symbolics.add(x, 2), Symbolics.add(y, 10)));
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.updateVariables();
|
2016-01-30 11:48:21 +00:00
|
|
|
|
2015-02-01 19:45:20 +00:00
|
|
|
System.out.println("x " + x.getValue() + " y " + y.getValue());
|
|
|
|
|
|
|
|
assertEquals(y.getValue(), 12, EPSILON);
|
|
|
|
assertEquals(x.getValue(), 20, EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
}
|
2016-01-30 11:48:21 +00:00
|
|
|
|
2015-02-01 19:45:20 +00:00
|
|
|
@Test
|
|
|
|
public void simple1() throws DuplicateConstraintException, UnsatisfiableConstraintException {
|
|
|
|
Variable x = new Variable("x");
|
|
|
|
Variable y = new Variable("y");
|
|
|
|
Solver solver = new Solver();
|
|
|
|
solver.addConstraint(Symbolics.equals(x, y));
|
|
|
|
solver.updateVariables();
|
|
|
|
assertEquals(x.getValue(), y.getValue(), EPSILON);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
|
|
|
public void casso1() throws DuplicateConstraintException, UnsatisfiableConstraintException {
|
|
|
|
Variable x = new Variable("x");
|
|
|
|
Variable y = new Variable("y");
|
2015-01-31 12:12:57 +00:00
|
|
|
Solver solver = new Solver();
|
|
|
|
|
2015-02-01 19:45:20 +00:00
|
|
|
solver.addConstraint(Symbolics.lessThanOrEqualTo(x, y));
|
|
|
|
solver.addConstraint(Symbolics.equals(y, Symbolics.add(x, 3.0)));
|
|
|
|
solver.addConstraint(Symbolics.equals(x, 10.0).setStrength(Strength.WEAK));
|
|
|
|
solver.addConstraint(Symbolics.equals(y, 10.0).setStrength(Strength.WEAK));
|
|
|
|
|
|
|
|
solver.updateVariables();
|
2016-01-30 11:48:21 +00:00
|
|
|
|
2015-02-01 19:45:20 +00:00
|
|
|
if (Math.abs(x.getValue() - 10.0) < EPSILON) {
|
|
|
|
assertEquals(10, x.getValue(), EPSILON);
|
|
|
|
assertEquals(13, y.getValue(), EPSILON);
|
|
|
|
} else {
|
|
|
|
assertEquals(7, x.getValue(), EPSILON);
|
|
|
|
assertEquals(10, y.getValue(), EPSILON);
|
|
|
|
}
|
2015-01-31 12:12:57 +00:00
|
|
|
}
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
@Test
|
|
|
|
public void addDelete1() throws DuplicateConstraintException, UnsatisfiableConstraintException, UnknownConstraintException {
|
2015-01-31 12:12:57 +00:00
|
|
|
Variable x = new Variable("x");
|
|
|
|
Solver solver = new Solver();
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.lessThanOrEqualTo(x, 100).setStrength(Strength.WEAK));
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
|
|
|
assertEquals(100, x.getValue(), EPSILON);
|
|
|
|
|
|
|
|
Constraint c10 = Symbolics.lessThanOrEqualTo(x, 10.0);
|
|
|
|
Constraint c20 = Symbolics.lessThanOrEqualTo(x, 20.0);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.addConstraint(c10);
|
|
|
|
solver.addConstraint(c20);
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
|
|
|
|
|
|
|
assertEquals(10, x.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.removeConstraint(c10);
|
2016-01-30 11:48:21 +00:00
|
|
|
|
|
|
|
solver.updateVariables();
|
|
|
|
|
|
|
|
assertEquals(20, x.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.removeConstraint(c20);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
assertEquals(100, x.getValue(), EPSILON);
|
|
|
|
|
|
|
|
Constraint c10again = Symbolics.lessThanOrEqualTo(x, 10.0);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.addConstraint(c10again);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(c10);
|
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
assertEquals(10, x.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.removeConstraint(c10);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
|
|
|
assertEquals(10, x.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.removeConstraint(c10again);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
|
|
|
assertEquals(100, x.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Test
|
2016-01-30 11:48:21 +00:00
|
|
|
public void addDelete2() throws DuplicateConstraintException, UnsatisfiableConstraintException, UnknownConstraintException {
|
2015-01-31 12:12:57 +00:00
|
|
|
Variable x = new Variable("x");
|
|
|
|
Variable y = new Variable("y");
|
|
|
|
Solver solver = new Solver();
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.equals(x, 100).setStrength(Strength.WEAK));
|
|
|
|
solver.addConstraint(Symbolics.equals(y, 120).setStrength(Strength.STRONG));
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
Constraint c10 = Symbolics.lessThanOrEqualTo(x, 10.0);
|
|
|
|
Constraint c20 = Symbolics.lessThanOrEqualTo(x, 20.0);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.addConstraint(c10);
|
|
|
|
solver.addConstraint(c20);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
assertEquals(10, x.getValue(), EPSILON);
|
|
|
|
assertEquals(120, y.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.removeConstraint(c10);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
assertEquals(20, x.getValue(), EPSILON);
|
|
|
|
assertEquals(120, y.getValue(), EPSILON);
|
|
|
|
|
|
|
|
Constraint cxy = Symbolics.equals(Symbolics.multiply(x, 2.0), y);
|
2015-01-31 12:12:57 +00:00
|
|
|
solver.addConstraint(cxy);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
|
|
|
|
|
|
|
assertEquals(20, x.getValue(), EPSILON);
|
|
|
|
assertEquals(40, y.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
solver.removeConstraint(c20);
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
assertEquals(60, x.getValue(), EPSILON);
|
|
|
|
assertEquals(120, y.getValue(), EPSILON);
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.removeConstraint(cxy);
|
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
assertEquals(100, x.getValue(), EPSILON);
|
|
|
|
assertEquals(120, y.getValue(), EPSILON);
|
|
|
|
}
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
@Test(expected = UnsatisfiableConstraintException.class)
|
|
|
|
public void inconsistent1() throws InternalError, DuplicateConstraintException, UnsatisfiableConstraintException {
|
2015-01-31 12:12:57 +00:00
|
|
|
Variable x = new Variable("x");
|
|
|
|
Solver solver = new Solver();
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.equals(x, 10.0));
|
|
|
|
solver.addConstraint(Symbolics.equals(x, 5.0));
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.updateVariables();
|
|
|
|
}
|
2015-01-31 12:12:57 +00:00
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
@Test(expected = UnsatisfiableConstraintException.class)
|
|
|
|
public void inconsistent2() throws DuplicateConstraintException, UnsatisfiableConstraintException {
|
2015-01-31 12:12:57 +00:00
|
|
|
Variable x = new Variable("x");
|
|
|
|
Solver solver = new Solver();
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.greaterThanOrEqualTo(x, 10.0));
|
|
|
|
solver.addConstraint(Symbolics.lessThanOrEqualTo(x, 5.0));
|
|
|
|
solver.updateVariables();
|
2015-01-31 12:12:57 +00:00
|
|
|
}
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
@Test(expected = UnsatisfiableConstraintException.class)
|
|
|
|
public void inconsistent3() throws DuplicateConstraintException, UnsatisfiableConstraintException {
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
Variable w = new Variable("w");
|
|
|
|
Variable x = new Variable("x");
|
|
|
|
Variable y = new Variable("y");
|
|
|
|
Variable z = new Variable("z");
|
|
|
|
Solver solver = new Solver();
|
|
|
|
|
2016-01-30 11:48:21 +00:00
|
|
|
solver.addConstraint(Symbolics.greaterThanOrEqualTo(w, 10.0));
|
|
|
|
solver.addConstraint(Symbolics.greaterThanOrEqualTo(x, w));
|
|
|
|
solver.addConstraint(Symbolics.greaterThanOrEqualTo(y, x));
|
|
|
|
solver.addConstraint(Symbolics.greaterThanOrEqualTo(z, y));
|
|
|
|
solver.addConstraint(Symbolics.greaterThanOrEqualTo(z, 8.0));
|
|
|
|
solver.addConstraint(Symbolics.lessThanOrEqualTo(z, 4.0));
|
|
|
|
solver.updateVariables();
|
|
|
|
}
|
2015-01-31 12:12:57 +00:00
|
|
|
|
|
|
|
}
|