Skip to content

Commit e2437a1

Browse files
committed
Add CaDiCaL support to CMake
Add CMake configuration to build using CaDiCaL, which was already supported with Makefiles. Also bump the version of CaDiCaL to rel-1.3.0 and fix the use of the cnf_solvert interface.
1 parent a46f12d commit e2437a1

File tree

7 files changed

+89
-23
lines changed

7 files changed

+89
-23
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ endif()
5858
set(enable_cbmc_tests on CACHE BOOL "Whether CBMC tests should be enabled")
5959

6060
set(sat_impl "minisat2" CACHE STRING
61-
"This setting controls the SAT library which is used. Valid values are 'minisat2' and 'glucose'"
61+
"This setting controls the SAT library which is used. Valid values are
62+
'minisat2', 'glucose', or 'cadical'"
6263
)
6364

6465
if(${enable_cbmc_tests})

scripts/cadical-patch

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,12 @@ glucose-download:
151151
@(cd ../glucose-syrup; patch -p1 < ../scripts/glucose-syrup-patch)
152152
@rm glucose-syrup.tgz
153153

154-
cadical_release = rel-06w
154+
cadical_release = rel-1.3.0
155155
cadical-download:
156156
@echo "Downloading CaDiCaL $(cadical_release)"
157157
@curl -L https://github.com/arminbiere/cadical/archive/$(cadical_release).tar.gz | tar xz
158158
@rm -Rf ../cadical
159159
@mv cadical-$(cadical_release) ../cadical
160-
@(cd ../cadical; patch -p1 < ../scripts/cadical-patch)
161160
@cd ../cadical && CXX=$(CXX) CXXFLAGS=-O3 ./configure --debug && make
162161

163162
doc :

src/solvers/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,36 @@ elseif("${sat_impl}" STREQUAL "glucose")
9898
target_sources(solvers PRIVATE ${glucose_source})
9999

100100
target_link_libraries(solvers glucose-condensed)
101+
elseif("${sat_impl}" STREQUAL "cadical")
102+
message(STATUS "Building solvers with cadical")
103+
104+
download_project(PROJ cadical
105+
URL https://github.com/arminbiere/cadical/archive/rel-1.3.0.tar.gz
106+
PATCH_COMMAND true
107+
COMMAND CXX=${CMAKE_CXX_COMPILER} CXXFLAGS=-O3 ./configure --debug
108+
URL_MD5 5bd15d1e198d2e904a8af8b7873dd341
109+
)
110+
111+
message(STATUS "Building CaDiCaL")
112+
execute_process(COMMAND make WORKING_DIRECTORY ${cadical_SOURCE_DIR})
113+
114+
target_compile_definitions(solvers PUBLIC
115+
SATCHECK_CADICAL HAVE_CADICAL
116+
)
117+
118+
add_library(cadical STATIC IMPORTED)
119+
120+
set_target_properties(
121+
cadical
122+
PROPERTIES IMPORTED_LOCATION ${cadical_SOURCE_DIR}/build/libcadical.a
123+
)
124+
125+
target_include_directories(solvers
126+
PUBLIC
127+
${cadical_SOURCE_DIR}/src
128+
)
129+
130+
target_link_libraries(solvers cadical)
101131
endif()
102132

103133
if(CMAKE_USE_CUDD)

src/solvers/sat/satcheck_cadical.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ tvt satcheck_cadicalt::l_get(literalt a) const
2323

2424
tvt result;
2525

26-
if(a.var_no() > static_cast<unsigned>(solver->max()))
26+
if(a.var_no() > static_cast<unsigned>(solver->vars()))
2727
return tvt(tvt::tv_enumt::TV_UNKNOWN);
2828

2929
const int val = solver->val(a.dimacs());
@@ -62,6 +62,9 @@ void satcheck_cadicalt::lcnf(const bvt &bv)
6262
}
6363
solver->add(0); // terminate clause
6464

65+
with_solver_hardness(
66+
[&bv](solver_hardnesst &hardness) { hardness.register_clause(bv); });
67+
6568
clause_counter++;
6669
}
6770

