3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-10 19:27:06 +00:00

merged dependency.h from main repo

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-12-18 21:01:45 -10:00
parent 1dbffe7367
commit 0039b68ca3
6 changed files with 51 additions and 59 deletions

View file

@ -161,15 +161,15 @@ nex * common::nexvar(const rational & coeff, lpvar j, nex_creator& cn, bool fixe
}
template <typename T> common::ci_dependency* common::create_sum_from_row(const T& row,
template <typename T> u_dependency* common::create_sum_from_row(const T& row,
nex_creator& cn,
nex_creator::sum_factory& sum,
bool fixed_as_scalars,
ci_dependency_manager* dep_manager
u_dependency_manager* dep_manager
) {
TRACE("nla_horner", tout << "row="; m_core->print_term(row, tout) << "\n";);
ci_dependency * dep = nullptr;
u_dependency * dep = nullptr;
SASSERT(row.size() > 1);
sum.reset();
for (const auto &p : row) {
@ -190,9 +190,9 @@ template <typename T> common::ci_dependency* common::create_sum_from_row(const T
}
template <typename T>
common::ci_dependency* common::get_fixed_vars_dep_from_row(const T& row, ci_dependency_manager& dep_manager) {
u_dependency* common::get_fixed_vars_dep_from_row(const T& row, u_dependency_manager& dep_manager) {
TRACE("nla_horner", tout << "row="; m_core->print_term(row, tout) << "\n";);
ci_dependency* dep = nullptr;
u_dependency* dep = nullptr;
for (const auto &p : row) {
lpvar j = p.var();
if (!c().is_monic_var(j)) {
@ -256,6 +256,5 @@ var_weight common::get_var_weight(lpvar j) const {
}
template nla::common::ci_dependency* nla::common::create_sum_from_row<old_vector<lp::row_cell<rational>, true, unsigned int> >(old_vector<lp::row_cell<rational>, true, unsigned int> const&, nla::nex_creator&, nla::nex_creator::sum_factory&, bool, ci_dependency_manager*);
template dependency_manager<nla::common::ci_dependency_config>::dependency* nla::common::get_fixed_vars_dep_from_row<old_vector<lp::row_cell<rational>, true, unsigned int> >(old_vector<lp::row_cell<rational>, true, unsigned int> const&, dependency_manager<nla::common::ci_dependency_config>&);
template u_dependency* nla::common::create_sum_from_row<old_vector<lp::row_cell<rational>, true, unsigned int> >(old_vector<lp::row_cell<rational>, true, unsigned int> const&, nla::nex_creator&, nla::nex_creator::sum_factory&, bool, u_dependency_manager*);
template dependency_manager<scoped_dependency_manager<unsigned int>::config>::dependency* nla::common::get_fixed_vars_dep_from_row<old_vector<lp::row_cell<rational>, true, unsigned int> >(old_vector<lp::row_cell<rational>, true, unsigned int> const&, scoped_dependency_manager<unsigned int>&);

View file

@ -109,22 +109,19 @@ struct common {
}
};
struct ci_dependency_config {
struct u_dependency_config {
typedef ci_value_manager value_manager;
typedef region allocator;
static const bool ref_count = false;
typedef lp::constraint_index value;
};
typedef dependency_manager<ci_dependency_config> ci_dependency_manager;
typedef ci_dependency_manager::dependency ci_dependency;
// nex* nexvar(lpvar j, nex_creator&, svector<lp::constraint_index> & fixed_vars_constraints);
nex* nexvar(const rational& coeff, lpvar j, nex_creator&, bool);
template <typename T>
ci_dependency* create_sum_from_row(const T&, nex_creator&, nex_creator::sum_factory&, bool, ci_dependency_manager*);
u_dependency* create_sum_from_row(const T&, nex_creator&, nex_creator::sum_factory&, bool, u_dependency_manager*);
template <typename T>
ci_dependency* get_fixed_vars_dep_from_row(const T&, ci_dependency_manager& dep_manager);
u_dependency* get_fixed_vars_dep_from_row(const T&, u_dependency_manager& dep_manager);
void set_active_vars_weights();
var_weight get_var_weight(lpvar) const;
};

View file

@ -174,7 +174,7 @@ void grobner::add_row(unsigned i) {
TRACE("grobner", tout << "adding row to gb\n"; c().m_lar_solver.print_row(row, tout) << '\n';
for (auto p : row) c().print_var(p.var(), tout) << "\n"; );
nex_creator::sum_factory sf(m_nex_creator);
ci_dependency* dep = create_sum_from_row(row, m_nex_creator, sf, m_look_for_fixed_vars_in_rows, &m_gc.dep());
u_dependency* dep = create_sum_from_row(row, m_nex_creator, sf, m_look_for_fixed_vars_in_rows, &m_gc.dep());
nex* e = m_nex_creator.simplify(sf.mk());
TRACE("grobner", tout << "e = " << *e << "\n";);
m_gc.assert_eq_0(e, dep);
@ -792,7 +792,7 @@ std::ostream& grobner_core::display(std::ostream& out) const {
return out;
}
void grobner_core::assert_eq_0(nex* e, common::ci_dependency * dep) {
void grobner_core::assert_eq_0(nex* e, u_dependency * dep) {
if (e == nullptr || is_zero_scalar(e))
return;
equation * eq = alloc(equation);
@ -807,7 +807,7 @@ void grobner_core::assert_eq_0(nex* e, common::ci_dependency * dep) {
update_stats_max_degree_and_size(eq);
}
void grobner_core::init_equation(equation* eq, nex*e, common::ci_dependency * dep) {
void grobner_core::init_equation(equation* eq, nex*e, u_dependency * dep) {
eq->m_bidx = m_equations_to_delete.size();
eq->m_dep = dep;
eq->m_expr = e;
@ -819,7 +819,7 @@ grobner_core::~grobner_core() {
del_equations(0);
}
std::ostream& grobner_core::display_dependency(std::ostream& out, common::ci_dependency* dep) const {
std::ostream& grobner_core::display_dependency(std::ostream& out, u_dependency* dep) const {
svector<lp::constraint_index> expl;
m_dep_manager.linearize(dep, expl);
lp::explanation e(expl);

View file

@ -77,7 +77,7 @@ public:
class equation {
unsigned m_bidx; //!< position at m_equations_to_delete
nex * m_expr; // simplified expressionted monomials
common::ci_dependency * m_dep; //!< justification for the equality
u_dependency * m_dep; //!< justification for the equality
public:
unsigned get_num_monomials() const {
switch(m_expr->type()) {
@ -102,7 +102,7 @@ public:
}
}
const nex* expr() const { return m_expr; }
common::ci_dependency * dep() const { return m_dep; }
u_dependency * dep() const { return m_dep; }
unsigned hash() const { return m_bidx; }
friend class grobner_core;
};
@ -119,8 +119,7 @@ private:
equation_set m_to_superpose;
equation_set m_to_simplify;
region m_alloc;
common::ci_value_manager m_val_manager;
mutable common::ci_dependency_manager m_dep_manager;
mutable u_dependency_manager m_dep_manager;
nex_lt m_lt;
bool m_changed_leading_term;
params m_params;
@ -129,16 +128,16 @@ public:
grobner_core(nex_creator& nc, reslimit& lim) :
m_nex_creator(nc),
m_limit(lim),
m_dep_manager(m_val_manager, m_alloc),
m_dep_manager(),
m_changed_leading_term(false)
{}
~grobner_core();
void reset();
bool compute_basis_loop();
void assert_eq_0(nex*, common::ci_dependency * dep);
void assert_eq_0(nex*, u_dependency * dep);
concat<equation_set, equation_set, equation*> equations();
common::ci_dependency_manager& dep() const { return m_dep_manager; }
u_dependency_manager& dep() const { return m_dep_manager; }
void display_equations_no_deps(std::ostream& out, equation_set const& v, char const* header) const;
void display_equations(std::ostream& out, equation_set const& v, char const* header) const;
@ -167,7 +166,7 @@ private:
bool is_simpler(equation * eq1, equation * eq2);
void del_equations(unsigned old_size);
void del_equation(equation * eq);
void init_equation(equation* eq, nex*, common::ci_dependency* d);
void init_equation(equation* eq, nex*, u_dependency* d);
void insert_to_simplify(equation *eq) {
TRACE("grobner", display_equation(tout, *eq););
@ -193,7 +192,7 @@ private:
void update_stats_max_degree_and_size(const equation*);
std::ostream& print_stats(std::ostream&) const;
std::ostream& display_dependency(std::ostream& out, common::ci_dependency*) const;
std::ostream& display_dependency(std::ostream& out, u_dependency*) const;
bool equation_is_too_complex(const equation* eq) const {
return eq->expr()->size() > m_params.m_expr_size_limit;
}

View file

@ -66,7 +66,7 @@ const nex* intervals::get_zero_interval_child(const nex_mul& e) const {
return nullptr;
}
std::ostream & intervals::print_dependencies(ci_dependency* deps , std::ostream& out) const {
std::ostream & intervals::print_dependencies(u_dependency* deps , std::ostream& out) const {
svector<lp::constraint_index> expl;
m_dep_manager.linearize(deps, expl);
{
@ -82,7 +82,7 @@ std::ostream & intervals::print_dependencies(ci_dependency* deps , std::ostream&
}
// return true iff the interval of n is does not contain 0
bool intervals::check_nex(const nex* n, ci_dependency* initial_deps) {
bool intervals::check_nex(const nex* n, u_dependency* initial_deps) {
m_core->lp_settings().stats().m_cross_nested_forms++;
auto i = interval_of_expr<without_deps>(n, 1);
if (!separated_from_zero(i)) {
@ -221,13 +221,13 @@ bool intervals::separated_from_zero_on_upper(const interval& i) const {
return true;
}
bool intervals::check_interval_for_conflict_on_zero(const interval & i, ci_dependency* dep) {
bool intervals::check_interval_for_conflict_on_zero(const interval & i, u_dependency* dep) {
return check_interval_for_conflict_on_zero_lower(i, dep) || check_interval_for_conflict_on_zero_upper(i, dep);
}
bool intervals::check_interval_for_conflict_on_zero_upper(
const interval & i,
ci_dependency* dep) {
u_dependency* dep) {
if (!separated_from_zero_on_upper(i))
return false;
@ -241,7 +241,7 @@ bool intervals::check_interval_for_conflict_on_zero_upper(
return true;
}
bool intervals::check_interval_for_conflict_on_zero_lower(const interval & i, ci_dependency* dep) {
bool intervals::check_interval_for_conflict_on_zero_lower(const interval & i, u_dependency* dep) {
if (!separated_from_zero_on_lower(i)) {
return false;
}
@ -255,12 +255,12 @@ bool intervals::check_interval_for_conflict_on_zero_lower(const interval & i, ci
return true;
}
common::ci_dependency *intervals::mk_dep(lp::constraint_index ci) const {
u_dependency *intervals::mk_dep(lp::constraint_index ci) const {
return m_dep_manager.mk_leaf(ci);
}
common::ci_dependency *intervals::mk_dep(const lp::explanation& expl) const {
intervals::ci_dependency * r = nullptr;
u_dependency *intervals::mk_dep(const lp::explanation& expl) const {
u_dependency * r = nullptr;
for (auto p : expl) {
if (r == nullptr) {
r = m_dep_manager.mk_leaf(p.second);

View file

@ -12,7 +12,7 @@
Author:
Nikolaj Bjorner (nbjorner)
Lev Nachmanson (levnach)
Revision History:
@ -29,12 +29,9 @@ namespace nla {
class core;
class intervals {
typedef common::ci_dependency_manager ci_dependency_manager;
typedef ci_dependency_manager::dependency ci_dependency;
class im_config {
unsynch_mpq_manager& m_manager;
common::ci_dependency_manager& m_dep_manager;
u_dependency_manager& m_dep_manager;
public:
typedef unsynch_mpq_manager numeral_manager;
@ -52,8 +49,8 @@ class intervals {
unsigned m_upper_open : 1;
unsigned m_lower_inf : 1;
unsigned m_upper_inf : 1;
ci_dependency* m_lower_dep; // justification for the lower bound
ci_dependency* m_upper_dep; // justification for the upper bound
u_dependency* m_lower_dep; // justification for the lower bound
u_dependency* m_upper_dep; // justification for the upper bound
};
void add_deps(interval const& a, interval const& b,
@ -105,10 +102,10 @@ class intervals {
// Reference to numeral manager
numeral_manager& m() const { return m_manager; }
im_config(numeral_manager& m, ci_dependency_manager& d) :m_manager(m), m_dep_manager(d) {}
im_config(numeral_manager& m, u_dependency_manager& d) :m_manager(m), m_dep_manager(d) {}
private:
ci_dependency* mk_dependency(interval const& a, interval const& b, deps_combine_rule bd) const {
ci_dependency* dep = nullptr;
u_dependency* mk_dependency(interval const& a, interval const& b, deps_combine_rule bd) const {
u_dependency* dep = nullptr;
if (dep_in_lower1(bd)) {
dep = m_dep_manager.mk_join(dep, a.m_lower_dep);
}
@ -124,8 +121,8 @@ class intervals {
return dep;
}
ci_dependency* mk_dependency(interval const& a, deps_combine_rule bd) const {
ci_dependency* dep = nullptr;
u_dependency* mk_dependency(interval const& a, deps_combine_rule bd) const {
u_dependency* dep = nullptr;
if (dep_in_lower1(bd)) {
dep = m_dep_manager.mk_join(dep, a.m_lower_dep);
}
@ -140,17 +137,17 @@ class intervals {
region m_alloc;
common::ci_value_manager m_val_manager;
mutable unsynch_mpq_manager m_num_manager;
mutable ci_dependency_manager m_dep_manager;
mutable u_dependency_manager m_dep_manager;
im_config m_config;
mutable interval_manager<im_config> m_imanager;
core* m_core;
public:
ci_dependency_manager& dep_manager() { return m_dep_manager; }
u_dependency_manager& dep_manager() { return m_dep_manager; }
typedef interval_manager<im_config>::interval interval;
private:
ci_dependency* mk_dep(lp::constraint_index ci) const;
ci_dependency* mk_dep(lp::explanation const&) const;
u_dependency* mk_dep(lp::constraint_index ci) const;
u_dependency* mk_dep(lp::explanation const&) const;
lp::lar_solver& ls();
const lp::lar_solver& ls() const;
public:
@ -158,15 +155,15 @@ public:
intervals(core* c, reslimit& lim) :
m_alloc(),
m_dep_manager(m_val_manager, m_alloc),
m_dep_manager(),
m_config(m_num_manager, m_dep_manager),
m_imanager(lim, im_config(m_num_manager, m_dep_manager)),
m_core(c)
{}
ci_dependency* mk_join(ci_dependency* a, ci_dependency* b) { return m_dep_manager.mk_join(a, b); }
ci_dependency* mk_leaf(lp::constraint_index ci) { return m_dep_manager.mk_leaf(ci); }
u_dependency* mk_join(u_dependency* a, u_dependency* b) { return m_dep_manager.mk_join(a, b); }
u_dependency* mk_leaf(lp::constraint_index ci) { return m_dep_manager.mk_leaf(ci); }
std::ostream& print_dependencies(ci_dependency*, std::ostream&) const;
std::ostream& print_dependencies(u_dependency*, std::ostream&) const;
std::ostream& display(std::ostream& out, const intervals::interval& i) const;
void set_lower(interval& a, rational const& n) const { m_config.set_lower(a, n.to_mpq()); }
void set_upper(interval& a, rational const& n) const { m_config.set_upper(a, n.to_mpq()); }
@ -345,9 +342,9 @@ public:
return separated_from_zero_on_upper(i) ||
separated_from_zero_on_lower(i);
}
bool check_interval_for_conflict_on_zero(const interval& i, ci_dependency*);
bool check_interval_for_conflict_on_zero_lower(const interval& i, ci_dependency*);
bool check_interval_for_conflict_on_zero_upper(const interval& i, ci_dependency*);
bool check_interval_for_conflict_on_zero(const interval& i, u_dependency*);
bool check_interval_for_conflict_on_zero_lower(const interval& i, u_dependency*);
bool check_interval_for_conflict_on_zero_upper(const interval& i, u_dependency*);
mpq const& lower(interval const& a) const { return m_config.lower(a); }
mpq const& upper(interval const& a) const { return m_config.upper(a); }
inline bool is_empty(interval const& a) const {
@ -362,7 +359,7 @@ public:
return false;
}
void reset() { m_alloc.reset(); }
bool check_nex(const nex*, ci_dependency*);
bool check_nex(const nex*, u_dependency*);
typedef interval interv;
void set_interval_for_scalar(interv&, const rational&);
const nex* get_zero_interval_child(const nex_mul&) const;