cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
prop_minimize.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module: Minimize some target function incrementally
4
5
Author: Daniel Kroening, kroening@kroening.com
6
7
\*******************************************************************/
8
11
12
#include "
prop_minimize.h
"
13
14
#include <
util/threeval.h
>
15
16
#include "
literal_expr.h
"
17
#include "
prop_conv.h
"
18
19
prop_minimizet::prop_minimizet
(
20
prop_convt
&_prop_conv,
21
message_handlert
&message_handler)
22
:
prop_conv
(_prop_conv),
log
(message_handler)
23
{
24
}
25
27
void
prop_minimizet::objective
(
const
literalt
condition,
const
weightt
weight)
28
{
29
if
(weight > 0)
30
{
31
objectives
[weight].push_back(
objectivet
(condition));
32
_number_objectives
++;
33
}
34
else
if
(weight < 0)
35
{
36
objectives
[-weight].push_back(
objectivet
(!condition));
37
_number_objectives
++;
38
}
39
}
40
42
void
prop_minimizet::fix_objectives
()
43
{
44
std::vector<objectivet> &entry =
current
->second;
45
bool
found =
false
;
46
47
for
(std::vector<objectivet>::iterator o_it = entry.begin();
48
o_it != entry.end();
49
++o_it)
50
{
51
if
(!o_it->fixed &&
prop_conv
.l_get(o_it->condition).is_false())
52
{
53
_number_satisfied
++;
54
_value
+=
current
->first;
55
prop_conv
.set_to(
literal_exprt
(o_it->condition),
false
);
// fix it
56
o_it->fixed =
true
;
57
found =
true
;
58
}
59
}
60
61
POSTCONDITION
(found);
62
}
63
65
literalt
prop_minimizet::constraint
()
66
{
67
std::vector<objectivet> &entry =
current
->second;
68
69
bvt
or_clause;
70
71
for
(std::vector<objectivet>::iterator o_it = entry.begin();
72
o_it != entry.end();
73
++o_it)
74
{
75
if
(!o_it->fixed)
76
or_clause.push_back(!o_it->condition);
77
}
78
79
// This returns false if the clause is empty,
80
// i.e., no further improvement possible.
81
if
(or_clause.empty())
82
return
const_literal
(
false
);
83
else
if
(or_clause.size() == 1)
84
return
or_clause.front();
85
else
86
{
87
exprt::operandst
disjuncts;
88
disjuncts.reserve(or_clause.size());
89
for
(
const
auto
&literal : or_clause)
90
disjuncts.push_back(
literal_exprt
(literal));
91
92
return
prop_conv
.convert(
disjunction
(disjuncts));
93
}
94
}
95
97
void
prop_minimizet::operator()
()
98
{
99
_iterations
= 0;
100
_number_satisfied
= 0;
101
_value
= 0;
102
bool
last_was_SAT =
false
;
103
104
// go from high weights to low ones
105
for
(
current
=
objectives
.rbegin();
current
!=
objectives
.rend();
current
++)
106
{
107
log
.status() <<
"weight "
<<
current
->first <<
messaget::eom
;
108
109
decision_proceduret::resultt
dec_result;
110
do
111
{
112
// We want to improve on one of the objectives, please!
113
literalt
c =
constraint
();
114
115
if
(c.
is_false
())
116
dec_result =
decision_proceduret::resultt::D_UNSATISFIABLE
;
117
else
118
{
119
_iterations
++;
120
121
prop_conv
.push({
literal_exprt
{c}});
122
dec_result =
prop_conv
();
123
124
switch
(dec_result)
125
{
126
case
decision_proceduret::resultt::D_UNSATISFIABLE
:
127
last_was_SAT =
false
;
128
break
;
129
130
case
decision_proceduret::resultt::D_SATISFIABLE
:
131
last_was_SAT =
true
;
132
fix_objectives
();
// fix the ones we got
133
break
;
134
135
case
decision_proceduret::resultt::D_ERROR
:
136
log
.error() <<
"decision procedure failed"
<<
messaget::eom
;
137
last_was_SAT =
false
;
138
return
;
139
}
140
}
141
}
while
(dec_result !=
decision_proceduret::resultt::D_UNSATISFIABLE
);
142
}
143
144
if
(!last_was_SAT)
145
{
146
// We don't have a satisfying assignment to work with.
147
// Run solver again to get one.
148
149
prop_conv
.pop();
150
(void)
prop_conv
();
151
}
152
}
decision_proceduret::resultt
resultt
Result of running the decision procedure.
Definition
decision_procedure.h:45
decision_proceduret::resultt::D_ERROR
@ D_ERROR
Definition
decision_procedure.h:48
decision_proceduret::resultt::D_UNSATISFIABLE
@ D_UNSATISFIABLE
Definition
decision_procedure.h:47
decision_proceduret::resultt::D_SATISFIABLE
@ D_SATISFIABLE
Definition
decision_procedure.h:46
exprt::operandst
std::vector< exprt > operandst
Definition
expr.h:59
literal_exprt
Definition
literal_expr.h:18
literalt
Definition
literal.h:26
literalt::is_false
bool is_false() const
Definition
literal.h:161
message_handlert
Definition
message.h:27
messaget::eom
static eomt eom
Definition
message.h:289
prop_convt
Definition
prop_conv.h:22
prop_minimizet::objectives
objectivest objectives
Definition
prop_minimize.h:69
prop_minimizet::prop_minimizet
prop_minimizet(prop_convt &_prop_conv, message_handlert &message_handler)
Definition
prop_minimize.cpp:19
prop_minimizet::fix_objectives
void fix_objectives()
Fix objectives that are satisfied.
Definition
prop_minimize.cpp:42
prop_minimizet::prop_conv
prop_convt & prop_conv
Definition
prop_minimize.h:76
prop_minimizet::_number_objectives
std::size_t _number_objectives
Definition
prop_minimize.h:74
prop_minimizet::_iterations
unsigned _iterations
Definition
prop_minimize.h:72
prop_minimizet::_value
weightt _value
Definition
prop_minimize.h:75
prop_minimizet::_number_satisfied
std::size_t _number_satisfied
Definition
prop_minimize.h:73
prop_minimizet::weightt
long long signed int weightt
Definition
prop_minimize.h:51
prop_minimizet::constraint
literalt constraint()
Build constraints that require us to improve on at least one goal, greedily.
Definition
prop_minimize.cpp:65
prop_minimizet::log
messaget log
Definition
prop_minimize.h:77
prop_minimizet::operator()
void operator()()
Try to cover all objectives.
Definition
prop_minimize.cpp:97
prop_minimizet::objective
void objective(const literalt condition, const weightt weight=1)
Add an objective.
Definition
prop_minimize.cpp:27
prop_minimizet::current
objectivest::reverse_iterator current
Definition
prop_minimize.h:82
bvt
std::vector< literalt > bvt
Definition
literal.h:201
const_literal
literalt const_literal(bool value)
Definition
literal.h:188
literal_expr.h
prop_conv.h
prop_minimize.h
SAT Minimizer.
POSTCONDITION
#define POSTCONDITION(CONDITION)
Definition
invariant.h:479
disjunction
exprt disjunction(const exprt::operandst &op)
1) generates a disjunction for two or more operands 2) for one operand, returns the operand 3) return...
Definition
std_expr.cpp:240
prop_minimizet::objectivet
Definition
prop_minimize.h:57
threeval.h
solvers
prop
prop_minimize.cpp
Generated by
1.17.0