Skip to content

Commit 8a7d0fa

Browse files
committed
Cadical with preprocessor and local search
This adds the option to enable Cadical's preprocessor and local search. The default remains unchanged. The choice of preprocessor=1 and localsearch=0 for satcheck_cadical_preprocessingt is motivated by the following data on the HWMCC 2008 benchmarks: 0, 0: ./hwmcc08.sh 114.78s 1, 0: ./hwmcc08.sh 107.44s 2, 0: ./hwmcc08.sh 117.63s 5, 0: ./hwmcc08.sh 129.10s 1, 1: ./hwmcc08.sh 113.50s 5, 5: ./hwmcc08.sh 154.71s
1 parent 83f61a4 commit 8a7d0fa

File tree

5 files changed

+53
-18
lines changed

5 files changed

+53
-18
lines changed

src/goto-checker/solver_factory.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ get_sat_solver(message_handlert &message_handler, const optionst &options)
297297
else if(solver_option == "cadical")
298298
{
299299
#if defined SATCHECK_CADICAL
300-
return make_satcheck_prop<satcheck_cadicalt>(message_handler, options);
300+
return make_satcheck_prop<satcheck_cadical_no_preprocessingt>(
301+
message_handler, options);
301302
#else
302303
emit_solver_warning(message_handler, "cadical");
303304
#endif

src/solvers/sat/satcheck.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ typedef satcheck_glucose_no_simplifiert satcheck_no_simplifiert;
137137

138138
#elif defined SATCHECK_CADICAL
139139

140-
typedef satcheck_cadicalt satcheckt;
141-
typedef satcheck_cadicalt satcheck_no_simplifiert;
140+
typedef satcheck_cadical_no_preprocessingt satcheckt;
141+
typedef satcheck_cadical_no_preprocessingt satcheck_no_simplifiert;
142142

143143
#endif
144144

src/solvers/sat/satcheck_cadical.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Author: Michael Tautschnig
1717

1818
# include <cadical.hpp>
1919

20-
tvt satcheck_cadicalt::l_get(literalt a) const
20+
tvt satcheck_cadical_baset::l_get(literalt a) const
2121
{
2222
if(a.is_constant())
2323
return tvt(a.sign());
@@ -38,12 +38,12 @@ tvt satcheck_cadicalt::l_get(literalt a) const
3838
return result;
3939
}
4040

41-
std::string satcheck_cadicalt::solver_text() const
41+
std::string satcheck_cadical_baset::solver_text() const
4242
{
4343
return std::string("CaDiCaL ") + solver->version();
4444
}
4545

46-
void satcheck_cadicalt::lcnf(const bvt &bv)
46+
void satcheck_cadical_baset::lcnf(const bvt &bv)
4747
{
4848
for(const auto &lit : bv)
4949
{
@@ -85,7 +85,7 @@ void satcheck_cadicalt::lcnf(const bvt &bv)
8585
clause_counter++;
8686
}
8787

88-
propt::resultt satcheck_cadicalt::do_prop_solve(const bvt &assumptions)
88+
propt::resultt satcheck_cadical_baset::do_prop_solve(const bvt &assumptions)
8989
{
9090
INVARIANT(status != statust::ERROR, "there cannot be an error");
9191

@@ -108,6 +108,12 @@ propt::resultt satcheck_cadicalt::do_prop_solve(const bvt &assumptions)
108108
if(!a.is_true())
109109
solver->assume(a.dimacs());
110110

111+
// set preprocessing and inprocessing limits
112+
auto limit1_ret = solver->limit("preprocessing", preprocessing_limit);
113+
CHECK_RETURN(limit1_ret);
114+
auto limit2_ret = solver->limit("localsearch", localsearch_limit);
115+
CHECK_RETURN(limit2_ret);
116+
111117
switch(solver->solve())
112118
{
113119
case 10:
@@ -128,24 +134,30 @@ propt::resultt satcheck_cadicalt::do_prop_solve(const bvt &assumptions)
128134
return resultt::P_UNSATISFIABLE;
129135
}
130136

131-
void satcheck_cadicalt::set_assignment(literalt a, bool value)
137+
void satcheck_cadical_baset::set_assignment(literalt a, bool value)
132138
{
133139
INVARIANT(!a.is_constant(), "cannot set an assignment for a constant");
134140
INVARIANT(false, "method not supported");
135141
}
136142

137-
satcheck_cadicalt::satcheck_cadicalt(message_handlert &message_handler)
138-
: cnf_solvert(message_handler), solver(new CaDiCaL::Solver())
143+
satcheck_cadical_baset::satcheck_cadical_baset(
144+
int _preprocessing_limit,
145+
int _localsearch_limit,
146+
message_handlert &message_handler)
147+
: cnf_solvert(message_handler),
148+
solver(new CaDiCaL::Solver()),
149+
preprocessing_limit(_preprocessing_limit),
150+
localsearch_limit(_localsearch_limit)
139151
{
140152
solver->set("quiet", 1);
141153
}
142154

143-
satcheck_cadicalt::~satcheck_cadicalt()
155+
satcheck_cadical_baset::~satcheck_cadical_baset()
144156
{
145157
delete solver;
146158
}
147159

148-
bool satcheck_cadicalt::is_in_conflict(literalt a) const
160+
bool satcheck_cadical_baset::is_in_conflict(literalt a) const
149161
{
150162
return solver->failed(a.dimacs());
151163
}

src/solvers/sat/satcheck_cadical.h

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@ namespace CaDiCaL // NOLINT(readability/namespace)
1919
class Solver; // NOLINT(readability/identifiers)
2020
}
2121

22-
class satcheck_cadicalt : public cnf_solvert, public hardness_collectort
22+
class satcheck_cadical_baset : public cnf_solvert, public hardness_collectort
2323
{
2424
public:
25-
explicit satcheck_cadicalt(message_handlert &message_handler);
26-
virtual ~satcheck_cadicalt();
25+
satcheck_cadical_baset(
26+
int preprocessing_limit,
27+
int localsearch_limit,
28+
message_handlert &);
29+
virtual ~satcheck_cadical_baset();
2730

2831
std::string solver_text() const override;
2932
tvt l_get(literalt a) const override;
@@ -46,6 +49,25 @@ class satcheck_cadicalt : public cnf_solvert, public hardness_collectort
4649

4750
// NOLINTNEXTLINE(readability/identifiers)
4851
CaDiCaL::Solver *solver;
52+
int preprocessing_limit = 0, localsearch_limit = 0;
53+
};
54+
55+
class satcheck_cadical_no_preprocessingt : public satcheck_cadical_baset
56+
{
57+
public:
58+
explicit satcheck_cadical_no_preprocessingt(message_handlert &message_handler)
59+
: satcheck_cadical_baset(0, 0, message_handler)
60+
{
61+
}
62+
};
63+
64+
class satcheck_cadical_preprocessingt : public satcheck_cadical_baset
65+
{
66+
public:
67+
explicit satcheck_cadical_preprocessingt(message_handlert &message_handler)
68+
: satcheck_cadical_baset(1, 0, message_handler)
69+
{
70+
}
4971
};
5072

5173
#endif // CPROVER_SOLVERS_SAT_SATCHECK_CADICAL_H

unit/solvers/sat/satcheck_cadical.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ SCENARIO("satcheck_cadical", "[core][solvers][sat][satcheck_cadical]")
2323

2424
GIVEN("A satisfiable formula f")
2525
{
26-
satcheck_cadicalt satcheck(message_handler);
26+
satcheck_cadical_no_preprocessingt satcheck(message_handler);
2727
literalt f = satcheck.new_variable();
2828
satcheck.l_set_to_true(f);
2929

@@ -42,7 +42,7 @@ SCENARIO("satcheck_cadical", "[core][solvers][sat][satcheck_cadical]")
4242

4343
GIVEN("An unsatisfiable formula f && !f")
4444
{
45-
satcheck_cadicalt satcheck(message_handler);
45+
satcheck_cadical_no_preprocessingt satcheck(message_handler);
4646
literalt f = satcheck.new_variable();
4747
satcheck.l_set_to_true(satcheck.land(f, !f));
4848

@@ -54,7 +54,7 @@ SCENARIO("satcheck_cadical", "[core][solvers][sat][satcheck_cadical]")
5454

5555
GIVEN("An unsatisfiable formula false implied by a")
5656
{
57-
satcheck_cadicalt satcheck(message_handler);
57+
satcheck_cadical_no_preprocessingt satcheck(message_handler);
5858
literalt a = satcheck.new_variable();
5959
literalt a_implies_false = satcheck.lor(!a, const_literal(false));
6060
satcheck.l_set_to_true(a_implies_false);

0 commit comments

Comments
 (0)