3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-28 19:35:50 +00:00

reverting signed mon_eq, try to rely on canonization state during add/pop

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-03-19 17:14:59 -07:00 committed by Lev Nachmanson
parent 6877840342
commit 8a665e25ed
12 changed files with 110 additions and 91 deletions

View file

@ -2,45 +2,45 @@
Copyright (c) 2017 Microsoft Corporation
Author: Nikolaj Bjorner
Lev Nachmanson
A mon_eq represents a definition m_v = v1*v2*...*vn,
where m_vs = [v1, v2, .., vn]
A monic contains a mon_eq and variables in canonized form.
*/
#pragma once
#include "math/lp/lp_settings.h"
#include "util/vector.h"
#include "math/lp/lar_solver.h"
#include "math/lp/nla_defs.h"
namespace nla {
/*
* represents definition m_v = v1*v2*...*vn,
* where m_vs = [v1, v2, .., vn]
*/
class mon_eq {
// fields
bool m_sign;
lp::var_index m_v;
svector<lp::var_index> m_vs;
public:
// constructors
mon_eq(bool sign, lp::var_index v, unsigned sz, lp::var_index const* vs):
m_sign(sign), m_v(v), m_vs(sz, vs) {
mon_eq(lp::var_index v, unsigned sz, lp::var_index const* vs):
m_v(v), m_vs(sz, vs) {
std::sort(m_vs.begin(), m_vs.end());
}
mon_eq(bool sign, lp::var_index v, const svector<lp::var_index> &vs):
m_sign(sign), m_v(v), m_vs(vs) {
mon_eq(lp::var_index v, const svector<lp::var_index> &vs):
m_v(v), m_vs(vs) {
std::sort(m_vs.begin(), m_vs.end());
}
mon_eq():m_sign(false), m_v(UINT_MAX) {}
mon_eq(): m_v(UINT_MAX) {}
unsigned var() const { return m_v; }
unsigned size() const { return m_vs.size(); }
bool sign() const { return m_sign; }
const svector<lp::var_index>& vars() const { return m_vs; }
bool empty() const { return m_vs.empty(); }
protected:
svector<lp::var_index>& vars1() { return m_vs; }
};
// support the congruence
@ -51,11 +51,10 @@ class monic: public mon_eq {
mutable unsigned m_visited;
public:
// constructors
monic(bool sign, lpvar v, unsigned sz, lpvar const* vs, unsigned idx):
monic(sign, v, svector<lpvar>(sz, vs), idx) {
}
monic(bool sign, lpvar v, const svector<lpvar> &vs, unsigned idx):
mon_eq(sign, v, vs), m_rsign(false), m_visited(0) {
monic(lpvar v, unsigned sz, lpvar const* vs, unsigned idx):
monic(v, svector<lpvar>(sz, vs), idx) {}
monic(lpvar v, const svector<lpvar> &vs, unsigned idx):
mon_eq(v, vs), m_rsign(false), m_visited(0) {
std::sort(vars1().begin(), vars1().end());
}
@ -63,14 +62,15 @@ public:
void set_visited(unsigned v) { m_visited = v; }
svector<lpvar> const& rvars() const { return m_rvars; }
bool rsign() const { return m_rsign; }
void reset_rfields() { m_rsign = sign(); m_rvars.reset(); SASSERT(m_rvars.size() == 0); }
void reset_rfields() { m_rsign = false; m_rvars.reset(); SASSERT(m_rvars.size() == 0); }
void push_rvar(signed_var sv) { m_rsign ^= sv.sign(); m_rvars.push_back(sv.var()); }
void sort_rvars() { std::sort(m_rvars.begin(), m_rvars.end()); }
};
inline std::ostream& operator<<(std::ostream& out, monic const& m) {
return out << m.var() << " := " << (m.sign()?"- ":"") << m.vars() << " r ( " << (m.rsign()?"- ":"") << m.rvars() << ")";
}
inline std::ostream& operator<<(std::ostream& out, monic const& m) {
return out << m.var() << " := " << m.vars()
<< " r ( " << (m.rsign()?"- ":"") << m.rvars() << ")";
}
typedef std::unordered_map<lpvar, rational> variable_map_type;