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.maxsat;
31  
32  import static org.junit.Assert.assertEquals;
33  
34  import org.junit.Test;
35  import org.sat4j.core.VecInt;
36  import org.sat4j.pb.PseudoOptDecorator;
37  import org.sat4j.specs.ContradictionException;
38  import org.sat4j.specs.IOptimizationProblem;
39  import org.sat4j.specs.IProblem;
40  import org.sat4j.specs.TimeoutException;
41  import org.sat4j.tools.OptToSatAdapter;
42  
43  public class MichalBug {
44  
45      @Test
46      public void testMichalReportedProblem() throws ContradictionException,
47              TimeoutException {
48          WeightedMaxSatDecorator maxSATSolver = new WeightedMaxSatDecorator(
49                  SolverFactory.newLight());
50  
51          final int OPTIMUM_FOUND = 0;
52          final int UNSATISFIABLE = 1;
53  
54          maxSATSolver.newVar(2);
55          maxSATSolver.setExpectedNumberOfClauses(4);
56  
57          int[] clause_1 = { 1, 1, 2 };
58          maxSATSolver.addClause(new VecInt(clause_1));
59  
60          int[] clause_2 = { 100, -1, -2 };
61          maxSATSolver.addClause(new VecInt(clause_2));
62  
63          int[] clause_3 = { 1000, 1, -2 };
64          maxSATSolver.addClause(new VecInt(clause_3));
65  
66          int[] clause_4 = { 100000, -1, 2 };
67          maxSATSolver.addClause(new VecInt(clause_4));
68  
69          IOptimizationProblem problem = new PseudoOptDecorator(maxSATSolver);
70  
71          int exitCode = UNSATISFIABLE;
72          boolean isSatisfiable = false;
73          try {
74              while (problem.admitABetterSolution()) {
75                  isSatisfiable = true;
76                  problem.discardCurrentSolution();
77              }
78              if (isSatisfiable) {
79                  exitCode = OPTIMUM_FOUND;
80              } else {
81                  exitCode = UNSATISFIABLE;
82              }
83          } catch (ContradictionException ex) {
84              assert isSatisfiable;
85              exitCode = OPTIMUM_FOUND;
86          }
87  
88          assertEquals(OPTIMUM_FOUND, exitCode);
89          int[] model = problem.model();
90          assertEquals(2, model.length);
91          assertEquals(-1, model[0]);
92          assertEquals(-2, model[1]);
93      }
94  
95      @Test
96      public void testMichalWithOptAdapter() throws ContradictionException,
97              TimeoutException {
98          WeightedMaxSatDecorator maxSATSolver = new WeightedMaxSatDecorator(
99                  SolverFactory.newLight());
100 
101         maxSATSolver.newVar(2);
102         maxSATSolver.setExpectedNumberOfClauses(4);
103 
104         int[] clause_1 = { 1, 1, 2 };
105         maxSATSolver.addClause(new VecInt(clause_1));
106 
107         int[] clause_2 = { 100, -1, -2 };
108         maxSATSolver.addClause(new VecInt(clause_2));
109 
110         int[] clause_3 = { 1000, 1, -2 };
111         maxSATSolver.addClause(new VecInt(clause_3));
112 
113         int[] clause_4 = { 100000, -1, 2 };
114         maxSATSolver.addClause(new VecInt(clause_4));
115 
116         IProblem problem = new OptToSatAdapter(new PseudoOptDecorator(
117                 maxSATSolver));
118 
119         boolean isSatisfiable = problem.isSatisfiable();
120 
121         assertEquals(true, isSatisfiable);
122         int[] model = problem.model();
123         assertEquals(2, model.length);
124         assertEquals(-1, model[0]);
125         assertEquals(-2, model[1]);
126     }
127 }