Skip to content

Commit 72d73e8

Browse files
conp-solutionstautschnig
authored andcommitted
Add support for MergeSat
MergeSat is a recent SAT solver that fits the MiniSat2 interface. To use MergeSat as a proper SAT backend, some extensions might be dropped. Especially being able to print memory usage is not helpful for CBMC, but requires pulling in a new dependency. Signed-off-by: Norbert Manthey <[email protected]>
1 parent b002121 commit 72d73e8

File tree

6 files changed

+214
-5
lines changed

6 files changed

+214
-5
lines changed

scripts/mergesat.patch

+140
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
diff -urN mergesat-3.0.orig/core/OnlineProofChecker.h mergesat-3.0/core/OnlineProofChecker.h
2+
--- mergesat-3.0.orig/core/OnlineProofChecker.h 2021-03-25 07:15:00.000000000 +0000
3+
+++ mergesat-3.0/core/OnlineProofChecker.h 2021-11-04 09:43:19.934897933 +0000
4+
@@ -832,6 +832,6 @@
5+
}
6+
}
7+
8+
-}; // namespace MERGESAT_NSPACE
9+
+} // namespace MERGESAT_NSPACE
10+
11+
#endif
12+
diff -urN mergesat-3.0.orig/core/Solver.cc mergesat-3.0/core/Solver.cc
13+
--- mergesat-3.0.orig/core/Solver.cc 2021-03-25 07:15:00.000000000 +0000
14+
+++ mergesat-3.0/core/Solver.cc 2021-11-04 10:04:45.252778350 +0000
15+
@@ -215,22 +215,22 @@
16+
if (!args) return false;
17+
char *original_args = args;
18+
19+
- const size_t len = strlen(args);
20+
+ std::vector<char *> argv;
21+
+ argv.push_back(strdup("mergesat"));
22+
23+
- char *argv[len + 2];
24+
- int count = 1;
25+
-
26+
- argv[0] = "mergesat";
27+
while (isspace(*args)) ++args;
28+
while (*args) {
29+
- argv[count++] = args; // store current argument
30+
+ argv.push_back(args); // store current argument
31+
while (*args && !isspace(*args)) ++args; // skip current token
32+
if (!*args) break;
33+
*args = (char)0; // separate current token
34+
++args;
35+
}
36+
37+
- parseOptions(count, argv, false);
38+
+ argv.push_back(NULL);
39+
+
40+
+ int count = argv.size() - 1;
41+
+ parseOptions(count, argv.data(), false);
42+
free(original_args);
43+
return false;
44+
}
45+
@@ -2601,7 +2601,7 @@
46+
47+
/* grow limit after each rephasing */
48+
state_change_time = state_change_time + state_change_time_inc;
49+
- state_change_time_inc = state_change_time_inc *= state_change_time_inc_inc;
50+
+ state_change_time_inc *= state_change_time_inc_inc;
51+
52+
/* actually rephase */
53+
if (rand() % 100 < 50)
54+
@@ -3042,7 +3042,8 @@
55+
order_heap_CHB.build(order_heap_DISTANCE.elements());
56+
order_heap = &order_heap_CHB;
57+
break;
58+
- default:
59+
+ case VSIDS_CHB:
60+
+ case CHB:
61+
break;
62+
}
63+
assert(!considersDISTANCE() && "we should have disabled DISTANCE heuristic");
64+
@@ -3062,7 +3063,8 @@
65+
order_heap_DISTANCE.build(order_heap_CHB.elements());
66+
order_heap = &order_heap_DISTANCE;
67+
break;
68+
- default:
69+
+ case VSIDS_DISTANCE:
70+
+ case DISTANCE:
71+
break;
72+
}
73+
assert(considersDISTANCE() && "we should have enabled DISTANCE heuristic");
74+
diff -urN mergesat-3.0.orig/core/SolverTypes.h mergesat-3.0/core/SolverTypes.h
75+
--- mergesat-3.0.orig/core/SolverTypes.h 2021-03-25 07:15:00.000000000 +0000
76+
+++ mergesat-3.0/core/SolverTypes.h 2021-11-04 09:47:03.613323317 +0000
77+
@@ -187,6 +187,16 @@
78+
unsigned onQueue : 1;
79+
unsigned size : 30;
80+
} header;
81+
+#if defined __clang__
82+
+ #pragma clang diagnostic push
83+
+ #pragma clang diagnostic ignored "-Wzero-length-array"
84+
+#elif defined __GNUC__
85+
+ #pragma GCC diagnostic push
86+
+ #pragma GCC diagnostic ignored "-Wpedantic" // no specific ZLA warning in GCC
87+
+#elif defined _MSC_VER
88+
+ #pragma warning(push)
89+
+ #pragma warning(disable:4200)
90+
+#endif
91+
union {
92+
Lit lit;
93+
float act;
94+
@@ -194,6 +204,13 @@
95+
uint32_t touched;
96+
CRef rel;
97+
} data[0];
98+
+#if defined __clang__
99+
+ #pragma clang diagnostic pop
100+
+#elif defined __GNUC__
101+
+ #pragma GCC diagnostic pop
102+
+#elif defined _MSC_VER
103+
+ #pragma warning(pop)
104+
+#endif
105+
106+
friend class ClauseAllocator;
107+
108+
diff --git a/minisat/mtl/Vec.h b/minisat/mtl/Vec.h
109+
--- a/minisat/mtl/Vec.h
110+
+++ b/minisat/mtl/Vec.h
111+
@@ -159,8 +159,7 @@
112+
int add = imax((min_cap - cap + 1) & ~1, ((cap >> 1) + 2) & ~1); // NOTE: grow by approximately 3/2
113+
if (add > INT_MAX - cap) throw OutOfMemoryException();
114+
115+
- T *newdata = (T *)::realloc(data, (cap + add) * sizeof(T));
116+
+ T *newdata = (T *)xrealloc(data, (cap + add) * sizeof(T));
117+
- if (newdata == NULL && errno == ENOMEM) throw OutOfMemoryException();
118+
119+
cap += add;
120+
data = newdata;
121+
diff --git a/minisat/mtl/XAlloc.h b/minisat/mtl/XAlloc.h
122+
--- a/minisat/mtl/XAlloc.h
123+
+++ b/minisat/mtl/XAlloc.h
124+
@@ -21,7 +21,6 @@
125+
#ifndef MergeSat_XAlloc_h
126+
#define MergeSat_XAlloc_h
127+
128+
-#include <errno.h>
129+
#include <stdlib.h>
130+
131+
// To not introduce this multiple times, use this header, as it's rather central
132+
@@ -41,7 +40,7 @@
133+
static inline void *xrealloc(void *ptr, size_t size)
134+
{
135+
void *mem = realloc(ptr, size);
136+
- if (mem == NULL && errno == ENOMEM) {
137+
+ if (mem == NULL) {
138+
throw OutOfMemoryException();
139+
} else
140+
return mem;

src/Makefile

+15
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,21 @@ minisat2-download:
133133
@(cd ../minisat-2.2.1; patch -p1 < ../scripts/minisat-2.2.1-patch)
134134
@rm minisat2_2.2.1.orig.tar.gz
135135

136+
mergesat-download:
137+
@echo "Downloading MergeSat (replacing Minisat 2.2.1)"
138+
@for i in $$(seq 1 3) ; do \
139+
$(DOWNLOADER) \
140+
https://github.com/conp-solutions/mergesat/archive/refs/tags/v3.0.tar.gz && \
141+
exit 0 ; \
142+
$(RM) v3.0.tar.gz ; \
143+
if [ $$i -lt 3 ] ; then echo "Re-trying in 10 seconds" 1>&2 ; sleep 10 ; fi ; \
144+
done ; exit 1
145+
@$(TAR) xfz v3.0.tar.gz # will create mergesat-3.0
146+
@rm -Rf ../mergesat-3.0
147+
@mv mergesat-3.0 ../
148+
@(cd ../mergesat-3.0; patch -p1 < ../scripts/mergesat.patch)
149+
@rm v3.0.tar.gz
150+
136151
cudd-download:
137152
@echo "Downloading Cudd 3.0.0"
138153
@$(DOWNLOADER) https://sourceforge.net/projects/cudd-mirror/files/cudd-3.0.0.tar.gz/download cudd-3.0.0.tar.gz

src/config.inc

+6-1
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ endif
3030
#BOOLEFORCE = ../../booleforce-0.4
3131
#MINISAT = ../../MiniSat-p_v1.14
3232
#MINISAT2 = ../../minisat-2.2.1
33+
#MERGESAT = ../../mergesat-3.0
3334
#IPASIR = ../../ipasir
3435
#GLUCOSE = ../../glucose-syrup
3536
#CADICAL = ../../cadical
3637

3738
# select default solver to be minisat2 if no other is specified
38-
ifeq ($(BOOLEFORCE)$(CHAFF)$(GLUCOSE)$(IPASIR)$(LINGELING)$(MINISAT)$(MINISAT2)$(PICOSAT)$(CADICAL),)
39+
ifeq ($(BOOLEFORCE)$(CHAFF)$(GLUCOSE)$(IPASIR)$(LINGELING)$(MINISAT)$(MINISAT2)$(MERGESAT)$(PICOSAT)$(CADICAL),)
3940
MINISAT2 = ../../minisat-2.2.1
4041
endif
4142

@@ -63,6 +64,10 @@ ifneq ($(MINISAT2),)
6364
CP_CXXFLAGS += -DSATCHECK_MINISAT2
6465
endif
6566

67+
ifneq ($(MERGESAT),)
68+
CP_CXXFLAGS += -DSATCHECK_MERGESAT
69+
endif
70+
6671
ifneq ($(GLUCOSE),)
6772
CP_CXXFLAGS += -DSATCHECK_GLUCOSE
6873
endif

src/solvers/Makefile

+33-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ ifneq ($(MINISAT2),)
2222
CLEANFILES += $(MINISAT2_LIB) $(patsubst %$(OBJEXT), %$(DEPEXT), $(MINISAT2_LIB))
2323
endif
2424

25+
ifneq ($(MERGESAT),)
26+
MERGESAT_SRC=sat/satcheck_minisat2.cpp
27+
MERGESAT_INCLUDE=-I $(MERGESAT)
28+
MERGESAT_LIB=$(MERGESAT)/minisat/simp/SimpSolver$(OBJEXT) $(MERGESAT)/minisat/core/Solver$(OBJEXT) $(MERGESAT)/minisat/utils/ccnr$(OBJEXT) $(MERGESAT)/minisat/utils/Options$(OBJEXT) $(MERGESAT)/minisat/utils/System$(OBJEXT)
29+
CP_CXXFLAGS += -DHAVE_MERGESAT -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
30+
CLEANFILES += $(MERGESAT_LIB) $(patsubst %$(OBJEXT), %$(DEPEXT), $(MERGESAT_LIB))
31+
endif
32+
2533
ifneq ($(IPASIR),)
2634
IPASIR_SRC=sat/satcheck_ipasir.cpp
2735
IPASIR_INCLUDE=-I $(IPASIR)
@@ -74,6 +82,7 @@ SRC = $(BOOLEFORCE_SRC) \
7482
$(GLUCOSE_SRC) \
7583
$(LINGELING_SRC) \
7684
$(MINISAT2_SRC) \
85+
$(MERGESAT_SRC) \
7786
$(IPASIR_SRC) \
7887
$(MINISAT_SRC) \
7988
$(PICOSAT_SRC) \
@@ -222,6 +231,28 @@ $(MINISAT2)/minisat/core/Solver$(OBJEXT): $(MINISAT2)/minisat/core/Solver.cc
222231
endif
223232
endif
224233

234+
ifneq ($(MERGESAT),)
235+
ifeq ($(BUILD_ENV_),MSVC)
236+
sat/satcheck_minisat2$(OBJEXT): sat/satcheck_minisat2.cpp
237+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
238+
239+
$(MERGESAT)/minisat/utils/ccnr$(OBJEXT): $(MERGESAT)/minisat/utils/ccnr.cc
240+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
241+
242+
$(MERGESAT)/minisat/utils/Options$(OBJEXT): $(MERGESAT)/minisat/utils/Options.cc
243+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
244+
245+
$(MERGESAT)/minisat/utils/System$(OBJEXT): $(MERGESAT)/minisat/utils/System.cc
246+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
247+
248+
$(MERGESAT)/minisat/simp/SimpSolver$(OBJEXT): $(MERGESAT)/minisat/simp/SimpSolver.cc
249+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
250+
251+
$(MERGESAT)/minisat/core/Solver$(OBJEXT): $(MERGESAT)/minisat/core/Solver.cc
252+
$(CXX) $(CP_CXXFLAGS) /w /nologo /c /EHsc $< /Fo$@
253+
endif
254+
endif
255+
225256
ifneq ($(GLUCOSE),)
226257
ifeq ($(BUILD_ENV_),MSVC)
227258
sat/satcheck_glucose$(OBJEXT): sat/satcheck_glucose.cpp
@@ -237,6 +268,7 @@ endif
237268

238269
INCLUDES += -I .. \
239270
$(CHAFF_INCLUDE) $(BOOLEFORCE_INCLUDE) $(MINISAT_INCLUDE) $(MINISAT2_INCLUDE) \
271+
$(MERGESAT_INCLUDE) \
240272
$(IPASIR_INCLUDE) \
241273
$(SQUOLEM2_INC) $(CUDD_INCLUDE) $(GLUCOSE_INCLUDE) \
242274
$(PICOSAT_INCLUDE) $(LINGELING_INCLUDE) $(CADICAL_INCLUDE)
@@ -255,7 +287,7 @@ endif
255287
endif
256288

257289
SOLVER_LIB = $(CHAFF_LIB) $(BOOLEFORCE_LIB) $(MINISAT_LIB) \
258-
$(MINISAT2_LIB) $(SQUOLEM2_LIB) $(CUDD_LIB) \
290+
$(MINISAT2_LIB) $(MERGESAT_LIB) $(SQUOLEM2_LIB) $(CUDD_LIB) \
259291
$(PICOSAT_LIB) $(LINGELING_LIB) $(GLUCOSE_LIB) $(CADICAL_LIB)
260292

261293
SOLVER_OBJS = $(filter %$(OBJEXT), $(SOLVER_LIB))

src/solvers/sat/satcheck.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Author: Daniel Kroening, [email protected]
1717
// #define SATCHECK_ZCHAFF
1818
// #define SATCHECK_MINISAT1
1919
// #define SATCHECK_MINISAT2
20+
// #define SATCHECK_MERGESAT
2021
// #define SATCHECK_GLUCOSE
2122
// #define SATCHECK_BOOLEFORCE
2223
// #define SATCHECK_PICOSAT
@@ -39,6 +40,10 @@ Author: Daniel Kroening, [email protected]
3940
#define SATCHECK_MINISAT2
4041
#endif
4142

43+
#if defined(HAVE_MERGESAT) && !defined(SATCHECK_MERGESAT)
44+
#define SATCHECK_MERGESAT
45+
#endif
46+
4247
#if defined(HAVE_GLUCOSE) && !defined(SATCHECK_GLUCOSE)
4348
#define SATCHECK_GLUCOSE
4449
#endif
@@ -80,7 +85,7 @@ typedef satcheck_booleforcet satcheck_no_simplifiert;
8085
typedef satcheck_minisat1t satcheckt;
8186
typedef satcheck_minisat1t satcheck_no_simplifiert;
8287

83-
#elif defined SATCHECK_MINISAT2
88+
#elif defined SATCHECK_MINISAT2 || defined SATCHECK_MERGESAT
8489

8590
#include "satcheck_minisat2.h"
8691

src/solvers/sat/satcheck_minisat2.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ Author: Daniel Kroening, [email protected]
2222
#include <minisat/core/Solver.h>
2323
#include <minisat/simp/SimpSolver.h>
2424

25-
#ifndef HAVE_MINISAT2
26-
#error "Expected HAVE_MINISAT2"
25+
#if !defined(HAVE_MINISAT2) && !defined(HAVE_MERGESAT)
26+
#error "Expected HAVE_MINISAT2 or HAVE_MERGESAT"
2727
#endif
2828

2929
void convert(const bvt &bv, Minisat::vec<Minisat::Lit> &dest)
@@ -77,7 +77,11 @@ void satcheck_minisat2_baset<T>::set_polarity(literalt a, bool value)
7777
try
7878
{
7979
add_variables();
80+
#ifdef HAVE_MERGESAT
81+
solver->setPolarity(a.var_no(), value);
82+
#else
8083
solver->setPolarity(a.var_no(), value ? l_True : l_False);
84+
#endif
8185
}
8286
catch(Minisat::OutOfMemoryException)
8387
{
@@ -101,12 +105,20 @@ void satcheck_minisat2_baset<T>::clear_interrupt()
101105

102106
const std::string satcheck_minisat_no_simplifiert::solver_text()
103107
{
108+
#ifdef HAVE_MERGESAT
109+
return "Mergesat 3.0 without simplifier";
110+
#else
104111
return "MiniSAT 2.2.1 without simplifier";
112+
#endif
105113
}
106114

107115
const std::string satcheck_minisat_simplifiert::solver_text()
108116
{
117+
#ifdef HAVE_MERGESAT
118+
return "Mergesat 3.0 with simplifier";
119+
#else
109120
return "MiniSAT 2.2.1 with simplifier";
121+
#endif
110122
}
111123

112124
template<typename T>

0 commit comments

Comments
 (0)