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  }