Skip to content

Commit 1f96000

Browse files
authored
Merge pull request #8502 from diffblue/cadical-preprocessor
Cadical with preprocessor and local search
2 parents db815f7 + 8a7d0fa commit 1f96000

File tree

5 files changed

+53
-18
lines changed

5 files changed

+53
-18
lines changed

src/goto-checker/solver_factory.cpp

+2-1
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

+2-2
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

+21-9
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

+25-3
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

+3-3
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)