CBMC
satcheck_picosat.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Michael Tautschnig, michael.tautschnig@cs.ox.ac.uk
6 
7 \*******************************************************************/
8 
9 #include "satcheck_picosat.h"
10 
11 #include <algorithm>
12 
13 #include <util/invariant.h>
14 #include <util/threeval.h>
15 
16 extern "C"
17 {
18 #include <picosat.h>
19 }
20 
21 #ifndef HAVE_PICOSAT
22 #error "Expected HAVE_PICOSAT"
23 #endif
24 
26 {
27  if(a.is_constant())
28  return tvt(a.sign());
29 
30  tvt result;
31 
32  if(static_cast<int>(a.var_no())>picosat_variables(picosat))
34 
35  const int val=picosat_deref(picosat, a.dimacs());
36  if(val>0)
37  result=tvt(true);
38  else if(val<0)
39  result=tvt(false);
40  else
42 
43  return result;
44 }
45 
46 const std::string satcheck_picosatt::solver_text()
47 {
48  return "PicoSAT";
49 }
50 
52 {
53  bvt new_bv;
54 
55  if(process_clause(bv, new_bv))
56  return;
57 
58  picosat_adjust(picosat, _no_variables);
59 
60  for(const auto &literal : new_bv)
61  picosat_add(picosat, literal.dimacs());
62 
63  picosat_add(picosat, 0);
64 
66 }
67 
69 {
71 
72  {
73  std::string msg=
74  std::to_string(_no_variables-1)+" variables, "+
75  std::to_string(picosat_added_original_clauses(picosat))+" clauses";
76  log.statistics() << msg << messaget::eom;
77  }
78 
79  std::string msg;
80 
81  for(const auto &literal : assumptions)
82  picosat_assume(picosat, literal.dimacs());
83 
84  const int res=picosat_sat(picosat, -1);
85  if(res==PICOSAT_SATISFIABLE)
86  {
87  msg="SAT checker: instance is SATISFIABLE";
88  log.status() << msg << messaget::eom;
89  status=SAT;
90  return P_SATISFIABLE;
91  }
92  else
93  {
94  INVARIANT(
95  res == PICOSAT_UNSATISFIABLE,
96  "picosat result should report either sat or unsat");
97  msg="SAT checker: instance is UNSATISFIABLE";
98  log.status() << msg << messaget::eom;
99  }
100 
101  status=UNSAT;
102  return P_UNSATISFIABLE;
103 }
104 
106 {
107  UNREACHABLE;
108 }
109 
111 {
112  picosat = picosat_init();
113 }
114 
116 {
117  picosat_reset(picosat);
118 }
119 
121 {
123 
124  return picosat_failed_assumption(picosat, a.dimacs())!=0;
125 }
126 
128 {
129  assumptions=bv;
130 
131  INVARIANT(
132  std::all_of(
133  assumptions.begin(),
134  assumptions.end(),
135  [](const literalt &l) { return !l.is_constant(); }),
136  "assumptions should be non-constant");
137 }
UNREACHABLE
#define UNREACHABLE
This should be used to mark dead code.
Definition: invariant.h:503
cnft::process_clause
bool process_clause(const bvt &bv, bvt &dest) const
filter 'true' from clause, eliminate duplicates, recognise trivially satisfied clauses
Definition: cnf.cpp:425
satcheck_picosatt::set_assumptions
void set_assumptions(const bvt &_assumptions) override
Definition: satcheck_picosat.cpp:127
property_statust::ERROR
@ ERROR
An error occurred during goto checking.
bvt
std::vector< literalt > bvt
Definition: literal.h:201
threeval.h
messaget::status
mstreamt & status() const
Definition: message.h:414
literalt::dimacs
int dimacs() const
Definition: literal.h:117
invariant.h
satcheck_picosat.h
to_string
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
Definition: string_constraint.cpp:58
messaget::eom
static eomt eom
Definition: message.h:297
literalt::var_no
var_not var_no() const
Definition: literal.h:83
satcheck_picosatt::set_assignment
void set_assignment(literalt a, bool value) override
Definition: satcheck_picosat.cpp:105
cnf_solvert::status
statust status
Definition: cnf.h:87
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
cnf_solvert::clause_counter
size_t clause_counter
Definition: cnf.h:88
satcheck_picosatt::l_get
tvt l_get(literalt a) const override
Definition: satcheck_picosat.cpp:25
propt::resultt
resultt
Definition: prop.h:97
satcheck_picosatt::picosat
PicoSAT * picosat
Definition: satcheck_picosat.h:47
tvt
Definition: threeval.h:19
literalt::sign
bool sign() const
Definition: literal.h:88
satcheck_picosatt::assumptions
bvt assumptions
Definition: satcheck_picosat.h:44
satcheck_picosatt::solver_text
const std::string solver_text() override
Definition: satcheck_picosat.cpp:46
satcheck_picosatt::is_in_conflict
bool is_in_conflict(literalt a) const override
Returns true if an assumption is in the final conflict.
Definition: satcheck_picosat.cpp:120
literalt
Definition: literal.h:25
satcheck_picosatt::lcnf
void lcnf(const bvt &bv) override
Definition: satcheck_picosat.cpp:51
cnft::_no_variables
size_t _no_variables
Definition: cnf.h:57
tvt::tv_enumt::TV_UNKNOWN
@ TV_UNKNOWN
propt::log
messaget log
Definition: prop.h:128
satcheck_picosatt::~satcheck_picosatt
~satcheck_picosatt()
Definition: satcheck_picosat.cpp:115
literalt::is_constant
bool is_constant() const
Definition: literal.h:166
satcheck_picosatt::do_prop_solve
resultt do_prop_solve() override
Definition: satcheck_picosat.cpp:68
satcheck_picosatt::satcheck_picosatt
satcheck_picosatt()
Definition: satcheck_picosat.cpp:110
validation_modet::INVARIANT
@ INVARIANT
messaget::statistics
mstreamt & statistics() const
Definition: message.h:419