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.maxsat;
31
32 import static org.junit.Assert.assertEquals;
33
34 import org.junit.Test;
35 import org.sat4j.core.VecInt;
36 import org.sat4j.pb.PseudoOptDecorator;
37 import org.sat4j.specs.ContradictionException;
38 import org.sat4j.specs.IOptimizationProblem;
39 import org.sat4j.specs.IProblem;
40 import org.sat4j.specs.TimeoutException;
41 import org.sat4j.tools.OptToSatAdapter;
42
43 public class MichalBug {
44
45 @Test
46 public void testMichalReportedProblem() throws ContradictionException,
47 TimeoutException {
48 WeightedMaxSatDecorator maxSATSolver = new WeightedMaxSatDecorator(
49 SolverFactory.newLight());
50
51 final int OPTIMUM_FOUND = 0;
52 final int UNSATISFIABLE = 1;
53
54 maxSATSolver.newVar(2);
55 maxSATSolver.setExpectedNumberOfClauses(4);
56
57 int[] clause_1 = { 1, 1, 2 };
58 maxSATSolver.addClause(new VecInt(clause_1));
59
60 int[] clause_2 = { 100, -1, -2 };
61 maxSATSolver.addClause(new VecInt(clause_2));
62
63 int[] clause_3 = { 1000, 1, -2 };
64 maxSATSolver.addClause(new VecInt(clause_3));
65
66 int[] clause_4 = { 100000, -1, 2 };
67 maxSATSolver.addClause(new VecInt(clause_4));
68
69 IOptimizationProblem problem = new PseudoOptDecorator(maxSATSolver);
70
71 int exitCode = UNSATISFIABLE;
72 boolean isSatisfiable = false;
73 try {
74 while (problem.admitABetterSolution()) {
75 isSatisfiable = true;
76 problem.discardCurrentSolution();
77 }
78 if (isSatisfiable) {
79 exitCode = OPTIMUM_FOUND;
80 } else {
81 exitCode = UNSATISFIABLE;
82 }
83 } catch (ContradictionException ex) {
84 assert isSatisfiable;
85 exitCode = OPTIMUM_FOUND;
86 }
87
88 assertEquals(OPTIMUM_FOUND, exitCode);
89 int[] model = problem.model();
90 assertEquals(2, model.length);
91 assertEquals(-1, model[0]);
92 assertEquals(-2, model[1]);
93 }
94
95 @Test
96 public void testMichalWithOptAdapter() throws ContradictionException,
97 TimeoutException {
98 WeightedMaxSatDecorator maxSATSolver = new WeightedMaxSatDecorator(
99 SolverFactory.newLight());
100
101 maxSATSolver.newVar(2);
102 maxSATSolver.setExpectedNumberOfClauses(4);
103
104 int[] clause_1 = { 1, 1, 2 };
105 maxSATSolver.addClause(new VecInt(clause_1));
106
107 int[] clause_2 = { 100, -1, -2 };
108 maxSATSolver.addClause(new VecInt(clause_2));
109
110 int[] clause_3 = { 1000, 1, -2 };
111 maxSATSolver.addClause(new VecInt(clause_3));
112
113 int[] clause_4 = { 100000, -1, 2 };
114 maxSATSolver.addClause(new VecInt(clause_4));
115
116 IProblem problem = new OptToSatAdapter(new PseudoOptDecorator(
117 maxSATSolver));
118
119 boolean isSatisfiable = problem.isSatisfiable();
120
121 assertEquals(true, isSatisfiable);
122 int[] model = problem.model();
123 assertEquals(2, model.length);
124 assertEquals(-1, model[0]);
125 assertEquals(-2, model[1]);
126 }
127 }