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 package org.sat4j.opt;
29
30 import org.sat4j.core.VecInt;
31 import org.sat4j.specs.ContradictionException;
32 import org.sat4j.specs.IConstr;
33 import org.sat4j.specs.ISolver;
34 import org.sat4j.specs.IVecInt;
35 import org.sat4j.specs.TimeoutException;
36
37
38
39
40
41
42
43 public final class MaxSatDecorator extends AbstractSelectorVariablesDecorator {
44
45
46
47
48 private static final long serialVersionUID = 1L;
49
50 public MaxSatDecorator(ISolver solver) {
51 super(solver);
52 }
53
54 @Override
55 public void setExpectedNumberOfClauses(int nb) {
56 super.setExpectedNumberOfClauses(nb);
57 lits.ensure(nb);
58 }
59
60 @Override
61 public IConstr addClause(IVecInt literals) throws ContradictionException {
62 int newvar = nextFreeVarId(true);
63 lits.push(newvar);
64 literals.push(newvar);
65 return super.addClause(literals);
66 }
67
68 @Override
69 public void reset() {
70 lits.clear();
71 super.reset();
72 prevConstr = null;
73 }
74
75 public boolean hasNoObjectiveFunction() {
76 return false;
77 }
78
79 public boolean nonOptimalMeansSatisfiable() {
80 return false;
81 }
82
83 public Number calculateObjective() {
84 calculateObjectiveValue();
85 return counter;
86 }
87
88 private final IVecInt lits = new VecInt();
89
90 private int counter;
91
92 private IConstr prevConstr;
93
94
95
96
97 public void discardCurrentSolution() throws ContradictionException {
98 if (prevConstr != null) {
99 super.removeSubsumedConstr(prevConstr);
100 }
101 try {
102 prevConstr = super.addAtMost(lits, counter - 1);
103 } catch (ContradictionException ce) {
104 isSolutionOptimal = true;
105 throw ce;
106 }
107 }
108
109 @Override
110 public boolean admitABetterSolution(IVecInt assumps)
111 throws TimeoutException {
112
113 boolean result = super.admitABetterSolution(assumps);
114 if (!result) {
115 if (prevConstr != null) {
116 super.removeConstr(prevConstr);
117 prevConstr = null;
118 }
119 }
120 return result;
121 }
122
123 public void discard() throws ContradictionException {
124 discardCurrentSolution();
125 }
126
127
128
129
130 public Number getObjectiveValue() {
131 return counter;
132 }
133
134 @Override
135 void calculateObjectiveValue() {
136 counter = 0;
137 for (int q : prevfullmodel) {
138 if (q > nVars()) {
139 counter++;
140 }
141 }
142 }
143
144
145
146
147 public void forceObjectiveValueTo(Number forcedValue)
148 throws ContradictionException {
149 super.addAtMost(lits, forcedValue.intValue());
150 }
151
152 }