mirror of
https://github.com/Z3Prover/z3
synced 2025-05-04 06:15:46 +00:00
review of NB
Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
0db79b1c79
commit
d0f682b239
7 changed files with 223 additions and 259 deletions
|
@ -20,8 +20,9 @@
|
|||
#include "math/lp/nla_grobner.h"
|
||||
#include "math/lp/nla_core.h"
|
||||
#include "math/lp/factorization_factory_imp.h"
|
||||
namespace nla {
|
||||
nla_grobner::nla_grobner(core *c, intervals *s)
|
||||
using namespace nla;
|
||||
|
||||
grobner::grobner(core *c, intervals *s)
|
||||
: common(c, s),
|
||||
m_nl_gb_exhausted(false),
|
||||
m_dep_manager(m_val_manager, m_alloc),
|
||||
|
@ -29,12 +30,30 @@ nla_grobner::nla_grobner(core *c, intervals *s)
|
|||
m_look_for_fixed_vars_in_rows(false)
|
||||
{}
|
||||
|
||||
bool nla_grobner::internalize_gb_eq(equation* ) {
|
||||
void grobner::grobner_lemmas() {
|
||||
c().lp_settings().stats().m_grobner_calls++;
|
||||
|
||||
init();
|
||||
|
||||
ptr_vector<equation> eqs;
|
||||
unsigned next_weight =
|
||||
(unsigned)(var_weight::MAX_DEFAULT_WEIGHT) + 1; // next weight using during perturbation phase.
|
||||
do {
|
||||
TRACE("grobner", tout << "before:\n"; display(tout););
|
||||
compute_basis();
|
||||
update_statistics();
|
||||
TRACE("grobner", tout << "after:\n"; display(tout););
|
||||
// if (find_conflict(eqs))
|
||||
// return;
|
||||
} while (push_calculation_forward(eqs, next_weight));
|
||||
}
|
||||
|
||||
bool grobner::internalize_gb_eq(equation* ) {
|
||||
NOT_IMPLEMENTED_YET();
|
||||
return false;
|
||||
}
|
||||
|
||||
void nla_grobner::add_var_and_its_factors_to_q_and_collect_new_rows(lpvar j, std::queue<lpvar> & q) {
|
||||
void grobner::add_var_and_its_factors_to_q_and_collect_new_rows(lpvar j, std::queue<lpvar> & q) {
|
||||
SASSERT(!c().active_var_set_contains(j) && !c().var_is_fixed(j));
|
||||
TRACE("grobner", tout << "j = " << j << ", "; c().print_var(j, tout) << "\n";);
|
||||
const auto& matrix = c().m_lar_solver.A_r();
|
||||
|
@ -69,7 +88,7 @@ void nla_grobner::add_var_and_its_factors_to_q_and_collect_new_rows(lpvar j, std
|
|||
}
|
||||
}
|
||||
|
||||
void nla_grobner::find_nl_cluster() {
|
||||
void grobner::find_nl_cluster() {
|
||||
prepare_rows_and_active_vars();
|
||||
std::queue<lpvar> q;
|
||||
for (lpvar j : c().m_to_refine) {
|
||||
|
@ -92,13 +111,13 @@ void nla_grobner::find_nl_cluster() {
|
|||
TRACE("grobner", display(tout););
|
||||
}
|
||||
|
||||
void nla_grobner::prepare_rows_and_active_vars() {
|
||||
void grobner::prepare_rows_and_active_vars() {
|
||||
m_rows.clear();
|
||||
m_rows.resize(c().m_lar_solver.row_count());
|
||||
c().clear_and_resize_active_var_set();
|
||||
}
|
||||
|
||||
void nla_grobner::display_matrix(std::ostream & out) const {
|
||||
void grobner::display_matrix(std::ostream & out) const {
|
||||
const auto& matrix = c().m_lar_solver.A_r();
|
||||
out << m_rows.size() << " rows" <<"\n";
|
||||
out << "the matrix\n";
|
||||
|
@ -107,21 +126,21 @@ void nla_grobner::display_matrix(std::ostream & out) const {
|
|||
c().print_term(r, out) << std::endl;
|
||||
}
|
||||
}
|
||||
std::ostream & nla_grobner::display(std::ostream & out) const {
|
||||
std::ostream & grobner::display(std::ostream & out) const {
|
||||
display_equations(out, m_to_superpose, "m_to_superpose:");
|
||||
display_equations(out, m_to_simplify, "m_to_simplify:");
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
common::ci_dependency* nla_grobner::dep_from_vector(svector<lp::constraint_index> & cs) {
|
||||
common::ci_dependency* grobner::dep_from_vector(svector<lp::constraint_index> & cs) {
|
||||
ci_dependency * d = nullptr;
|
||||
for (auto c : cs)
|
||||
d = m_dep_manager.mk_join(d, m_dep_manager.mk_leaf(c));
|
||||
return d;
|
||||
}
|
||||
|
||||
void nla_grobner::add_row(unsigned i) {
|
||||
void grobner::add_row(unsigned i) {
|
||||
const auto& row = c().m_lar_solver.A_r().m_rows[i];
|
||||
TRACE("grobner", tout << "adding row to gb\n"; c().m_lar_solver.print_row(row, tout) << '\n';
|
||||
for (auto p : row) {
|
||||
|
@ -135,13 +154,13 @@ void nla_grobner::add_row(unsigned i) {
|
|||
assert_eq_0(e, dep);
|
||||
}
|
||||
|
||||
void nla_grobner::simplify_equations_in_m_to_simplify() {
|
||||
void grobner::simplify_equations_in_m_to_simplify() {
|
||||
for (equation *eq : m_to_simplify) {
|
||||
eq->expr() = m_nex_creator.simplify(eq->expr());
|
||||
}
|
||||
}
|
||||
|
||||
void nla_grobner::init() {
|
||||
void grobner::init() {
|
||||
m_reported = 0;
|
||||
del_equations(0);
|
||||
SASSERT(m_equations_to_delete.size() == 0);
|
||||
|
@ -157,13 +176,13 @@ void nla_grobner::init() {
|
|||
simplify_equations_in_m_to_simplify();
|
||||
}
|
||||
|
||||
bool nla_grobner::is_trivial(equation* eq) const {
|
||||
SASSERT(m_nex_creator.is_simplified(eq->expr()));
|
||||
bool grobner::is_trivial(equation* eq) const {
|
||||
SASSERT(m_nex_creator.is_simplified(*eq->expr()));
|
||||
return eq->expr()->size() == 0;
|
||||
}
|
||||
|
||||
// returns true if eq1 is simpler than eq2
|
||||
bool nla_grobner::is_simpler(equation * eq1, equation * eq2) {
|
||||
bool grobner::is_simpler(equation * eq1, equation * eq2) {
|
||||
if (!eq2)
|
||||
return true;
|
||||
if (is_trivial(eq1))
|
||||
|
@ -173,7 +192,7 @@ bool nla_grobner::is_simpler(equation * eq1, equation * eq2) {
|
|||
return m_nex_creator.gt(eq2->expr(), eq1->expr());
|
||||
}
|
||||
|
||||
void nla_grobner::del_equation(equation * eq) {
|
||||
void grobner::del_equation(equation * eq) {
|
||||
m_to_superpose.erase(eq);
|
||||
m_to_simplify.erase(eq);
|
||||
SASSERT(m_equations_to_delete[eq->m_bidx] == eq);
|
||||
|
@ -181,7 +200,7 @@ void nla_grobner::del_equation(equation * eq) {
|
|||
dealloc(eq);
|
||||
}
|
||||
|
||||
nla_grobner::equation* nla_grobner::pick_next() {
|
||||
grobner::equation* grobner::pick_next() {
|
||||
equation * r = nullptr;
|
||||
ptr_buffer<equation> to_delete;
|
||||
for (equation * curr : m_to_simplify) {
|
||||
|
@ -200,7 +219,7 @@ nla_grobner::equation* nla_grobner::pick_next() {
|
|||
return r;
|
||||
}
|
||||
|
||||
nla_grobner::equation* nla_grobner::simplify_using_to_superpose(equation* eq) {
|
||||
grobner::equation* grobner::simplify_using_to_superpose(equation* eq) {
|
||||
bool result = false;
|
||||
bool simplified;
|
||||
TRACE("grobner", tout << "simplifying: "; display_equation(tout, *eq); tout << "using equalities of m_to_superpose of size " << m_to_superpose.size() << "\n";);
|
||||
|
@ -229,7 +248,7 @@ nla_grobner::equation* nla_grobner::simplify_using_to_superpose(equation* eq) {
|
|||
return result ? eq : nullptr;
|
||||
}
|
||||
|
||||
const nex* nla_grobner::get_highest_monomial(const nex* e) const {
|
||||
const nex* grobner::get_highest_monomial(const nex* e) const {
|
||||
switch (e->type()) {
|
||||
case expr_type::MUL:
|
||||
return to_mul(e);
|
||||
|
@ -245,7 +264,7 @@ const nex* nla_grobner::get_highest_monomial(const nex* e) const {
|
|||
// source 3f + k + l = 0, so f = (-k - l)/3
|
||||
// target 2fg + 3fp + e = 0
|
||||
// target is replaced by 2(-k/3 - l/3)g + 3(-k/3 - l/3)p + e = -2/3kg -2/3lg - kp -lp + e
|
||||
bool nla_grobner::simplify_target_monomials(equation * source, equation * target) {
|
||||
bool grobner::simplify_target_monomials(equation * source, equation * target) {
|
||||
auto * high_mon = get_highest_monomial(source->expr());
|
||||
if (high_mon == nullptr)
|
||||
return false;
|
||||
|
@ -266,7 +285,7 @@ bool nla_grobner::simplify_target_monomials(equation * source, equation * target
|
|||
return simplify_target_monomials_sum(source, target, targ_sum, high_mon);
|
||||
}
|
||||
|
||||
unsigned nla_grobner::find_divisible(nex_sum* targ_sum,
|
||||
unsigned grobner::find_divisible(nex_sum* targ_sum,
|
||||
const nex* high_mon) const {
|
||||
for (unsigned j = 0; j < targ_sum->size(); j++) {
|
||||
auto t = (*targ_sum)[j];
|
||||
|
@ -280,7 +299,7 @@ unsigned nla_grobner::find_divisible(nex_sum* targ_sum,
|
|||
}
|
||||
|
||||
|
||||
bool nla_grobner::simplify_target_monomials_sum(equation * source,
|
||||
bool grobner::simplify_target_monomials_sum(equation * source,
|
||||
equation * target, nex_sum* targ_sum,
|
||||
const nex* high_mon) {
|
||||
unsigned j = find_divisible(targ_sum, high_mon);
|
||||
|
@ -298,16 +317,16 @@ bool nla_grobner::simplify_target_monomials_sum(equation * source,
|
|||
return true;
|
||||
}
|
||||
|
||||
nex_mul* nla_grobner::divide_ignore_coeffs(nex* ej, const nex* h) {
|
||||
nex_mul* grobner::divide_ignore_coeffs(nex* ej, const nex* h) {
|
||||
TRACE("grobner", tout << "ej = " << *ej << " , h = " << *h << "\n";);
|
||||
if (!divide_ignore_coeffs_check_only(ej, h))
|
||||
return nullptr;
|
||||
return divide_ignore_coeffs_perform(ej, h);
|
||||
}
|
||||
|
||||
bool nla_grobner::divide_ignore_coeffs_check_only_nex_mul(nex_mul* t , const nex* h) const {
|
||||
bool grobner::divide_ignore_coeffs_check_only_nex_mul(nex_mul* t , const nex* h) const {
|
||||
TRACE("grobner", tout << "t = " << *t << ", h=" << *h << "\n";);
|
||||
SASSERT(m_nex_creator.is_simplified(t) && m_nex_creator.is_simplified(h));
|
||||
SASSERT(m_nex_creator.is_simplified(*t) && m_nex_creator.is_simplified(*h));
|
||||
unsigned j = 0; // points to t
|
||||
for(unsigned k = 0; k < h->number_of_child_powers(); k++) {
|
||||
lpvar h_var = to_var(h->get_child_exp(k))->var();
|
||||
|
@ -331,7 +350,7 @@ bool nla_grobner::divide_ignore_coeffs_check_only_nex_mul(nex_mul* t , const nex
|
|||
}
|
||||
|
||||
// return true if h divides t
|
||||
bool nla_grobner::divide_ignore_coeffs_check_only(nex* n , const nex* h) const {
|
||||
bool grobner::divide_ignore_coeffs_check_only(nex* n , const nex* h) const {
|
||||
if (n->is_mul())
|
||||
return divide_ignore_coeffs_check_only_nex_mul(to_mul(n), h);
|
||||
if (!n->is_var())
|
||||
|
@ -354,7 +373,7 @@ bool nla_grobner::divide_ignore_coeffs_check_only(nex* n , const nex* h) const {
|
|||
return false;
|
||||
}
|
||||
|
||||
nex_mul * nla_grobner::divide_ignore_coeffs_perform_nex_mul(nex_mul* t, const nex* h) {
|
||||
nex_mul * grobner::divide_ignore_coeffs_perform_nex_mul(nex_mul* t, const nex* h) {
|
||||
nex_mul * r = m_nex_creator.mk_mul();
|
||||
unsigned j = 0; // points to t
|
||||
for(unsigned k = 0; k < h->number_of_child_powers(); k++) {
|
||||
|
@ -379,7 +398,7 @@ nex_mul * nla_grobner::divide_ignore_coeffs_perform_nex_mul(nex_mul* t, const ne
|
|||
|
||||
// perform the division t / h, but ignores the coefficients
|
||||
// h does not change
|
||||
nex_mul * nla_grobner::divide_ignore_coeffs_perform(nex* e, const nex* h) {
|
||||
nex_mul * grobner::divide_ignore_coeffs_perform(nex* e, const nex* h) {
|
||||
if (e->is_mul())
|
||||
return divide_ignore_coeffs_perform_nex_mul(to_mul(e), h);
|
||||
SASSERT(e->is_var());
|
||||
|
@ -390,7 +409,7 @@ nex_mul * nla_grobner::divide_ignore_coeffs_perform(nex* e, const nex* h) {
|
|||
// and b*high_mon + e = 0, so high_mon = -e/b
|
||||
// then targ_sum->children()[j] = - (c/b) * e*p
|
||||
|
||||
void nla_grobner::simplify_target_monomials_sum_j(equation * source, equation *target, nex_sum* targ_sum, const nex* high_mon, unsigned j) {
|
||||
void grobner::simplify_target_monomials_sum_j(equation * source, equation *target, nex_sum* targ_sum, const nex* high_mon, unsigned j) {
|
||||
nex * ej = (*targ_sum)[j];
|
||||
TRACE("grobner_d", tout << "high_mon = " << *high_mon << ", ej = " << *ej << "\n";);
|
||||
nex_mul * ej_over_high_mon = divide_ignore_coeffs(ej, high_mon);
|
||||
|
@ -409,11 +428,11 @@ void nla_grobner::simplify_target_monomials_sum_j(equation * source, equation *t
|
|||
}
|
||||
|
||||
// return true iff simplified
|
||||
bool nla_grobner::simplify_source_target(equation * source, equation * target) {
|
||||
bool grobner::simplify_source_target(equation * source, equation * target) {
|
||||
TRACE("grobner", tout << "simplifying: "; display_equation(tout, *target); tout << "using: "; display_equation(tout, *source););
|
||||
TRACE("grobner_d", tout << "simplifying: " << *(target->expr()) << " using " << *(source->expr()) << "\n";);
|
||||
SASSERT(m_nex_creator.is_simplified(source->expr()));
|
||||
SASSERT(m_nex_creator.is_simplified(target->expr()));
|
||||
SASSERT(m_nex_creator.is_simplified(*source->expr()));
|
||||
SASSERT(m_nex_creator.is_simplified(*target->expr()));
|
||||
if (target->expr()->is_scalar()) {
|
||||
TRACE("grobner_d", tout << "no simplification\n";);
|
||||
return false;
|
||||
|
@ -442,7 +461,7 @@ bool nla_grobner::simplify_source_target(equation * source, equation * target) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void nla_grobner::process_simplified_target(equation* target, ptr_buffer<equation>& to_remove) {
|
||||
void grobner::process_simplified_target(equation* target, ptr_buffer<equation>& to_remove) {
|
||||
if (is_trivial(target)) {
|
||||
to_remove.push_back(target);
|
||||
} else if (m_changed_leading_term) {
|
||||
|
@ -451,7 +470,7 @@ void nla_grobner::process_simplified_target(equation* target, ptr_buffer<equatio
|
|||
}
|
||||
}
|
||||
|
||||
void nla_grobner::check_eq(equation* target) {
|
||||
void grobner::check_eq(equation* target) {
|
||||
if(m_intervals->check_nex(target->expr(), target->dep())) {
|
||||
TRACE("grobner", tout << "created a lemma for "; display_equation(tout, *target) << "\n";
|
||||
tout << "vars = \n";
|
||||
|
@ -463,7 +482,7 @@ void nla_grobner::check_eq(equation* target) {
|
|||
}
|
||||
}
|
||||
|
||||
bool nla_grobner::simplify_to_superpose_with_eq(equation* eq) {
|
||||
bool grobner::simplify_to_superpose_with_eq(equation* eq) {
|
||||
TRACE("grobner_d", tout << "eq->exp " << *(eq->expr()) << "\n";);
|
||||
|
||||
ptr_buffer<equation> to_insert;
|
||||
|
@ -481,7 +500,7 @@ bool nla_grobner::simplify_to_superpose_with_eq(equation* eq) {
|
|||
if (is_trivial(target))
|
||||
to_delete.push_back(target);
|
||||
else
|
||||
SASSERT(m_nex_creator.is_simplified(target->expr()));
|
||||
SASSERT(m_nex_creator.is_simplified(*target->expr()));
|
||||
}
|
||||
for (equation* eq : to_insert)
|
||||
insert_to_superpose(eq);
|
||||
|
@ -495,7 +514,7 @@ bool nla_grobner::simplify_to_superpose_with_eq(equation* eq) {
|
|||
/*
|
||||
Use the given equation to simplify m_to_simplify equations
|
||||
*/
|
||||
void nla_grobner::simplify_m_to_simplify(equation* eq) {
|
||||
void grobner::simplify_m_to_simplify(equation* eq) {
|
||||
TRACE("grobner_d", tout << "eq->exp " << *(eq->expr()) << "\n";);
|
||||
ptr_buffer<equation> to_delete;
|
||||
for (equation* target : m_to_simplify) {
|
||||
|
@ -509,7 +528,7 @@ void nla_grobner::simplify_m_to_simplify(equation* eq) {
|
|||
// if e is the sum then add to r all children of e multiplied by beta, except the first one
|
||||
// which corresponds to the highest monomial,
|
||||
// otherwise do nothing
|
||||
void nla_grobner::add_mul_skip_first(nex_sum* r, const rational& beta, nex *e, nex_mul* c) {
|
||||
void grobner::add_mul_skip_first(nex_sum* r, const rational& beta, nex *e, nex_mul* c) {
|
||||
if (e->is_sum()) {
|
||||
nex_sum *es = to_sum(e);
|
||||
for (unsigned j = 1; j < es->size(); j++) {
|
||||
|
@ -523,7 +542,7 @@ void nla_grobner::add_mul_skip_first(nex_sum* r, const rational& beta, nex *e, n
|
|||
|
||||
|
||||
// let e1: alpha*ab+q=0, and e2: beta*ac+e=0, then beta*qc - alpha*eb = 0
|
||||
nex * nla_grobner::expr_superpose(nex* e1, nex* e2, const nex* ab, const nex* ac, nex_mul* b, nex_mul* c) {
|
||||
nex * grobner::expr_superpose(nex* e1, nex* e2, const nex* ab, const nex* ac, nex_mul* b, nex_mul* c) {
|
||||
TRACE("grobner", tout << "e1 = " << *e1 << "\ne2 = " << *e2 <<"\n";);
|
||||
nex_sum * r = m_nex_creator.mk_sum();
|
||||
rational alpha = - ab->coeff();
|
||||
|
@ -540,7 +559,7 @@ nex * nla_grobner::expr_superpose(nex* e1, nex* e2, const nex* ab, const nex* ac
|
|||
return ret;
|
||||
}
|
||||
// let eq1: ab+q=0, and eq2: ac+e=0, then qc - eb = 0
|
||||
void nla_grobner::superpose(equation * eq1, equation * eq2) {
|
||||
void grobner::superpose(equation * eq1, equation * eq2) {
|
||||
TRACE("grobner", tout << "eq1="; display_equation(tout, *eq1) << "eq2="; display_equation(tout, *eq2););
|
||||
const nex * ab = get_highest_monomial(eq1->expr());
|
||||
const nex * ac = get_highest_monomial(eq2->expr());
|
||||
|
@ -562,13 +581,13 @@ void nla_grobner::superpose(equation * eq1, equation * eq2) {
|
|||
|
||||
}
|
||||
|
||||
void nla_grobner::register_report() {
|
||||
void grobner::register_report() {
|
||||
m_reported++;
|
||||
m_conflict = true;
|
||||
}
|
||||
// Let a be the greatest common divider of ab and bc,
|
||||
// then ab/a is stored in b, and ac/a is stored in c
|
||||
bool nla_grobner::find_b_c(const nex* ab, const nex* ac, nex_mul*& b, nex_mul*& c) {
|
||||
bool grobner::find_b_c(const nex* ab, const nex* ac, nex_mul*& b, nex_mul*& c) {
|
||||
if (!find_b_c_check_only(ab, ac))
|
||||
return false;
|
||||
b = m_nex_creator.mk_mul(); c = m_nex_creator.mk_mul();
|
||||
|
@ -614,10 +633,10 @@ bool nla_grobner::find_b_c(const nex* ab, const nex* ac, nex_mul*& b, nex_mul*&
|
|||
return true;
|
||||
}
|
||||
// Finds out if ab and bc have a non-trivial common divider
|
||||
bool nla_grobner::find_b_c_check_only(const nex* ab, const nex* ac) const {
|
||||
bool grobner::find_b_c_check_only(const nex* ab, const nex* ac) const {
|
||||
if (ab == nullptr || ac == nullptr)
|
||||
return false;
|
||||
SASSERT(m_nex_creator.is_simplified(ab) && m_nex_creator.is_simplified(ab));
|
||||
SASSERT(m_nex_creator.is_simplified(*ab) && m_nex_creator.is_simplified(*ac));
|
||||
unsigned i = 0, j = 0; // i points to ab, j points to ac
|
||||
for (;;) {
|
||||
const nex* m = ab->get_child_exp(i);
|
||||
|
@ -641,14 +660,14 @@ bool nla_grobner::find_b_c_check_only(const nex* ab, const nex* ac) const {
|
|||
}
|
||||
|
||||
|
||||
void nla_grobner::superpose(equation * eq) {
|
||||
void grobner::superpose(equation * eq) {
|
||||
for (equation * target : m_to_superpose) {
|
||||
superpose(eq, target);
|
||||
}
|
||||
}
|
||||
|
||||
// return true iff cannot pick_next()
|
||||
bool nla_grobner::compute_basis_step() {
|
||||
bool grobner::compute_basis_step() {
|
||||
equation * eq = pick_next();
|
||||
if (!eq) {
|
||||
TRACE("grobner", tout << "cannot pick an equation\n";);
|
||||
|
@ -671,7 +690,7 @@ bool nla_grobner::compute_basis_step() {
|
|||
return false;
|
||||
}
|
||||
|
||||
void nla_grobner::compute_basis(){
|
||||
void grobner::compute_basis(){
|
||||
compute_basis_init();
|
||||
if (m_rows.size() < 2) {
|
||||
TRACE("nla_grobner", tout << "there are only " << m_rows.size() << " rows, exiting compute_basis()\n";);
|
||||
|
@ -690,16 +709,16 @@ void nla_grobner::compute_basis(){
|
|||
}
|
||||
}
|
||||
}
|
||||
void nla_grobner::compute_basis_init(){
|
||||
void grobner::compute_basis_init(){
|
||||
c().lp_settings().stats().m_grobner_basis_computatins++;
|
||||
}
|
||||
|
||||
bool nla_grobner::canceled() const {
|
||||
bool grobner::canceled() const {
|
||||
return c().lp_settings().get_cancel_flag();
|
||||
}
|
||||
|
||||
|
||||
bool nla_grobner::done() const {
|
||||
bool grobner::done() const {
|
||||
if (
|
||||
num_of_equations() >= c().m_nla_settings.grobner_eqs_threshold()
|
||||
||
|
||||
|
@ -725,7 +744,7 @@ bool nla_grobner::done() const {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool nla_grobner::compute_basis_loop(){
|
||||
bool grobner::compute_basis_loop(){
|
||||
int i = 0;
|
||||
while (!done()) {
|
||||
if (compute_basis_step()) {
|
||||
|
@ -738,11 +757,11 @@ bool nla_grobner::compute_basis_loop(){
|
|||
return false;
|
||||
}
|
||||
|
||||
void nla_grobner::set_gb_exhausted(){
|
||||
void grobner::set_gb_exhausted(){
|
||||
m_nl_gb_exhausted = true;
|
||||
}
|
||||
|
||||
void nla_grobner::update_statistics(){
|
||||
void grobner::update_statistics(){
|
||||
/* todo : implement
|
||||
m_stats.m_gb_simplify += gb.m_stats.m_simplify;
|
||||
m_stats.m_gb_superpose += gb.m_stats.m_superpose;
|
||||
|
@ -751,36 +770,17 @@ void nla_grobner::update_statistics(){
|
|||
}
|
||||
|
||||
|
||||
bool nla_grobner::push_calculation_forward(ptr_vector<equation>& eqs, unsigned & next_weight) {
|
||||
bool grobner::push_calculation_forward(ptr_vector<equation>& eqs, unsigned & next_weight) {
|
||||
return (!m_nl_gb_exhausted) &&
|
||||
try_to_modify_eqs(eqs, next_weight);
|
||||
}
|
||||
|
||||
bool nla_grobner::try_to_modify_eqs(ptr_vector<equation>& eqs, unsigned& next_weight) {
|
||||
bool grobner::try_to_modify_eqs(ptr_vector<equation>& eqs, unsigned& next_weight) {
|
||||
// NOT_IMPLEMENTED_YET();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void nla_grobner::grobner_lemmas() {
|
||||
c().lp_settings().stats().m_grobner_calls++;
|
||||
|
||||
init();
|
||||
|
||||
ptr_vector<equation> eqs;
|
||||
unsigned next_weight =
|
||||
(unsigned)(var_weight::MAX_DEFAULT_WEIGHT) + 1; // next weight using during perturbation phase.
|
||||
do {
|
||||
TRACE("grobner", tout << "before:\n"; display(tout););
|
||||
compute_basis();
|
||||
update_statistics();
|
||||
TRACE("grobner", tout << "after:\n"; display(tout););
|
||||
// if (find_conflict(eqs))
|
||||
// return;
|
||||
}
|
||||
while(push_calculation_forward(eqs, next_weight));
|
||||
}
|
||||
void nla_grobner:: del_equations(unsigned old_size) {
|
||||
void grobner:: del_equations(unsigned old_size) {
|
||||
TRACE("grobner", );
|
||||
SASSERT(m_equations_to_delete.size() >= old_size);
|
||||
equation_vector::iterator it = m_equations_to_delete.begin();
|
||||
|
@ -794,18 +794,18 @@ void nla_grobner:: del_equations(unsigned old_size) {
|
|||
m_equations_to_delete.shrink(old_size);
|
||||
}
|
||||
|
||||
void nla_grobner::display_equations(std::ostream & out, equation_set const & v, char const * header) const {
|
||||
void grobner::display_equations(std::ostream & out, equation_set const & v, char const * header) const {
|
||||
out << header << "\n";
|
||||
for (const equation* e : v)
|
||||
display_equation(out, *e);
|
||||
}
|
||||
|
||||
std::ostream& nla_grobner::display_equation(std::ostream & out, const equation & eq) const {
|
||||
std::ostream& grobner::display_equation(std::ostream & out, const equation & eq) const {
|
||||
out << "expr = " << *eq.expr() << "\n";
|
||||
display_dependency(out, eq.dep());
|
||||
return out;
|
||||
}
|
||||
std::unordered_set<lpvar> nla_grobner::get_vars_of_expr_with_opening_terms(const nex *e ) {
|
||||
std::unordered_set<lpvar> grobner::get_vars_of_expr_with_opening_terms(const nex *e ) {
|
||||
auto ret = get_vars_of_expr(e);
|
||||
auto & ls = c().m_lar_solver;
|
||||
do {
|
||||
|
@ -827,7 +827,7 @@ std::unordered_set<lpvar> nla_grobner::get_vars_of_expr_with_opening_terms(const
|
|||
} while (true);
|
||||
}
|
||||
|
||||
void nla_grobner::assert_eq_0(nex* e, ci_dependency * dep) {
|
||||
void grobner::assert_eq_0(nex* e, ci_dependency * dep) {
|
||||
if (e == nullptr || is_zero_scalar(e))
|
||||
return;
|
||||
m_tmp_var_set.clear();
|
||||
|
@ -843,7 +843,7 @@ void nla_grobner::assert_eq_0(nex* e, ci_dependency * dep) {
|
|||
insert_to_simplify(eq);
|
||||
}
|
||||
|
||||
void nla_grobner::init_equation(equation* eq, nex*e, ci_dependency * dep) {
|
||||
void grobner::init_equation(equation* eq, nex*e, ci_dependency * dep) {
|
||||
unsigned bidx = m_equations_to_delete.size();
|
||||
eq->m_bidx = bidx;
|
||||
eq->dep() = dep;
|
||||
|
@ -852,11 +852,11 @@ void nla_grobner::init_equation(equation* eq, nex*e, ci_dependency * dep) {
|
|||
SASSERT(m_equations_to_delete[eq->m_bidx] == eq);
|
||||
}
|
||||
|
||||
nla_grobner::~nla_grobner() {
|
||||
grobner::~grobner() {
|
||||
del_equations(0);
|
||||
}
|
||||
|
||||
std::ostream& nla_grobner::display_dependency(std::ostream& out, ci_dependency* dep) const {
|
||||
std::ostream& grobner::display_dependency(std::ostream& out, ci_dependency* dep) const {
|
||||
svector<lp::constraint_index> expl;
|
||||
m_dep_manager.linearize(dep, expl);
|
||||
{
|
||||
|
@ -872,5 +872,4 @@ std::ostream& nla_grobner::display_dependency(std::ostream& out, ci_dependency*
|
|||
|
||||
return out;
|
||||
}
|
||||
|
||||
} // end of nla namespace
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue