Skip to content

Commit 4b72e51

Browse files
SLS: log clause , allow more frequent export of SLS state to SMT
1 parent 84447b7 commit 4b72e51

File tree

4 files changed

+32
-21
lines changed

4 files changed

+32
-21
lines changed

src/ast/sls/sls_arith_base.cpp

+20-20
Original file line numberDiff line numberDiff line change
@@ -123,38 +123,37 @@ namespace sls {
123123
// distance to true
124124
template<typename num_t>
125125
num_t arith_base<num_t>::dtt(bool sign, num_t const& args, ineq const& ineq) const {
126-
num_t zero{ 0 };
127126
switch (ineq.m_op) {
128127
case ineq_kind::LE:
129128
if (sign) {
130129
if (args + ineq.m_coeff <= 0)
131130
return -ineq.m_coeff - args + 1;
132-
return zero;
131+
return num_t(0);
133132
}
134133
if (args + ineq.m_coeff <= 0)
135-
return zero;
134+
return num_t(0);
136135
return args + ineq.m_coeff;
137136
case ineq_kind::EQ:
138137
if (sign) {
139138
if (args + ineq.m_coeff == 0)
140139
return num_t(1);
141-
return zero;
140+
return num_t(0);
142141
}
143142
if (args + ineq.m_coeff == 0)
144-
return zero;
143+
return num_t(0);
145144
return num_t(1);
146145
case ineq_kind::LT:
147146
if (sign) {
148147
if (args + ineq.m_coeff < 0)
149148
return -ineq.m_coeff - args;
150-
return zero;
149+
return num_t(0);
151150
}
152151
if (args + ineq.m_coeff < 0)
153-
return zero;
152+
return num_t(0);
154153
return args + ineq.m_coeff + 1;
155154
default:
156155
UNREACHABLE();
157-
return zero;
156+
return num_t(0);
158157
}
159158
}
160159

@@ -863,36 +862,36 @@ namespace sls {
863862
template<typename num_t>
864863
typename arith_base<num_t>::var_t arith_base<num_t>::mk_op(arith_op_kind k, expr* e, expr* x, expr* y) {
865864
auto v = mk_var(e);
866-
auto w = mk_term(x);
865+
auto vx = mk_term(x);
866+
auto vy = mk_term(y);
867867
unsigned idx = m_ops.size();
868868
num_t val;
869869
switch (k) {
870870
case arith_op_kind::OP_MOD:
871-
val = value(v) == 0 ? num_t(0) : mod(value(w), value(v));
871+
val = value(vy) == 0 ? num_t(0) : mod(value(v), value(vy));
872872
break;
873873
case arith_op_kind::OP_REM:
874-
if (value(v) == 0)
874+
if (value(vy) == 0)
875875
val = 0;
876876
else {
877-
val = value(w);
878-
val %= value(v);
877+
val = value(vx);
878+
val %= value(vy);
879879
}
880880
break;
881881
case arith_op_kind::OP_IDIV:
882-
val = value(v) == 0 ? num_t(0): div(value(w), value(v));
882+
val = value(vy) == 0 ? num_t(0): div(value(vx), value(vy));
883883
break;
884884
case arith_op_kind::OP_DIV:
885-
val = value(v) == 0? num_t(0) : value(w) / value(v);
885+
val = value(vy) == 0? num_t(0) : value(vx) / value(vy);
886886
break;
887887
case arith_op_kind::OP_ABS:
888-
val = abs(value(w));
888+
val = abs(value(vx));
889889
break;
890890
default:
891891
NOT_IMPLEMENTED_YET();
892892
break;
893893
}
894-
verbose_stream() << "mk-op " << mk_bounded_pp(e, m) << "\n";
895-
m_ops.push_back({v, k, v, w});
894+
m_ops.push_back({v, k, vx, vy});
896895
m_vars[v].m_def_idx = idx;
897896
m_vars[v].m_op = k;
898897
m_vars[v].set_value(val);
@@ -1606,7 +1605,7 @@ namespace sls {
16061605
bool arith_base<num_t>::repair_idiv(op_def const& od) {
16071606
auto v1 = value(od.m_arg1);
16081607
auto v2 = value(od.m_arg2);
1609-
IF_VERBOSE(0, verbose_stream() << "todo repair div");
1608+
IF_VERBOSE(0, verbose_stream() << "TODO repair div");
16101609
// bail
16111610
return update(od.m_var, v2 == 0 ? num_t(0) : div(v1, v2));
16121611
}
@@ -1615,7 +1614,7 @@ namespace sls {
16151614
bool arith_base<num_t>::repair_div(op_def const& od) {
16161615
auto v1 = value(od.m_arg1);
16171616
auto v2 = value(od.m_arg2);
1618-
IF_VERBOSE(0, verbose_stream() << "todo repair /");
1617+
IF_VERBOSE(0, verbose_stream() << "TODO repair /");
16191618
// bail
16201619
return update(od.m_var, v2 == 0 ? num_t(0) : v1 / v2);
16211620
}
@@ -2112,6 +2111,7 @@ namespace sls {
21122111
auto const& vi = m_vars[v];
21132112
if (vi.m_def_idx == UINT_MAX)
21142113
return true;
2114+
verbose_stream() << " repair def " << mk_bounded_pp(vi.m_expr, m) << "\n";
21152115
TRACE("sls", tout << "repair def " << mk_bounded_pp(vi.m_expr, m) << "\n");
21162116
switch (vi.m_op) {
21172117
case arith_op_kind::LAST_ARITH_OP:

src/ast/sls/sls_euf_plugin.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,19 @@ namespace sls {
114114
}
115115
// flip the last literal on the replay stack
116116
IF_VERBOSE(10, verbose_stream() << "sls.euf - flip " << flit << "\n");
117+
log_clause(lits);
117118
ctx.add_clause(lits);
118119
return flit;
119120
}
120121

122+
void euf_plugin::log_clause(sat::literal_vector const& lits) {
123+
IF_VERBOSE(3, verbose_stream() << "block " << lits << "\n";
124+
for (auto lit : lits)
125+
verbose_stream() << (lit.sign() ? "~" : "") << mk_bounded_pp(ctx.atom(lit.var()), m) << "\n";
126+
verbose_stream() << "\n";
127+
);
128+
}
129+
121130
void euf_plugin::propagate_literal(sat::literal lit) {
122131
SASSERT(ctx.is_true(lit));
123132
auto e = ctx.atom(lit.var());
@@ -154,6 +163,7 @@ namespace sls {
154163
++m_stats.m_num_conflicts;
155164
if (flit != sat::null_literal)
156165
ctx.flip(flit.var());
166+
log_clause(lits);
157167
};
158168

159169
if (lit.sign() && m.is_eq(e, x, y))

src/ast/sls/sls_euf_plugin.h

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace sls {
5656
sat::literal to_literal(size_t* p) { return sat::to_literal(static_cast<unsigned>(reinterpret_cast<size_t>(p) >> 4)); };
5757

5858
void validate_model();
59+
void log_clause(sat::literal_vector const& lits);
5960

6061
public:
6162
euf_plugin(context& c);

src/ast/sls/sls_smt_plugin.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ namespace sls {
293293
}
294294

295295
void smt_plugin::export_from_sls() {
296-
if (unsat().size() >= m_min_unsat_size)
296+
if (unsat().size() > m_min_unsat_size)
297297
return;
298298
m_min_unsat_size = unsat().size();
299299
export_phase_from_sls();

0 commit comments

Comments
 (0)