3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-10-08 08:51:55 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2025-09-22 11:26:48 +03:00
parent fae67b79b7
commit 0a0e925f27
4 changed files with 49 additions and 2 deletions

View file

@ -30,6 +30,7 @@ z3_add_component(lp
nla_grobner.cpp nla_grobner.cpp
nla_intervals.cpp nla_intervals.cpp
nla_monotone_lemmas.cpp nla_monotone_lemmas.cpp
nla_mul_saturate.cpp
nla_order_lemmas.cpp nla_order_lemmas.cpp
nla_powers.cpp nla_powers.cpp
nla_pp.cpp nla_pp.cpp

View file

@ -60,6 +60,7 @@ class core {
friend class monomial_bounds; friend class monomial_bounds;
friend class nra::solver; friend class nra::solver;
friend class divisions; friend class divisions;
friend class mul_saturate;
unsigned m_nlsat_delay = 0; unsigned m_nlsat_delay = 0;
unsigned m_nlsat_delay_bound = 0; unsigned m_nlsat_delay_bound = 0;

View file

@ -10,13 +10,53 @@
Check if the system with new constraints is LP feasible. Check if the system with new constraints is LP feasible.
If it is not, then produce a lemma that explains the infeasibility. If it is not, then produce a lemma that explains the infeasibility.
The lemma is in terms of the original constraints and bounds.
--*/ --*/
#include "math/lp/nla_mul_saturate.h"
#include "math/lp/nla_core.h" #include "math/lp/nla_core.h"
#include "math/lp/nla_mul_saturate.h"
namespace nla { namespace nla {
mul_saturate::mul_saturate(core* core) : common(core) {} mul_saturate::mul_saturate(core* core) :
common(core),
lra(m_core.lra) {}
lbool mul_saturate::saturate() {
lra.push();
for (auto j : c().m_to_refine) {
auto& m = c().emons()[j];
for (auto& con : lra.constraints().active()) {
for (auto v : m.vars()) {
for (auto [coeff, u] : con.coeffs()) {
if (u == v) {
// add new constraint
// multiply by remaining vars
}
}
}
}
}
// record new monomials that are created and recursively down-saturate with respect to these.
auto st = lra.solve();
lbool r = l_undef;
if (st == lp::lp_status::INFEASIBLE) {
// now we need to filter new constraints into bounds and old constraints.
r = l_false;
}
if (st == lp::lp_status::OPTIMAL || st == lp::lp_status::FEASIBLE) {
// TODO: check model just in case it got lucky.
}
lra.pop(1);
return r;
}
lp::lar_base_constraint* mul_saturate::multiply_constraint(lp::lar_base_constraint const& c, monic const& m, lpvar x) {
return nullptr;
}
} }

View file

@ -7,9 +7,14 @@
namespace nla { namespace nla {
class core; class core;
class lar_solver;
class mul_saturate : common { class mul_saturate : common {
lp::lar_solver& lra;
lp::lar_base_constraint* multiply_constraint(lp::lar_base_constraint const& c, monic const& m, lpvar x);
public: public:
mul_saturate(core* core); mul_saturate(core* core);
lbool saturate();
}; };
} }