3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 13:28:47 +00:00

fixes in the interval multiplication

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-07-26 21:01:43 -07:00
parent 4c2279343b
commit 4ef7bf2bf6
3 changed files with 26 additions and 16 deletions

View file

@ -55,8 +55,9 @@ bool horner::row_is_interesting(const T& row) const {
void horner::lemmas_on_expr(nex& e) { void horner::lemmas_on_expr(nex& e) {
TRACE("nla_horner", tout << "e = " << e << "\n";); TRACE("nla_horner", tout << "e = " << e << "\n";);
cross_nested cn(e, [this](const nex& n) { cross_nested cn(e, [this](const nex& n) {
TRACE("nla_horner", tout << "callback n = " << n << "\n";);
auto i = interval_of_expr(n); auto i = interval_of_expr(n);
TRACE("nla_horner", tout << "callback n = " << n << "\ni="; m_intervals.display(tout, i) << "\n";);
m_intervals.check_interval_for_conflict_on_zero(i);} ); m_intervals.check_interval_for_conflict_on_zero(i);} );
cn.run(); cn.run();
} }
@ -77,7 +78,13 @@ void horner::horner_lemmas() {
} }
const auto& matrix = c().m_lar_solver.A_r(); const auto& matrix = c().m_lar_solver.A_r();
for (unsigned i = 0; i < matrix.row_count(); i++) { // choose only rows that depend on m_to_refine variables
std::set<unsigned> rows_to_check; // we need it to be determenistic: cannow work with the unordered_set
for (lpvar j : c().m_to_refine) {
for (auto & s : matrix.m_columns[j])
rows_to_check.insert(s.var());
}
for (unsigned i : rows_to_check) {
lemmas_on_row(matrix.m_rows[i]); lemmas_on_row(matrix.m_rows[i]);
} }
} }
@ -117,8 +124,6 @@ void horner::set_interval_for_scalar(interv& a, const rational& v) {
} }
interv horner::interval_of_expr(const nex& e) { interv horner::interval_of_expr(const nex& e) {
TRACE("nla_horner_details", tout << e.type() << " e=" << e << std::endl;);
interv a; interv a;
switch (e.type()) { switch (e.type()) {
case expr_type::SCALAR: case expr_type::SCALAR:
@ -145,18 +150,21 @@ interv horner::interval_of_mul(const nex& e) {
interv a = interval_of_expr(es[0]); interv a = interval_of_expr(es[0]);
TRACE("nla_horner_details", tout << "es[0]= "<< es[0] << std::endl << "a = "; m_intervals.display(tout, a); ); TRACE("nla_horner_details", tout << "es[0]= "<< es[0] << std::endl << "a = "; m_intervals.display(tout, a); );
for (unsigned k = 1; k < es.size(); k++) { for (unsigned k = 1; k < es.size(); k++) {
interv b = interval_of_expr(es[k]);
interv c;
interval_deps deps; interval_deps deps;
m_intervals.mul(a, b, c, deps);
TRACE("nla_horner_details", tout << "c = "; m_intervals.display(tout, c); tout << "\n";);
m_intervals.add_deps(a, b, deps, a);
m_intervals.set(a, c);
TRACE("nla_horner_details", tout << "es[" << k << "]=" << es[k] << ", a = "; m_intervals.display(tout, a); );
if (m_intervals.is_zero(a)) { if (m_intervals.is_zero(a)) {
interv t;
set_interval_for_scalar(t, rational(1));
m_intervals.mul(a, t, a, deps);
m_intervals.add_deps(a, t, deps, a);
TRACE("nla_horner_details", tout << "got zero\n"; ); TRACE("nla_horner_details", tout << "got zero\n"; );
break; break;
} }
interv b = interval_of_expr(es[k]);
interv c;
m_intervals.mul(a, b, c, deps);
m_intervals.add_deps(a, b, deps, a);
m_intervals.set(a, c);
TRACE("nla_horner_details", tout << "es[" << k << "]=" << es[k] << ", "; m_intervals.display(tout, a) << "\n";);
} }
TRACE("nla_horner_details", tout << "e=" << e << "\n"; TRACE("nla_horner_details", tout << "e=" << e << "\n";
tout << " interv = "; m_intervals.display(tout, a);); tout << " interv = "; m_intervals.display(tout, a););
@ -185,13 +193,10 @@ interv horner::interval_of_sum(const nex& e) {
interval_deps deps; interval_deps deps;
TRACE("nla_horner_details_sum", tout << "a = "; m_intervals.display(tout, a) << "\nb = "; m_intervals.display(tout, b) << "\n";); TRACE("nla_horner_details_sum", tout << "a = "; m_intervals.display(tout, a) << "\nb = "; m_intervals.display(tout, b) << "\n";);
m_intervals.add(a, b, c, deps); m_intervals.add(a, b, c, deps);
TRACE("nla_horner_details", tout << "c = "; m_intervals.display(tout, c); tout << "\n";);
m_intervals.add_deps(a, b, deps, a); m_intervals.add_deps(a, b, deps, a);
m_intervals.set(a, c); m_intervals.set(a, c);
TRACE("nla_horner_details_sum", tout << "a = "; m_intervals.display(tout, a); tout << "\n";); TRACE("nla_horner_details_sum", tout << es[k] << ", ";
m_intervals.display(tout, a); tout << "\n";);
// m_intervals.add_deps(a, b, deps, a);
TRACE("nla_horner_details", tout << "final a with deps = "; m_intervals.display(tout, a); tout << "\n";);
if (m_intervals.is_inf(a)) { if (m_intervals.is_inf(a)) {
TRACE("nla_horner_details", tout << "got infinity\n";); TRACE("nla_horner_details", tout << "got infinity\n";);
return a; return a;

View file

@ -3,6 +3,7 @@ def_module_params('nla',
params=( params=(
('order', BOOL, True, 'run order lemmas'), ('order', BOOL, True, 'run order lemmas'),
('tangents', BOOL, True, 'run tangent lemmas'), ('tangents', BOOL, True, 'run tangent lemmas'),
('horner', BOOL, True, 'run horner\'s heuristic'),
)) ))

View file

@ -447,6 +447,10 @@ class theory_lra::imp {
(void)_s; (void)_s;
m_nla->push(); m_nla->push();
} }
nla_params nla(ctx().get_params());
m_nla->get_core()->m_settings.run_order() = nla.order();
m_nla->get_core()->m_settings.run_tangents() = nla.tangents();
m_nla->get_core()->m_settings.run_horner() = nla.horner();
} }
} }