Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
	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;
	}