1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.sat4j.pb;
31
32 import static org.junit.Assert.assertTrue;
33
34 import java.math.BigInteger;
35
36 import org.junit.Test;
37 import org.sat4j.core.Vec;
38 import org.sat4j.core.VecInt;
39 import org.sat4j.specs.ContradictionException;
40 import org.sat4j.specs.IProblem;
41 import org.sat4j.specs.IVec;
42 import org.sat4j.specs.IVecInt;
43 import org.sat4j.specs.TimeoutException;
44
45 public class MikolasTest {
46 static boolean solve(PseudoOptDecorator optproblem) throws TimeoutException {
47 boolean isSatisfiable = false;
48
49 try {
50 while (optproblem.admitABetterSolution()) {
51 if (!isSatisfiable) {
52 if (optproblem.nonOptimalMeansSatisfiable()) {
53 if (optproblem.hasNoObjectiveFunction()) {
54 return true;
55 }
56 }
57 isSatisfiable = true;
58 }
59 optproblem.discardCurrentSolution();
60 }
61 } catch (ContradictionException ex) {
62 assertTrue(isSatisfiable);
63 }
64 return isSatisfiable;
65 }
66
67 public static IVecInt vector(int... ls) {
68 return new VecInt(ls);
69 }
70
71 public static IVec<BigInteger> constant_vector(final BigInteger value,
72 int sz) {
73 IVec<BigInteger> ones = new Vec<BigInteger>(sz);
74 for (int index = 0; index < sz; ++index) {
75 ones.push(value);
76 }
77 return ones;
78 }
79
80 public static void print_model(IProblem solver) {
81 for (int index = 1; index <= solver.nVars(); ++index) {
82 System.err.print((solver.model(index) ? "+" : "-") + index + " ");
83 }
84 }
85
86 @Test
87 public void testLexicoOptimizationWithPseudoOptDecorator()
88 throws ContradictionException, TimeoutException {
89 PseudoOptDecorator solver = new PseudoOptDecorator(
90 org.sat4j.pb.SolverFactory.newDefault());
91 solver.newVar(8);
92 solver.setObjectiveFunction(new ObjectiveFunction(vector(6, 7, 8),
93 constant_vector(BigInteger.valueOf(-1), 3)));
94 System.err.println(solver.getObjectiveFunction());
95
96 solver.addClause(vector(-3, 6));
97 solver.addClause(vector(-1, -6));
98 solver.addClause(vector(-4, 7));
99 solver.addClause(vector(1, -7));
100 solver.addClause(vector(-5, 8));
101 solver.addClause(vector(-2, -8));
102
103
104 solver.addClause(vector(1, 2, 3));
105 assertTrue(solve(solver));
106 print_model(solver);
107 System.err.println();
108 solver.addClause(vector(1));
109 assertTrue(solve(solver));
110 }
111
112 }