import java.util.*;
/** This Generator generates random CNF formulas of a fixed
* size over a fixed number of symbols and with a fixed number of
* literals per clause. This class also includes a main
* method for testing.
*/
public class RandomCnfGenerator implements Generator {
private int num_clauses; // number of clauses
private int num_symbols; // number of symbols
private int num_literals; // number of literals per clause
private Random random; // random number generator
/** Constructor for this object.
* @param num_clauses number of clauses in constructed CNF
* @param num_symbols number of symbols (variables) in CNF
* @param num_literals number of literals per clause
*/
public RandomCnfGenerator(int num_clauses, int num_symbols, int num_literals) {
random = new Random();
this.num_clauses = num_clauses;
this.num_symbols = num_symbols;
this.num_literals = num_literals;
}
/** Generates another CNF of the specified form. */
public Literal[][] getNext() {
Literal[][] cnf = new Literal[num_clauses][num_literals];
for (int i = 0; i < num_clauses; i++) {
for (int j = 0; j < num_literals; j++) {
cnf[i][j] = new Literal();
cnf[i][j].sign = random.nextBoolean();
cnf[i][j].symbol = random.nextInt(num_symbols);
}
}
return cnf;
}
/** This is a simple main. It generates a random CNF
* formula with number of clauses, number of symbols and number of
* literals per clause specified by the first three arguments.
* Once generated, MySatSolver is called to try to solve
* the CNF within the time limit specified by the fourth argument.
* This process is repeated the number of times specified by the
* fifth argument.
*/
public static void main(String[] argv) {
int num_clauses = 0;
int num_symbols = 0;
int num_literals = 0;
int time_limit = 0;
int num_reps = 0;
try {
num_clauses = Integer.parseInt(argv[0]);
num_symbols = Integer.parseInt(argv[1]);
num_literals = Integer.parseInt(argv[2]);
time_limit = Integer.parseInt(argv[3]);
num_reps = Integer.parseInt(argv[4]);
}
catch (Exception e) {
System.err.println("Arguments: ");
return;
}
Generator gen = new RandomCnfGenerator(num_clauses,
num_symbols,
num_literals);
SatSolver sat = new MySatSolver();
for (int r = 0; r < num_reps; r++) {
Literal[][] cnf = gen.getNext();
System.out.println("--------------------------");
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));
}
}
}