mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 10:52:02 +00:00
reorg monomials
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
fa6091dc16
commit
8a49002f60
5 changed files with 58 additions and 9 deletions
|
@ -63,8 +63,23 @@ namespace sls {
|
||||||
template<typename num_t>
|
template<typename num_t>
|
||||||
std::ostream& arith_base<num_t>::ineq::display(std::ostream& out) const {
|
std::ostream& arith_base<num_t>::ineq::display(std::ostream& out) const {
|
||||||
bool first = true;
|
bool first = true;
|
||||||
for (auto const& [c, v] : this->m_args)
|
unsigned j = 0;
|
||||||
out << (first ? "" : " + ") << c << " * v" << v, first = false;
|
for (auto const& [c, v] : this->m_args) {
|
||||||
|
out << (first ? (c > 0 ? "" : "-") : (c > 0 ? " + " : " - "));
|
||||||
|
bool first2 = abs(c) == 1;
|
||||||
|
if (abs(c) != 1)
|
||||||
|
out << abs(c);
|
||||||
|
auto const& m = this->m_monomials[j];
|
||||||
|
|
||||||
|
for (auto [w, p] : m) {
|
||||||
|
out << (first2 ? "" : " * ") << "v" << w;
|
||||||
|
if (p > 1)
|
||||||
|
out << "^" << p;
|
||||||
|
first2 = false;
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
++j;
|
||||||
|
}
|
||||||
if (this->m_coeff != 0)
|
if (this->m_coeff != 0)
|
||||||
out << " + " << this->m_coeff;
|
out << " + " << this->m_coeff;
|
||||||
switch (m_op) {
|
switch (m_op) {
|
||||||
|
@ -78,15 +93,17 @@ namespace sls {
|
||||||
out << " < " << 0 << "(" << m_args_value << ")";
|
out << " < " << 0 << "(" << m_args_value << ")";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
for (auto const& [x, nl] : this->m_nonlinear) {
|
for (auto const& [x, nl] : this->m_nonlinear) {
|
||||||
if (nl.size() == 1 && nl[0].v == x)
|
if (nl.size() == 1 && nl[0].v == x)
|
||||||
continue;
|
continue;
|
||||||
for (auto const& [v, c, p] : nl) {
|
for (auto const& [v, c, p] : nl) {
|
||||||
out << " v" << x;
|
out << " v" << x;
|
||||||
if (p > 1) out << "^" << p;
|
if (p > 1) out << "^" << p;
|
||||||
out << " in " << c << " * v" << v;
|
out << " in v" << v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1058,6 +1075,14 @@ namespace sls {
|
||||||
i.m_args[k++] = i.m_args[j];
|
i.m_args[k++] = i.m_args[j];
|
||||||
}
|
}
|
||||||
i.m_args.shrink(k);
|
i.m_args.shrink(k);
|
||||||
|
i.m_monomials.reserve(k);
|
||||||
|
for (unsigned j = 0; j < i.m_args.size(); ++j) {
|
||||||
|
auto const& [c, v] = i.m_args[j];
|
||||||
|
if (is_mul(v))
|
||||||
|
i.m_monomials[j].append(get_mul(v).m_monomial);
|
||||||
|
else
|
||||||
|
i.m_monomials[j].push_back({ v, 1 });
|
||||||
|
}
|
||||||
// compute the value of the linear term, and accumulate non-linear sub-terms
|
// compute the value of the linear term, and accumulate non-linear sub-terms
|
||||||
i.m_args_value = i.m_coeff;
|
i.m_args_value = i.m_coeff;
|
||||||
for (auto const& [coeff, v] : i.m_args) {
|
for (auto const& [coeff, v] : i.m_args) {
|
||||||
|
@ -1896,9 +1921,6 @@ namespace sls {
|
||||||
|
|
||||||
template<typename num_t>
|
template<typename num_t>
|
||||||
void arith_base<num_t>::on_restart() {
|
void arith_base<num_t>::on_restart() {
|
||||||
for (unsigned v = 0; v < ctx.num_bool_vars(); ++v)
|
|
||||||
init_bool_var_assignment(v);
|
|
||||||
check_ineqs();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename num_t>
|
template<typename num_t>
|
||||||
|
|
|
@ -58,9 +58,13 @@ namespace sls {
|
||||||
num_t coeff; // coeff of v in inequality
|
num_t coeff; // coeff of v in inequality
|
||||||
unsigned p; // power
|
unsigned p; // power
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef svector<std::pair<unsigned, unsigned>> monomial_t;
|
||||||
|
|
||||||
// encode args <= bound, args = bound, args < bound
|
// encode args <= bound, args = bound, args < bound
|
||||||
struct ineq : public linear_term {
|
struct ineq : public linear_term {
|
||||||
vector<std::pair<var_t, vector<nonlinear_coeff>>> m_nonlinear;
|
vector<std::pair<var_t, vector<nonlinear_coeff>>> m_nonlinear;
|
||||||
|
vector<monomial_t> m_monomials;
|
||||||
ineq_kind m_op = ineq_kind::LE;
|
ineq_kind m_op = ineq_kind::LE;
|
||||||
num_t m_args_value;
|
num_t m_args_value;
|
||||||
bool m_is_linear = true;
|
bool m_is_linear = true;
|
||||||
|
@ -120,7 +124,7 @@ namespace sls {
|
||||||
|
|
||||||
struct mul_def {
|
struct mul_def {
|
||||||
unsigned m_var;
|
unsigned m_var;
|
||||||
svector<std::pair<unsigned, unsigned>> m_monomial;
|
monomial_t m_monomial;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct add_def : public linear_term {
|
struct add_def : public linear_term {
|
||||||
|
|
|
@ -22,6 +22,7 @@ Author:
|
||||||
#include "ast/sls/sls_basic_plugin.h"
|
#include "ast/sls/sls_basic_plugin.h"
|
||||||
#include "ast/ast_ll_pp.h"
|
#include "ast/ast_ll_pp.h"
|
||||||
#include "ast/ast_pp.h"
|
#include "ast/ast_pp.h"
|
||||||
|
#include "smt/params/smt_params_helper.hpp"
|
||||||
|
|
||||||
namespace sls {
|
namespace sls {
|
||||||
|
|
||||||
|
@ -42,6 +43,11 @@ namespace sls {
|
||||||
register_plugin(alloc(basic_plugin, *this));
|
register_plugin(alloc(basic_plugin, *this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void context::updt_params(params_ref const& p) {
|
||||||
|
smt_params_helper smtp(p);
|
||||||
|
m_rand.set_seed(smtp.random_seed());
|
||||||
|
}
|
||||||
|
|
||||||
void context::register_plugin(plugin* p) {
|
void context::register_plugin(plugin* p) {
|
||||||
m_plugins.reserve(p->fid() + 1);
|
m_plugins.reserve(p->fid() + 1);
|
||||||
m_plugins.set(p->fid(), p);
|
m_plugins.set(p->fid(), p);
|
||||||
|
@ -51,6 +57,12 @@ namespace sls {
|
||||||
m_atoms.setx(v, e);
|
m_atoms.setx(v, e);
|
||||||
m_atom2bool_var.setx(e->get_id(), v, sat::null_bool_var);
|
m_atom2bool_var.setx(e->get_id(), v, sat::null_bool_var);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void context::on_restart() {
|
||||||
|
for (auto p : m_plugins)
|
||||||
|
if (p)
|
||||||
|
p->on_restart();
|
||||||
|
}
|
||||||
|
|
||||||
lbool context::check() {
|
lbool context::check() {
|
||||||
//
|
//
|
||||||
|
|
|
@ -137,6 +137,9 @@ namespace sls {
|
||||||
void register_atom(sat::bool_var v, expr* e);
|
void register_atom(sat::bool_var v, expr* e);
|
||||||
lbool check();
|
lbool check();
|
||||||
|
|
||||||
|
void on_restart();
|
||||||
|
void updt_params(params_ref const& p);
|
||||||
|
|
||||||
// expose sat_solver to plugins
|
// expose sat_solver to plugins
|
||||||
vector<sat::clause_info> const& clauses() const { return s.clauses(); }
|
vector<sat::clause_info> const& clauses() const { return s.clauses(); }
|
||||||
sat::clause_info const& get_clause(unsigned idx) const { return s.get_clause(idx); }
|
sat::clause_info const& get_clause(unsigned idx) const { return s.get_clause(idx); }
|
||||||
|
|
|
@ -46,7 +46,9 @@ namespace sls {
|
||||||
|
|
||||||
void on_rescale() override {}
|
void on_rescale() override {}
|
||||||
|
|
||||||
void on_restart() override {}
|
void on_restart() override {
|
||||||
|
m_context.on_restart();
|
||||||
|
}
|
||||||
|
|
||||||
bool m_on_save_model = false;
|
bool m_on_save_model = false;
|
||||||
void on_save_model() override {
|
void on_save_model() override {
|
||||||
|
@ -114,13 +116,19 @@ namespace sls {
|
||||||
m_ddfw.reset_statistics();
|
m_ddfw.reset_statistics();
|
||||||
m_context.reset_statistics();
|
m_context.reset_statistics();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updt_params(params_ref const& p) {
|
||||||
|
m_ddfw.updt_params(p);
|
||||||
|
m_context.updt_params(p);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
smt_solver::smt_solver(ast_manager& m, params_ref const& p):
|
smt_solver::smt_solver(ast_manager& m, params_ref const& p):
|
||||||
m(m),
|
m(m),
|
||||||
m_solver_ctx(alloc(solver_ctx, m, m_ddfw)),
|
m_solver_ctx(alloc(solver_ctx, m, m_ddfw)),
|
||||||
m_assertions(m) {
|
m_assertions(m) {
|
||||||
m_ddfw.updt_params(p);
|
|
||||||
|
m_solver_ctx->updt_params(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
smt_solver::~smt_solver() {
|
smt_solver::~smt_solver() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue