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.tools;
31
32 import java.util.ArrayList;
33 import java.util.Collection;
34
35 import org.sat4j.core.ConstrGroup;
36 import org.sat4j.core.VecInt;
37 import org.sat4j.specs.ContradictionException;
38 import org.sat4j.specs.IConstr;
39 import org.sat4j.specs.ISolver;
40 import org.sat4j.specs.IVecInt;
41 import org.sat4j.specs.IteratorInt;
42 import org.sat4j.specs.TimeoutException;
43
44
45
46
47
48
49
50
51 public class NegationDecorator<T extends ISolver> extends
52 AbstractClauseSelectorSolver<T> {
53
54
55
56
57 private static final long serialVersionUID = 1L;
58
59 private final Collection<Integer> addedVars = new ArrayList<Integer>();
60
61 public NegationDecorator(T decorated) {
62 super(decorated);
63 internalState();
64 }
65
66 @Override
67 public IConstr addClause(IVecInt literals) throws ContradictionException {
68 int newVar = createNewVar(literals);
69 IVecInt clause = new VecInt(2);
70 clause.push(newVar);
71 ConstrGroup group = new ConstrGroup();
72 for (IteratorInt it = literals.iterator(); it.hasNext();) {
73 clause.push(-it.next());
74 group.add(super.addClause(clause));
75 clause.pop();
76 }
77 addedVars.add(newVar);
78 return group;
79 }
80
81 @Override
82 public IConstr addAtMost(IVecInt literals, int degree)
83 throws ContradictionException {
84 throw new UnsupportedOperationException("Not implemented yet!");
85 }
86
87 @Override
88 public IConstr addAtLeast(IVecInt literals, int degree)
89 throws ContradictionException {
90 throw new UnsupportedOperationException("Not implemented yet!");
91 }
92
93 @Override
94 public IConstr addExactly(IVecInt literals, int n)
95 throws ContradictionException {
96 throw new UnsupportedOperationException("Not implemented yet!");
97 }
98
99 @Override
100 public boolean isSatisfiable(IVecInt assumps, boolean global)
101 throws TimeoutException {
102 IVecInt vars = new VecInt();
103 for (int var : getAddedVars()) {
104 vars.push(var);
105 }
106 try {
107 IConstr constr = super.addClause(vars);
108 boolean returnValue;
109 try {
110 returnValue = super.isSatisfiable(assumps, global);
111 } finally {
112 removeConstr(constr);
113 }
114 return returnValue;
115 } catch (ContradictionException e) {
116 return false;
117 }
118
119 }
120
121 @Override
122 public Collection<Integer> getAddedVars() {
123 return addedVars;
124 }
125
126 }