// // test calling the minisolver import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import org.sat4j.minisat.SolverFactory; import org.sat4j.minisat.core.SolverStats; import org.sat4j.reader.*; import org.sat4j.specs.ContradictionException; import org.sat4j.specs.ISolver; import org.sat4j.specs.TimeoutException; import java.io.*; /* this layer is not yet complete. It is possible to call a solver directly from a LineNumberReader. I've started the implementation but haven't completed it yet. At present, _debug.cnf files are generated but not cleaned up. Here's the help message from Daniel Le Berre: You can provide a LineNumberReader to DimacsReader.parseInstance(). ISolver solver = SolverFactory.newMiniLearning(); DimacsReader reader = new DimacsReader(solver); LineNumberReader in = new LineNumberReader(new BufferedReader(...)); reader.parseInstance(in); */ public class SATSolver { ISolver solver; InstanceReader reader; DimacsReader dreader; boolean isSat; SATSolver() { solver = SolverFactory.createSolverByName("MiniSAT"); // initialize both, although only one will be used reader = new InstanceReader(solver); dreader = new DimacsReader(solver); } // argument needs a LineNumberReader as input // returns result of SAT solver // public boolean solve( LineNumberReader in ) { isSat = false; try { dreader.parseInstance(in); isSat = solver.isSatisfiable(); } catch (ContradictionException e) { isSat = false; } catch (TimeoutException e) { System.out.println("Timeout"); System.exit(1); } catch (ParseFormatException e) { System.out.println("Parse Format Exception"); e.printStackTrace(); System.exit(1); } catch (Exception e) { System.out.println("CNF file format likely wrong"); e.printStackTrace(); System.exit(1); } return isSat; } // argument needs a cnf file type as input // returns result of SAT solver // public boolean solve( String filename ) { isSat = false; try { reader.parseInstance(filename); isSat = solver.isSatisfiable(); } catch (FileNotFoundException e) { System.out.println("File Not found " + filename); e.printStackTrace(); System.exit(1); } catch (IOException e) { System.out.println("IOException " + e.getMessage()); e.printStackTrace(); System.exit(1); } catch (ContradictionException e) { isSat = false; } catch (TimeoutException e) { System.out.println("Timeout"); System.exit(1); } catch (ParseFormatException e) { System.out.println("Parse Format Exception"); e.printStackTrace(); System.exit(1); } catch (Exception e) { System.out.println("CNF file format likely wrong"); e.printStackTrace(); System.exit(1); } return isSat; } void decode() { if (isSat) { int[] model = solver.model(); System.out.println("v "+reader.decode(model)); System.out.println( "Solutions"); for (int i = 0; i<model.length; i++ ) { if (model[i] > 0) System.out.println(model[i]); } } } }