3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-01 11:51:20 +00:00

address #3886 and #3891 by revamping nl_arith decoupling of monomial analysis and access

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2020-04-10 01:33:46 -07:00
parent addbe55823
commit ee9c797822
3 changed files with 182 additions and 293 deletions

View file

@ -978,15 +978,16 @@ namespace smt {
void mark_var(theory_var v, svector<theory_var> & vars, var_set & already_found);
void mark_dependents(theory_var v, svector<theory_var> & vars, var_set & already_found, row_set & already_visited_rows);
void get_non_linear_cluster(svector<theory_var> & vars);
std::pair<unsigned, int> analyze_monomial(expr * m) const;
expr * get_monomial_body(expr * m) const;
rational get_monomial_coeff(expr * m) const;
unsigned get_num_vars_in_monomial(expr * m) const;
typedef std::pair<expr *, unsigned> var_power_pair;
var_power_pair get_var_and_degree(expr * m, unsigned i) const;
typedef std::pair<unsigned, var_power_pair> n_var_power_pair;
n_var_power_pair analyze_monomial(expr * m) const;
rational decompose_monomial(expr* m, buffer<var_power_pair>& vp) const;
void display_monomial(std::ostream & out, expr * m) const;
bool propagate_nl_upward(expr * m);
bool propagate_nl_downward(expr * m, unsigned i);
bool propagate_nl_downward(expr * m, var_power_pair const& p);
interval mk_interval_for(theory_var v);
interval mk_interval_for(expr * n);
void mul_bound_of(expr * var, unsigned power, interval & target);
@ -996,14 +997,13 @@ namespace smt {
bool update_bounds_using_interval(theory_var v, interval const & i);
bool update_bounds_using_interval(expr * n, interval const & i);
bool propagate_nl_bounds(expr * m);
bool propagate_nl_bound(expr * m, int i);
bool propagate_nl_bounds();
bool is_problematic_non_linear_row(row const & r);
bool is_mixed_real_integer(row const & r) const;
bool is_integer(row const & r) const;
typedef std::pair<rational, expr *> coeff_expr;
bool get_polynomial_info(buffer<coeff_expr> const & p, sbuffer<var_num_occs> & vars);
expr * p2expr(buffer<coeff_expr> & p);
expr_ref p2expr(buffer<coeff_expr> & p);
expr * power(expr * var, unsigned power);
expr * mk_nary_mul(unsigned sz, expr * const * args, bool is_int);
expr * mk_nary_add(unsigned sz, expr * const * args, bool is_int);
@ -1013,8 +1013,8 @@ namespace smt {
unsigned get_min_degree(buffer<coeff_expr> & p, expr * var);
expr * factor(expr * m, expr * var, unsigned d);
bool in_monovariate_monomials(buffer<coeff_expr> & p, expr * var, unsigned & i1, rational & c1, unsigned & n1, unsigned & i2, rational & c2, unsigned & n2);
expr * horner(unsigned depth, buffer<coeff_expr> & p, expr * var);
expr * cross_nested(unsigned depth, buffer<coeff_expr> & p, expr * var);
expr_ref horner(unsigned depth, buffer<coeff_expr> & p, expr * var);
expr_ref cross_nested(unsigned depth, buffer<coeff_expr> & p, expr * var);
bool is_cross_nested_consistent(buffer<coeff_expr> & p);
bool is_cross_nested_consistent(row const & r);
bool is_cross_nested_consistent(svector<theory_var> const & nl_cluster);