Skip to content

Commit c50f3d5

Browse files
authored
Merge pull request #1004 from smowton/smowton/feature/time_limit_minisat
Add simple time limiting to prop_conv and propt
2 parents 38907fc + 0ee4933 commit c50f3d5

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

src/solvers/prop/prop.h

+6
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ class propt:public messaget, public prop_assignmentt
108108
// an incremental solver may remove any variables that aren't frozen
109109
virtual void set_frozen(literalt a) { }
110110

111+
// Resource limits:
112+
virtual void set_time_limit_seconds(uint32_t lim)
113+
{
114+
warning() << "CPU limit ignored (not implemented)" << eom;
115+
}
116+
111117
protected:
112118
// to avoid a temporary for lcnf(...)
113119
bvt lcnf_bv;

src/solvers/prop/prop_conv.h

+8
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class prop_convt:public decision_proceduret
5555
// returns true if an assumption is in the final conflict
5656
virtual bool is_in_conflict(literalt l) const;
5757
virtual bool has_is_in_conflict() const { return false; }
58+
59+
// Resource limits:
60+
virtual void set_time_limit_seconds(uint32_t) {}
5861
};
5962

6063
//
@@ -115,6 +118,11 @@ class prop_conv_solvert:public prop_convt
115118
const cachet &get_cache() const { return cache; }
116119
const symbolst &get_symbols() const { return symbols; }
117120

121+
void set_time_limit_seconds(uint32_t lim) override
122+
{
123+
prop.set_time_limit_seconds(lim);
124+
}
125+
118126
protected:
119127
virtual void post_process();
120128

src/solvers/sat/satcheck_minisat2.cpp

+42-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Author: Daniel Kroening, [email protected]
1111
#include <inttypes.h>
1212
#endif
1313

14+
#include <signal.h>
15+
#include <unistd.h>
16+
1417
#include <cassert>
1518
#include <stack>
1619

@@ -112,6 +115,13 @@ void satcheck_minisat2_baset<T>::lcnf(const bvt &bv)
112115
clause_counter++;
113116
}
114117

118+
static Minisat::Solver *solver_to_interrupt=nullptr;
119+
120+
static void interrupt_solver(int signum)
121+
{
122+
solver_to_interrupt->interrupt();
123+
}
124+
115125
template<typename T>
116126
propt::resultt satcheck_minisat2_baset<T>::prop_solve()
117127
{
@@ -151,19 +161,48 @@ propt::resultt satcheck_minisat2_baset<T>::prop_solve()
151161
Minisat::vec<Minisat::Lit> solver_assumptions;
152162
convert(assumptions, solver_assumptions);
153163

154-
if(solver->solve(solver_assumptions))
164+
void (*old_handler)(int)=SIG_ERR;
165+
166+
if(time_limit_seconds!=0)
167+
{
168+
solver_to_interrupt=solver;
169+
old_handler=signal(SIGALRM, interrupt_solver);
170+
if(old_handler==SIG_ERR)
171+
warning() << "Failed to set solver time limit" << eom;
172+
else
173+
alarm(time_limit_seconds);
174+
}
175+
176+
using Minisat::lbool;
177+
lbool solver_result=solver->solveLimited(solver_assumptions);
178+
179+
if(old_handler!=SIG_ERR)
180+
{
181+
alarm(0);
182+
signal(SIGALRM, old_handler);
183+
solver_to_interrupt=solver;
184+
}
185+
186+
if(solver_result==l_True)
155187
{
156188
messaget::status() <<
157189
"SAT checker: instance is SATISFIABLE" << eom;
158190
assert(solver->model.size()!=0);
159191
status=statust::SAT;
160192
return resultt::P_SATISFIABLE;
161193
}
162-
else
194+
else if(solver_result==l_False)
163195
{
164196
messaget::status() <<
165197
"SAT checker: instance is UNSATISFIABLE" << eom;
166198
}
199+
else
200+
{
201+
messaget::status() <<
202+
"SAT checker: timed out or other error" << eom;
203+
status=statust::ERROR;
204+
return resultt::P_ERROR;
205+
}
167206
}
168207
}
169208

@@ -195,7 +234,7 @@ void satcheck_minisat2_baset<T>::set_assignment(literalt a, bool value)
195234

196235
template<typename T>
197236
satcheck_minisat2_baset<T>::satcheck_minisat2_baset(T *_solver):
198-
solver(_solver)
237+
solver(_solver), time_limit_seconds(0)
199238
{
200239
}
201240

src/solvers/sat/satcheck_minisat2.h

+6
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,14 @@ class satcheck_minisat2_baset:public cnf_solvert
4646
virtual bool has_set_assumptions() const final { return true; }
4747
virtual bool has_is_in_conflict() const final { return true; }
4848

49+
void set_time_limit_seconds(uint32_t lim) override
50+
{
51+
time_limit_seconds=lim;
52+
}
53+
4954
protected:
5055
T *solver;
56+
uint32_t time_limit_seconds;
5157

5258
void add_variables();
5359
bvt assumptions;

0 commit comments

Comments
 (0)