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 java.util.ArrayList;
33  import java.util.Collection;
34  
35  import org.sat4j.core.ConstrGroup;
36  import org.sat4j.core.VecInt;
37  import org.sat4j.specs.ContradictionException;
38  import org.sat4j.specs.IConstr;
39  import org.sat4j.specs.ISolver;
40  import org.sat4j.specs.IVecInt;
41  import org.sat4j.specs.IteratorInt;
42  import org.sat4j.specs.TimeoutException;
43  
44  /**
45   * Negates the formula inside a solver.
46   * 
47   * @author leberre
48   * 
49   * @param <T>
50   */
51  public class NegationDecorator<T extends ISolver> extends
52          AbstractClauseSelectorSolver<T> {
53  
54      /**
55       * 
56       */
57      private static final long serialVersionUID = 1L;
58  
59      private final Collection<Integer> addedVars = new ArrayList<Integer>();
60  
61      public NegationDecorator(T decorated) {
62          super(decorated);
63          internalState();
64      }
65  
66      @Override
67      public IConstr addClause(IVecInt literals) throws ContradictionException {
68          int newVar = createNewVar(literals);
69          IVecInt clause = new VecInt(2);
70          clause.push(newVar);
71          ConstrGroup group = new ConstrGroup();
72          for (IteratorInt it = literals.iterator(); it.hasNext();) {
73              clause.push(-it.next());
74              group.add(super.addClause(clause));
75              clause.pop();
76          }
77          addedVars.add(newVar);
78          return group;
79      }
80  
81      @Override
82      public IConstr addAtMost(IVecInt literals, int degree)
83              throws ContradictionException {
84          throw new UnsupportedOperationException("Not implemented yet!");
85      }
86  
87      @Override
88      public IConstr addAtLeast(IVecInt literals, int degree)
89              throws ContradictionException {
90          throw new UnsupportedOperationException("Not implemented yet!");
91      }
92  
93      @Override
94      public IConstr addExactly(IVecInt literals, int n)
95              throws ContradictionException {
96          throw new UnsupportedOperationException("Not implemented yet!");
97      }
98  
99      @Override
100     public boolean isSatisfiable(IVecInt assumps, boolean global)
101             throws TimeoutException {
102         IVecInt vars = new VecInt();
103         for (int var : getAddedVars()) {
104             vars.push(var);
105         }
106         try {
107             IConstr constr = super.addClause(vars);
108             boolean returnValue;
109             try {
110                 returnValue = super.isSatisfiable(assumps, global);
111             } finally {
112                 removeConstr(constr);
113             }
114             return returnValue;
115         } catch (ContradictionException e) {
116             return false;
117         }
118 
119     }
120 
121     @Override
122     public Collection<Integer> getAddedVars() {
123         return addedVars;
124     }
125 
126 }