@@ -79,6 +82,21 @@ propt::resultt satcheck_cadicalt::do_prop_solve()
7982
}
8083
else
8184
{
85+
// if assumptions contains false, we need this to be UNSAT
86+
for(const auto &a : assumptions)
87+
{
88+
if(a.is_false())
89+
{
90+
log.status() << "got FALSE as assumption: instance is UNSATISFIABLE"
91+
<< messaget::eom;
92+
status = statust::UNSAT;
93+
return resultt::P_UNSATISFIABLE;
94+
}
95+
}
96+
97+
for(const auto &a : assumptions)
98+
solver->assume(a.dimacs());
99+
82100
switch(solver->solve())
83101
{
84102
case 10:
@@ -107,8 +125,8 @@ void satcheck_cadicalt::set_assignment(literalt a, bool value)
107125
INVARIANT(false, "method not supported");
108126
}
109127

110-
satcheck_cadicalt::satcheck_cadicalt() :
111-
solver(new CaDiCaL::Solver())
128+
satcheck_cadicalt::satcheck_cadicalt(message_handlert &message_handler)
129+
: cnf_solvert(message_handler), solver(new CaDiCaL::Solver())
112130
{
113131
solver->set("quiet", 1);
114132
}
@@ -120,13 +138,20 @@ satcheck_cadicalt::~satcheck_cadicalt()
120138

121139
void satcheck_cadicalt::set_assumptions(const bvt &bv)
122140
{
123-
INVARIANT(false, "method not supported");
141+
// We filter out 'true' assumptions which cause spurious results with CaDiCaL.
142+
assumptions.clear();
143+
for(const auto &assumption : bv)
144+
{
145+
if(!assumption.is_true())
146+
{
147+
assumptions.push_back(assumption);
148+
}
149+
}
124150
}
125151

126152
bool satcheck_cadicalt::is_in_conflict(literalt a) const
127153
{
128-
INVARIANT(false, "method not supported");
129-
return false;
154+
return solver->failed(a.dimacs());
130155
}
131156

132157
#endif

src/solvers/sat/satcheck_cadical.h

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,17 @@ Author: Michael Tautschnig
1212

1313
#include "cnf.h"
1414

15+
#include <solvers/hardness_collector.h>
16+
1517
namespace CaDiCaL // NOLINT(readability/namespace)
1618
{
1719
class Solver; // NOLINT(readability/identifiers)
1820
}
1921

20-
class satcheck_cadicalt:public cnf_solvert
22+
class satcheck_cadicalt : public cnf_solvert, public hardness_collectort
2123
{
2224
public:
23-
satcheck_cadicalt();
25+
explicit satcheck_cadicalt(message_handlert &message_handler);
2426
virtual ~satcheck_cadicalt();
2527

2628
const std::string solver_text() override;
@@ -32,19 +34,37 @@ class satcheck_cadicalt:public cnf_solvert
3234
void set_assumptions(const bvt &_assumptions) override;
3335
bool has_set_assumptions() const override
3436
{
35-
return false;
37+
return true;
3638
}
3739
bool has_is_in_conflict() const override
3840
{
39-
return false;
41+
return true;
4042
}
4143
bool is_in_conflict(literalt a) const override;
4244

45+
void
46+
with_solver_hardness(std::function<void(solver_hardnesst &)> handler) override
47+
{
48+
if(solver_hardness.has_value())
49+
{
50+
handler(solver_hardness.value());
51+
}
52+
}
53+
54+
void enable_hardness_collection() override
55+
{
56+
solver_hardness = solver_hardnesst{};
57+
}
58+
4359
protected:
4460
resultt do_prop_solve() override;
4561

4662
// NOLINTNEXTLINE(readability/identifiers)
4763
CaDiCaL::Solver * solver;
64+
65+
bvt assumptions;
66+
67+
optionalt<solver_hardnesst> solver_hardness;
4868
};
4969

5070
#endif // CPROVER_SOLVERS_SAT_SATCHECK_CADICAL_H

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ SRC += analyses/ai/ai.cpp \
5959
solvers/lowering/byte_operators.cpp \
6060
solvers/prop/bdd_expr.cpp \
6161
solvers/sat/external_sat.cpp \
62+
solvers/sat/satcheck_cadical.cpp \
6263
solvers/sat/satcheck_minisat2.cpp \
6364
solvers/strings/array_pool/array_pool.cpp \
6465
solvers/strings/string_constraint_generator_valueof/calculate_max_string_length.cpp \

0 commit comments

Comments
 (0)