Skip to content

Cleanup error handling in solvers/qbf #2961

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 19 additions & 15 deletions src/solvers/qbf/qbf_bdd_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ Author: CM Wintersteiger

#include <solvers/prop/literal.h>

#include <cassert>
#include <fstream>

#include <util/arith_tools.h>
#include <util/invariant.h>
#include <util/std_expr.h>

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

tvt qbf_bdd_coret::l_get(literalt a) const
{
assert(false);
return tvt(false);
UNREACHABLE;
}

const std::string qbf_bdd_coret::solver_text()
Expand Down Expand Up @@ -122,17 +121,18 @@ propt::resultt qbf_bdd_coret::prop_solve()

*matrix=matrix->ExistAbstract(*bdd_variable_map[var]);
}
else if(it->type==quantifiert::UNIVERSAL)
else
{
INVARIANT(
it->type == quantifiert::UNIVERSAL,
"only handles quantified variables");
#if 0
std::cout << "BDD A: " << var << ", " <<
matrix->nodeCount() << " nodes\n";
#endif

*matrix=matrix->UnivAbstract(*bdd_variable_map[var]);
}
else
throw "unquantified variable";
}

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

bool qbf_bdd_coret::is_in_core(literalt l) const
{
throw "nyi";
UNIMPLEMENTED;
}

qdimacs_coret::modeltypet qbf_bdd_coret::m_get(literalt a) const
{
throw "nyi";
UNIMPLEMENTED;
}

