mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
fix parameters in utvpi and make Karr invariants use backward propagation
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
c8c5f30b49
commit
5eed106ffe
7 changed files with 101 additions and 66 deletions
|
@ -65,7 +65,7 @@ namespace smt {
|
|||
class parent_trail;
|
||||
|
||||
struct GExt : public Ext {
|
||||
typedef literal explanation;
|
||||
typedef std::pair<literal,unsigned> explanation;
|
||||
};
|
||||
|
||||
class atom {
|
||||
|
@ -113,15 +113,18 @@ namespace smt {
|
|||
// a negative cycle.
|
||||
class nc_functor {
|
||||
literal_vector m_antecedents;
|
||||
unsigned_vector m_coeffs;
|
||||
theory_utvpi& m_super;
|
||||
public:
|
||||
nc_functor(theory_utvpi& s) : m_super(s) {}
|
||||
void reset() { m_antecedents.reset(); }
|
||||
void reset() { m_antecedents.reset(); m_coeffs.reset(); }
|
||||
literal_vector const& get_lits() const { return m_antecedents; }
|
||||
unsigned_vector const& get_coeffs() const { return m_coeffs; }
|
||||
|
||||
void operator()(literal const & ex) {
|
||||
if (ex != null_literal) {
|
||||
m_antecedents.push_back(ex);
|
||||
void operator()(std::pair<literal,unsigned> const & ex) {
|
||||
if (ex.first != null_literal) {
|
||||
m_antecedents.push_back(ex.first);
|
||||
m_coeffs.push_back(ex.second);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -197,6 +197,15 @@ namespace smt {
|
|||
inc_conflicts();
|
||||
literal_vector const& lits = m_nc_functor.get_lits();
|
||||
context & ctx = get_context();
|
||||
IF_VERBOSE(2,
|
||||
verbose_stream() << "conflict:\n";
|
||||
for (unsigned i = 0; i < lits.size(); ++i) {
|
||||
ast_manager& m = get_manager();
|
||||
expr_ref e(m);
|
||||
ctx.literal2expr(lits[i], e);
|
||||
verbose_stream() << mk_pp(e, m) << "\n";
|
||||
}
|
||||
verbose_stream() << "\n";);
|
||||
TRACE("utvpi",
|
||||
tout << "conflict: ";
|
||||
for (unsigned i = 0; i < lits.size(); ++i) {
|
||||
|
@ -213,7 +222,9 @@ namespace smt {
|
|||
vector<parameter> params;
|
||||
if (get_manager().proofs_enabled()) {
|
||||
params.push_back(parameter(symbol("farkas")));
|
||||
params.resize(lits.size()+1, parameter(rational(1)));
|
||||
for (unsigned i = 0; i < m_nc_functor.get_coeffs().size(); ++i) {
|
||||
params.push_back(parameter(rational(m_nc_functor.get_coeffs()[i])));
|
||||
}
|
||||
}
|
||||
|
||||
ctx.set_conflict(
|
||||
|
@ -620,28 +631,28 @@ namespace smt {
|
|||
edge_id id = m_graph.get_num_edges();
|
||||
th_var w1 = to_var(v1), w2 = to_var(v2);
|
||||
if (terms.size() == 1 && pos1) {
|
||||
m_graph.add_edge(neg(w1), pos(w1), -weight-weight, l);
|
||||
m_graph.add_edge(neg(w1), pos(w1), -weight-weight, l);
|
||||
m_graph.add_edge(neg(w1), pos(w1), -weight-weight, std::make_pair(l,2));
|
||||
m_graph.add_edge(neg(w1), pos(w1), -weight-weight, std::make_pair(l,2));
|
||||
}
|
||||
else if (terms.size() == 1 && !pos1) {
|
||||
m_graph.add_edge(pos(w1), neg(w1), -weight-weight, l);
|
||||
m_graph.add_edge(pos(w1), neg(w1), -weight-weight, l);
|
||||
m_graph.add_edge(pos(w1), neg(w1), -weight-weight, std::make_pair(l,2));
|
||||
m_graph.add_edge(pos(w1), neg(w1), -weight-weight, std::make_pair(l,2));
|
||||
}
|
||||
else if (pos1 && pos2) {
|
||||
m_graph.add_edge(neg(w2), pos(w1), -weight, l);
|
||||
m_graph.add_edge(neg(w1), pos(w2), -weight, l);
|
||||
m_graph.add_edge(neg(w2), pos(w1), -weight, std::make_pair(l,1));
|
||||
m_graph.add_edge(neg(w1), pos(w2), -weight, std::make_pair(l,1));
|
||||
}
|
||||
else if (pos1 && !pos2) {
|
||||
m_graph.add_edge(pos(w2), pos(w1), -weight, l);
|
||||
m_graph.add_edge(neg(w1), neg(w2), -weight, l);
|
||||
m_graph.add_edge(pos(w2), pos(w1), -weight, std::make_pair(l,1));
|
||||
m_graph.add_edge(neg(w1), neg(w2), -weight, std::make_pair(l,1));
|
||||
}
|
||||
else if (!pos1 && pos2) {
|
||||
m_graph.add_edge(neg(w2), neg(w1), -weight, l);
|
||||
m_graph.add_edge(pos(w1), pos(w2), -weight, l);
|
||||
m_graph.add_edge(neg(w2), neg(w1), -weight, std::make_pair(l,1));
|
||||
m_graph.add_edge(pos(w1), pos(w2), -weight, std::make_pair(l,1));
|
||||
}
|
||||
else {
|
||||
m_graph.add_edge(pos(w1), neg(w2), -weight, l);
|
||||
m_graph.add_edge(pos(w2), neg(w1), -weight, l);
|
||||
m_graph.add_edge(pos(w1), neg(w2), -weight, std::make_pair(l,1));
|
||||
m_graph.add_edge(pos(w2), neg(w1), -weight, std::make_pair(l,1));
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue