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.core.VecInt; 31 import org.sat4j.specs.ContradictionException; 32 import org.sat4j.specs.ISolver; 33 import org.sat4j.specs.IVecInt; 34 import org.sat4j.specs.TimeoutException; 35 36 /** 37 * Computes models with a minimal subset (with respect to set inclusion) of 38 * negative literals. This is done be adding a clause containing the negation of 39 * the negative literals appearing in the model found (which prevents any 40 * interpretation containing that subset of negative literals to be a model of 41 * the formula). 42 * 43 * Computes only one model minimal for inclusion, since there is currently no 44 * way to save the state of the solver. 45 * 46 * @author leberre 47 * 48 * @see org.sat4j.specs.ISolver#addClause(IVecInt) 49 */ 50 public class Minimal4InclusionModel extends SolverDecorator<ISolver> { 51 52 private static final long serialVersionUID = 1L; 53 54 /** 55 * @param solver 56 */ 57 public Minimal4InclusionModel(ISolver solver) { 58 super(solver); 59 } 60 61 /* 62 * (non-Javadoc) 63 * 64 * @see org.sat4j.ISolver#model() 65 */ 66 @SuppressWarnings("null") 67 @Override 68 public int[] model() { 69 int[] prevmodel = null; 70 IVecInt vec = new VecInt(); 71 IVecInt cube = new VecInt(); 72 // backUp(); 73 try { 74 do { 75 prevmodel = super.model(); 76 vec.clear(); 77 cube.clear(); 78 for (int q : prevmodel) { 79 if (q < 0) { 80 vec.push(-q); 81 } else { 82 cube.push(q); 83 } 84 } 85 addClause(vec); 86 } while (isSatisfiable(cube)); 87 } catch (TimeoutException e) { 88 throw new IllegalStateException("Solver timed out"); 89 } catch (ContradictionException e) { 90 // added trivial unsat clauses 91 } 92 // restore(); 93 int[] newmodel = new int[vec.size()]; 94 for (int i = 0, j = 0; i < prevmodel.length; i++) { 95 if (prevmodel[i] < 0) { 96 newmodel[j++] = prevmodel[i]; 97 } 98 } 99 100 return newmodel; 101 } 102 }