Skip to content

Commit 13d40b0

Browse files
authored
Merge pull request #2961 from xbauch/cleanup_qbf
Cleanup error handling in solvers/qbf
2 parents e0dbf2a + 706a529 commit 13d40b0

File tree

10 files changed

+63
-47
lines changed

10 files changed

+63
-47
lines changed

src/solvers/qbf/qbf_bdd_core.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ Author: CM Wintersteiger
88

99
#include <solvers/prop/literal.h>
1010

11-
#include <cassert>
1211
#include <fstream>
1312

1413
#include <util/arith_tools.h>
14+
#include <util/invariant.h>
1515
#include <util/std_expr.h>
1616

1717
#include <cuddObj.hh> // CUDD Library
@@ -80,8 +80,7 @@ qbf_bdd_coret::~qbf_bdd_coret()
8080

8181
tvt qbf_bdd_coret::l_get(literalt a) const
8282
{
83-
assert(false);
84-
return tvt(false);
83+
UNREACHABLE;
8584
}
8685

8786
const std::string qbf_bdd_coret::solver_text()
@@ -122,17 +121,18 @@ propt::resultt qbf_bdd_coret::prop_solve()
122121

123122
*matrix=matrix->ExistAbstract(*bdd_variable_map[var]);
124123
}
125-
else if(it->type==quantifiert::UNIVERSAL)
124+
else
126125
{
126+
INVARIANT(
127+
it->type == quantifiert::UNIVERSAL,
128+
"only handles quantified variables");
127129
#if 0
128130
std::cout << "BDD A: " << var << ", " <<
129131
matrix->nodeCount() << " nodes\n";
130132
#endif
131133

132134
*matrix=matrix->UnivAbstract(*bdd_variable_map[var]);
133135
}
134-
else
135-
throw "unquantified variable";
136136
}
137137

138138
if(*matrix==bdd_manager->bddOne())
@@ -151,12 +151,12 @@ propt::resultt qbf_bdd_coret::prop_solve()
151151

152152
bool qbf_bdd_coret::is_in_core(literalt l) const
153153
{
154-
throw "nyi";
154+
UNIMPLEMENTED;
155155
}
156156

157157
qdimacs_coret::modeltypet qbf_bdd_coret::m_get(literalt a) const
158158
{
159-
throw "nyi";
159+
UNIMPLEMENTED;
160160
}
161161

