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:
parent
237db5cb3d
commit
08d891891e
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue