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.Collection;
33 import java.util.HashMap;
34 import java.util.Map;
35
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
42 public class FullClauseSelectorSolver<T extends ISolver> extends
43 AbstractClauseSelectorSolver<T> {
44
45
46
47
48 private static final long serialVersionUID = 1L;
49 private final Map<Integer, IConstr> constrs = new HashMap<Integer, IConstr>();
50 private final IVecInt lastClause = new VecInt();
51 private IConstr lastConstr;
52 private final boolean skipDuplicatedEntries;
53
54 public FullClauseSelectorSolver(T solver, boolean skipDuplicatedEntries) {
55 super(solver);
56 this.skipDuplicatedEntries = skipDuplicatedEntries;
57 }
58
59 public IConstr addControlableClause(IVecInt literals)
60 throws ContradictionException {
61 if (this.skipDuplicatedEntries) {
62 if (literals.equals(this.lastClause)) {
63 return null;
64 }
65 this.lastClause.clear();
66 literals.copyTo(this.lastClause);
67 }
68 int newvar = createNewVar(literals);
69 literals.push(newvar);
70 this.lastConstr = super.addClause(literals);
71 if (this.lastConstr == null) {
72 discardLastestVar();
73 } else {
74 this.constrs.put(newvar, this.lastConstr);
75 }
76 return this.lastConstr;
77 }
78
79 public IConstr addNonControlableClause(IVecInt literals)
80 throws ContradictionException {
81 return super.addClause(literals);
82 }
83
84 @Override
85 public IConstr addClause(IVecInt literals) throws ContradictionException {
86 return addControlableClause(literals);
87 }
88
89 @Override
90 public int[] model() {
91 int[] fullmodel = super.modelWithInternalVariables();
92 if (fullmodel == null) {
93 return null;
94 }
95 int[] model = new int[fullmodel.length - this.constrs.size()];
96 int j = 0;
97 for (int element : fullmodel) {
98 if (this.constrs.get(Math.abs(element)) == null) {
99 model[j++] = element;
100 }
101 }
102 return model;
103 }
104
105
106
107
108
109 public Collection<IConstr> getConstraints() {
110 return this.constrs.values();
111 }
112
113 @Override
114 public Collection<Integer> getAddedVars() {
115 return this.constrs.keySet();
116 }
117
118 public IConstr getLastConstr() {
119 return lastConstr;
120 }
121
122 public void setLastConstr(IConstr lastConstr) {
123 this.lastConstr = lastConstr;
124 }
125
126 public Map<Integer, IConstr> getConstrs() {
127 return constrs;
128 }
129
130 public IVecInt getLastClause() {
131 return lastClause;
132 }
133
134 public boolean isSkipDuplicatedEntries() {
135 return skipDuplicatedEntries;
136 }
137
138 }