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 pseudo boolean algorithms described in:
20   * A fast pseudo-Boolean constraint solver Chai, D.; Kuehlmann, A.
21   * Computer-Aided Design of Integrated Circuits and Systems, IEEE Transactions on
22   * Volume 24, Issue 3, March 2005 Page(s): 305 - 317
23   * 
24   * and 
25   * Heidi E. Dixon, 2004. Automating Pseudo-Boolean Inference within a DPLL 
26   * Framework. Ph.D. Dissertation, University of Oregon.
27   *******************************************************************************/
28  package org.sat4j.pb;
29  
30  import org.sat4j.core.VecInt;
31  import org.sat4j.specs.ContradictionException;
32  import org.sat4j.specs.IOptimizationProblem;
33  import org.sat4j.specs.IVecInt;
34  import org.sat4j.specs.TimeoutException;
35  
36  /**
37   * Utility class to use optimization solvers instead of simple SAT solvers in
38   * code meant for SAT solvers.
39   * 
40   * @author daniel
41   */
42  public class OptToPBSATAdapter extends PBSolverDecorator {
43  
44  	/**
45       * 
46       */
47  	private static final long serialVersionUID = 1L;
48  
49  	IOptimizationProblem problem;
50  
51  	boolean modelComputed = false;
52  
53  	private final IVecInt assumps = new VecInt();
54  
55  	private long begin;
56  
57  	public OptToPBSATAdapter(IOptimizationProblem problem) {
58  		super((IPBSolver) problem);
59  		this.problem = problem;
60  	}
61  
62  	@Override
63  	public boolean isSatisfiable() throws TimeoutException {
64  		modelComputed = false;
65  		assumps.clear();
66  		begin = System.currentTimeMillis();
67  		if (problem.hasNoObjectiveFunction()) {
68  			return modelComputed = problem.isSatisfiable();
69  		}
70  		return problem.admitABetterSolution();
71  	}
72  
73  	@Override
74  	public boolean isSatisfiable(boolean global) throws TimeoutException {
75  		return isSatisfiable();
76  	}
77  
78  	@Override
79  	public boolean isSatisfiable(IVecInt myAssumps, boolean global)
80  			throws TimeoutException {
81  		return isSatisfiable(myAssumps);
82  	}
83  
84  	@Override
85  	public boolean isSatisfiable(IVecInt myAssumps) throws TimeoutException {
86  		modelComputed = false;
87  		this.assumps.clear();
88  		myAssumps.copyTo(this.assumps);
89  		begin = System.currentTimeMillis();
90  		if (problem.hasNoObjectiveFunction()) {
91  			return modelComputed = problem.isSatisfiable(myAssumps);
92  		}
93  		return problem.admitABetterSolution(myAssumps);
94  	}
95  
96  	@Override
97  	public int[] model() {
98  		if (modelComputed)
99  			return problem.model();
100 		try {
101 			assert problem.admitABetterSolution(assumps);
102 			assert !problem.hasNoObjectiveFunction();
103 			do {
104 				problem.discardCurrentSolution();
105 				if (isVerbose()) {
106 					System.out.println(getLogPrefix()
107 							+ "Current objective function value: "
108 							+ problem.getObjectiveValue() + "("
109 							+ ((System.currentTimeMillis() - begin) / 1000.0)
110 							+ "s)");
111 				}
112 			} while (problem.admitABetterSolution(assumps));
113 		} catch (TimeoutException e) {
114 			if (isVerbose()) {
115 				System.out.println(getLogPrefix() + "Solver timed out after "
116 						+ ((System.currentTimeMillis() - begin) / 1000.0)
117 						+ "s)");
118 			}
119 		} catch (ContradictionException e) {
120 			// OK, optimal model found
121 		}
122 		modelComputed = true;
123 		return problem.model();
124 	}
125 
126 	@Override
127 	public boolean model(int var) {
128 		if (!modelComputed)
129 			model();
130 		return problem.model(var);
131 	}
132 
133 	@Override
134 	public String toString(String prefix) {
135 		return prefix + "Optimization to Pseudo Boolean adapter\n"
136 				+ super.toString(prefix);
137 	}
138 
139 	public boolean isOptimal() {
140 		return problem.isOptimal();
141 	}
142 }