void test_Solver() { std::cout << "\n---- Testing Solver ----" << std::endl; cnf::VariableSet v; cnf::Formula unsat(&v), sat(&v); cnf::Solver * s = new cnf::Solver("minisat", {}); v.add_subset("x", {3}); unsat.add_clauses({ cnf::Clause{ v.var("x", {1}) , v.var("x", {2})}, cnf::Clause{ v.var("x", {1}) ,cnf::no(v.var("x", {2}))}, cnf::Clause{cnf::no(v.var("x", {1})), v.var("x", {0})}, cnf::Clause{cnf::no(v.var("x", {1})),cnf::no(v.var("x", {0}))} }); sat.add_clauses({ cnf::Clause{ v.var("x", {1}) , v.var("x", {2})}, cnf::Clause{ v.var("x", {1}) ,cnf::no(v.var("x", {2}))}, cnf::Clause{cnf::no(v.var("x", {1})), v.var("x", {0})} }); if (!s->solve(unsat, &v)) std::cout << "UNSAT correctly identified" << std::endl; else std::cout << "Problem with UNSAT formula" << std::endl; if (s->solve(sat, &v)) std::cout << "SAT correctly identified" << std::endl; else std::cout << "Problem with SAT formula" << std::endl; }
std::vector<int> solve() { auto flips = 0; auto start = std::clock(); auto state = initializer_(clauses_, variable_count_); while(!sls::util::is_interrupted() && state.unsat().size() > 0) { state.before_pick(flips); selector_->is_applicable(state); auto pick = selector_->select(state); ++flips; state.after_pick(flips, pick); transitor_(state, pick); state.flush(); } auto end = std::clock(); auto time = static_cast<double>(end - start) / static_cast<double>(CLOCKS_PER_SEC); std::cout << "c " << variable_count_ << "," << clauses_.size() << "," << flips << "," << (!sls::util::is_interrupted() ? time : -1.0) << "," << static_cast<int>(static_cast<double>(flips)/time) << std::endl; std::vector<int> model(variable_count_); for(auto i = 0; i < variable_count_; ++i) model[i] = (i + 1) * (static_cast<int>(state.truth(sat_type::make_variable(i + 1))) * 2 - 1); return model; }