cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
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
25
tvt
satcheck_picosatt::l_get
(
literalt
a)
const
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
))
33
return
tvt
(
tvt::tv_enumt::TV_UNKNOWN
);
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
41
return
tvt
(
tvt::tv_enumt::TV_UNKNOWN
);
42
43
return
result;
44
}
45
46
std::string
satcheck_picosatt::solver_text
()
const
47
{
48
return
"PicoSAT"
;
49
}
50
51
void
satcheck_picosatt::lcnf
(
const
bvt
&bv)
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
65
clause_counter
++;
66
}
67
68
propt::resultt
satcheck_picosatt::do_prop_solve
(
const
bvt
&assumptions)
69
{
70
PRECONDITION
(
status
!=
ERROR
);
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
if
(!literal.is_true())
83
picosat_assume(
picosat
, literal.dimacs());
84
85
const
int
res=picosat_sat(
picosat
, -1);
86
if
(res==PICOSAT_SATISFIABLE)
87
{
88
msg=
"SAT checker: instance is SATISFIABLE"
;
89
log
.status() << msg <<
messaget::eom
;
90
status
=
SAT
;
91
return
P_SATISFIABLE
;
92
}
93
else
94
{
95
INVARIANT
(
96
res == PICOSAT_UNSATISFIABLE,
97
"picosat result should report either sat or unsat"
);
98
msg=
"SAT checker: instance is UNSATISFIABLE"
;
99
log
.status() << msg <<
messaget::eom
;
100
}
101
102
status
=
UNSAT
;
103
return
P_UNSATISFIABLE
;
104
}
105
106
void
satcheck_picosatt::set_assignment
(
literalt
a,
bool
value)
107
{
108
UNREACHABLE
;
109
}
110
111
satcheck_picosatt::satcheck_picosatt
()
112
{
113
picosat
= picosat_init();
114
}
115
116
satcheck_picosatt::~satcheck_picosatt
()
117
{
118
picosat_reset(
picosat
);
119
}
120
121
bool
satcheck_picosatt::is_in_conflict
(
literalt
a)
const
122
{
123
PRECONDITION
(!a.
is_constant
());
124
125
return
picosat_failed_assumption(
picosat
, a.
dimacs
())!=0;
126
}
cnf_solvert::status
statust status
Definition
cnf.h:87
cnf_solvert::statust::UNSAT
@ UNSAT
Definition
cnf.h:86
cnf_solvert::statust::SAT
@ SAT
Definition
cnf.h:86
cnf_solvert::statust::ERROR
@ ERROR
Definition
cnf.h:86
cnf_solvert::clause_counter
size_t clause_counter
Definition
cnf.h:88
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:424
cnft::_no_variables
size_t _no_variables
Definition
cnf.h:57
literalt
Definition
literal.h:26
literalt::sign
bool sign() const
Definition
literal.h:88
literalt::is_constant
bool is_constant() const
Definition
literal.h:166
literalt::dimacs
int dimacs() const
Definition
literal.h:117
literalt::var_no
var_not var_no() const
Definition
literal.h:83
messaget::eom
static eomt eom
Definition
message.h:289
propt::resultt
resultt
Definition
prop.h:101
propt::resultt::P_UNSATISFIABLE
@ P_UNSATISFIABLE
Definition
prop.h:101
propt::resultt::P_SATISFIABLE
@ P_SATISFIABLE
Definition
prop.h:101
propt::log
messaget log
Definition
prop.h:134
satcheck_picosatt::~satcheck_picosatt
~satcheck_picosatt()
Definition
satcheck_picosat.cpp:116
satcheck_picosatt::satcheck_picosatt
satcheck_picosatt()
Definition
satcheck_picosat.cpp:111
satcheck_picosatt::l_get
tvt l_get(literalt a) const override
Definition
satcheck_picosat.cpp:25
satcheck_picosatt::set_assignment
void set_assignment(literalt a, bool value) override
Definition
satcheck_picosat.cpp:106
satcheck_picosatt::picosat
PicoSAT * picosat
Definition
satcheck_picosat.h:44
satcheck_picosatt::solver_text
std::string solver_text() const 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:121
satcheck_picosatt::do_prop_solve
resultt do_prop_solve(const bvt &assumptions) override
Definition
satcheck_picosat.cpp:68
satcheck_picosatt::lcnf
void lcnf(const bvt &bv) override
Definition
satcheck_picosat.cpp:51
tvt
Definition
threeval.h:20
tvt::tv_enumt::TV_UNKNOWN
@ TV_UNKNOWN
Definition
threeval.h:23
bvt
std::vector< literalt > bvt
Definition
literal.h:201
satcheck_picosat.h
invariant.h
UNREACHABLE
#define UNREACHABLE
This should be used to mark dead code.
Definition
invariant.h:525
PRECONDITION
#define PRECONDITION(CONDITION)
Definition
invariant.h:463
INVARIANT
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
Definition
invariant.h:423
threeval.h
solvers
sat
satcheck_picosat.cpp
Generated by
1.17.0