import java.util.*;
import java.io.*;
/** A Generator that simply reads a file representing a CNF
* in the style used in the DIMACS implementation challenge.
* (Note that these files must be uncompressed before using here.)
* Each time getNext is called, this same CNF is returned.
* This class also includes a main method for testing.
*/
public class DimacsFileGenerator implements Generator {
Literal[][] cnf;
/** Constructor for this generator.
* @param file_name name of file containing DIMACS CNF description
*/
public DimacsFileGenerator(String file_name)
throws FileNotFoundException, IOException
{
BufferedReader in;
String line;
Stack s = new Stack( );
Literal literal = new Literal( );
try
{
in = new BufferedReader(new FileReader(file_name));
} catch (FileNotFoundException e)
{
System.err.print("File "+file_name+" not found.\n");
throw e;
}
int i = 0;
while( true )
{
try
{
line = in.readLine();
} catch (IOException e)
{
System.err.println("Error reading file "+file_name);
throw e;
}
if (line == null)
break;
line = line.trim( );
String[] words = line.split("\\s");
if (words[0].equals("c"))
continue;
if (words[0].equals("p"))
{
if (!words[1].equals("cnf"))
System.err.println("expect cnf after p in file " + file_name);
int num_clauses = Integer.parseInt(words[3]);
cnf = new Literal[num_clauses][];
}
else if (!line.equals(""))
{
for (int j = 0; j < words.length; j++)
{
int var = Integer.parseInt(words[j]);
if( var == 0 )
{
cnf[i] = new Literal[ s.size( ) ];
int k = 0;
while( ! s.empty( ) )
{
cnf[i][k] = ( Literal ) s.pop( );
k++;
}
i++;
s = new Stack( );
break;
}
literal = new Literal( );
literal.sign = (var > 0);
literal.symbol = (var < 0 ? -var : var) - 1;
s.push( literal );
}
}
}
}
/** Returns the CNF read in from the named DIMACS file. */
public Literal[][] getNext()
{
return cnf;
}
/** This is a simple main which runs MySatSolver
* on the CNF stored in the file named in the first argument
* within the time limit specified by the second argument.
*/
public static void main(String[] argv)
throws FileNotFoundException, IOException
{
String file_name = "";
int time_limit = 0;
try
{
file_name = argv[0];
time_limit = Integer.parseInt(argv[1]);
if( time_limit == -1 )
time_limit = 3600;
} catch (Exception e)
{
System.err.println("Arguments: ");
return;
}
Generator gen = new DimacsFileGenerator(file_name);
SatSolver sat = new MySatSolver();
Literal[][] cnf = gen.getNext();
System.out.println("cnf:");
System.out.println(CnfUtil.cnfToString(cnf));
Timer timer = new Timer(time_limit * 1000);
boolean[] model = sat.solve(cnf, timer);
System.out.println("elapsed time= " + timer.getTimeElapsed());
int num_unsat = CnfUtil.numClauseUnsat(cnf, model);
System.out.println("num_unsat= " + num_unsat);
System.out.println("model: " +
CnfUtil.modelToString(model));
}
}