View Javadoc

1   /*******************************************************************************
2   * SAT4J: a SATisfiability library for Java Copyright (C) 2004-2008 Daniel Le Berre
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  *******************************************************************************/
28  package org.sat4j.tools;
29  
30  import org.sat4j.specs.ContradictionException;
31  import org.sat4j.specs.IOptimizationProblem;
32  import org.sat4j.specs.ISolver;
33  import org.sat4j.specs.IVecInt;
34  import org.sat4j.specs.TimeoutException;
35  
36  public class OptToSatAdapter extends SolverDecorator<ISolver> {
37  
38      /**
39       * 
40       */
41      private static final long serialVersionUID = 1L;
42  
43      IOptimizationProblem problem;
44  
45      boolean modelComputed = false;
46      
47      public OptToSatAdapter(IOptimizationProblem problem) {
48          super((ISolver) problem);
49          this.problem = problem;
50      }
51  
52      @Override
53      public boolean isSatisfiable() throws TimeoutException {
54          modelComputed = false;
55          return problem.admitABetterSolution();
56      }
57  
58      @Override
59      public boolean isSatisfiable(boolean global) throws TimeoutException {
60          throw new UnsupportedOperationException();
61      }
62  
63      @Override
64      public boolean isSatisfiable(IVecInt assumps, boolean global)
65              throws TimeoutException {
66          throw new UnsupportedOperationException();
67      }
68  
69      @Override
70      public boolean isSatisfiable(IVecInt assumps) throws TimeoutException {
71          throw new UnsupportedOperationException();
72      }
73  
74      @Override
75      public int[] model() {
76      	if (modelComputed)
77      		return problem.model();
78      	
79          try {
80              assert problem.admitABetterSolution();
81              do {
82                  problem.calculateObjective();
83                  problem.discard();
84              } while (problem.admitABetterSolution());
85          } catch (TimeoutException e) {
86              // solver timeout 
87          } catch (ContradictionException e) {
88              // OK, optimal model found
89          }
90          modelComputed = true;
91          return problem.model();
92      }
93  
94      @Override
95      public boolean model(int var) {
96      	if (!modelComputed)
97      		model();
98          return problem.model(var);
99      }
100 
101     @Override
102     public String toString(String prefix) {        
103         return prefix+"Optimization to SAT adapter\n"+super.toString(prefix);
104     }
105 }