// SAT Solver Test (SST) // import java.io.*; import java.util.*; class solverTest { static final String input2SATSolver = "_debug.cnf"; // this method does double-duty. // if 2 command-line arguments are given, the first file input // is assumed to be a #true-#end test // if only 1 file input is given, it is assumed to be a .cnf file public static void main( String args[] ) { if ( args.length > 1 ) { try { modelDebug( args[0] , true ); } catch ( Exception e ) { outln( "Exception in processing " + args[0] + " " + e.getMessage() ); outln( "Processing of " + args[0] + " aborted" ); } return; } original( args ); } static void modelDebug( String filename, boolean saveInFile ) throws dparseException, IOException { boolean result; variable var = null; // Step 0 -- for debugging cnf files // variable.dumpVariablesInOrder(); // Step 1: create model cnf file string // cnfModel model = cnfModel.init(); boolean testSucceeded = true; outln( "Beginning test : " + filename ); outln(); dparser d = new dparser( filename ); while ( true ) { SATtest t = d.getNextTest(); if ( t == null ) break; if (t.isComplete()) { // temporarily remove UserSelections ArrayList orig = grammar.UserSelections; grammar.UserSelections = new ArrayList(); // now perform the complete test // convert strings into variable references grammar.UserSelections.clear(); Vector v = t.getSelections(); for (int i=0; i<v.size(); i++) { var = (variable) (var.Vtable.get(v.get(i))); grammar.UserSelections.add(var); } grammar.propagate(); testSucceeded = reportResult( t.getName(), cnfClause.complete(false) == t.isSat, testSucceeded); // replace original UserSelections grammar.UserSelections = orig; continue; } // create the file to be tested, invoke the solver // and output the result SATSolver s = new SATSolver(); if ( saveInFile ) { createOutputFile( model, t ); result = s.solve( input2SATSolver ); } else { // use in-memory file createOutputBuffer( model, t ); result = s.solve( new LineNumberReader( new StringReader( cnfFileString ) ) ); } testSucceeded = reportResult( t.getName(), result == t.isSat, testSucceeded ); } outln(); out( "Summary of " + filename + " test : " ); if ( testSucceeded ) outln( " ALL SUCCEEDED" ); else outln( " SOME FAILED" ); } static boolean reportResult( String testname, boolean resultOfTest, boolean testSucceeded ) { if (resultOfTest) { outln( "succeeded ... " + testname ); return testSucceeded; } else { outln( "FAILED ... " + testname ); return false; } } static void outln( String x ) { if ( ModelDebuggerGui.itsme == null ) System.out.println( x ); else ModelDebuggerGui.itsme.println( x ); } static void outln() { outln( "" ); } static void out( String x ) { if ( ModelDebuggerGui.itsme == null ) System.out.println( x ); else ModelDebuggerGui.itsme.print( x ); } static void createOutputFile( cnfModel model, SATtest t ) throws IOException, dparseException { PrintWriter pw = new PrintWriter( new FileWriter( input2SATSolver, false ) ); createFile(pw, model, t); pw.close(); } static String cnfFileString = ""; static void createOutputBuffer( cnfModel model, SATtest t ) throws IOException, dparseException { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter( sw ); createFile(pw, model, t); pw.close(); cnfFileString = sw.toString(); // System.out.println(cnfFileString); } static void createFile( PrintWriter pw, cnfModel model, SATtest t ) throws IOException, dparseException { cnfout out = new cnfout(); t.toCnfFormat( out ); int nclause = model.nclause + out.getCnt(); pw.println( "p cnf " + model.nvars + " " + nclause + " "); variable.dumpVariablesInOrder(pw); pw.print( model.model ); pw.println( out.toString() ); } }