3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-10-28 18:29:23 +00:00
z3/src/math/lp/nla_mul_saturate.h
2025-10-10 16:28:22 -07:00

69 lines
2.2 KiB
C++

/*++
Copyright (c) 2025 Microsoft Corporation
--*/
#pragma once
#include "math/lp/nla_coi.h"
namespace nla {
class core;
class lar_solver;
class mul_saturate : common {
struct var_sign {
lpvar v = lp::null_lpvar;
bool is_neg = false;
u_dependency* dep = nullptr;
};
coi m_coi;
// source of multiplication constraint
u_map<lp::constraint_index> m_new_mul_constraints;
svector<var_sign> m_var_signs;
tracked_uint_set m_seen_vars;
indexed_uint_set m_to_refine;
scoped_ptr<lp::lar_solver> local_solver;
ptr_vector<u_dependency> m_ci2dep;
vector<rational> m_values;
struct eq {
bool operator()(unsigned_vector const& a, unsigned_vector const& b) const {
return a == b;
}
};
map<unsigned_vector, unsigned, svector_hash<unsigned_hash>, eq> m_vars2mon;
u_map<unsigned_vector> m_mon2vars;
// initialization
void init_solver();
void init_vars();
void init_monomial(unsigned mon_var);
bool constraint_is_true(lp::constraint_index ci);
void insert_monomials_from_constraint(lp::constraint_index ci);
// additional variables and monomials and constraints
lpvar add_monomial(svector<lp::lpvar> const& vars);
bool is_int(svector<lp::lpvar> const& vars) const;
lpvar add_var(bool is_int);
void add_multiply_constraints();
void add_multiply_constraint(lp::constraint_index con_id, lp::lpvar mi, lpvar x);
// solving
lbool solve(lp::explanation& ex);
// lemmas
void add_lemma(lp::explanation const& ex);
std::ostream& display(std::ostream& out) const;
std::ostream& display_product(std::ostream& out, svector<lpvar> const& vars) const;
std::ostream& display_constraint(std::ostream& out, lp::constraint_index ci) const;
std::ostream& display_constraint(std::ostream& out, vector<std::pair<rational, lpvar>> const& lhs,
lp::lconstraint_kind k, rational const& rhs) const;
public:
mul_saturate(core* core);
lbool saturate();
};
}