View Javadoc

1   /*******************************************************************************
2    * SAT4J: a SATisfiability library for Java Copyright (C) 2004, 2012 Artois University and CNRS
3    *
4    * All rights reserved. This program and the accompanying materials
5    * are made available under the terms of the Eclipse Public License v1.0
6    * which accompanies this distribution, and is available at
7    *  http://www.eclipse.org/legal/epl-v10.html
8    *
9    * Alternatively, the contents of this file may be used under the terms of
10   * either the GNU Lesser General Public License Version 2.1 or later (the
11   * "LGPL"), in which case the provisions of the LGPL are applicable instead
12   * of those above. If you wish to allow use of your version of this file only
13   * under the terms of the LGPL, and not to allow others to use your version of
14   * this file under the terms of the EPL, indicate your decision by deleting
15   * the provisions above and replace them with the notice and other provisions
16   * required by the LGPL. If you do not delete the provisions above, a recipient
17   * may use your version of this file under the terms of the EPL or the LGPL.
18   *
19   * Based on the original MiniSat specification from:
20   *
21   * An extensible SAT solver. Niklas Een and Niklas Sorensson. Proceedings of the
22   * Sixth International Conference on Theory and Applications of Satisfiability
23   * Testing, LNCS 2919, pp 502-518, 2003.
24   *
25   * See www.minisat.se for the original solver in C++.
26   *
27   * Contributors:
28   *   CRIL - initial API and implementation
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  }