mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 09:35:32 +00:00
Bug and performance fixes for FP UFs.
This commit is contained in:
parent
ec565ae7a0
commit
df81ab72f5
5 changed files with 122 additions and 42 deletions
|
@ -322,50 +322,55 @@ void fpa2bv_model_converter::convert(model * bv_mdl, model * float_mdl) {
|
|||
sort * rng = f->get_range();
|
||||
|
||||
if (arity > 0) {
|
||||
func_interp * flt_fi = alloc(func_interp, m, f->get_arity());
|
||||
func_interp * bv_fi = bv_mdl->get_func_interp(it->m_value);
|
||||
|
||||
func_interp * bv_fi = bv_mdl->get_func_interp(it->m_value);
|
||||
SASSERT(bv_fi->args_are_values());
|
||||
if (bv_fi != 0) {
|
||||
func_interp * flt_fi = alloc(func_interp, m, f->get_arity());
|
||||
|
||||
for (unsigned i = 0; i < bv_fi->num_entries(); i++) {
|
||||
func_entry const * bv_fe = bv_fi->get_entry(i);
|
||||
expr * const * bv_args = bv_fe->get_args();
|
||||
expr_ref_buffer new_args(m);
|
||||
for (unsigned i = 0; i < bv_fi->num_entries(); i++) {
|
||||
func_entry const * bv_fe = bv_fi->get_entry(i);
|
||||
expr * const * bv_args = bv_fe->get_args();
|
||||
expr_ref_buffer new_args(m);
|
||||
|
||||
for (unsigned j = 0; j < arity; j++) {
|
||||
sort * dj = f->get_domain(j);
|
||||
expr * aj = bv_args[j];
|
||||
if (fu.is_float(dj))
|
||||
new_args.push_back(convert_bv2fp(bv_mdl, dj, aj));
|
||||
else if (fu.is_rm(dj)) {
|
||||
expr_ref fv(m);
|
||||
fv = convert_bv2rm(aj);
|
||||
new_args.push_back(fv);
|
||||
for (unsigned j = 0; j < arity; j++) {
|
||||
sort * dj = f->get_domain(j);
|
||||
expr * aj = bv_args[j];
|
||||
expr_ref saj(m);
|
||||
bv_mdl->eval(aj, saj, true);
|
||||
|
||||
if (fu.is_float(dj))
|
||||
new_args.push_back(convert_bv2fp(bv_mdl, dj, saj));
|
||||
else if (fu.is_rm(dj)) {
|
||||
expr_ref fv(m);
|
||||
fv = convert_bv2rm(saj);
|
||||
new_args.push_back(fv);
|
||||
}
|
||||
else
|
||||
new_args.push_back(saj);
|
||||
}
|
||||
else
|
||||
new_args.push_back(aj);
|
||||
|
||||
expr_ref ret(m);
|
||||
ret = bv_fe->get_result();
|
||||
bv_mdl->eval(ret, ret);
|
||||
if (fu.is_float(rng))
|
||||
ret = convert_bv2fp(bv_mdl, rng, ret);
|
||||
else if (fu.is_rm(rng))
|
||||
ret = convert_bv2rm(ret);
|
||||
|
||||
flt_fi->insert_new_entry(new_args.c_ptr(), ret);
|
||||
}
|
||||
|
||||
expr_ref ret(m);
|
||||
ret = bv_fe->get_result();
|
||||
expr_ref els(m);
|
||||
els = bv_fi->get_else();
|
||||
if (fu.is_float(rng))
|
||||
ret = convert_bv2fp(bv_mdl, rng, ret);
|
||||
els = convert_bv2fp(bv_mdl, rng, els);
|
||||
else if (fu.is_rm(rng))
|
||||
ret = convert_bv2rm(ret);
|
||||
els = convert_bv2rm(els);
|
||||
|
||||
flt_fi->insert_new_entry(new_args.c_ptr(), ret);
|
||||
flt_fi->set_else(els);
|
||||
|
||||
float_mdl->register_decl(f, flt_fi);
|
||||
}
|
||||
|
||||
expr_ref els(m);
|
||||
els = bv_fi->get_else();
|
||||
if (fu.is_float(rng))
|
||||
els = convert_bv2fp(bv_mdl, rng, els);
|
||||
else if (fu.is_rm(rng))
|
||||
els = convert_bv2rm(els);
|
||||
|
||||
flt_fi->set_else(els);
|
||||
|
||||
float_mdl->register_decl(f, flt_fi);
|
||||
}
|
||||
else {
|
||||
func_decl * bvf = it->m_value;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue