void ToSATAIG::add_cnf_to_solver(SATSolver& satSolver, Cnf_Dat_t* cnfData) { bm->GetRunTimes()->start(RunTimes::SendingToSAT); // Create a new sat variable for each of the variables in the CNF. int satV = satSolver.nVars(); for (int i = 0; i < cnfData->nVars - satV; i++) satSolver.newVar(); SATSolver::vec_literals satSolverClause; for (int i = 0; i < cnfData->nClauses; i++) { satSolverClause.clear(); for (int* pLit = cnfData->pClauses[i], *pStop = cnfData->pClauses[i + 1]; pLit < pStop; pLit++) { uint32_t var = (*pLit) >> 1; assert((var < satSolver.nVars())); Minisat::Lit l = SATSolver::mkLit(var, (*pLit) & 1); satSolverClause.push(l); } satSolver.addClause(satSolverClause); if (!satSolver.okay()) break; } bm->GetRunTimes()->stop(RunTimes::SendingToSAT); }
void SIGINT_handler(int) { SATSolver* solver = solverToInterrupt; cout << "c " << endl; std::cerr << "*** INTERRUPTED ***" << endl; if (!redDumpFname.empty() || !irredDumpFname.empty() || need_clean_exit) { solver->interrupt_asap(); std::cerr << "*** Please wait. We need to interrupt cleanly" << endl << "*** This means we might need to finish some calculations" << endl; } else { if (solver->nVars() > 0) { //if (conf.verbosity >= 1) { solver->add_in_partial_solving_stats(); solver->print_stats(); //} } else { cout << "No clauses or variables were put into the solver, exiting without stats" << endl; } _exit(1); } }
TEST(xor_interface, xor_check_unsat) { SATSolver s; s.new_vars(3); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, false); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.nVars(), 3u); }
TEST(xor_interface, xor_check_solution_values4) { SATSolver s; s.new_var(); s.new_var(); s.add_xor_clause(vector<uint32_t>{0U, 0U}, false); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.nVars(), 2u); }
TEST(xor_interface, xor_norm_mix_unsat_multi_thread) { SATSolver s; //s.set_num_threads(3); s.new_vars(3); s.add_clause(vector<Lit>{Lit(0, false)}); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, false); s.add_clause(vector<Lit>{Lit(1, false)}); s.add_clause(vector<Lit>{Lit(2, false)}); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.nVars(), 3u); }
TEST(xor_interface, xor_check_solution_values6) { SATSolver s; s.new_var(); s.new_var(); s.add_xor_clause(vector<uint32_t>{0U, 1U}, false); vector<Lit> assump = {Lit(0, true)}; lbool ret = s.solve(&assump); EXPECT_EQ( ret, l_True); EXPECT_EQ(s.get_model()[0], l_False); EXPECT_EQ(s.get_model()[1], l_False); EXPECT_EQ( s.nVars(), 2u); }
TEST(xor_interface, xor_check_sat_solution) { SATSolver s; s.new_var(); s.add_xor_clause(vector<unsigned>{0U}, false); s.add_xor_clause(vector<unsigned>{0U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_False); for(size_t i = 0;i < 10; i++) { ret = s.solve(); EXPECT_EQ( ret, l_False); } EXPECT_EQ( s.nVars(), 1u); }
TEST(xor_interface, xor_check_unsat_multi_solve_multi_thread) { SATSolver s; s.set_num_threads(3); s.new_vars(3); s.add_xor_clause(vector<uint32_t>{0U, 1U}, false); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.nVars(), 3u); s.add_xor_clause(vector<uint32_t>{0U}, false); ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.get_model()[0], l_False); EXPECT_EQ( s.get_model()[1], l_False); EXPECT_EQ( s.get_model()[2], l_True); EXPECT_EQ( s.nVars(), 3u); s.add_xor_clause(vector<uint32_t>{1U}, true); ret = s.solve(); EXPECT_EQ( ret, l_False); EXPECT_EQ( s.nVars(), 3u); }
TEST(xor_interface, xor_check_solution_values) { SATSolver s; s.new_var(); s.add_xor_clause(vector<uint32_t>{0U}, true); s.add_xor_clause(vector<uint32_t>{0U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); for(size_t i = 0;i < 10; i++) { ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ( s.okay(), true); } EXPECT_EQ( s.nVars(), 1u); }
TEST(xor_interface, xor_3_long2) { SATSolver s; s.new_var(); s.new_var(); s.new_var(); s.add_xor_clause(vector<uint32_t>{0U, 1U, 2U}, false); s.add_xor_clause(vector<uint32_t>{0U}, true); s.add_xor_clause(vector<uint32_t>{1U}, true); lbool ret = s.solve(); EXPECT_EQ( ret, l_True); EXPECT_EQ(s.get_model()[0], l_True); EXPECT_EQ(s.get_model()[1], l_True); EXPECT_EQ(s.get_model()[2], l_False); EXPECT_EQ( s.nVars(), 3u); }
TEST(xor_interface, xor_very_long) { SATSolver s; vector<uint32_t> vars; for(unsigned i = 0; i < 30; i++) { s.new_var(); vars.push_back(i); } s.add_xor_clause(vars, false); for(unsigned i = 0; i < 29; i++) { s.add_xor_clause(vector<uint32_t>{i}, false); } lbool ret = s.solve(); EXPECT_EQ( ret, l_True); for(unsigned i = 0; i < 30; i++) { EXPECT_EQ(s.get_model()[i], l_False); } EXPECT_EQ( s.nVars(), 30u); }
TEST(xor_interface, xor_very_long2) { for(size_t num = 3; num < 30; num++) { SATSolver s; vector<uint32_t> vars; for(unsigned i = 0; i < num; i++) { s.new_var(); vars.push_back(i); } s.add_xor_clause(vars, true); for(unsigned i = 0; i < num-1; i++) { s.add_xor_clause(vector<uint32_t>{i}, false); } lbool ret = s.solve(); EXPECT_EQ( ret, l_True); for(unsigned i = 0; i < num-1; i++) { EXPECT_EQ(s.get_model()[i], l_False); } EXPECT_EQ(s.get_model()[num-1], l_True); EXPECT_EQ( s.nVars(), num); } }