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 import java.util.Collection;
34
35 import org.sat4j.core.Vec;
36 import org.sat4j.core.VecInt;
37 import org.sat4j.pb.IPBSolver;
38 import org.sat4j.pb.OptToPBSATAdapter;
39 import org.sat4j.pb.PBSolverDecorator;
40 import org.sat4j.specs.IVec;
41 import org.sat4j.specs.IVecInt;
42
43 public class LexicoHelper<T, C> extends DependencyHelper<T, C> {
44
45 private final LexicoDecoratorPB lexico;
46
47 public LexicoHelper(IPBSolver solver) {
48 super(new OptToPBSATAdapter(new LexicoDecoratorPB(solver)));
49 this.lexico = (LexicoDecoratorPB) ((PBSolverDecorator) getSolver())
50 .decorated();
51 }
52
53 public LexicoHelper(IPBSolver solver, boolean explanationEnabled,
54 boolean canonicalOptFunctionEnabled) {
55 super(new OptToPBSATAdapter(new LexicoDecoratorPB(solver)),
56 explanationEnabled, canonicalOptFunctionEnabled);
57 this.lexico = (LexicoDecoratorPB) ((PBSolverDecorator) getSolver())
58 .decorated();
59 }
60
61 public LexicoHelper(IPBSolver solver, boolean explanationEnabled) {
62 super(new OptToPBSATAdapter(new LexicoDecoratorPB(solver)),
63 explanationEnabled);
64 this.lexico = (LexicoDecoratorPB) ((PBSolverDecorator) getSolver())
65 .decorated();
66 }
67
68 public void addCriterion(Collection<T> things) {
69 IVecInt literals = new VecInt(things.size());
70 for (T thing : things) {
71 literals.push(getIntValue(thing));
72 }
73 this.lexico.addCriterion(literals);
74 }
75
76 public void addWeightedCriterion(Collection<WeightedObject<T>> things) {
77 IVecInt literals = new VecInt(things.size());
78 IVec<BigInteger> coefs = new Vec<BigInteger>(things.size());
79 for (WeightedObject<T> wo : things) {
80 literals.push(getIntValue(wo.thing));
81 coefs.push(wo.getWeight());
82 }
83 this.lexico.addCriterion(literals, coefs);
84 }
85
86 public boolean isOptimal() {
87 return ((OptToPBSATAdapter) getSolver()).isOptimal();
88 }
89 }