162162
literalt qbf_bdd_coret::new_variable()
@@ -268,17 +268,17 @@ void qbf_bdd_coret::compress_certificate(void)
268268
const exprt qbf_bdd_certificatet::f_get(literalt l)
269269
{
270270
quantifiert q;
271-
if(!find_quantifier(l, q))
272-
throw "no model for unquantified variable";
271+
PRECONDITION_WITH_DIAGNOSTICS(
272+
!find_quantifier(l, q), "no model for unquantified variables");
273273

274274
// universal?
275275
if(q.type==quantifiert::UNIVERSAL)
276276
{
277-
assert(l.var_no()!=0);
277+
INVARIANT(l.var_no() != 0, "input literal wasn't properly initialized");
278278
variable_mapt::const_iterator it=variable_map.find(l.var_no());
279279

280-
if(it==variable_map.end())
281-
throw "variable map error";
280+
INVARIANT(
281+
it != variable_map.end(), "variable not found in the variable map");
282282

283283
const exprt &sym=it->second.first;
284284
unsigned index=it->second.second;
@@ -293,7 +293,9 @@ const exprt qbf_bdd_certificatet::f_get(literalt l)
293293
else
294294
{
295295
// skolem functions for existentials
296-
assert(q.type==quantifiert::EXISTENTIAL);
296+
INVARIANT(
297+
q.type == quantifiert::EXISTENTIAL,
298+
"only quantified literals are supported");
297299

298300
function_cachet::const_iterator it=function_cache.find(l.var_no());
299301
if(it!=function_cache.end())
@@ -310,7 +312,9 @@ const exprt qbf_bdd_certificatet::f_get(literalt l)
310312

311313
// no cached function, so construct one
312314

313-
assert(model_bdds[l.var_no()]!=NULL);
315+
INVARIANT(
316+
model_bdds[l.var_no()] != nullptr,
317+
"there must be a model BDD for the literal");
314318
BDD &model=*model_bdds[l.var_no()];
315319

316320
#if 0

src/solvers/qbf/qbf_quantor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ Author: Daniel Kroening, [email protected]
88

99
#include "qbf_quantor.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
1312
#include <fstream>
1413

14+
#include <util/invariant.h>
15+
1516
qbf_quantort::qbf_quantort()
1617
{
1718
}
@@ -22,8 +23,7 @@ qbf_quantort::~qbf_quantort()
2223

2324
tvt qbf_quantort::l_get(literalt) const
2425
{
25-
assert(false);
26-
return tvt::unknown();
26+
UNREACHABLE;
2727
}
2828

2929
const std::string qbf_quantort::solver_text()

src/solvers/qbf/qbf_qube.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ Author: CM Wintersteiger
88

99
#include "qbf_qube.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
1312
#include <fstream>
1413

14+
#include <util/invariant.h>
15+
1516
qbf_qubet::qbf_qubet()
1617
{
1718
// skizzo crashes on broken lines
@@ -24,8 +25,7 @@ qbf_qubet::~qbf_qubet()
2425

2526
tvt qbf_qubet::l_get(literalt) const
2627
{
27-
assert(false);
28-
return tvt(false);
28+
UNREACHABLE;
2929
}
3030

3131
const std::string qbf_qubet::solver_text()

src/solvers/qbf/qbf_qube_core.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ Author: CM Wintersteiger
88

99
#include "qbf_qube_core.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
13-
#include <fstream>
1412
#include <cstring>
13+
#include <fstream>
1514

15+
#include <util/invariant.h>
1616
#include <util/mp_arith.h>
1717

1818
qbf_qube_coret::qbf_qube_coret() : qdimacs_coret()
@@ -131,10 +131,10 @@ propt::resultt qbf_qube_coret::prop_solve()
131131

132132
bool qbf_qube_coret::is_in_core(literalt) const
133133
{
134-
throw "not supported";
134+
UNIMPLEMENTED;
135135
}
136136

137137
qdimacs_coret::modeltypet qbf_qube_coret::m_get(literalt) const
138138
{
139-
throw "not supported";
139+
UNIMPLEMENTED;
140140
}

src/solvers/qbf/qbf_qube_core.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Author: CM Wintersteiger
1212

1313
#include "qdimacs_core.h"
1414

15+
#include <util/invariant.h>
16+
1517
class qbf_qube_coret:public qdimacs_coret
1618
{
1719
protected:
@@ -51,7 +53,7 @@ class qbf_qube_coret:public qdimacs_coret
5153

5254
virtual const exprt f_get(literalt)
5355
{
54-
throw "qube does not support full certificates.";
56+
INVARIANT(false, "qube does not support full certificates.");
5557
}
5658
};
5759

src/solvers/qbf/qbf_skizzo.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ Author: Daniel Kroening, [email protected]
88

99
#include "qbf_skizzo.h"
1010

11-
#include <cassert>
1211
#include <cstdlib>
1312
#include <fstream>
1413

14+
#include <util/invariant.h>
15+
1516
qbf_skizzot::qbf_skizzot()
1617
{
1718
// skizzo crashes on broken lines
@@ -24,8 +25,7 @@ qbf_skizzot::~qbf_skizzot()
2425

2526
tvt qbf_skizzot::l_get(literalt) const
2627
{
27-
assert(false);
28-
return tvt(false);
28+
UNREACHABLE;
2929
}
3030

3131
const std::string qbf_skizzot::solver_text()

src/solvers/qbf/qbf_skizzo_core.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ Author: CM Wintersteiger
66
77
\*******************************************************************/
88

9-
10-
#include <cassert>
119
#include <fstream>
1210

11+
#include <util/invariant.h>
12+
1313
#include <util/string2int.h>
1414

1515
#include <cuddObj.hh> // CUDD Library
@@ -132,12 +132,12 @@ propt::resultt qbf_skizzo_coret::prop_solve()
132132

133133
bool qbf_skizzo_coret::is_in_core(literalt l) const
134134
{
135-
throw "nyi";
135+
UNIMPLEMENTED;
136136
}
137137

138138
qdimacs_coret::modeltypet qbf_skizzo_coret::m_get(literalt a) const
139139
{
140-
throw "nyi";
140+
UNIMPLEMENTED;
141141
}
142142

143143
bool qbf_skizzo_coret::get_certificate(void)
@@ -196,7 +196,10 @@ bool qbf_skizzo_coret::get_certificate(void)
196196
std::string line;
197197
std::getline(in, line);
198198

199-
assert(line=="# QBM file, 1.3");
199+
INVARIANT_WITH_DIAGNOSTICS(
200+
line == "# QBM file, 1.3",
201+
"QBM file has to start with this exact string: ",
202+
"# QBM file, 1.3");
200203

201204
while(in)
202205
{
@@ -215,7 +218,7 @@ bool qbf_skizzo_coret::get_certificate(void)
215218
size_t ob=line.find('[');
216219
std::string n_es=line.substr(ob+1, line.find(']')-ob-1);
217220
n_e=unsafe_string2int(n_es);
218-
assert(n_e!=0);
221+
INVARIANT(n_e != 0, "there has to be at least one existential variable");
219222

220223
e_list.resize(n_e);
221224
std::string e_lists=line.substr(line.find(':')+2);
@@ -225,7 +228,7 @@ bool qbf_skizzo_coret::get_certificate(void)
225228
size_t space=e_lists.find(' ');
226229

227230
int cur=unsafe_string2int(e_lists.substr(0, space));
228-
assert(cur!=0);
231+
INVARIANT(cur != 0, "variable numbering starts with 1");
229232

230233
e_list[i]=cur;
231234
if(cur>e_max)
@@ -234,8 +237,7 @@ bool qbf_skizzo_coret::get_certificate(void)
234237
e_lists=e_lists.substr(space+1);
235238
}
236239

237-
if(!result)
238-
throw "existential mapping from sKizzo missing";
240+
INVARIANT(result, "existential mapping from sKizzo missing");
239241

240242
in.close();
241243

@@ -270,7 +272,10 @@ bool qbf_skizzo_coret::get_certificate(void)
270272
NULL,
271273
&bdds);
272274

273-
assert(nroots=2*n_e); // ozziKs documentation guarantees that.
275+
INVARIANT(
276+
nroots == 2 * n_e,
277+
"valid QBM certificate should have twice as much roots as the "
278+
"existential variables");
274279

275280
model_bdds.resize(e_max+1, NULL);
276281

src/solvers/qbf/qbf_squolem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ qbf_squolemt::~qbf_squolemt()
2323

2424
tvt qbf_squolemt::l_get(literalt a) const
2525
{
26-
assert(false);
26+
UNREACHABLE;
2727
}
2828

2929
const std::string qbf_squolemt::solver_text()

src/solvers/qbf/qbf_squolem_core.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,12 @@ const exprt qbf_squolem_coret::f_get(literalt l)
189189
{
190190
if(squolem->isUniversal(l.var_no()))
191191
{
192-
assert(l.var_no()!=0);
192+
INVARIANT_WITH_DIAGNOSTICS(
193+
l.var_no() != 0, "unknown variable: ", std::to_string(l.var_no()));
193194
variable_mapt::const_iterator it=variable_map.find(l.var_no());
194195

195-
if(it==variable_map.end())
196-
throw "variable map error";
196+
INVARIANT(
197+
it != variable_map.end(), "variable not found in the variable map");
197198

198199
const exprt &sym=it->second.first;
199200
unsigned index=it->second.second;

src/solvers/qbf/qdimacs_cnf.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ Author: Daniel Kroening, [email protected]
99
#include "qdimacs_cnf.h"
1010

1111
#include <iostream>
12-
#include <cassert>
12+
13+
#include <util/invariant.h>
1314

1415
void qdimacs_cnft::write_qdimacs_cnf(std::ostream &out)
1516
{
@@ -31,9 +32,12 @@ void qdimacs_cnft::write_prefix(std::ostream &out) const
3132
{
3233
const quantifiert &quantifier=*it;
3334

34-
assert(quantifier.var_no<no_variables());
35+
INVARIANT_WITH_DIAGNOSTICS(
36+
quantifier.var_no < no_variables(),
37+
"unknown variable: ",
38+
std::to_string(quantifier.var_no));
3539
// double quantification?
36-
assert(!quantified[quantifier.var_no]);
40+
INVARIANT(!quantified[quantifier.var_no], "no double quantification");
3741
quantified[quantifier.var_no]=true;
3842

3943
switch(quantifier.type)
@@ -47,7 +51,7 @@ void qdimacs_cnft::write_prefix(std::ostream &out) const
4751
break;
4852

4953
default:
50-
assert(false);
54+
UNREACHABLE;
5155
}
5256

5357
out << " " << quantifier.var_no << " 0\n";

0 commit comments

Comments
 (0)