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 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 = nborigvars + ++nbnewvar;
63 lits.push(newvar);
64 literals.push(newvar);
65 return super.addClause(literals);
66 }
67
68 @Override
69 public void reset() {
70 nbnewvar = 0;
71 lits.clear();
72 super.reset();
73 prevConstr = null;
74 }
75
76 public boolean hasNoObjectiveFunction() {
77 return false;
78 }
79
80 public boolean nonOptimalMeansSatisfiable() {
81 return false;
82 }
83
84 public Number calculateObjective() {
85 calculateObjectiveValue();
86 return counter;
87 }
88
89 private final IVecInt lits = new VecInt();
90
91 private int counter;
92
93 private IConstr prevConstr;
94
95
96
97
98 public void discardCurrentSolution() throws ContradictionException {
99 if (prevConstr != null) {
100 super.removeSubsumedConstr(prevConstr);
101 }
102 prevConstr = super.addAtMost(lits, counter - 1);
103 }
104
105 @Override
106 public boolean admitABetterSolution(IVecInt assumps)
107 throws TimeoutException {
108
109 boolean result = super.admitABetterSolution(assumps);
110 if (!result) {
111 if (prevConstr != null) {
112 super.removeConstr(prevConstr);
113 prevConstr = null;
114 }
115 }
116 return result;
117 }
118
119 public void discard() throws ContradictionException {
120 discardCurrentSolution();
121 }
122
123
124
125
126 public Number getObjectiveValue() {
127 return counter;
128 }
129
130 @Override
131 void calculateObjectiveValue() {
132 counter = 0;
133 for (int q : prevfullmodel) {
134 if (q > nborigvars) {
135 counter++;
136 }
137 }
138 }
139
140
141
142
143 public void forceObjectiveValueTo(Number forcedValue)
144 throws ContradictionException {
145 super.addAtMost(lits, forcedValue.intValue());
146 }
147
148 }