#define NANOSEC 1000000000.0
using namespace std;
-enum SolverType {CSOLVER, DUMP, ALLOY};
-
+enum SolverType {_CSOLVER, _DUMP, _ALLOY, _Z3, _MATHSAT, _SMTRAT};
+InterpreterType convertSolverToInterpreterType(SolverType type){
+ return (InterpreterType)(type -1);
+}
void EqualOneToCNF(vector<int> literals, vector< vector<int> > & cnf){
int N = literals.size();
cnf.push_back(literals);
}
-void csolverNQueens(int N, SolverType stype = CSOLVER){
+void csolverNQueens(int N, SolverType stype = _CSOLVER){
if(N <=1){
cout<<"Q" << endl;
return;
}
CSolver *solver = new CSolver();
- if(stype = ALLOY){
- solver->setAlloyEncoder();
+ if(stype >= _ALLOY){
+ solver->setInterpreter( convertSolverToInterpreterType(stype) );
}
uint64_t domain[N];
diagonallyDifferentConstraintBothDir(solver, N, elems);
symmetryBreakingConstraint(solver, N, elems);
// solver->printConstraints();
- if(stype == DUMP){
+ if(stype == _DUMP){
solver->serialize();
} if (solver->solve() != 1){
printf("Problem is Unsolvable ...\n");
int main(int argc, char * argv[]){
if(argc < 2){
- printf("Two arguments are needed\n./nqueen <size> [--csolver/--dump/--alloy]\n");
+ printf("Two arguments are needed\n./nqueen <size> [--csolver/--dump/--alloy/--z3/--mathsat/--smtrat]\n");
exit(-1);
}
int N = atoi(argv[1]);
csolverNQueens(N);
}else if (strcmp( argv[2], "--dump") == 0){
printf("Running the CSolver encoding ...\n");
- csolverNQueens(N, DUMP);
+ csolverNQueens(N, _DUMP);
}else if (strcmp( argv[2], "--alloy") == 0){
printf("Running the Alloy encoding ...\n");
- csolverNQueens(N, ALLOY);
+ csolverNQueens(N, _ALLOY);
+ }else if (strcmp( argv[2], "--z3") == 0){
+ printf("Running the Z3 encoding ...\n");
+ csolverNQueens(N, _Z3);
+ }else if (strcmp( argv[2], "--mathsat") == 0){
+ printf("Running the mathsat encoding ...\n");
+ csolverNQueens(N, _MATHSAT);
+ } else if (strcmp( argv[2], "--smtrat") == 0){
+ printf("Running the SMTRat encoding ...\n");
+ csolverNQueens(N, _SMTRAT);
}else {
printf("Unknown argument %s", argv[2]);
}