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.tools;
31  
32  import org.sat4j.specs.ContradictionException;
33  import org.sat4j.specs.IOptimizationProblem;
34  import org.sat4j.specs.ISolver;
35  import org.sat4j.specs.IVecInt;
36  import org.sat4j.specs.TimeoutException;
37  
38  public class OptToSatAdapter extends SolverDecorator<ISolver> {
39  
40      /**
41       * 
42       */
43      private static final long serialVersionUID = 1L;
44  
45      IOptimizationProblem problem;
46  
47      boolean modelComputed = false;
48      boolean optimalValueForced = false;
49  
50      public OptToSatAdapter(IOptimizationProblem problem) {
51          super((ISolver) problem);
52          this.problem = problem;
53      }
54  
55      @Override
56      public boolean isSatisfiable() throws TimeoutException {
57          this.modelComputed = false;
58          return this.problem.admitABetterSolution();
59      }
60  
61      @Override
62      public void reset() {
63          super.reset();
64          this.optimalValueForced = false;
65      }
66  
67      @Override
68      public boolean isSatisfiable(boolean global) throws TimeoutException {
69          this.modelComputed = false;
70          return this.problem.admitABetterSolution();
71      }
72  
73      @Override
74      public boolean isSatisfiable(IVecInt assumps, boolean global)
75              throws TimeoutException {
76          throw new UnsupportedOperationException();
77      }
78  
79      @Override
80      public boolean isSatisfiable(IVecInt assumps) throws TimeoutException {
81          throw new UnsupportedOperationException();
82      }
83  
84      @Override
85      public int[] model() {
86          if (this.modelComputed) {
87              return this.problem.model();
88          }
89  
90          try {
91              assert this.problem.admitABetterSolution();
92              do {
93                  this.problem.discardCurrentSolution();
94              } while (this.problem.admitABetterSolution());
95              if (!this.optimalValueForced) {
96                  try {
97                      this.problem.forceObjectiveValueTo(this.problem
98                              .getObjectiveValue());
99                  } catch (ContradictionException e1) {
100                     throw new IllegalStateException();
101                 }
102                 this.optimalValueForced = true;
103             }
104         } catch (TimeoutException e) {
105             // solver timeout
106         } catch (ContradictionException e) {
107             // OK, optimal model found
108             if (!this.optimalValueForced) {
109                 try {
110                     this.problem.forceObjectiveValueTo(this.problem
111                             .getObjectiveValue());
112                 } catch (ContradictionException e1) {
113                     throw new IllegalStateException();
114                 }
115                 this.optimalValueForced = true;
116             }
117         }
118         this.modelComputed = true;
119         return this.problem.model();
120     }
121 
122     @Override
123     public boolean model(int var) {
124         if (!this.modelComputed) {
125             model();
126         }
127         return this.problem.model(var);
128     }
129 
130     @Override
131     public String toString(String prefix) {
132         return prefix + "Optimization to SAT adapter\n"
133                 + super.toString(prefix);
134     }
135 
136     /**
137      * Allow to easily check is the solution returned by isSatisfiable is
138      * optimal or not.
139      * 
140      * @return true is the solution found is indeed optimal.
141      */
142     public boolean isOptimal() {
143         return this.problem.isOptimal();
144     }
145 }