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.specs.ContradictionException;
37 import org.sat4j.specs.IConstr;
38 import org.sat4j.specs.IGroupSolver;
39 import org.sat4j.specs.ISolver;
40 import org.sat4j.specs.IVecInt;
41
42 public class GroupClauseSelectorSolver<T extends ISolver> extends
43 AbstractClauseSelectorSolver<T> implements IGroupSolver {
44
45 private static final long serialVersionUID = 1L;
46
47 private final Map<Integer, Integer> varToHighLevel = new HashMap<Integer, Integer>();
48 private final Map<Integer, Integer> highLevelToVar = new HashMap<Integer, Integer>();
49
50 public GroupClauseSelectorSolver(T solver) {
51 super(solver);
52 }
53
54 public IConstr addControlableClause(IVecInt literals, int desc)
55 throws ContradictionException {
56 if (desc == 0) {
57 return super.addClause(literals);
58 }
59 Integer hlvar = this.highLevelToVar.get(desc);
60 if (hlvar == null) {
61 hlvar = createNewVar(literals);
62 this.highLevelToVar.put(desc, hlvar);
63 this.varToHighLevel.put(hlvar, desc);
64 }
65 literals.push(hlvar);
66 return super.addClause(literals);
67 }
68
69 public IConstr addNonControlableClause(IVecInt literals)
70 throws ContradictionException {
71 return super.addClause(literals);
72 }
73
74 public IConstr addClause(IVecInt literals, int desc)
75 throws ContradictionException {
76 return addControlableClause(literals, desc);
77 }
78
79 @Override
80 public Collection<Integer> getAddedVars() {
81 return varToHighLevel.keySet();
82 }
83
84 @Override
85 public int[] model() {
86 int[] fullmodel = super.modelWithInternalVariables();
87 if (fullmodel == null) {
88 return null;
89 }
90 int[] model = new int[fullmodel.length - this.varToHighLevel.size()];
91 int j = 0;
92 for (int element : fullmodel) {
93 if (this.varToHighLevel.get(Math.abs(element)) == null) {
94 model[j++] = element;
95 }
96 }
97 return model;
98 }
99
100 public Map<Integer, Integer> getVarToHighLevel() {
101 return varToHighLevel;
102 }
103
104 }