3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 05:18:44 +00:00

handle unsorted monomials

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2018-08-22 11:03:32 +08:00
parent 237db5cb3d
commit 08d891891e
5 changed files with 32 additions and 12 deletions

View file

@ -430,7 +430,7 @@ class theory_lra::imp {
}
void ensure_niil() {
if (!m_niil) {
m_niil = alloc(niil::solver, *m_solver.get(), m.limit(), ctx().get_params());
m_niil = alloc(niil::solver, *m_solver.get(), m.limit(), ctx().get_params(), false);
m_switcher.m_niil = &m_niil;
for (auto const& _s : m_scopes) {
(void)_s;

View file

@ -29,6 +29,14 @@ void print_vector(const C & t, std::ostream & out) {
out << std::endl;
}
template <typename C>
void print_vector(const C * t, unsigned size, std::ostream & out) {
for (unsigned i = 0; i < size; i++ )
out << t[i] << " ";
out << std::endl;
}
template <typename A, typename B>
bool try_get_value(const std::unordered_map<A,B> & map, const A& key, B & val) {
const auto it = map.find(key);

View file

@ -9,6 +9,8 @@ namespace nra {
struct mon_eq {
mon_eq(lp::var_index v, unsigned sz, lp::var_index const* vs):
m_v(v), m_vs(sz, vs) {}
mon_eq(lp::var_index v, const svector<lp::var_index> &vs):
m_v(v), m_vs(vs) {}
lp::var_index m_v;
svector<lp::var_index> m_vs;
unsigned var() const { return m_v; }

View file

@ -33,9 +33,8 @@ struct solver::imp {
lpvar m_i;
lpvar m_j;
int m_sign;
lpci m_c0;
lpci m_c1;
lpci m_c0;
lpci m_c1;
equiv(lpvar i, lpvar j, int sign, lpci c0, lpci c1) :
m_i(i),
m_j(j),
@ -196,17 +195,29 @@ struct solver::imp {
std::unordered_map<lpvar, var_lists> m_var_lists;
lp::explanation * m_expl;
lemma * m_lemma;
imp(lp::lar_solver& s, reslimit& lim, params_ref const& p)
: m_lar_solver(s)
bool m_monomials_are_presorted;
imp(lp::lar_solver& s, reslimit& lim, params_ref const& p, bool monomials_are_presorted)
: m_lar_solver(s), m_monomials_are_presorted(monomials_are_presorted)
// m_limit(lim),
// m_params(p)
{
}
void add(lpvar v, unsigned sz, lpvar const* vs) {
m_monomials.push_back(mon_eq(v, sz, vs));
if (m_monomials_are_presorted) {
m_monomials.push_back(mon_eq(v, sz, vs));
}
else {
svector<lpvar> sorted_vs;
for (unsigned i = 0; i < sz; i++)
sorted_vs.push_back(vs[i]);
std::sort(sorted_vs.begin(), sorted_vs.end());
std::cout << "sorted_vs = ";
print_vector(sorted_vs, std::cout);
m_monomials.push_back(mon_eq(v, sorted_vs));
}
}
void push() {
m_monomials_lim.push_back(m_monomials.size());
}
@ -640,8 +651,8 @@ void solver::pop(unsigned n) {
}
solver::solver(lp::lar_solver& s, reslimit& lim, params_ref const& p) {
m_imp = alloc(imp, s, lim, p);
solver::solver(lp::lar_solver& s, reslimit& lim, params_ref const& p, bool monomials_are_sorted) {
m_imp = alloc(imp, s, lim, p, monomials_are_sorted);
}

View file

@ -40,8 +40,7 @@ public:
struct imp;
imp* m_imp;
void add_monomial(lp::var_index v, unsigned sz, lp::var_index const* vs);
solver(lp::lar_solver& s, reslimit& lim, params_ref const& p);
solver(lp::lar_solver& s, reslimit& lim, params_ref const& p, bool monomials_are_presorted);
imp* get_imp();
void push();
void pop(unsigned scopes);