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.assertEquals;
33 import static org.junit.Assert.assertTrue;
34
35 import java.math.BigInteger;
36
37 import org.junit.Test;
38 import org.sat4j.core.Vec;
39 import org.sat4j.core.VecInt;
40 import org.sat4j.specs.ContradictionException;
41 import org.sat4j.specs.IVec;
42 import org.sat4j.specs.IVecInt;
43 import org.sat4j.specs.TimeoutException;
44 import org.sat4j.tools.RemiUtils;
45
46 public class BugSAT16 {
47
48 @Test
49 public void testCNFCase() throws ContradictionException, TimeoutException {
50
51 IPBSolver solver = SolverFactory.newDefault();
52
53
54 solver.addClause(transform1(new int[] { 6 }));
55
56
57 solver.addClause(transform1(new int[] { 6, -5 }));
58
59
60 solver.addClause(transform1(new int[] { -6, 5 }));
61
62
63 solver.addClause(transform1(new int[] { 6, -4 }));
64
65
66 solver.addClause(transform1(new int[] { -6, 4 }));
67
68
69 solver.addClause(transform1(new int[] { 4, -2, -1 }));
70
71
72 solver.addClause(transform1(new int[] { -4, 2, 1 }));
73
74 IVecInt backbone = RemiUtils.backbone(solver);
75 assertEquals(3, backbone.size());
76 assertTrue(backbone.contains(6));
77 assertTrue(backbone.contains(5));
78 assertTrue(backbone.contains(4));
79 }
80
81 @Test
82 public void testPBCase() throws ContradictionException, TimeoutException {
83
84 IPBSolver solver = SolverFactory.newDefault();
85
86
87 solver.addPseudoBoolean(transform1(new int[] { 6 }),
88 transform2(new int[] { 1 }), true, BigInteger.valueOf(1));
89
90
91 solver.addPseudoBoolean(transform1(new int[] { 6, -5 }),
92 transform2(new int[] { 1, 1 }), true, BigInteger.valueOf(1));
93
94
95 solver.addPseudoBoolean(transform1(new int[] { -6, 5 }),
96 transform2(new int[] { 1, 1 }), true, BigInteger.valueOf(1));
97
98
99 solver.addPseudoBoolean(transform1(new int[] { 6, -4 }),
100 transform2(new int[] { 1, 1 }), true, BigInteger.valueOf(1));
101
102
103 solver.addPseudoBoolean(transform1(new int[] { -6, 4 }),
104 transform2(new int[] { 1, 1 }), true, BigInteger.valueOf(1));
105
106
107 solver.addPseudoBoolean(transform1(new int[] { 4, -2, -1 }),
108 transform2(new int[] { 1, 1, 1 }), true, BigInteger.valueOf(2));
109
110
111 solver.addPseudoBoolean(transform1(new int[] { -4, 2, 1 }),
112 transform2(new int[] { 1, 1, 1 }), true, BigInteger.valueOf(1));
113
114 IVecInt backbone = RemiUtils.backbone(solver);
115 assertEquals(3, backbone.size());
116 assertTrue(backbone.contains(6));
117 assertTrue(backbone.contains(5));
118 assertTrue(backbone.contains(4));
119 }
120
121 static IVecInt transform1(int[] intArray) {
122 return new VecInt(intArray);
123 }
124
125 static IVec<BigInteger> transform2(int[] intArray) {
126 BigInteger[] result = new BigInteger[intArray.length];
127 for (int i = 0; i < intArray.length; i++) {
128 result[i] = BigInteger.valueOf(intArray[i]);
129 }
130 return new Vec<BigInteger>(result);
131 }
132 }