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.pb.tools;
31
32 import java.math.BigInteger;
33
34 import org.sat4j.ILauncherMode;
35 import org.sat4j.pb.IPBSolverService;
36 import org.sat4j.pb.ObjectiveFunction;
37 import org.sat4j.specs.IConstr;
38 import org.sat4j.specs.Lbool;
39 import org.sat4j.specs.RandomAccessModel;
40 import org.sat4j.tools.SearchListenerAdapter;
41 import org.sat4j.tools.SolutionFoundListener;
42
43 public final class SearchOptimizerListener extends
44 SearchListenerAdapter<IPBSolverService> {
45
46
47
48
49 private static final long serialVersionUID = 1L;
50
51 private IPBSolverService solverService;
52
53 private ObjectiveFunction obj;
54
55 private final SolutionFoundListener sfl;
56
57 private BigInteger currentValue;
58
59 private IConstr prevConstr = null;
60
61 public SearchOptimizerListener(SolutionFoundListener sfl) {
62 this.sfl = sfl;
63 }
64
65 @Override
66 public void init(IPBSolverService solverService) {
67 this.obj = solverService.getObjectiveFunction();
68 this.solverService = solverService;
69 this.currentValue = null;
70 this.prevConstr = null;
71 }
72
73 @Override
74 public void solutionFound(int[] model, RandomAccessModel lazyModel) {
75 if (obj != null) {
76 this.currentValue = obj.calculateDegree(lazyModel);
77 System.out.println(ILauncherMode.CURRENT_OPTIMUM_VALUE_PREFIX
78 + this.currentValue);
79 if (this.prevConstr != null) {
80 this.solverService.removeSubsumedConstr(prevConstr);
81 }
82 this.prevConstr = this.solverService.addAtMostOnTheFly(
83 obj.getVars(), obj.getCoeffs(),
84 this.currentValue.subtract(BigInteger.ONE));
85 }
86 sfl.onSolutionFound(model);
87 }
88
89 @Override
90 public void end(Lbool result) {
91 if (result == Lbool.FALSE) {
92 sfl.onUnsatTermination();
93 System.out.println(solverService.getLogPrefix()
94 + "objective function=" + currentValue);
95 }
96 }
97
98 @Override
99 public String toString() {
100 return "Internal optimizer search listener";
101 }
102 }