mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 10:25:18 +00:00
fix #3836 remove unused and buggy hoist_cmul
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
97af74d8cb
commit
db9d6d12fc
|
@ -35,7 +35,6 @@ protected:
|
|||
unsigned m_som_blowup;
|
||||
bool m_sort_sums;
|
||||
bool m_hoist_mul;
|
||||
bool m_hoist_cmul;
|
||||
bool m_ast_order;
|
||||
bool m_hoist_ite;
|
||||
|
||||
|
@ -88,9 +87,7 @@ protected:
|
|||
bool hoist_multiplication(expr_ref& som);
|
||||
expr* merge_muls(expr* x, expr* y);
|
||||
|
||||
struct hoist_cmul_lt;
|
||||
bool is_mul(expr * t, numeral & c, expr * & pp);
|
||||
void hoist_cmul(expr_ref_buffer & args);
|
||||
|
||||
class mon_lt {
|
||||
poly_rewriter& rw;
|
||||
|
|
|
@ -32,7 +32,6 @@ void poly_rewriter<Config>::updt_params(params_ref const & _p) {
|
|||
m_flat = p.flat();
|
||||
m_som = p.som();
|
||||
m_hoist_mul = p.hoist_mul();
|
||||
m_hoist_cmul = p.hoist_cmul();
|
||||
m_hoist_ite = p.hoist_ite();
|
||||
m_som_blowup = p.som_blowup();
|
||||
if (!m_flat) m_som = false;
|
||||
|
@ -270,8 +269,8 @@ br_status poly_rewriter<Config>::mk_nflat_mul_core(unsigned num_args, expr * con
|
|||
}
|
||||
}
|
||||
|
||||
if (num_add == 0 || m_hoist_cmul) {
|
||||
SASSERT(!is_add(var) || m_hoist_cmul);
|
||||
if (num_add == 0) {
|
||||
SASSERT(!is_add(var));
|
||||
if (num_args == 2 && args[1] == var) {
|
||||
DEBUG_CODE({
|
||||
numeral c_prime;
|
||||
|
@ -452,67 +451,6 @@ bool poly_rewriter<Config>::is_mul(expr * t, numeral & c, expr * & pp) {
|
|||
return true;
|
||||
}
|
||||
|
||||
template<typename Config>
|
||||
struct poly_rewriter<Config>::hoist_cmul_lt {
|
||||
poly_rewriter<Config> & m_r;
|
||||
hoist_cmul_lt(poly_rewriter<Config> & r):m_r(r) {}
|
||||
|
||||
bool operator()(expr * t1, expr * t2) const {
|
||||
expr * pp1 = nullptr;
|
||||
expr * pp2 = nullptr;
|
||||
numeral c1, c2;
|
||||
bool is_mul1 = m_r.is_mul(t1, c1, pp1);
|
||||
bool is_mul2 = m_r.is_mul(t2, c2, pp2);
|
||||
if (!is_mul1 && is_mul2)
|
||||
return true;
|
||||
if (is_mul1 && !is_mul2)
|
||||
return false;
|
||||
if (!is_mul1 && !is_mul2)
|
||||
return t1->get_id() < t2->get_id();
|
||||
if (c1 < c2)
|
||||
return true;
|
||||
if (c1 > c2)
|
||||
return false;
|
||||
return pp1->get_id() < pp2->get_id();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Config>
|
||||
void poly_rewriter<Config>::hoist_cmul(expr_ref_buffer & args) {
|
||||
unsigned sz = args.size();
|
||||
std::sort(args.c_ptr(), args.c_ptr() + sz, hoist_cmul_lt(*this));
|
||||
numeral c, c_prime;
|
||||
ptr_buffer<expr> pps;
|
||||
expr * pp, * pp_prime;
|
||||
unsigned j = 0;
|
||||
unsigned i = 0;
|
||||
while (i < sz) {
|
||||
expr * mon = args[i];
|
||||
if (is_mul(mon, c, pp) && i < sz - 1) {
|
||||
expr * mon_prime = args[i+1];
|
||||
if (is_mul(mon_prime, c_prime, pp_prime) && c == c_prime) {
|
||||
// found target
|
||||
pps.reset();
|
||||
pps.push_back(pp);
|
||||
pps.push_back(pp_prime);
|
||||
i += 2;
|
||||
while (i < sz && is_mul(args[i], c_prime, pp_prime) && c == c_prime) {
|
||||
pps.push_back(pp_prime);
|
||||
i++;
|
||||
}
|
||||
SASSERT(is_numeral(to_app(mon)->get_arg(0), c_prime) && c == c_prime);
|
||||
expr * mul_args[2] = { to_app(mon)->get_arg(0), mk_add_app(pps.size(), pps.c_ptr()) };
|
||||
args.set(j, mk_mul_app(2, mul_args));
|
||||
j++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
args.set(j, mon);
|
||||
j++;
|
||||
i++;
|
||||
}
|
||||
args.resize(j);
|
||||
}
|
||||
|
||||
template<typename Config>
|
||||
bool poly_rewriter<Config>::mon_lt::operator()(expr* e1, expr * e2) const {
|
||||
|
@ -638,10 +576,7 @@ br_status poly_rewriter<Config>::mk_nflat_add_core(unsigned num_args, expr * con
|
|||
new_args.push_back(mk_mul_app(a, pp));
|
||||
}
|
||||
}
|
||||
if (m_hoist_cmul) {
|
||||
hoist_cmul(new_args);
|
||||
}
|
||||
else if (m_sort_sums) {
|
||||
if (m_sort_sums) {
|
||||
TRACE("rewriter_bug", tout << "new_args.size(): " << new_args.size() << "\n";);
|
||||
if (c.is_zero())
|
||||
std::sort(new_args.c_ptr(), new_args.c_ptr() + new_args.size(), mon_lt(*this));
|
||||
|
@ -660,7 +595,7 @@ br_status poly_rewriter<Config>::mk_nflat_add_core(unsigned num_args, expr * con
|
|||
}
|
||||
else {
|
||||
SASSERT(!has_multiple);
|
||||
if (ordered && !m_hoist_mul && !m_hoist_cmul && !m_hoist_ite) {
|
||||
if (ordered && !m_hoist_mul && !m_hoist_ite) {
|
||||
if (num_coeffs == 0)
|
||||
return BR_FAILED;
|
||||
if (num_coeffs == 1 && is_numeral(args[0], a) && !a.is_zero())
|
||||
|
@ -675,10 +610,7 @@ br_status poly_rewriter<Config>::mk_nflat_add_core(unsigned num_args, expr * con
|
|||
continue;
|
||||
new_args.push_back(arg);
|
||||
}
|
||||
if (m_hoist_cmul) {
|
||||
hoist_cmul(new_args);
|
||||
}
|
||||
else if (!ordered) {
|
||||
if (!ordered) {
|
||||
if (c.is_zero())
|
||||
std::sort(new_args.c_ptr(), new_args.c_ptr() + new_args.size(), lt);
|
||||
else
|
||||
|
|
|
@ -4,6 +4,5 @@ def_module_params(module_name='rewriter',
|
|||
params=(("som", BOOL, False, "put polynomials in sum-of-monomials form"),
|
||||
("som_blowup", UINT, 10, "maximum increase of monomials generated when putting a polynomial in sum-of-monomials normal form"),
|
||||
("hoist_mul", BOOL, False, "hoist multiplication over summation to minimize number of multiplications"),
|
||||
("hoist_cmul", BOOL, False, "hoist constant multiplication over summation to minimize number of multiplications"),
|
||||
("hoist_ite", BOOL, False, "hoist shared summands under ite expressions"),
|
||||
("flat", BOOL, True, "create nary applications for and,or,+,*,bvadd,bvmul,bvand,bvor,bvxor")))
|
||||
|
|
|
@ -308,7 +308,7 @@ namespace smt {
|
|||
*/
|
||||
void theory_recfun::assert_macro_axiom(case_expansion & e) {
|
||||
m_stats.m_macro_expansions++;
|
||||
TRACEFN("case expansion " << pp_case_expansion(e, m) << "\n");
|
||||
TRACEFN("case expansion " << pp_case_expansion(e, m) << "\n");
|
||||
SASSERT(e.m_def->is_fun_macro());
|
||||
auto & vars = e.m_def->get_vars();
|
||||
expr_ref lhs(e.m_lhs, m);
|
||||
|
|
|
@ -113,7 +113,6 @@ static tactic * mk_preamble(ast_manager & m, params_ref const & p) {
|
|||
|
||||
params_ref hoist_p;
|
||||
hoist_p.set_bool("hoist_mul", true);
|
||||
// hoist_p.set_bool("hoist_cmul", true);
|
||||
hoist_p.set_bool("som", false);
|
||||
|
||||
params_ref gaussian_p;
|
||||
|
|
Loading…
Reference in a new issue