literalt qbf_bdd_coret::new_variable()
Expand Down Expand Up @@ -268,17 +268,17 @@ void qbf_bdd_coret::compress_certificate(void)
const exprt qbf_bdd_certificatet::f_get(literalt l)
{
quantifiert q;
if(!find_quantifier(l, q))
throw "no model for unquantified variable";
PRECONDITION_WITH_DIAGNOSTICS(
!find_quantifier(l, q), "no model for unquantified variables");

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

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

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

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

// no cached function, so construct one

assert(model_bdds[l.var_no()]!=NULL);
INVARIANT(
model_bdds[l.var_no()] != nullptr,
"there must be a model BDD for the literal");
BDD &model=*model_bdds[l.var_no()];

#if 0
Expand Down
6 changes: 3 additions & 3 deletions src/solvers/qbf/qbf_quantor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ Author: Daniel Kroening, kroening@kroening.com

#include "qbf_quantor.h"

#include <cassert>
#include <cstdlib>
#include <fstream>

#include <util/invariant.h>

qbf_quantort::qbf_quantort()
{
}
Expand All @@ -22,8 +23,7 @@ qbf_quantort::~qbf_quantort()

tvt qbf_quantort::l_get(literalt) const
{
assert(false);
return tvt::unknown();
UNREACHABLE;
}

const std::string qbf_quantort::solver_text()
Expand Down
6 changes: 3 additions & 3 deletions src/solvers/qbf/qbf_qube.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ Author: CM Wintersteiger

#include "qbf_qube.h"

#include <cassert>
#include <cstdlib>
#include <fstream>

#include <util/invariant.h>

qbf_qubet::qbf_qubet()
{
// skizzo crashes on broken lines
Expand All @@ -24,8 +25,7 @@ qbf_qubet::~qbf_qubet()

tvt qbf_qubet::l_get(literalt) const
{
assert(false);
return tvt(false);
UNREACHABLE;
}

const std::string qbf_qubet::solver_text()
Expand Down
8 changes: 4 additions & 4 deletions src/solvers/qbf/qbf_qube_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ Author: CM Wintersteiger

#include "qbf_qube_core.h"

#include <cassert>
#include <cstdlib>
#include <fstream>
#include <cstring>
#include <fstream>

#include <util/invariant.h>
#include <util/mp_arith.h>

qbf_qube_coret::qbf_qube_coret() : qdimacs_coret()
Expand Down Expand Up @@ -131,10 +131,10 @@ propt::resultt qbf_qube_coret::prop_solve()

bool qbf_qube_coret::is_in_core(literalt) const
{
throw "not supported";
UNIMPLEMENTED;
}

qdimacs_coret::modeltypet qbf_qube_coret::m_get(literalt) const
{
throw "not supported";
UNIMPLEMENTED;
}
4 changes: 3 additions & 1 deletion src/solvers/qbf/qbf_qube_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ Author: CM Wintersteiger

#include "qdimacs_core.h"

#include <util/invariant.h>

class qbf_qube_coret:public qdimacs_coret
{
protected:
Expand Down Expand Up @@ -51,7 +53,7 @@ class qbf_qube_coret:public qdimacs_coret

virtual const exprt f_get(literalt)
{
throw "qube does not support full certificates.";
INVARIANT(false, "qube does not support full certificates.");
}
};

Expand Down
6 changes: 3 additions & 3 deletions src/solvers/qbf/qbf_skizzo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ Author: Daniel Kroening, kroening@kroening.com

#include "qbf_skizzo.h"

#include <cassert>
#include <cstdlib>
#include <fstream>

#include <util/invariant.h>

qbf_skizzot::qbf_skizzot()
{
// skizzo crashes on broken lines
Expand All @@ -24,8 +25,7 @@ qbf_skizzot::~qbf_skizzot()

tvt qbf_skizzot::l_get(literalt) const
{
assert(false);
return tvt(false);
UNREACHABLE;
}

const std::string qbf_skizzot::solver_text()
Expand Down
25 changes: 15 additions & 10 deletions src/solvers/qbf/qbf_skizzo_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ Author: CM Wintersteiger

\*******************************************************************/


#include <cassert>
#include <fstream>

#include <util/invariant.h>

#include <util/string2int.h>

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

bool qbf_skizzo_coret::is_in_core(literalt l) const
{
throw "nyi";
UNIMPLEMENTED;
}

qdimacs_coret::modeltypet qbf_skizzo_coret::m_get(literalt a) const
{
throw "nyi";
UNIMPLEMENTED;
}

bool qbf_skizzo_coret::get_certificate(void)
Expand Down Expand Up @@ -196,7 +196,10 @@ bool qbf_skizzo_coret::get_certificate(void)
std::string line;
std::getline(in, line);

assert(line=="# QBM file, 1.3");
INVARIANT_WITH_DIAGNOSTICS(
line == "# QBM file, 1.3",
"QBM file has to start with this exact string: ",
"# QBM file, 1.3");

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

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

int cur=unsafe_string2int(e_lists.substr(0, space));
assert(cur!=0);
INVARIANT(cur != 0, "variable numbering starts with 1");

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

if(!result)
throw "existential mapping from sKizzo missing";
INVARIANT(result, "existential mapping from sKizzo missing");

in.close();

Expand Down Expand Up @@ -270,7 +272,10 @@ bool qbf_skizzo_coret::get_certificate(void)
NULL,
&bdds);

assert(nroots=2*n_e); // ozziKs documentation guarantees that.
INVARIANT(
nroots == 2 * n_e,
"valid QBM certificate should have twice as much roots as the "
"existential variables");

model_bdds.resize(e_max+1, NULL);

Expand Down
2 changes: 1 addition & 1 deletion src/solvers/qbf/qbf_squolem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ qbf_squolemt::~qbf_squolemt()

tvt qbf_squolemt::l_get(literalt a) const
{
assert(false);
UNREACHABLE;
}

const std::string qbf_squolemt::solver_text()
Expand Down
7 changes: 4 additions & 3 deletions src/solvers/qbf/qbf_squolem_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,12 @@ const exprt qbf_squolem_coret::f_get(literalt l)
{
if(squolem->isUniversal(l.var_no()))
{
assert(l.var_no()!=0);
INVARIANT_WITH_DIAGNOSTICS(
l.var_no() != 0, "unknown variable: ", std::to_string(l.var_no()));
variable_mapt::const_iterator it=variable_map.find(l.var_no());

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

const exprt &sym=it->second.first;
unsigned index=it->second.second;
Expand Down
12 changes: 8 additions & 4 deletions src/solvers/qbf/qdimacs_cnf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ Author: Daniel Kroening, kroening@kroening.com
#include "qdimacs_cnf.h"

#include <iostream>
#include <cassert>

#include <util/invariant.h>

void qdimacs_cnft::write_qdimacs_cnf(std::ostream &out)
{
Expand All @@ -31,9 +32,12 @@ void qdimacs_cnft::write_prefix(std::ostream &out) const
{
const quantifiert &quantifier=*it;

assert(quantifier.var_no<no_variables());
INVARIANT_WITH_DIAGNOSTICS(
quantifier.var_no < no_variables(),
"unknown variable: ",
std::to_string(quantifier.var_no));
// double quantification?
assert(!quantified[quantifier.var_no]);
INVARIANT(!quantified[quantifier.var_no], "no double quantification");
quantified[quantifier.var_no]=true;

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

default:
assert(false);
UNREACHABLE;
}

out << " " << quantifier.var_no << " 0\n";
Expand Down